Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unsigned int
- *get_page_directory (void)
- {
- return (unsigned int *)0x9c000;
- }
- void
- add_page (unsigned int v_addr, unsigned int p_addr)
- {
- int offset = v_addr / (4096*1024);
- int i;
- unsigned int *page_directory = get_page_directory();//Make sure that this address is properly page aligned
- unsigned int *page_table = page_directory + (1024 * (offset+1));
- for (i=0;i<1024;i++) {
- page_table[i] = p_addr | 3; // attributes: supervisor level, read/write, present.
- p_addr = p_addr + 4096; //advance the address to the next page boundary
- }
- page_directory[offset] = page_table;
- page_directory[offset] |= 3;// attributes: supervisor level, read/write, present
- }
- void
- page_initialize (void)
- {
- unsigned int *page_directory = get_page_directory();//Make sure that this address is properly page aligned
- //set each entry to not present
- int i = 0;
- for (i = 0; i < 1024; i++) {
- //attribute: supervisor level, read/write, not present.
- page_directory[i] = 0 | 2;
- }
- add_page(0, 0);
- add_page(0x400000, 0x400000);
- add_page(0x800000, 0x800000);
- add_page(0xC00000, 0xC00000);
- add_page(0xFD000000, 0xFD000000);
- __asm__ volatile("mov %0, %%cr3":: "b"(page_directory));
- //reads cr0, switches the "paging enable" bit, and writes it back.
- unsigned int cr0;
- asm volatile("mov %%cr0, %0": "=b"(cr0));
- cr0 |= 0x80000000;
- asm volatile("mov %0, %%cr0":: "b"(cr0));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement