Преглед на файлове

Add blog post draft to README

Philipp Oppermann преди 9 години
родител
ревизия
5486e52edd
променени са 1 файла, в които са добавени 60 реда и са изтрити 1 реда
  1. 60 1
      README.md

+ 60 - 1
README.md

@@ -5,4 +5,63 @@ Contributions welcome! **If someone wants to maintain this crate, please contact
 
 It uses the Multiboot 1.6 specification at http://nongnu.askapache.com/grub/phcoder/multiboot.pdf and the ELF 64 specification at http://www.uclibc.org/docs/elf-64-gen.pdf.
 
-Note that the multiboot specification for the ELF-sections tag seems to be wrong for ELF 64 kernels: The `num`, `entsize`, and `shndx` fields seem to be `u32` instead of `u16` (but I'm not sure on this).
+Below is the draft for a blog post about this. I don't plan to finish it but maybe it's helpful as documentation.
+
+## The Multiboot 2 Information Structure
+The Multiboot information structure looks like this:
+
+Field            | Type
+---------------- | -----------
+total size       | u32
+reserved         | u32
+tags             | variable
+end tag = (0, 8) | (u32, u32)
+
+There are many different types of tags, but they all have the same beginning:
+
+Field         | Type
+------------- | -----------------
+type          | u32
+size          | u32
+other fields  | variable
+
+All tags are 8-byte aligned. The last tag must be the _end tag_, which is a tag of type `0` and size `8`.
+
+## Tags
+
+We are interested in two tags, the _Elf-symbols_ tag and the _memory map_ tag. For a full list of possible tags see section 3.4 in the Multiboot 2 specification ([PDF][Multiboot 2]).
+
+[Multiboot 2]: http://nongnu.askapache.com/grub/phcoder/multiboot.pdf
+
+### The Elf-Symbols Tag
+The Elf-symbols tag contains a list of all sections of the loaded [ELF] kernel. It has the following format:
+
+[ELF]: http://www.uclibc.org/docs/elf-64-gen.pdf
+
+Field                       | Type
+--------------------------- | -----------------
+type = 9                    | u32
+size                        | u32
+number of entries           | u32
+entry size                  | u32
+string table                | u32
+section headers             | variable
+
+Note that this format differs from the description in the Multiboot specification because if seems to be wrong for ELF 64 kernels: The `number of entries`, `entry size`, and `string table` fields seem to be `u32` instead of `u16` (but I'm not sure on this).
+
+The section headers are just copied from the ELF file, so we need to look at the ELF specification to find the corresponding structure definition. Our kernel is a 64-bit ELF file, so we need to look at the ELF-64 specification ([PDF][ELF specification]). According to section 4 and figure 3, a section header has the following format:
+
+[ELF specification]: http://www.uclibc.org/docs/elf-64-gen.pdf
+
+Field                       | Type             | Value
+--------------------------- | ---------------- | -----------
+name                        | u32              | string table index
+type                        | u32              | `0` (unused), `1` (section of program), `3` (string table), `8` (uninitialized section), etc.
+flags                       | u64              | `0x1` (writable), `0x2` (loaded), `0x4` (executable), etc.
+address                     | u64              | virtual start address of section (0 if not loaded)
+file offset                 | u64              | offset (in bytes) of section contents in the file
+size                        | u64              | size of the section in bytes
+link                        | u32              | associated section (only for some section types)
+info                        | u32              | extra information (only for some section types)
+address align               | u64              | required alignment of section (power of 2)
+entry size                  | u64              | contains the entry size for table sections (e.g. string table)