標籤:linux0.11 記憶體
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/27/26/wKiom1NwmT6w_9fCAANYNUpRVn0957.jpg" title="a.jpg" alt="wKiom1NwmT6w_9fCAANYNUpRVn0957.jpg" />
Linux0.11,記憶體最多支援16M,其中0-1M是核心去,實際核心使用是從0-640k,從640k-1M的地區,分別是顯存,bios地區,高速緩衝區,1-16M是是主記憶體地區。
在記憶體核心地區當中,從0開始,首先存放的是頁目錄表,占4kb,之後的3個是頁表,每個4kb,每個頁表包含一個數組,每個數組共1024項,即每項4個位元組,這個也定義在/include/linux/head.h當中。
在核心地區中,最重要的地區之一是idt和gdt。2個合起來占1頁記憶體。每個占2k記憶體。二者的定義在/include/linux/head.h當中。
#ifndef_HEAD_H#define_HEAD_Htypedefstructdesc_struct{ // 定義了段描述符的資料結構。該結構僅說明每個描述 unsignedlonga, b; // 符是由個位元組構成,每個描述符表共有項。}desc_table[256];externunsignedlongpg_dir[1024]; // 記憶體頁目錄數組。每個目錄項為位元組。從物理地址開始。//#define pg_dir((unsigned long*)0)externdesc_tableidt,gdt; // 中斷描述符表,通用描述元表。#defineGDT_NUL 0 // 通用描述元表的第0項,不用。#defineGDT_CODE 1 // 第1項,是核心程式碼片段描述符項。#defineGDT_DATA 2 // 第2項,是核心資料區段描述符項。#defineGDT_TMP 3 // 第3項,系統段描述符,Linux 沒有使用。#defineLDT_NUL 0 // 每個局部描述符表的第項,不用。#defineLDT_CODE 1 // 第項,是使用者程式碼段描述符項。#defineLDT_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結構體和一個堆棧數組。
uniontask_union{// 定義任務聯合(任務結構成員和stack 字元數組程式成員)。 structtask_structtask;// 因為一個任務資料結構與其堆棧放在同一記憶體頁中,所以 charstack[PAGE_SIZE];// 從堆棧段寄存器ss 可以獲得其資料區段選擇符。};