低画分区lowmemory

上传人:小** 文档编号:89501629 上传时间:2019-05-26 格式:PPT 页数:63 大小:435.01KB
返回 下载 相关 举报
低画分区lowmemory_第1页
第1页 / 共63页
低画分区lowmemory_第2页
第2页 / 共63页
低画分区lowmemory_第3页
第3页 / 共63页
低画分区lowmemory_第4页
第4页 / 共63页
低画分区lowmemory_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《低画分区lowmemory》由会员分享,可在线阅读,更多相关《低画分区lowmemory(63页珍藏版)》请在金锄头文库上搜索。

1、Chapter 13,MMAP與DMA,13.1 Linux的記憶體管理,主要是描述用於控管記憶體的各種資料結構,相當冗長.有了必要的基礎知識後,我們就可以開始使用這些結構.,13.1.1 位址的分類(1/4),作業系統的分類上,Linux是一種虛擬記憶系統. 虛擬記憶體系統將邏輯世界(軟體)與現實世界(硬體)分隔開來,最大的好處是軟體可配置的空間超過RAM的實際容量. 另一項優點是核心可在執行期改變行程的部分記憶空間. Linux系統上不只有兩種位址,而且每種位址都有其特殊用途. 但核心原始程式裡沒有明確定義何種位只適用何種情況,所以必須相當謹慎小心.,13.1.1 位址的分類(2/4),1

2、3.1.1 位址的分類(3/4),使用者虛擬位址(User Virtual Address) 簡稱為虛擬位址,位址寬度隨CPU架構而定 實體位址(Physical Address) 位址匯流排上的位址,寬度依CPU而定,但不一定與暫存器相符 匯流排位址(Bus Address) 用於週邊匯流排與記憶體的位址,具有高度的平台依存性 核心邏輯位址(Kernel Logical Address) 與實體位址只差距幾段固定偏移量,通常存放在unsigned long或void *型別變數上. kmalloc() 核心虛擬位址(Kernel Virtual Address) 與實體位址不一定有直接對應關

3、係,通常存放在指標變數中. vmalloc(),13.1.1 位址的分類(4/4),定義了兩個可換算位址的巨集. 如果你有一個邏輯位址,_pa()巨集可換算出其對應的實體位址. _va()可將實體位址換算回邏輯位址,但僅限於低畫分區的實體位址才有效,因為高畫分區沒有邏輯位址. 不同的核心函式,需要不同類型的位址.如果各種位址都有不同的C型別,程式師就可明確知道何種情況該用何種位址.然而,我們並沒有如此幸運,所以認命吧.,13.1.2 高低劃分區,核心邏輯位址與核心虛擬位址之間的差異,再配備超大量記憶體的32-bits系統上才凸顯出來. 低畫分區(Low memory) 在kernel-spac

4、e裡可用邏輯位址來定位的記憶體 高畫分區(High memory) 沒有邏輯位址的記憶體,因為安裝超過定址範圍的實體記憶體. 高低區之間的分界線,是核心在開機期間依據BIOS提供的資訊來決定的.在i386系統,分界通常位於1GB以下.這是核心自己設下的限制,因為核心必須將32-bit位址空間劃分成kernel-space與user-space兩大部份.,13.1.3 記憶體對應表與struct page(1/2),由於高畫分區沒有邏輯位址,處理記憶體的核心函式,紛紛改用struct page來代替邏輯位址. page結構紀錄了關於實體記憶頁的一切資訊.系統上的每一頁記憶體,都有一個專屬的str

5、uct 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 *vi

6、rt_to_page(void *kaddr); 將核心邏輯位址轉換成對應的struct page指標. void *page_address(struct page *page); 傳回指定的page的核心虛擬位址.高劃分記憶頁除非已事先映射到虛擬位址空間,否則沒有虛擬位址. #include void *kmap(struct page *page); void kunmap(struct page *page); kmap()可傳回系統上任何記憶頁的核心虛擬位址. 如果分頁表剛好沒有空位,kmap()有可能會休眠.,13.1.4 分頁表(1/7),每當程式用到一個虛擬位址,CPU必須先將

7、它轉換成實體位址,然後才能存取實體記憶體. 轉換過程中,虛擬位址被拆成幾個位元欄,每個位元欄分別被當成不同陣列的索引,這些陣列就稱為分頁表. 不管在何種平台上,Linux統一使用三層分頁表,是為了讓位址範圍能被稀疏分布,即使硬體只支援兩層,或是另有特殊的虛擬-實體位址對應法. 一致的三層式架構,使得Linux核心成是不必寫一大堆#ifdef敘述,就可以同時支援兩層與三層式處理器. 在只提供兩層分頁表的硬體上,多出來的中間層會被編譯器予以“最佳化”,所以不會造成額外負擔.,13.1.4 分頁表(3/7),頂層頁目錄(Page Directory, PGD) 第一層的分頁表.PGD是一個由pgd_

