一步步编写操作系统 32 linux内核获取内存容量的方法
操作系統是計算機硬件的管家,它不僅要知道自己的安裝了哪些硬件,還得給出有效得當的管理措施,按照預定的一套管理策略使硬件資源得到合理的運用。但管理策略只是邏輯上的東西,是操作系統自圓其說的一套管理資源的方法,管理再漂亮,沒有硬件支撐也無能為力,真正干活的都是底層。
保護模式最“大”的特點就是尋址空間“大”,在進入保護模式之后,我們將接觸到虛擬內存、內存管理等。但這些和內存有關的概念都是建立在物理內存之上,無論理論概念說的多高大上,最終也要在物理內存上落實行動。為了在后期做好內存管理工作,咱們先得知道自己有多少物理內存才行。
在linux中有多種方法獲取內存容量,如果一種方法失敗,就會試用其它方法。比如在linux 2.6內核中,是用detect_memory函數來獲取內存容量的。其函數在本質上是通過調用bios中斷0x15實現的,分別是bios 中斷0x15的3個子功能,子功能號要存放到寄存器EAX或AX中,如下:
- EAX=0xE820:遍歷主機上全部內存。
- AX=0xE801: 分別檢測低15MB和16M~4GB之間的內存,最大支持4GB。
- AH=0x88:最多檢測出64MB內存,實際內存超過此容量也按照64MB返回。
bios中斷是實模式下的方法,只能在進入保護模式前調用。咱們效仿linux“不棄不舍”的精神,在實模式下也用這三種方法檢測完內存容量后再進入保護模式。如果一種方法獲取失敗,嘗試另一種方法,若三種方法都失敗了,由于無法獲取內存信息,后續程序無法加載,只好將機器掛起,停止運行。
bios中斷可以返回已安裝的硬件信息,由于bios及其中斷也只是一組軟件,它要訪問硬件也要依靠硬件提供的接口,所以,獲取內存信息,其內部是通過連續調用硬件的API(Application Program Interface,應用程序接口)來獲取內存信息的。另外,由于每次調用bios中斷都是有一定的代價的(比如至少要將程序的上下文保護起來以便從中斷返回時可以回到原點繼續向下執行),所以盡量在一次中斷中返回足量的信息,由用戶程序自己挑出重點內容。下面介紹的中斷便是這方面的典范。
bios 0x15中斷提供了豐富的功能,具體要調用的功能,需要在寄存器ax中指定。其中0xE8xx系列的子功能較為強大,0x15中斷的子功能0xE820和0xE801都可以用來獲取內存,區別是0xE820返回的是內存布局,信息量相對多一些,操作也相對復雜。而0xE801直接返回的是內存容量,操作適中,不繁不簡。上面還提到了子功能0x88也能獲取內存容量,這是最簡單的用法,不過操作越簡單,功能也就越薄弱。話說linux中的dmesg命令就與0xE820相關,可見其功能是很大的,之后就按照功能強弱的順序逐一介紹用法。
總結
以上是生活随笔為你收集整理的一步步编写操作系统 32 linux内核获取内存容量的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TFS(Team Foundation
- 下一篇: 驾驶证办信用卡额度多少