Linux核心設計與實現(十二) 記憶體管理

2021-06-23 00:23:55 字數 1977 閱讀 8502

一、基本概念

頁:核心把物理頁作為記憶體管理的基本單元。mmu(記憶體管理單元)是管理記憶體,並把虛擬位址轉換為實體地址的硬體。mmu已頁大小為單位管理系統中的也不。

從虛擬記憶體的角度來看,頁就是最小單位。當時必須理解一點,page結構與物理頁相關,並非與虛擬頁相關。

系統中的每個物理頁都要分配乙個這樣的結構體。

struct page

unsigned long     flags;   //頁的狀態,比如頁是不是髒的,是不是被鎖定在記憶體中

atomic_t     _count;//頁的引用計數,一般呼叫page_count()函式來檢查,不直接訪問

atomic_t     _mapcount;

unsigned long    private;

pgoff_tindex;

struct list_head      lru;

void  *virtual;  //頁的虛擬位址

......

區:核心把頁劃分為不同 的區,核心使用區對具有相似特徵的頁進行分組。

linux中主要使用四種區:

zone_dma dma使用的頁

zone_dma32 dma使用的頁,只能被32位裝置訪問

zone_normal正常可定址的頁

zone_highem動態對映的頁

在x86-32上,zone_dma :   <16mb,zone_normal:  16~896mb;  zone_highem:  > 896mb

每個區都使用struct zone表示,結構體較大,在中定義

二、記憶體分配

1、獲取頁

alloc_page(gfp_mask)只分配一頁,返回指向頁結構的指標

alloc_pages(gfp_mask, order)分配2^order個頁,返回指向頁結構的指標

__get_free_page(gfp_mask)只分配一頁,返回指向其邏輯位址的指標

__get_free_pages(gfp_mask, order) 分配2^order個頁,返回指向其邏輯位址的指標

get_zeroed_page(gfp_mask) 只分配一頁,

讓內容填充0,返回指向其邏輯位址的指標

void _free_pages(struct page*page, unsigned int order);

void free_pages(unsigned long addr, unsigned int order);

void free_page(unsigned long addr);

2、獲取較少位元組的連續實體地址記憶體

void *kmalloc(size_t size, gfp_t flags);

void kfree(const void *ptr);

3、獲取非連續的實體地址記憶體

void *vmalloc(unsigned long size);

void vfree(const void *addr);

4、slab分頻器

struct kmem_cache *kmem_cache_create(const char *name,   //快取記憶體的名字

size_t size, //快取記憶體中每個元素的大小

size_t align,// slab內第乙個物件的偏移,用了確保在業內進行特定的對齊

unsigned long flags,

void (*octor)(void *));// 快取記憶體的建構函式,在新的頁追加到快取記憶體時,建構函式才被呼叫

int kmen_cache_destroy(struct kmem_cache (cachep);

//  從快取中分配物件

void *keme_cache_alloc( struct kmem_cache , gfp_t flags);

//  釋放物件

void keme_cache_free( struct kmem_cache , void *objp);

linux 核心設計與實現相關

有待繼續補充。第一章 linux核心簡介 需要注意 核心開發其實並不難。第二章 從核心出發 核心開發需要注意 1 沒有c庫,c庫太大了 2 沒有記憶體保護機制 3 不要輕易使用浮點數 4 可移植的重要性 5 同步和併發 疑問 編譯和安裝核心?必須在linux下麼?其他機器安裝了gcc編譯器呢?能否編...

Linux核心設計與實現總結。

1.程序管理。本章主要是介紹程序的乙個靜態的狀態,包括系統如何組織程序。建立,啟動,到最後死亡的乙個概念性認識,沒有更加深刻的知識。2.程序排程。本章比較重要。1.搶占式排程策略。2.倆程序間上下文切換 有倆函式 switch mm 和 switch to倆函式完成此功能。具體細節需要閱讀其他書籍 ...

linux核心設計與實現 前言

認真閱讀原始碼很重要,應該鑽研並嘗試著手改一些 尋找乙個bug然後去修改它,改進你的硬體裝置的驅動程式 unix特點 作業系統 指系統中負責完成最基本功能和系統管理的部分。包括 核心 裝置驅動程式 啟動引導程式 命令列shell或其他種類的使用者介面 基本的檔案管理和系統工具。核心組成 中斷服務程式...