国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

讀核日記(八) --linux的內(nèi)存管理機(jī)制(2)

2024-07-26 00:31:37
字體:
供稿:網(wǎng)友

地址的映射機(jī)制

地址的映射機(jī)制,主要完成主存.輔存.和虛存之間的關(guān)聯(lián).包括磁盤文件到虛存的映射和虛存與內(nèi)存的映射關(guān)系.為了虛擬存儲(chǔ)和進(jìn)程調(diào)度相一致.linux 采用可一系列的數(shù)據(jù)結(jié)構(gòu),和一個(gè)硬件緩存(TLB)來實(shí)現(xiàn)地址映射機(jī)制.

mm_strut 用來描述進(jìn)程的緩存.

struct mm_struct

{

struct vm_area_struct * mmap; /* list of VMAs */

struct vm_area_struct * mmap_avl; /* tree of VMAs */

struct vm_area_struct * mmap_cache; /* last find_vma result */

pgd_t * pgd;

atomic_t count;

int map_count; /* number of VMAs */

struct semaphore mmap_sem;

spinlock_t page_table_lock;

unsigned long context;

unsigned long start_code, end_code, start_data, end_data;

unsigned long start_brk, brk, start_stack;

unsigned long arg_start, arg_end, env_start, env_end;

unsigned long rss, total_vm, locked_vm;

unsigned long def_flags;

unsigned long cpu_vm_mask;

unsigned long swap_cnt; /* number of pages to swap on next pass */

unsigned long swap_address;

/*

* This is an architecture-specific pointer: the portable

* part of Linux does not know about any segments.

*/

void * segments;

};

他描述了一個(gè)進(jìn)程的頁目錄,有關(guān)進(jìn)程的上下文信息.以及數(shù)據(jù).代碼.堆棧的啟示結(jié)束地址.還有虛擬存儲(chǔ)取得數(shù)目.以及調(diào)度存儲(chǔ)用的鏈表指針.他的參差比較高

較高層次的vm_area-struct 是描述進(jìn)程的虛擬地址區(qū)域.他形成一個(gè)算相鏈表.按虛地址下降排列.這樣當(dāng)內(nèi)核需要在一個(gè)給定進(jìn)程頁上執(zhí)行給定操作時(shí).客從雙向列表中找到該項(xiàng).在世想有關(guān)頁的處理.如.頁錯(cuò)誤.頁換出等等

他的具體結(jié)構(gòu)如下:

struct vm_area_struct {

struct mm_struct * vm_mm; /* VM area parameters */

unsigned long vm_start;

unsigned long vm_end;

 

/* linked list of VM areas per task, sorted by address */

struct vm_area_struct *vm_next;

 

pgPRot_t vm_page_prot;

unsigned short vm_flags;

 

/* AVL tree of VM areas per task, sorted by address */

short vm_avl_height;

struct vm_area_struct * vm_avl_left;

struct vm_area_struct * vm_avl_right;

 

/* For areas with inode, the list inode->i_mmap, for shm areas,

* the list of attaches, otherwise unused.

*/

struct vm_area_struct *vm_next_share;

struct vm_area_struct **vm_pprev_share;

 

struct vm_Operations_struct * vm_ops;

unsigned long vm_offset;

struct file * vm_file;

unsigned long vm_pte; /* shared mem */

};

而page 結(jié)構(gòu) 則是對(duì)物理頁進(jìn)行描述的一個(gè)數(shù)據(jù)結(jié)構(gòu),他不是一個(gè)真正的物理頁.而只不過是描述了一個(gè)物理頁的內(nèi)容和框架.作了邏輯頁的一個(gè)標(biāo)志;.他的標(biāo)志域定義了這個(gè)頁在進(jìn)行的操作.鏈域則定義了一個(gè)雙項(xiàng)鏈表.時(shí)的頁框.可以很容易的查找到.為實(shí)際物理內(nèi)存的使用直到方便

他的具體結(jié)構(gòu)如下

typedef struct page {

/* these must be first (free area handling) */

struct page *next;

struct page *prev;

struct inode *inode;

unsigned long offset;

struct page *next_hash;

atomic_t count;

unsigned long flags; /* atomic flags, some possibly updated asynchronously */

wait_queue_head_t wait;

struct page **pprev_hash;

struct buffer_head * buffers;

int owner; /* temporary debugging check */

} mem_map_t;

所有的page 結(jié)構(gòu)將都被轉(zhuǎn)入一個(gè)叫做mem_map 的數(shù)組中.

當(dāng)一個(gè)進(jìn)程運(yùn)行時(shí),他的代碼段和數(shù)據(jù)段將都會(huì)被調(diào)入內(nèi)存.如果它使用了共享庫.共享客的內(nèi)容也將貝雕如內(nèi)存.進(jìn)程運(yùn)行時(shí).系統(tǒng)首先分配一個(gè)vm_area_struct 給進(jìn)程.并將這各進(jìn)程連結(jié)到虛擬內(nèi)存的連標(biāo)中去.這是根據(jù)進(jìn)程的可執(zhí)行影像中的信息.吧數(shù)據(jù)段和客執(zhí)行代碼非配內(nèi)存.新分配的內(nèi)存必須和進(jìn)程已有的內(nèi)存連結(jié)起來才能應(yīng)用.這樣聚會(huì)出現(xiàn)頁故障.系統(tǒng)利用了請(qǐng)頁機(jī)制來避免對(duì)物理內(nèi)存的過分使用.但進(jìn)程訪問的虛存不在當(dāng)前的物理內(nèi)存時(shí),這時(shí)系統(tǒng)會(huì)將需要的頁調(diào)入內(nèi)存.同時(shí)修改進(jìn)程的頁表.用來標(biāo)志虛擬頁是否在物理內(nèi)存中.

因此,系統(tǒng)用了較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)來跟蹤進(jìn)程的虛擬地址.在task_struct 中包含一個(gè)指向mm_struct 結(jié)構(gòu)的指針.進(jìn)程的mm_struct 中則包含了進(jìn)程可執(zhí)行影像的頁目錄指針pgd.還包含了指向vm_area_struct 的幾個(gè)指針,每個(gè)vm_area_struct 包含一個(gè)進(jìn)程的虛擬地址區(qū)域.

一個(gè)進(jìn)程有多個(gè)vm_area_stuct 結(jié)構(gòu).linux 要經(jīng)常對(duì)進(jìn)程分配..或調(diào)整vm_area_struct .這樣對(duì)vm_area_stuct 的查找效率.對(duì)系統(tǒng)很有影像.所以在這里將所有的vm_area_struct 形成了一個(gè)查找效率較高的平衡二叉樹結(jié)構(gòu).

我個(gè)人認(rèn)為,在整個(gè)linux內(nèi)核中這個(gè)地方.數(shù)據(jù)結(jié)構(gòu)是最復(fù)雜的.如果把這一部分肯下來以后,整個(gè)內(nèi)核便開始清晰了


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 电白县| 元江| 即墨市| 宝清县| 保康县| 乌审旗| 白玉县| 增城市| 聊城市| 茂名市| 昔阳县| 九江市| 上饶县| 林甸县| 沾化县| 成安县| 灌南县| 黄冈市| 志丹县| 乌兰浩特市| 禄劝| 隆子县| 镶黄旗| 萝北县| 平舆县| 西盟| 韩城市| 洛隆县| 博白县| 尚志市| 京山县| 沈丘县| 大洼县| 万年县| 淅川县| 兴国县| 砚山县| 富宁县| 梧州市| 昭苏县| 疏附县|