Advertisement
Guest User

boot.s

a guest
Dec 21st, 2024
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.89 KB | Source Code | 0 0
  1. [BITS 32]
  2.  
  3. section .multiboot
  4. header_start:
  5. dd 0xe85250d6
  6. dd 0
  7. dd header_end - header_start
  8. dd 0x100000000 - (0xe85250d6 + 0 + (header_end - header_start))
  9. dw 0
  10. dw 0
  11. dd 8
  12. header_end:
  13.  
  14. KERNEL_OFFSET equ 0xffffffff80000000
  15.  
  16. section .bss
  17.  
  18. align 4096
  19. page:
  20. .p4:
  21. resb 4096
  22. .p3:
  23. resb 4096
  24. .p2:
  25. resb 4096
  26.  
  27. stack_bottom:
  28. resb 4096 * 4
  29. stack_top:
  30.  
  31. section .rodata
  32. gdt64:
  33. dq 0
  34. .code: equ $ - gdt64
  35. dq (1 << 43) | (1 << 44) | (1 << 47) | (1 << 53)
  36. .pointer:
  37. dw $ - gdt64 - 1
  38. dq gdt64 - KERNEL_OFFSET
  39.  
  40. section .text
  41. global start
  42. start:
  43. mov esp, (stack_top - KERNEL_OFFSET)
  44.  
  45. call setup_page_tables
  46. call enable_paging
  47.  
  48. lgdt [(gdt64.pointer - KERNEL_OFFSET)]
  49. jmp gdt64.code:(longmode_entry - KERNEL_OFFSET)
  50.  
  51. cli
  52. hlt
  53.  
  54. setup_page_tables:
  55. mov eax, (page.p3 - KERNEL_OFFSET)
  56. or eax, 0b11 ; present + writable
  57. mov [(page.p4 - KERNEL_OFFSET)], eax
  58.  
  59. mov eax, (page.p2 - KERNEL_OFFSET)
  60. or eax, 0b11 ; present + writable
  61. mov [(page.p3 - KERNEL_OFFSET)], eax
  62.  
  63. mov ecx, 0 ; loop counter
  64. .loop:
  65. mov eax, 0x200000 ; 2MiB
  66. mul ecx
  67. or eax, 0b10000011 ; present + writable + huge page
  68. mov [(page.p2 - KERNEL_OFFSET) + ecx * 8], eax
  69. inc ecx
  70. cmp ecx, 512
  71. jne .loop
  72. ret
  73.  
  74. enable_paging:
  75. mov eax, (page.p4 - KERNEL_OFFSET)
  76. mov cr3, eax
  77.  
  78. mov eax, cr4
  79. or eax, 1 << 5
  80. mov cr4, eax
  81.  
  82. ; long mode enable (LME)
  83. mov ecx, 0xC0000080
  84. rdmsr
  85. or eax, 1 << 8
  86. wrmsr
  87.  
  88. mov eax, cr0
  89. or eax, 1 << 31
  90. mov cr0, eax
  91.  
  92. ret
  93.  
  94. [BITS 64]
  95. extern kmain
  96. longmode_entry:
  97. mov ax, 0
  98. mov ss, ax
  99. mov ds, ax
  100. mov es, ax
  101. mov fs, ax
  102. mov gs, ax
  103.  
  104. add rsp, KERNEL_OFFSET
  105.  
  106. call kmain ; bootloop
  107.  
  108. cli
  109. nop
  110. hlt
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement