OSDev.org https://forum.osdev.org/ |
|
Question about 32-bits paging https://forum.osdev.org/viewtopic.php?f=1&t=34667 |
Page 1 of 1 |
Author: | NotSchur [ Fri Sep 20, 2019 10:54 am ] |
Post subject: | Question about 32-bits paging |
Hi all! I'm getting back into osdev and there is one thing I can't figure out about paging. My code for getting a page table entry from a virtual address looks basically like this Code: uint32_t dir_index = DIRECTORY_INDEX(virt); uint32_t table_index = TABLE_INDEX(virt); directory_entry_t* dir = (directory_entry_t*) 0xFFFFF000; page_t* table = ((uint32_t*) 0xFFC00000) + (0x400 * dir_index); if (dir[dir_index] & PAGE_PRESENT) { return &table[table_index]; } It's about the same code given in the wiki page about paging (https://wiki.osdev.org/Paging#Manipulation) and it works like a charm. My question: why is table not calculated like in the following code? Why does my current code work? Code: page_t* table = ((uint32_t*) 0xFFC00000) + (dir_index << 12); Why do we multiply the index by 0x400 (i.e left-shift by 10) instead of multiplying by 0x1000? Multiplying by 0x400 is like left-shifting by 10 bits, so the index in the page directory should be mangled by 2 bits... I don't get it. Isn't that address translated the same way every other linear address is? That's the last thing standing in my way for understanding paging |
Author: | alexfru [ Fri Sep 20, 2019 11:12 am ] |
Post subject: | Re: Question about 32-bits paging |
NotSchur wrote: Code: page_t* table = ((uint32_t*) 0xFFC00000) + (0x400 * dir_index); My question: why is table not calculated like in the following code? Why does my current code work? Code: page_t* table = ((uint32_t*) 0xFFC00000) + (dir_index << 12); Why do we multiply the index by 0x400 (i.e left-shift by 10) instead of multiplying by 0x1000? Multiplying by 0x400 is like left-shifting by 10 bits, so the index in the page directory should be mangled by 2 bits... I don't get it. It's C. You're adding to a pointer to uint32_t. Adding 1 advances the pointer to the next uint32_t (4 bytes away). |
Author: | linguofreak [ Fri Sep 20, 2019 3:32 pm ] |
Post subject: | Re: Question about 32-bits paging |
NotSchur wrote: My question: why is table not calculated like in the following code? Why does my current code work? Code: page_t* table = ((uint32_t*) 0xFFC00000) + (dir_index << 12); To expand on alexfru's response, if this code snippet were instead: Code: page_t* table = (uint32_t*)((0xFFC00000) + (dir_index << 12)); So that you cast to a pointer *after* adding dir_index, it should work identically to your code. |
Author: | NotSchur [ Fri Sep 20, 2019 4:33 pm ] |
Post subject: | Re: Question about 32-bits paging |
That makes perfect sense now! Kicking myself for not having spotted this Thanks a lot to both of you! |
Page 1 of 1 | All times are UTC - 6 hours |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |