其中,前兩個方法都有許多大小上的限制(它們比較老舊),所以我們只實作利用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基金會的贊助。
您只需要支持我們,完全不會花到錢!