一步步编写操作系统 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中断获取物理内存大小的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 与比亚迪联合打造 丰田bZ SND专利图
- 下一篇: 一步步编写操作系统 42 用c语言编写内