讀核日記(五)
進來忙得不得了,這時才體會出工作和在學校真的不同.有時候自己想做的事,很難如願.不過我這一段時間沒有太偷懶.對於linux 的386 保護模式,記憶體管理,作了乙個初步的學習.當初學習作業系統課時老覺得理論沒用. 如今,真的時間了,才知道理論知識是多麼的缺乏.也許是書到用時方恨少
閒話少說 目前
linux使用了intel 80386系列處理器的」保護模式」.作業系統的資源的管理和分配.由80386硬體儲存管理和保護機制實現
虛擬儲存器
,是一種擴種記憶體的設計方案.他**於當初主存非常昂貴的年代.用到了程式的區域性性原則,即程式在執行時沒有必要全部裝入記憶體.
支部當前要執行的那一部分調入記憶體即可
實際上,整個儲存系統是
由快取記憶體--- 記憶體--- 硬碟
等多級儲存介質構成的,但這對程式原始透明的,
比如我們在程式中執行這樣一天指令
mov bx ,1997
mov ax ,[bx]
這樣位址是
1997 的內容背拷貝到了ax ,這樣由程式產生的位址時虛位址.這個位址與實際的實體地址是不同的.要有這個位址轉換到實際的實體地址,就需要有乙個轉換機制.通常叫做mmu
的硬體單元完成這個任務
所謂的保護機制就是在這個基礎上進行的
.它的目的是要使不同的程式段互不干涉.系統程序與使用者程序嚴格分開已達到系統安全與多使用者多程序的要求.在linux 中通過給不同的任務分配不同的虛擬位址到實體地址的對映.來實現不同任務的切換與保護.同時.linux 「可能」是把系統程序與使用者程序分開(我不太確定,可能是把系統程序的位址控制在100000以內?,當然在iipv通行中的共享記憶體,由於操作不當可能產生不可預料的後果).
另外,linux對統一任務也進行了不同程度的保護.它使用優先順序來決定的.比如核心的優先順序是0,系統呼叫 :1 庫:2 使用者程序3.在程式對某乙個資料段進行讀寫的時候,.應縣檢查優先順序,.在決定它執行的優先順序或訪問許可權.
我想,這個優先順序一定會和struct_task 的某些表示排程優先順序的引數關聯.
對於記憶體管理
,通常是有段式,頁式和段頁式三種方式.在這裡討論的使者兩種方式的虛擬-物理轉換機制的不同.因為linux實行的是段頁式記憶體管理.因此這兩種對映機制,
也就必須都存在
段式管理
,使用了一系列的可改變大小的位址集合進行管理.它的好處是,可以充分利用物理記憶體.缺點是難以管理,
通常在c 中
我們可以這樣定義乙個段(此定義只是解釋段的概念,linux中絕不是如此)
typedef stucrt duan
以上實在是實際記憶體中可能用到的段的資料結構
.而我們在保護模式中,所謂的段是保護管理.大體上和組合語言中基址定址有些相似:他是實現虛擬-實體地址轉換的基礎(說白了,我個人認為,把所有的段定義成一樣大就是頁,不過實際上我還沒看linux 是怎樣做的,所以千萬不要被我誤導)
段有乙個限制位,(limit) 表示段內最大偏移量,(也就是大小)
段的屬性 (attribute) 表示該段是否會被讀寫
這3 個屬性,
包含在段的描述符中
所謂的描述符
.是乙個8個子節的儲存單元,其結構大概如下:
位元組0 -----0—7
位描述苻
位元組1 ------8—15
位描述符
位元組2 -----0—7
位基址位元組
3 -----8—15
位基址位元組
4 -----16—24
段基址位元組
5 -----
儲存許可權的位元組
位元組6 -----g| d|0|0| 16-19
位段界限
位元組7 -----31-—24 段基址
其中第五個位元組,是訪問權位元組,它包含有好幾個標誌位,用來標誌該段是在記憶體中,還是沒有.後者該段是使用者段或者是系統段之類的.被人水平有限.在此不一一說明.希望有興趣的朋友可以查一下資料,將給我們大家聽
在系統段中
.有乙個位元組.可以來定義系統段的型別,好像是有16類
像標誌為有效的386.tss,386中斷門,386陷阱門等等,在此不一一介紹.在此要弄清楚兩個名次 tss(系統狀態標) ldt(區域性描述標),在相關的資料中,
經常會碰到
在linux的核心中有一系列的描述苻表.像全域性描述苻表(gdt),中斷描述苻表(idt)還有上面介紹的ldt等等,在他們中間.定義了系統可用的描述苻,中斷門,等等.它的作用是使得機器的相容性得到保證
在ldt 中.則定義了一些和具體的任務相聯絡的**段,資料段等等.描述苻表的內資料結構大致如下:
typedef struct desc_struct
後面用以下兩行完成了描述苻表的定義以及外部描述苻的定義
: desc_table[256]; //定義了可以在區域性描述苻表中的最大描述苻量
extern dessc_table idt,gdt //外部的描述變數
至此,關於linux的分段機制大體上節講解完畢了,剩下的就是在暫存器與選擇器之間的對映,
還有一些定址方法
這部分內容
,大概和
<<組合語言>>中講的大同小異,在此不多費唇舌
讀核日記 三
讀核日記 三 在linux 中每乙個程序都由 task struct 資料結構來定義 task struct 就是我們通常所說的 pcb.她是對程序控制的唯一手段也是最有效的手段.當我們呼叫 fork 時,系統會為我們產生乙個 task struct結構.然後從父程序 那裡繼承一些資料 並把新的程序...
讀核日記 七
讀核日記 七 linux的記憶體管理機制 1 記憶體管理是乙個作業系統必不可少.並且.非常重要的一環.linux的成功.和它優秀的記憶體管理聯絡非常密切.因為乙個系統的高效性慾穩定性往往決定於它的記憶體管理機制.我項很多人吃過dos下640k 的苦吧.前面我們介紹了386保護模式.從今天起我們將在此...
讀核日記 《Linux核心完全注釋》
linux核心完全注釋 v1.9.5版說明 linux 核心 6.程序間通訊機制 linux 核心 4.記憶體管理 linux 核心 5.linux程序 linux 核心 3.軟體基礎 linux 核心 2.硬體基礎 linux 核心 1.前言 讀核日記 八 linux的記憶體管理機制 2 讀核日記...