日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

一步步编写操作系统 33 利用bios中断0x15子功能0xe820获取内存

發(fā)布時(shí)間:2023/12/10 windows 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一步步编写操作系统 33 利用bios中断0x15子功能0xe820获取内存 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

咱們先介紹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)用步驟是:

  • 填寫(xiě)好“調(diào)用前輸入”中列出的寄存器。
  • 執(zhí)行中斷調(diào)用int 0x15。
  • 在CF位為0的情況下,“返回后輸出”中對(duì)應(yīng)的寄存器便會(huì)有對(duì)應(yīng)的結(jié)果。
  • 本內(nèi)容摘自《操作系統(tǒng)真象還原》,請(qǐng)大家支持正版,多謝。

    總結(jié)

    以上是生活随笔為你收集整理的一步步编写操作系统 33 利用bios中断0x15子功能0xe820获取内存的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。