[057][x86匯編語(yǔ)言]第16章 源碼分析 過(guò)程[create_copy_cur_pdir]:復(fù)制 頁(yè)目錄表(core)到 頁(yè)目錄表(user)

學(xué)習(xí)筆記

《x86匯編語(yǔ)言:從實(shí)模式到保護(hù)模式》
http://www.reibang.com/p/d481cb547e9f

方案的內(nèi)容

每個(gè)任務(wù)都有自己的頁(yè)目錄表以及頁(yè)表诗越,
頁(yè)目錄表的前半部分對(duì)應(yīng)著任務(wù)自己虛擬地址空間的前2GB(0~2G)
后半部分則映射到內(nèi)核的頁(yè)表(2~4G);

- 當(dāng)任務(wù)在自己獨(dú)立的局部空間工作時(shí),使用它自己的頁(yè)表油讯;
- 當(dāng)任務(wù)請(qǐng)求系統(tǒng)服務(wù)時(shí),用的則是內(nèi)核的頁(yè)表颗品,訪問(wèn)的是內(nèi)核的代碼和數(shù)據(jù)趾徽;

本文只涉及頁(yè)目錄表相關(guān)。
  • [1]惨远、創(chuàng)建用戶任務(wù)的頁(yè)目錄表頁(yè)目錄表(user));
  • [2]谜悟、將內(nèi)核頁(yè)目錄表( 頁(yè)目錄表(core) )中的內(nèi)容復(fù)制過(guò)去话肖;
  • [3]、切換到用戶任務(wù)的頁(yè)目錄表上去工作葡幸;

代碼過(guò)程

  • 源碼文件 c16_core.asm
  • 前面的數(shù)字代表語(yǔ)句在源碼文件中的行號(hào)最筒;

零、調(diào)用 過(guò)程 load_relocate_program

1067 call load_relocate_program

一蔚叨、過(guò)程 load_relocate_program 的內(nèi)部調(diào)用

830 ;創(chuàng)建用戶任務(wù)的頁(yè)目錄
831 ;注意床蜘!頁(yè)的分配和使用是由頁(yè)位圖決定的,可以不占用線性地址空間

; 調(diào)用過(guò)程 create_copy_cur_pdir 
832 call sys_routine_seg_sel:create_copy_cur_pdir

833 mov ebx,[es:esi+0x14] ;從TCB中獲取TSS的線性地址
834 mov dword [es:ebx+28],eax ;填寫TSS的CR3(PDBR)域
  • 調(diào)用過(guò)程 create_copy_cur_pdir 蔑水,完成方案中的[1]以及[2]邢锯;
  • 在過(guò)程 create_copy_cur_pdir返回之后,更新了用戶任務(wù)的TSS的CR3域搀别,從而完成了方案中的[3]

二丹擎、過(guò)程 create_copy_cur_pdir 的具體實(shí)現(xiàn)

create_copy_cur_pdir:                       ;創(chuàng)建新頁(yè)目錄,并復(fù)制當(dāng)前頁(yè)目錄內(nèi)容
                                            ;輸入:無(wú)
                                            ;輸出:EAX=新頁(yè)目錄的物理地址 
         push ds
         push es
         push esi
         push edi
         push ebx
         push ecx
         
         mov ebx,mem_0_4_gb_seg_sel
         mov ds,ebx
         mov es,ebx
         
         call allocate_a_4k_page            
         mov ebx,eax
         or ebx,0x00000007
         mov [0xfffffff8],ebx
         
         mov esi,0xfffff000                 ;ESI->當(dāng)前頁(yè)目錄的線性地址
         mov edi,0xffffe000                 ;EDI->新頁(yè)目錄的線性地址
         mov ecx,1024                       ;ECX=要復(fù)制的目錄項(xiàng)數(shù)
         cld
         repe movsd 
         
         pop ecx
         pop ebx
         pop edi
         pop esi
         pop es
         pop ds
         
         retf
1歇父、通過(guò)call allocate_a_4k_page用戶任務(wù)申請(qǐng)了一個(gè)新的空閑的物理頁(yè)蒂培,作為用戶任務(wù)的頁(yè)目錄表,記為頁(yè)目錄表(user)榜苫,即書上所稱的新頁(yè)目錄表护戳;
2、給頁(yè)目錄表(user)的物理地址填上頁(yè)的屬性:US=1(只有特權(quán)級(jí)為3的用戶程序可以訪問(wèn)該頁(yè))单刁、RW=1(頁(yè)是可讀可寫的)灸异、P=1(頁(yè)位于物理內(nèi)存中)
mov ebx,eax
or ebx,0x00000007
3、裝填好頁(yè)屬性的頁(yè)目錄表(user)的物理地址怎么處理羔飞?放到頁(yè)目錄表(core)倒數(shù)第二個(gè)表項(xiàng)里去肺樟,頁(yè)目錄表(core),就是內(nèi)核程序的頁(yè)目錄表逻淌,即書上所稱的當(dāng)前頁(yè)目錄表(看完步驟4么伯,一起看圖解)
 mov [0xfffffff8],ebx