8、t構成的陣列,每一個pgd_t各自指向一個第二層的分頁表. 中層頁目錄(Page Mid-level Directory, PMD) 第二層的分頁表.PMD是一個由pmd_t構成的陣列,每個pmd_t都是指向第三層分頁表的指標.在只有兩層分頁表的處理器上,由於缺乏實體上的PMD,所以其PMD被宣告成只有一個pmd_t的陣列,而這唯一的pmd_t指標是指向PMD自己. 分頁表(Page Table) 第三層的分頁表.為一個由分頁表項目(Page Table Entry, PTE)所構成的陣列,核心使用pte_t型別來表示分頁表項目,pte_t的直就是資料頁的實體位址.,13.1.4 分頁表(4/

9、7),對於各種硬體平台在記憶體管理機制上的差異,Linux以巧妙的安排來解決這個問題:將整個記憶體管理系統分為兩個部份,低階部份負責設定硬體的分頁機制,高階部分以一致的三層是分頁表來管理位址空間. 硬體上的差異,全部都隱藏在低階部份,這部份的程式必須按照平台的特性來寫,所以各種系統都不太一樣,但它們都呈現一致的三層式分頁表存在,而不必理會硬體上的差異. Linux以軟體手法模擬出來的三層式分頁表,可用和所定義的一組符號來存取:,13.1.4 分頁表(5/7),PTRS_PER_PGD PTRS_PER_PMD PTRS_PER_PTE 各層分頁表的大小.在只有兩層分頁表的系統上,PTRS_PE

10、R_PMD式設定為1,藉此避免處理中間層的負擔. unsigned pdg_val(pgd_t pgd); unsigned pmg_val(pmd_t pmd); unsigned pte_val(pte_t pte); 這些巨集用於取得特定型別項目的unsigned值.pgd_t、pmd_t、pte_t的實際型別,隨底層硬體與核心組態而定.,13.1.4 分頁表(6/7),pgd_t *pgd_offset(struct mm_struct *mm, unsigned long address); pmd_t *pmd_offset(pgd_t *dir, unsigned long ad

11、dress); pte_t *pte_offset(pmd_t *dir, unsigned long address); 這些內插函式用於取得address所關聯的pgd、pmd和pte項目. 對於user-space的目前行程,此指標關聯的記憶對應表(memory map)是current-mm;在kernel-space則是以&init_mm來描述此指標. 在只有兩層分頁表的系統,pmd_offset(dir,add)被定義成(pmd_t *)dir,也就是將pmd“翻蓋”在pgd之上.,13.1.4 分頁表(7/7),struct page *pte_page(pte_t pte) 找

12、出pte所代表的struct page,並傳回該結構的指標.處理分頁表的程式通常使用pte_page(),而非pte_val(),因為pte_page()能處理分頁表項目在處理器上的實際格式,並傳回我們通常想要的struct page指標. pte_present(pte_t pte) 此巨集傳回一個邏輯值,表示pte所指的記憶頁目前是否在主記憶體上.但分頁表本身必定留在主記憶體裡,如此可以簡化核心程式的寫作. 身為驅動程式設計者的你,大略知道如何管理記憶頁就夠了,因為需要自己處理分頁表的機會並不多.詳情請見include/asm/和mm/目錄之下.,13.1.5 虛擬記憶區(Virtual

13、Memory Areas)(1/6),核心需要一個較高層級的機制,才能處理行程所見到的記憶體佈局.在Linux,這機制稱為虛擬記憶區(virtual memory areas),通常簡稱為區域或VMA. 行程的記憶對應表,由下列區域構成: 一個存放程式碼(executable binary)的區域.通常稱為text. 一個存放資料的區域.包括有初值資料,沒初值資料以及堆疊. 每一個有效的對應關係(memory mapping),各有一個區域.,13.1.5 虛擬記憶區(Virtual Memory Areas)(2/6),特定行程的各個VMA,可從/proc/pid/maps看到. 各欄位的格

14、式如下: start-end perm offset major:minor inode imagename,rootsip root# cat /proc/1/maps 08048000-0804e000 r-xp 00000000 03:02 405289 /sbin/init # 程式區(text) 0804e000-0804f000 rw-p 00006000 03:02 405289 /sbin/init # 資料區(data) 0804f000-08052000 rwxp 00000000 00:00 0 # bss(映射到page0) 40000000-40015000 r-xp

15、 00000000 03:02 1149683 /lib/ld-2.3.2.so # test 40015000-40016000 rw-p 00014000 03:02 1149683 /lib/ld-2.3.2.so # data 40016000-40017000 rw-p 00000000 00:00 0 # ld.so 的 bss 42000000-4212e000 r-xp 00000000 03:02 809632 /lib/tls/libc-2.3.2.so # text 4212e000-42131000 rw-p 0012e000 03:02 809632 /lib/tls

16、/libc-2.3.2.so # data 42131000-42133000 rw-p 00000000 00:00 0 # libc.si的bss bfffe000-c0000000 rwxp fffff000 00:00 0 # 堆疊區(映射到page 0),13.1.5 虛擬記憶區(Virtual Memory Areas)(3/6),上面每一欄除了imagename之外,都分別對應到struct vm_area_struct裡的欄位,這些欄位意義如下: start-end VMA前後邊界的虛擬位址 perm VMA的存取位元遮罩 offset 檔案從何處開始映射到此VMA的起點 major:minor 映射檔案所在裝置(磁碟,分割)的主次編號 inode 被映射檔案的inode編號 imagename 被映射檔案(通常是可執行檔)的名稱 要實作mmap作業方法的驅動程式,必須填寫一個VMA結構,放在要求映射裝置的行程的位址空間裡.,13.1.5 虛擬記憶區(Virtual

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号