趣談Linux操做系統學習筆記:第二十一講

1、分段機制

一、分段機制的原理圖

二、段選擇子

三、段偏移量

例如,咱們將上面的虛擬空間分紅如下 4 個段,用 0~3 來編號。每一個段在段表中有一個項,在物理空間中,段的排列以下圖的右邊所示。linux

 

四、段表

#define GDT_ENTRY_INIT(flags, base, limit) { { { \
		.a = ((limit) & 0xffff) | (((base) & 0xffff) << 16), \
		.b = (((base) & 0xff0000) >> 16) | (((flags) & 0xf0ff) << 8) | \
			((limit) & 0xf0000) | ((base) & 0xff000000), \
	} } }

一個段表項由段基地址 base、段界限 limit,還有一些標識符組成分佈式

DEFINE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page) = { .gdt = {
#ifdef CONFIG_X86_64
	[GDT_ENTRY_KERNEL32_CS]		= GDT_ENTRY_INIT(0xc09b, 0, 0xfffff),
	[GDT_ENTRY_KERNEL_CS]		= GDT_ENTRY_INIT(0xa09b, 0, 0xfffff),
	[GDT_ENTRY_KERNEL_DS]		= GDT_ENTRY_INIT(0xc093, 0, 0xfffff),
	[GDT_ENTRY_DEFAULT_USER32_CS]	= GDT_ENTRY_INIT(0xc0fb, 0, 0xfffff),
	[GDT_ENTRY_DEFAULT_USER_DS]	= GDT_ENTRY_INIT(0xc0f3, 0, 0xfffff),
	[GDT_ENTRY_DEFAULT_USER_CS]	= GDT_ENTRY_INIT(0xa0fb, 0, 0xfffff),
#else
	[GDT_ENTRY_KERNEL_CS]		= GDT_ENTRY_INIT(0xc09a, 0, 0xfffff),
	[GDT_ENTRY_KERNEL_DS]		= GDT_ENTRY_INIT(0xc092, 0, 0xfffff),
	[GDT_ENTRY_DEFAULT_USER_CS]	= GDT_ENTRY_INIT(0xc0fa, 0, 0xfffff),
	[GDT_ENTRY_DEFAULT_USER_DS]	= GDT_ENTRY_INIT(0xc0f2, 0, 0xfffff),
......
#endif
} };
EXPORT_PER_CPU_SYMBOL_GPL(gdt_page);

五、分析

 

分頁機制本質上來講就是相似於linux文件系統的目錄管理同樣,頁目錄項和頁表項至關於根目錄和上級目錄,
頁內便宜量就是相對路徑,
絕對路徑就是整個32位地址,分佈式存儲系統也是採用的相似的機制,先用元數據存儲前面的路徑,
再用塊內偏移定位到具體文件,感受道理都差很少3d

2、內存分頁

一、物理內存

下圖,舉了一個簡單的頁表的例子,虛擬內存中的頁經過頁表映射爲了物理內存中的頁blog

 

二、虛擬地址管理

 

 

 

 

 

分頁機制本質上來講就是相似於linux文件系統的目錄管理同樣,頁目錄項和頁表項至關於根目錄和上級目錄,
頁內變量就是相對路徑,
絕對路徑就是整個32位地址,分佈式存儲系統也是採用的相似的機制,先用元數據存儲前面的路徑,
再用塊內偏移定位到具體文件,感受道理都差很少內存

 3、總結時刻

這一節咱們講了分段機制、分頁機制以及從虛擬地址到物理地址的映映射方式。總結一下這兩節,咱們能夠把內存管理系統精細化爲下面三件事情:

it

第一:虛擬內存空間的管理,將虛擬內存分紅大小相等的頁;內存管理

第二:物理內存的管理,將物理內存分紅大小相等的頁;class

第三:內存映射,將虛擬內存也和物理內存也映射起來,而且在內存緊張的時候能夠換出到硬盤中。變量

相關文章
相關標籤/搜索