作業系統中記憶體管理之請求調頁

2021-09-13 22:22:54 字數 2468 閱讀 4732

我們知道當我們使用記憶體管理策略時,我們程式設計中使用的位址在0-4g之間(對於32位機器來說),但是往往實際的記憶體沒有那麼大,可能只有1g左右。當pc指標移動取址時,發現取出的虛擬位址無法對映到實際的記憶體頁上,這種情況就稱為缺頁。發生缺頁的原因通常是乙個程式的程式段在虛擬記憶體上排列的較為分散,起始範圍與末梢範圍太大,這種情況下,每次執行到不同的段時容易發生缺頁。

// linux-0.11/kernel/traps.c

void

trap_init

(void

)

上面的初始化**就是設定頁錯誤中斷入口的。

2、page_fault是也錯誤中斷入口,這中斷函式就是實現了調頁換入的功能:

// linux-0.11/mm/page.s

page_fault:

xchgl %eax,

(%esp)

pushl %ecx

pushl %edx

push %ds

push %es

push %fs

movl $0x10

,%edx // 進入核心

mov %dx,

%ds mov %dx,

%es mov %dx,

%fs movl %cr2,

%edx // 將對映失敗的虛擬位址儲存到edx暫存器中

pushl %edx // 壓棧edx中的內容,為了後面呼叫do_no_page提供引數

pushl %eax

testl $1

,%eax

jne 1f

call do_no_page // 開始呼叫這個函式,這個函式會實現調頁功能

jmp 2f

1: call do_wp_page

2: addl $8

,%esp

pop %fs

pop %es

pop %ds

popl %edx

popl %ecx

popl %eax

iret

上面一段**是彙編**,主要之後進入了 do_no_page這個c函式,並且提供了那個對映失敗的虛擬位址引數,提供這個引數也是為了之後將換入的頁重新與該位址建立對映。

3、do_no_page的實現:

// linux-0.11/mm/memory.c

void

do_no_page

(unsigned

long error_code,

unsigned

long address)if(

share_page

(tmp)

)return;if

(!(page =

get_free_page()

))// 申請空閒頁,此頁是要拷貝磁碟中的程式段的

oom();

/* remember that 1 block is used for header */

block =

1+ tmp/block_size;

for(i=

0; i<

4; block++

,i++

) nr[i]

=bmap

(current->executable,block)

;bread_page

(page,current->executable->i_dev,nr)

;// 從磁碟拷貝程式段到page

i = tmp +

4096

- current->end_data;

tmp = page +

4096

;while

(i--

>0)

if(put_page

(page,address)

)// 將物理page與虛擬位址建立對映關係

return

;free_page

(page)

;oom()

;}

從上面的注釋可以發現put_page是建立對映關係的。

4、put_page的**實現分析:

// linux-0.11/mm/memroy.c

unsigned

long

put_page

(unsigned

long page,

unsigned

long address)

page_table[

(address>>12)

&0x3ff

]= page |7;

// 將物理頁框號對映到虛擬位址中

/* no need for invalidate */

return page;

}

上面的**就是重新將換入的物理頁的頁框號與虛擬位址建立對映關係的,到此時請求換頁已完成。

作業系統記憶體管理

作業系統記憶體管理 一 程序的虛擬位址空間 每個程序都被賦予自己的虛擬位址空間,對於32位程序來說,這個位址空間為4g,因此程序中的位址可以為0x00000000至0xffffffff之間的任何乙個值。其中4g空間中的低區的2g空間留給程序使用,而高區的2g空間則留給系統使用。在windows200...

作業系統記憶體管理

作業系統記憶體管理一 程序的虛擬位址空間 每個程序都被賦予自己的虛擬位址空間,對於 32位程序來說,這個位址空間為 4g,因此程序中的位址可以為 0x00000000 至0xffffffff 之間的任何乙個值。其中 4g空間中的低區的 2g空間留給程序使用,而高區的 2g空間則留給系統使用。在win...

作業系統記憶體管理

記憶體,毫無疑問是最重要的資源,顯然,作業系統對記憶體的管理我必須清楚。這裡主要介紹了分頁管理和分段管理。1.頁式管理 a.頁式管理的基本思想 打破儲存分配的連續性 將邏輯上連續的使用者程式對映到離散的記憶體塊 使用者程式與記憶體空間被劃分為若干等長的區域 邏輯頁 與 物理頁 使用者程式的劃分由系統...