低画分区Lowmemory.PPT

  1. 1、本文档共63页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
低画分区Lowmemory

Chapter 13 MMAP與DMA 13.1 Linux的記憶體管理 主要是描述用於控管記憶體的各種資料結構,相當冗長.有了必要的基礎知識後,我們就可以開始使用這些結構. 13.1.1 位址的分類(1/4) 作業系統的分類上,Linux是一種虛擬記憶系統. 虛擬記憶體系統將邏輯世界(軟體)與現實世界(硬體)分隔開來,最大的好處是軟體可配置的空間超過RAM的實際容量. 另一項優點是核心可在執行期改變行程的部分記憶空間. Linux系統上不只有兩種位址,而且每種位址都有其特殊用途. 但核心原始程式裡沒有明確定義何種位只適用何種情況,所以必須相當謹慎小心. 13.1.1 位址的分類(2/4) 13.1.1 位址的分類(3/4) 使用者虛擬位址(User Virtual Address) 簡稱為虛擬位址,位址寬度隨CPU架構而定 實體位址(Physical Address) 位址匯流排上的位址,寬度依CPU而定,但不一定與暫存器相符 匯流排位址(Bus Address) 用於週邊匯流排與記憶體的位址,具有高度的平台依存性 核心邏輯位址(Kernel Logical Address) 與實體位址只差距幾段固定偏移量,通常存放在unsigned long或void *型別變數上. kmalloc() 核心虛擬位址(Kernel Virtual Address) 與實體位址不一定有直接對應關係,通常存放在指標變數中. vmalloc() 13.1.1 位址的分類(4/4) asm/page.h定義了兩個可換算位址的巨集. 如果你有一個邏輯位址,__pa()巨集可換算出其對應的實體位址. __va()可將實體位址換算回邏輯位址,但僅限於低畫分區的實體位址才有效,因為高畫分區沒有邏輯位址. 不同的核心函式,需要不同類型的位址.如果各種位址都有不同的C型別,程式師就可明確知道何種情況該用何種位址.然而,我們並沒有如此幸運,所以認命吧. 13.1.2 高低劃分區 核心邏輯位址與核心虛擬位址之間的差異,再配備超大量記憶體的32-bits系統上才凸顯出來. 低畫分區(Low memory) 在kernel-space裡可用邏輯位址來定位的記憶體 高畫分區(High memory) 沒有邏輯位址的記憶體,因為安裝超過定址範圍的實體記憶體. 高低區之間的分界線,是核心在開機期間依據BIOS提供的資訊來決定的.在i386系統,分界通常位於1GB以下.這是核心自己設下的限制,因為核心必須將32-bit位址空間劃分成kernel-space與user-space兩大部份. 13.1.3 記憶體對應表與struct page(1/2) 由於高畫分區沒有邏輯位址,處理記憶體的核心函式,紛紛改用struct page來代替邏輯位址. page結構紀錄了關於實體記憶頁的一切資訊.系統上的每一頁記憶體,都有一個專屬的struct page,幾個重要欄位如下. atomic_t count; 此記憶頁的用量計次.當降為0時,會被釋放回自由串列. wait_queue_head_t wait; 正在等待此記憶頁的所有行程. void *virtual; 本記憶頁對應的核心虛擬位址;若無(高劃分)則指向NULL. unsigned long flags; 一組描述記憶頁狀態的位元旗標.如PG_locked、PG_reserved. 13.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); void kunmap(struct page *page); kmap()可傳回系統上任何記憶頁的核心虛擬位址. 如果分頁表剛好沒有空位,kmap()有可能會休眠. 13.1.4 分頁表(1/7) 每當程式用到一個虛擬位址,CPU必須先將它轉換成實體位址,然後才能存取實體記憶體. 轉換過程中,虛擬位址被拆成幾個位元欄,每個位元欄分別被當成不同陣列的索引,這些陣列就稱為分頁表. 不管在何種平台上,Linux統一使用三層分頁表,是為了讓位址範圍能被稀疏分布,即使硬體只支援兩層,或是另有特殊的虛擬-實體位址對應法. 一致的三層式架構,使得Linux核心成是不必寫一大堆#ifdef敘

文档评论(0)

xiaozu + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档