4、為什么頁(yè)目錄表(user)的線性地址是0x FFFF E000?

回顧 為什么 頁(yè)目錄表(core) 的線性地址是0x FFFF F000
http://www.reibang.com/p/d6b534560669

  • 為什么`頁(yè)目錄表(user)`的線性地址是`0x FFFF E000`.png
  • 首先卡儒,由于步驟3田柔,頁(yè)目錄(core)的倒數(shù)第二個(gè)表項(xiàng),填入了剛分配的物理頁(yè)物理地址骨望,而這個(gè)物理頁(yè)正是分配給用戶程序頁(yè)目錄表用的硬爆;

  • 現(xiàn)在是在內(nèi)核程序里面,調(diào)用的過(guò)程擎鸠,因此CR3寄存器的內(nèi)容指向的正是內(nèi)核程序頁(yè)目錄表缀磕;

  • 頁(yè)目錄表(core)的倒數(shù)第一項(xiàng)在很早的時(shí)候就已經(jīng)被填好了自己的物理地址;

具體的時(shí)間點(diǎn)在源碼文件`c16_core.asm`是這樣的:

開啟分頁(yè)機(jī)制之后

(第969~973行) 在倒數(shù)第一項(xiàng)填入自己的物理地址
具體實(shí)現(xiàn)與圖解 
可見 http://www.reibang.com/p/c251257329fe

....
....
....

(1067行) call load_relocate_program 
回到本文上方看標(biāo)題,就可以明白邏輯順序
call load_relocate_program 
|---- call sys_routine_seg_sel:create_copy_cur_pdir          
  • 倒數(shù)第二個(gè)表項(xiàng)的偏移量應(yīng)該是0xFF8就可以逆推出中10位0x3FE袜蚕,全部寫成二進(jìn)制的序列就是 0011 1111 1110糟把,而根據(jù)線性地址的格式,也可以知道最開始的兩個(gè)零牲剃,其實(shí)是自己的補(bǔ)零遣疯,那么中10位本質(zhì)上就是 11 1111 1110,全部組合起來(lái)凿傅,就可以得到頁(yè)目錄表(user)的線性地址是0x FFFF E000缠犀;
  • 因此,驗(yàn)證了書上的結(jié)論:
`頁(yè)目錄表(user)`的線性地址是`0x FFFF E000`
`頁(yè)目錄表(core)`的線性地址是`0x FFFF F000`
5聪舒、將內(nèi)核頁(yè)目錄表中的內(nèi)容復(fù)制過(guò)去
mov esi,0xfffff000                 ;ESI->當(dāng)前頁(yè)目錄的線性地址
mov edi,0xffffe000                 ;EDI->新頁(yè)目錄的線性地址
mov ecx,1024                       ;ECX=要復(fù)制的目錄項(xiàng)數(shù)
cld
repe movsd 
  • 復(fù)制操作的匯編指令rep的語(yǔ)法就是這樣的夭坪, 只要提供源地址目的地址并且指定傳送方向即可过椎;

rep 相關(guān)具體語(yǔ)法參見 http://www.reibang.com/p/1b17ad3ad51f

  • 值得一提的是,因?yàn)楝F(xiàn)在的內(nèi)核程序運(yùn)行已經(jīng)開啟了分頁(yè)機(jī)制戏仓,所以源地址和目的地址都要提供線性地址疚宇,我們需要把目錄表(core)的內(nèi)容全部復(fù)制給目錄表(user),就需要知道兩個(gè)東西的線性地址赏殃。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末敷待,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子仁热,更是在濱河造成了極大的恐慌榜揖,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抗蠢,死亡現(xiàn)場(chǎng)離奇詭異举哟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)迅矛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門妨猩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人秽褒,你說(shuō)我怎么就攤上這事壶硅。” “怎么了销斟?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵庐椒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蚂踊,道長(zhǎng)约谈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮窗宇,結(jié)果婚禮上措伐,老公的妹妹穿的比我還像新娘。我一直安慰自己军俊,他們只是感情好侥加,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著粪躬,像睡著了一般担败。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上镰官,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天提前,我揣著相機(jī)與錄音,去河邊找鬼泳唠。 笑死狈网,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的笨腥。 我是一名探鬼主播拓哺,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼脖母!你這毒婦竟也來(lái)了士鸥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谆级,失蹤者是張志新(化名)和其女友劉穎烤礁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肥照,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脚仔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舆绎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玻侥。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖亿蒸,靈堂內(nèi)的尸體忽然破棺而出凑兰,到底是詐尸還是另有隱情,我是刑警寧澤边锁,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布姑食,位于F島的核電站,受9級(jí)特大地震影響茅坛,放射性物質(zhì)發(fā)生泄漏音半。R本人自食惡果不足惜则拷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望曹鸠。 院中可真熱鬧煌茬,春花似錦、人聲如沸彻桃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)邻眷。三九已至眠屎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肆饶,已是汗流浹背改衩。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驯镊,地道東北人葫督。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像板惑,于是被迫代替她去往敵國(guó)和親候衍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359