Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2014
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.49 KB | None | 0 0
  1. unsigned int
  2. *get_page_directory (void)
  3. {
  4. return (unsigned int *)0x9c000;
  5. }
  6.  
  7. void
  8. add_page (unsigned int v_addr, unsigned int p_addr)
  9. {
  10. int offset = v_addr / (4096*1024);
  11. int i;
  12. unsigned int *page_directory = get_page_directory();//Make sure that this address is properly page aligned
  13. unsigned int *page_table = page_directory + (1024 * (offset+1));
  14. for (i=0;i<1024;i++) {
  15. page_table[i] = p_addr | 3; // attributes: supervisor level, read/write, present.
  16. p_addr = p_addr + 4096; //advance the address to the next page boundary
  17. }
  18. page_directory[offset] = page_table;
  19. page_directory[offset] |= 3;// attributes: supervisor level, read/write, present
  20. }
  21.  
  22. void
  23. page_initialize (void)
  24. {
  25. unsigned int *page_directory = get_page_directory();//Make sure that this address is properly page aligned
  26. //set each entry to not present
  27. int i = 0;
  28. for (i = 0; i < 1024; i++) {
  29. //attribute: supervisor level, read/write, not present.
  30. page_directory[i] = 0 | 2;
  31. }
  32.  
  33. add_page(0, 0);
  34. add_page(0x400000, 0x400000);
  35. add_page(0x800000, 0x800000);
  36. add_page(0xC00000, 0xC00000);
  37. add_page(0xFD000000, 0xFD000000);
  38.  
  39.  
  40. __asm__ volatile("mov %0, %%cr3":: "b"(page_directory));
  41. //reads cr0, switches the "paging enable" bit, and writes it back.
  42. unsigned int cr0;
  43. asm volatile("mov %%cr0, %0": "=b"(cr0));
  44. cr0 |= 0x80000000;
  45. asm volatile("mov %0, %%cr0":: "b"(cr0));
  46.  
  47. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement