2019年7月27日 星期六

自製64位元作業系統15──進入32位元相容模式

  我們之前已經證明可以使用C語言了,不過我想了想,我希望在最快速度進入長模式,不想搞太多花樣,所以我們改成利用組合語言先繼續。我自己利用了一些時間,將我們之前的程式分成數個檔案,然後放到一個資料夾裡,讓我們的主要資料夾乾淨一些。我們之後利用之前讀取核心的方法,如法炮製,再做一個可以讀取kernel64.elf的程式,讓我們之後可以使用。
  我們首先要進入32位元相容模式,我們要設定一個Paging,先把0到2MiB的虛擬記憶體先映射到本身,讓我們可以繼續做接下來的動作。
bootEntry:
# Setup Page Table
  leal 0x1C0000, %edi
  movl %edi, %cr3
  xorl %eax, %eax
  movl $0x10000, %ecx

  rep stosl

  movl $0x1C1003, 0x1C0000
  movl $0x1C2003, 0x1C1000
  movl $0x1C3003, 0x1C2000

  leal 0x1C3000, %edi
  movl $3, %eax
  movl $512, %ecx

  .loop_low2mb_pg:
    movl %eax, (%edi)
    addl $0x1000, %eax
    addl $8, %edi
    loop .loop_low2mb_pg
然後我們就接著開啟PAE。
# Enable PAE
  movl %cr4, %eax
  orl $32, %eax
  movl %eax, %cr4
然後我們開啟MSR暫存器的LMBit進入長模式。
# EFER MSR
  movl $0xC0000080, %ecx
  rdmsr
  orl $256, %eax
  wrmsr
最後開啟分頁功能。
# Enable Paging
  movl %cr0, %eax
  orl $0x80000000, %eax
  movl %eax, %cr0


👉【幫我們一個忙!】👈

👋如果您喜歡這篇文章,請在下方按5個Like!
 ❤您的支持是我們最大的動力!

您只要登入帳號(Facebook、Google),在下方按5個Like,我們就會收到來自LikeCoin基金會的贊助。
您只需要支持我們,完全不會花到錢!