- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
MMAP與DMA 15.1 Linux的記憶體管理 主要是描述用於控管記憶體的各種資料結構,相當冗長.有了必要的基礎知識後,我們就可以開始使用這些結構. 15.1.1 位址的分類(1/4) 作業系統的分類上,Linux是一種虛擬記憶系統. 虛擬記憶系統將邏輯世界(軟體)與現實世界(硬體)分隔開來,最大的好處是軟體可配置的空間超過RAM的實際容量. 另一項優點是核心可在執行期改變行程的部分記憶空間. Linux系統上不只有兩種位址(虛擬、實體),而且每種位址都有其特殊用途. 但核心原始程式裡沒有明確定義何種位址適用何種情況,所以必須相當謹慎小心. 15.1.1 位址的分類(3/4) 使用者虛擬位址(User Virtual Address) 簡稱為虛擬位址,位址寬度隨CPU架構而定 實體位址(Physical Address) CPU與記憶體間的位址,寬度依CPU而定,但不一定與CPU暫存器相符 匯流排位址(Bus Address) 週邊匯流排與記憶體的位址,具有高度的平台相依性 核心邏輯位址(Kernel Logical Address) 構成核心的正常位址空間,他們對應到所有主記憶體,而且通常被當作實體位址來使用。邏輯位址與實體位址只差距一段固定偏移量,通常存放在unsigned long或void *型別變數上。kmalloc()所傳回的記憶體,就是以邏輯位址來定位。 核心虛擬位址(Kernel Virtual Address) 核心虛擬位址跟邏輯位址不同之處,在於核心虛擬位址與實體位址不一定有直接對應關係,虛擬位址通常存放在指標變數中。vmalloc()配置而來的記憶體位址是以虛擬位址來表示。 15.1.1 位址的分類(4/4) asm/page.h定義了兩個可換算位址的巨集. 如果你有一個邏輯位址,__pa()巨集可換算出其對應的實體位址 __va()可將實體位址換算回邏輯位址,但僅限於低記憶體的實體位址才有效,因為高記憶體沒有邏輯位址 15.1.2 高低記憶體 核心邏輯位址與核心虛擬位址之間的差異,再配備超大量記憶體的32-bits系統上才凸顯出來. 低記憶體(Low memory) 存在kernel-space裡,可用邏輯位址來定位的記憶體 高記憶體(High memory) 沒有邏輯位址的記憶體,因為系統上安裝超過32-bits定址範圍的實體記憶體. 高低記憶體之間的分界線 核心在開機期間依據BIOS提供的資訊來決定的.在i386系統,分界通常位於1GB以下.這是核心自己設下的限制,因為核心必須將32-bit位址空間劃分成kernel-space與user-space兩大部份. 15.1.3 記憶體對應表與struct page(1/2) 由於高記憶體沒有邏輯位址,處理記憶體的核心函式,紛紛改用struct page來代替邏輯位址. page結構紀錄了關於實體記憶頁的一切資訊.系統上的每一頁記憶體,都有一個專屬的struct page,幾個重要欄位如下. atomic_t count; 此記憶頁的用量計次.當count降為0時,記憶頁會被釋放回自由串列. void *virtual; 本記憶頁對應的核心虛擬位址;若無對應的虛擬位址則指向NULL. unsigned long flags; 一組描述記憶頁狀態的位元旗標.如PG_locked、PG_reserved. 15.1.3 記憶體對應表與struct page(2/2) 為了方便在struct page指標與虛擬位址之間轉換,Linux定義了一組方便的函式與巨集: struct page *virt_to_page(void *kaddr); 將核心邏輯位址轉換成對應的struct page指標. void *page_address(struct page *page); 傳回指定的page的核心虛擬位址.位於記憶體的記憶頁除非已事先映射到虛擬位址空間,否則沒有虛擬位址. #include linux/highmem.h void *kmap(struct page *page); kmap()可傳回系統上任何記憶頁的核心虛擬位址. Page在低記憶體→傳回該記憶頁的邏輯位址 Page在高記憶體→將他映射到特殊的虛擬空間 void kunmap(struct page *page); 將kmap()所建立的特殊對應解除 15.1.4 虛擬記憶區(Virtual Memory Areas)(1/6) 核心需要一個較高層級的機制,才能處理行程所見到的記憶體佈局.在Linux,這機制稱為虛擬記憶區(virtual memory areas),通常簡稱為區域或VMA. 用來管理使用者行程的虛擬位址空間的各個區域 行程空間的虛擬位址空間,由下列區域構成
文档评论(0)