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 #-o
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/