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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

一步步编写操作系统 34 内核利用bios中断获取物理内存大小

發布時間:2023/12/10 windows 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一步步编写操作系统 34 内核利用bios中断获取物理内存大小 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

接上文,另一個獲取內存容量的方法是bios 0x15中斷的子功能0xE801。

此方法雖然簡單,但功能也不強大,最大只能識別4G內存,不過這對咱們32位地址總線足夠了。稍微有點不便的是,此方法檢測到的內存是分別存放到兩組寄存器中的。低于15MB的內存是以1KB為單位大小來記錄,單位數量在寄存器AX和CX中記錄,其中AX和CX的值是一樣的,所以在15MB空間以下的實際內存容量=AX*1024。AX、CX最大值為0x3c00,即0x3c00*1024=15MB。16MB~4GB是以64KB為單位大小來記錄,單位數量在寄存器BX和DX中記錄,其中BX和DX的值是一樣的,所以16MB以上空間的內存實際大小=BX*64*1024,不用在意BX和DX最大值是多少,前面說過啦,只支持4G空間,您可以反推一下看看。

咱們還是列個表,將其用法分為輸入、輸出兩部分介紹。

?

再次提醒,中斷返回后,AX和CX中,其值的單位是1KB,而BX和DX的單位是64KB。

當初我看到這兒的時候,腦子中不禁彈出了兩個問號:

1 為什么要分“前15MB”和“16MB以上”這兩部分來展示4GB內存?

2 為什么寄存器結果是重復的?如寄存器AX和CX相等,BX和DX相等?

為了解決第1個問題,讓我們實際測試下,讓事實說話。測試方法是修改bochs配置文件bochsrc.disk中的內存容量參數megs,然后執行bios中斷。測試結果見表

?

表中“實際物理內存”和“檢測到的內存大小”,它們之間總是差1MB,言外之意是,總有1MB內存不可用。這是怎么回事?真是一波未平一波又起啊。

很多問題都是祖上傳下來的^_^,即著名的歷史遺留問題。80286是擁有24位地址線,其尋址空間是16MB。當時有一些ISA設備要用到地址15MB以上的內存做為緩沖區,也就是此緩沖區為1MB大小,所以硬件系統就把這部分內存保留下來,操作系統不可以用此段內存空間。保留的這部分內存區域就像不可以訪問的黑洞,這就成了內存空洞memory hole。現在雖然很少很少能碰到這些老ISA設備了,但為了兼容,這部分空間還是保留下來,只不過是通過bios選項的方式由用戶自己選擇是否開啟。bios廠商不同,一般的菜單選項名稱也不相同,不過大概意思都差不多。比如咱們開機進入bios界面后,會有類似這樣的選項:

memory hole at address 15m-16m

將此選項設為enable或disable便開啟或關閉對這類擴展ISA設備的支持。

話說,起初定義這個0xe801子功能,就是為了支持擴展ISA服務。現在來回答這個問題。

如果檢測到的內存容量大于等于16MB,bios 0x15中斷返回的結果中,AX*1024必然是小于等于15MB,而BX*64*1024肯定大于0。所以,內存容量分成兩部分展示,只要符合這兩個結果,就能檢查出內存空洞。當然如果物理內存在16MB以下,此方法就不靈了,但檢測到的內存依然會小于實際內存1MB。所以實際的物理內存大小,在檢測結果的基礎上一定要加上1MB。

至于第2個疑問,手冊上是這么說的:

Not sure what this difference between the "Extended" and "Configured" numbers are, but they appear to be identical, as reported from the BIOS.

這句英文中的兩個單詞"Extended"和"Configured"已經在表5-4的“用途”列中出現了,后面數字相同的為一組,比如AX的用途為 Extended 1,CX的用途為Configured 1,AX和CX為一組,BX和DX類同。

這句英文大概意思是:不清楚"Extended" 和 "Configured"之間的區別,但它們似乎是相同的,bios就是這樣說的。咱們這里暫時就不深究了,畢竟咱們只是想拿到內存容量,以后等咱們有精力了再深入學習吧。

此中斷的調用步驟:

1將AX寄存器寫入0xE801。

2執行中斷調用int 0x15。

3在CF位為0的情況下,“返回后輸出”中對應的寄存器便會有對應的結果.

總結

以上是生活随笔為你收集整理的一步步编写操作系统 34 内核利用bios中断获取物理内存大小的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。