執(zhí)行jmp 40這個指令(進程1跳轉(zhuǎn)到2040這個地址,進程2跳轉(zhuǎn)到3040這個地址)。
LDT有個寄存器ldtr。
多進程切換的時候,LDT也要跟著切換,也就是LDTR要跟著修改。
進程切換時候需要切換的映射表,就是LDT。
重要的3步——
- 將程序分成多個段(是編譯要做的事情)
- 內(nèi)存中找一個空閑的分區(qū)
- 通過磁盤讀寫將程序載入進去(設(shè)備驅(qū)動要做的事)
- 將分好段的程序讀入空閑內(nèi)存中,然后初始化好LDT表(建立地址和內(nèi)存的映射關(guān)系,i.e.映射表),將LDT和PCB關(guān)聯(lián)在一起。
最后通過運行時重定位,通過取指執(zhí)行,從而讓程序執(zhí)行起來,內(nèi)存也用起來。
image.png

image.png
image.png

image.png
可變分區(qū)更合理一些

image.png
要對可變分區(qū)進行管理

image.png
下一個問題,選哪個空閑分區(qū)更合適?

image.png

實際問題中,我們不采用分區(qū)來分割內(nèi)存,而是分頁。所以爭論最佳適配、最差適配這些是沒有意義的,這些分區(qū)方法是針對于虛擬內(nèi)存的,就是將程序放到虛擬內(nèi)存的過程(段對應(yīng)虛擬內(nèi)存)。

image.png
可變分區(qū)可引發(fā)內(nèi)存碎片問題,總的空閑內(nèi)存的大小是比160K大的,但是160K這個連續(xù)的內(nèi)存是裝不進去的,想要改變需要內(nèi)存緊縮,但是內(nèi)存緊縮在user看來會導(dǎo)致死機,所以另一個方法則是將請求的160K分成120K和40K,這種分割的思想引出了分頁的思想。

image.png
OS在初始化的時候(mem_map()),就將物理內(nèi)存分成了頁。
分頁的好處是不用內(nèi)存緊縮,最大的內(nèi)存浪費是4K。
物理內(nèi)存喜歡分頁,因為這樣可以減少內(nèi)存浪費。
用戶喜歡分段,因為程序可以被分為1段1段的。
所以要段頁結(jié)合。

image.png
有段表就有頁表。
段表寄存器是ldtr,頁表寄存器是 cr3。
地址0x2240變成第幾頁和offset是MMU來搞的。
頁表和PCB要關(guān)聯(lián)。
注意看邏輯地址0x2240是怎么變成0x3240的。

image.png