一步步编写操作系统 33 利用bios中断0x15子功能0xe820获取内存
咱們先介紹0xE820子功能,這是最靈活的內存獲取方式。
bios中斷 0x15的子功能0xE820能夠獲取系統的內存布局,由于系統內存各部分的類型屬性不同,bios就按照類型屬性來劃分這片系統內存,所以這種查詢則呈迭代式,每次bios只返回一種類型的內存信息,直到將所有內存類型返回完畢。子功能0xE820的強大之處是返回的內存信息較豐富,包括多個屬性字段,所以需要一種格式結構來組織這些數據。內存信息的內容是用地址范圍描述符來描述的,用于存儲這種描述符的結構稱之為地址范圍描述符ARDS,Address Range Descriptor Structure。見格式見表
?
此結構中的字段大小都是4字節,共5個字段,所以此結構大小為20字節。每次int 0x15之后,bios就返回這樣一個結構的數據。注意,ARDS結構中是用64位寬度的屬性來描述這段內存基地址(起始地址)及其長度,所以表中的基地址和長度都分為低32位和高32位兩部分。
其中的Type字段是用來描述這段內存的類型,這里所謂的類型是說明這段內存的用途,是可以被操作系統使用,還是保留起來不能用。Type字段的具體意義見表
為什么bios會按類型來返回內存信息呢?原因是這段內存可能是:
- 系統的ROM。
- ROM用到了這部分內存。
- 設備內存映射到了這部分內存。
- 由于某種原因,這段內存不適合標準設備使用。
由于我們是在32位環境下工作,所以在ARDS結構屬性中,我們只用到低32位屬性。BaseAddrLow+LengthLow是一片內存區域上限,單位是字節。正常情況下,不會出現較大的內存區域不可用的情況,除非安裝的物理內存極其的小。這意味著,在所有返回的ARDS結構里,此值最大的內存塊一定是操作系統可使用的部分,即主板上配置的物理內存容量。
bios中斷只是一段函數例程,調用它就要為其提供參數,現在介紹下bios中斷0x15的0xe820子功能需要哪些參數。
先介紹下此中斷例程的調用方法。下表是使用此中斷的方法,分輸入和輸出兩部分。
?
表中的ECX寄存器和ES:DI寄存器,是典型的“值-結果”型參數,即調用方提供了兩個變量做為被調用函數的參數,一個變量是緩沖區指針,另一個變量是緩沖區大小。被調用函數在緩沖區中寫入數據后,將實際所寫入的字節數記錄到緩沖區大小變量中。
根據上表中的說明,此中斷的調用步驟是:
本內容摘自《操作系統真象還原》,請大家支持正版,多謝。
總結
以上是生活随笔為你收集整理的一步步编写操作系统 33 利用bios中断0x15子功能0xe820获取内存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SharePoint2013 2019性
- 下一篇: 最近十年,美国GDP增长49%,印度增长