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