2019年7月4日 星期四

自製64位元作業系統05──偵測記憶體

我們利用BIOS中斷來偵測記憶體的數據。偵測記憶體的方法是利用0x15號中斷,再配上0x88、0xE801、0xE820這三種功能號,就可以讀取記憶體的各種數據。
其中,前兩個方法都有許多大小上的限制(它們比較老舊),所以我們只實作利用0xE820功能號的偵測法。
#=====================================================================
# int 0xE820
# (eax = 0xe820) (ebx = 0) (es:di = 要放smap的位置) (ecx = 緩衝區大小 = 32) (edx = 0x534D4150(神祕數字,代表SMAP))
# 這個中斷一次會回傳一個SMAP結構,所以每次要把di加一段距離
# 回傳值中,ecx的值是實際寫入的大小,但為了方便,就把每一個都用32Bytes
# 第一次ebx設為0,之後保留ebx的回傳值,繼續呼叫下一次中斷,直到ebx=0,就代表讀完了
#=====================================================================
getRam:
  movl $0xe820, %eax
  xorl %ebx, %ebx
  movw $0x400, %di
  movl $32, %ecx
  movl $0x534D4150, %edx
getRam_loop:
  int $0x15
  movl %eax, %edx
  movl $0xe820, %eax
  movl $32, %ecx
  addw $32, %di
  cmpl $0, %ebx # 若ebx 不等於 0,則跳回前面繼續
  jne getRam_loop
  ret 
在其他地方呼叫這個函式後,我們可以利用bochs模擬器的除錯功能,來看看我們有沒有成功讀取。
0x0000000000008000 :    0x00000000      0x00000000      0x0009f000      0x00000000
0x0000000000008010 :    0x00000001      0x00000000      0x00000000      0x00000000
像是上述的內容,就是代表從0x0開始,大小是0x9f000的記憶體,且其種類是0x1,代表可用的記憶體。



👉【幫我們一個忙!】👈

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

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