diff --git a/Booting/linux-bootstrap-4.md b/Booting/linux-bootstrap-4.md index aecd8c1..6f79a27 100644 --- a/Booting/linux-bootstrap-4.md +++ b/Booting/linux-bootstrap-4.md @@ -419,9 +419,9 @@ So, we already know that before we can move into `64-bit` mode, we need to build The Linux kernel uses `4-level` paging, and generally we build 6 page tables: -* One `PML4` or `Page Map Level 4` table; -* One `PDP` or `Page Directory Pointer` table; -* Four Page Directory tables. +* One `PML4` or `Page Map Level 4` table with one entry; +* One `PDP` or `Page Directory Pointer` table with four entries; +* Four Page Directory tables with `2048` entries. Let's look at the implementation of this. First of all we clear the buffer for the page tables in memory. Every table is `4096` bytes, so we need clear `24` kilobytes buffer: @@ -468,7 +468,7 @@ In the next step we will build four `Page Directory` entries in the `Page Direct jnz 1b ``` -We put the base address of the page directory pointer which is `4096` or `0x1000` offset from the `pgtable` table in `edi` and the address of the first page directory pointer entry in `eax` register. Put `4` in the `ecx` register, it will be a counter in the following loop and write the address of the first page directory pointer table entry to the `edi` register. After this `edi` will contain the address of the first page directory pointer entry with flags `0x7`. Next we just calculate the address of following page directory pointer entries where each entry is `8` bytes, and write their addresses to `eax`. The next step is the building the `2048` page table entries with `2-MByte` pages: +We put the base address of the page directory pointer which is `4096` or `0x1000` offset from the `pgtable` table in `edi` and the address of the first page directory pointer entry in `eax` register. Put `4` in the `ecx` register, it will be a counter in the following loop and write the address of the first page directory pointer table entry to the `edi` register. After this `edi` will contain the address of the first page directory pointer entry with flags `0x7`. Next we just calculate the address of following page directory pointer entries where each entry is `8` bytes, and write their addresses to `eax`. The last step of building paging structure is the building of the `2048` page table entries with `2-MByte` pages: ```assembly leal pgtable + 0x2000(%ebx), %edi