linux0 11 記憶體結構

2021-06-22 01:07:19 字數 1643 閱讀 7767

linux0.11,記憶體最多支援16m,其中0-1m是核心區,核心模組大約為520k,即end位址,即實際核心使用是從0-到end,之後到640k是高速緩衝區,從640k開始的區域,分別是視訊記憶體,bios區域,高速緩衝區,高速緩衝區之後是是主記憶體區域。

在記憶體核心區域當中,從0開始,首先存放的是頁目錄表,佔4kb,之後的3個是頁表,每個4kb,每個頁表包含乙個陣列,每個陣列共1024項,即每項4個位元組,這個也定義在/include/linux/head.h當中。

在核心區域中,最重要的區域之一是idt和gdt。2個合起來佔1頁記憶體。每個佔2k記憶體。二者的定義在/include/linux/head.h當中。

#ifndef _head_h

#define _head_h

typedef struct desc_struct

desc_table[256];

extern unsigned long pg_dir[1024]; // 記憶體頁目錄陣列。每個目錄項為位元組。從實體地址開始。

//#definepg_dir ((unsigned long*)0)

extern desc_table idt,gdt; // 中斷描述符表,全域性描述符表。

#define gdt_nul 0 // 全域性描述符表的第0項,不用。

#define gdt_code 1 // 第1項,是核心**段描述符項。

#define gdt_data 2 // 第2項,是核心資料段描述符項。

#define gdt_tmp 3 // 第3項,系統段描述符,linux 沒有使用。

#define ldt_nul 0 // 每個區域性描述符表的第項,不用。

#define ldt_code 1 // 第項,是使用者程式**段描述符項。

#define ldt_data 2 // 第項,是使用者程式資料段描述符項。

#endif

從上面的**可以看出來,idt,gdt是desc_struct結構的,每個都是256項。

每項包含2個部分,每個部分4個位元組,

idt存放的是中斷描述符表。

gdt中存放的是全域性描述符表。gdt當中,第0項為null,第1項為**段描述,第2項為資料段描述符,第3項為系統段描述符,未使用,為null。從第4項開始,存放程序的相關資訊,每個程序使用2項,對於每個程序,第一項是tssn,第2項是ldtn,其中n為程序標號。從這裡就可以看出來linux0.11最多容納127個任務,但實際上,linux0.11規定,最多有64個任務同時存在。

對於80386,有32根位址線,可以定址4g的位址空間,tssn描述符內,存放的正是任務號為n的tss段的位址,ldtn描述符內,有任務號為n的ldt描述符位址。

linux0.11規定,每個任務的虛擬位址範圍為64m。每個任務都包含乙個task_union的聯合體,包含乙個task_struct結構體和乙個堆疊陣列。

union task_union

;

linux0 11之記憶體管理

其實我覺得作業系統的記憶體管理很神秘,且不說在寫應用程式時呼叫的malloc,在寫linux驅動時get free page,get free pages,kmalloc,就相當頭疼。看完linux0.11之後小有感觸,就此記下。先說核心使用的get free page吧,其實get free pa...

Linux0 11核心 記憶體組織和程序結構

程序結構 linux0.11中的每個程序都有如下的結構 在gdt中占有兩項,一項是tss段描述符,一項是ldt段描述符。在task陣列中占有一項,指向一頁物理記憶體,該物理記憶體低端是程序控制塊task struct 裡面包括tss段和ldt段 其餘部分是程序的核心態堆疊。在頁目錄表和頁表中設定有相...

Linux0 11核心 記憶體組織和程序結構

程序結構 linux0.11中的每個程序都有如下的結構 在gdt中占有兩項,一項是tss段描述符,一項是ldt段描述符。在task陣列中占有一項,指向一頁物理記憶體,該物理記憶體低端是程序控制塊task struct 裡面包括tss段和ldt段 其餘部分是程序的核心態堆疊。在頁目錄表和頁表中設定有相...