[039][x86匯編語言]第十五章 任務(wù)切換 內(nèi)存示意圖 以及 TSS相關(guān) 源碼解析

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

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

運行結(jié)果

第十五章 任務(wù)切換 運行結(jié)果.png

代碼使用

  • nasmide.exe 編譯源碼文件 :加載程序c13_mbr.asm慷荔,內(nèi)核程序c15_core.asm,用戶程序c15.asm
  • fixvhdwr.exe 寫扇區(qū)二進(jìn)制.bin文件:c13_mbr.bin(邏輯扇區(qū)號LBA:0)宫患、c15_core.bin(LBA:1)檀蹋、c15.bin(LBA:50)哩掺;
  • 運行VM virtual box.

執(zhí)行完兩次任務(wù)切換(CALL一次,JMP一次)后的內(nèi)存以及GDT狀態(tài)

第15章 執(zhí)行完兩次任務(wù)切換后的內(nèi)存示意圖.png

第15章 執(zhí)行完兩次任務(wù)切換后的GDT示意圖.png
  • 如圖所示厘擂,被加載到內(nèi)存的昆淡,紅色文字以及綠色文字代表的內(nèi)容均來自于同一個用戶程序c15.asm
  • 這說明刽严,一個程序可以對應(yīng)著多個運行中的副本昂灵,或者說多個任務(wù),它們彼此之間沒有任何關(guān)系舞萄,在內(nèi)存中的位置不同眨补,運行狀態(tài)也不一樣;
  • 正因如此鹏氧,即便兩次切換都是切換到同一個用戶程序渤涌,但本質(zhì)上是切換到不同的任務(wù)佩谣,加上沒有寫任何內(nèi)存管理的代碼(比如重新釋放內(nèi)存)把还,之前的任務(wù)一直留在內(nèi)存里;

任務(wù)管理器

  • 任務(wù)管理器茸俭,又稱程序管理器:創(chuàng)建0特權(quán)級的內(nèi)核任務(wù)吊履,并將當(dāng)前正在執(zhí)行的內(nèi)核代碼段劃歸該任務(wù),當(dāng)前代碼的作用是創(chuàng)建其他任務(wù)调鬓,管理它們艇炎,所以稱做任務(wù)管理器或者叫程序管理器

三個TSS描述符

[如圖黑色和灰色部分文字]程序管理器的TSS描述符(位于內(nèi)核程序c15_core.asm:標(biāo)號start后面)

         ;為程序管理器的TSS分配內(nèi)存空間 
         mov ecx,104                        ;為該任務(wù)的TSS分配內(nèi)存
         call sys_routine_seg_sel:allocate_memory
         mov [prgman_tss+0x00],ecx          ;保存程序管理器的TSS基地址 
      
         ;在程序管理器的TSS中設(shè)置必要的項目 
         mov word [es:ecx+96],0             ;沒有LDT腾窝。處理器允許沒有LDT的任務(wù)缀踪。
         mov word [es:ecx+102],103          ;沒有I/O位圖居砖。0特權(quán)級事實上不需要。
         mov word [es:ecx+0],0              ;反向鏈=0
         mov dword [es:ecx+28],0            ;登記CR3(PDBR)
         mov word [es:ecx+100],0            ;T=0
                                            ;不需要0驴娃、1奏候、2特權(quán)級堆棧。0特級不
                                            ;會向低特權(quán)級轉(zhuǎn)移控制唇敞。
         
         ;創(chuàng)建TSS描述符蔗草,并安裝到GDT中 
         mov eax,ecx                        ;TSS的起始線性地址
         mov ebx,103                        ;段長度(界限)
         mov ecx,0x00408900                 ;TSS描述符,特權(quán)級0
         call sys_routine_seg_sel:make_seg_descriptor
         call sys_routine_seg_sel:set_up_gdt_descriptor
         mov [prgman_tss+0x04],cx           ;保存程序管理器的TSS描述符選擇子 

         ;任務(wù)寄存器TR中的內(nèi)容是任務(wù)存在的標(biāo)志疆柔,該內(nèi)容也決定了當(dāng)前任務(wù)是誰咒精。
         ;下面的指令為當(dāng)前正在執(zhí)行的0特權(quán)級任務(wù)“程序管理器”后補手續(xù)(TSS)。
         ltr cx 
  • 程序管理器可以沒有自己的LDT旷档,可以將自己使用的段描述符安裝在GDT中模叙;
  • mov word [es:ecx+0],0 ,設(shè)置TSS指針域(結(jié)合TSS的格式來看鞋屈,此時ES指向0~4GB內(nèi)存空間,ECX是TSS基地址
  • 程序管理器的TSS描述符必須安裝在GDT中向楼;
  • 使用指令ltr,將當(dāng)前任務(wù)的TSS選擇子傳送到處理器TR寄存器谐区;
ltr指令執(zhí)行后湖蜕,處理器用該選擇子訪問GDT
找到相對應(yīng)的TSS描述符,將其B位置“1”
表示該任務(wù)正在執(zhí)行中(或者處于掛起狀態(tài))
同時宋列,還要將該描述符傳送到TR寄存器的描述符高速緩存器中昭抒。

子程序load_relocate_program 里TSS相關(guān)代碼(位于內(nèi)核程序c15_core.asm

TSS 與TCB 一 一對應(yīng)

  • 登記 TSS基地址、TSS選擇子TCB(這樣理解炼杖,從任務(wù)A切換到任務(wù)B時灭返,這里登記用的就是任務(wù)B的TCB,登記的內(nèi)容就是任務(wù)BTSS基地址坤邪、TSS選擇子熙含,保證一個任務(wù)、一個TCB艇纺、一個TSS)怎静;
  • 第15章的代碼,是從內(nèi)核程序切換到用戶程序的黔衡,那么內(nèi)核程序就是任務(wù)A蚓聘,用戶程序就是任務(wù)B;
  • 并且盟劫,內(nèi)核程序是不需要TCB的夜牡;
  • 如圖所示,第15章的代碼要分別用call 以及 jmp 各完成一次切換侣签,同一次任務(wù)我都用相同的顏色畫了TCB和TSS塘装;
 ;創(chuàng)建用戶程序的TSS
         mov ecx,104                        ;tss的基本尺寸
         mov [es:esi+0x12],cx              
         dec word [es:esi+0x12]             ;登記TSS界限值到TCB 
         call sys_routine_seg_sel:allocate_memory
         mov [es:esi+0x14],ecx              ;登記TSS基地址到TCB

...

  ;在GDT中登記TSS描述符
         mov eax,[es:esi+0x14]              ;TSS的起始線性地址
         movzx ebx,word [es:esi+0x12]       ;段長度(界限)
         mov ecx,0x00408900                 ;TSS描述符急迂,特權(quán)級0
         call sys_routine_seg_sel:make_seg_descriptor
         call sys_routine_seg_sel:set_up_gdt_descriptor
         mov [es:esi+0x18],cx               ;登記TSS選擇子到TCB

完整填寫TSS

  • 注意這里填的就是TSS的內(nèi)容不是TSS描述符蹦肴;
  • 根據(jù)注釋以及TSS格式來一一填寫即可

TSS格式 http://www.reibang.com/p/adb70daa6d2c

        ;訪問用戶程序頭部袋毙,獲取數(shù)據(jù)填充TSS
        mov ebx,[ebp+11*4]              ;從堆棧中取得TCB的基地址
        mov edi,[es:ebx+0x06]           ;取得用戶程序加載基地址
        
        mov edx,[es:edi+0x10]           ;登記程序入口點 EIP
        mov [es:ecx+32],edx             ;到TSS
        
        mov dx,[es:edi+0x14]            ;登記程序代碼段 CS 選擇子
        mov [es:ecx+76],dx              ;到TSS
        
        mov dx,[es:edi+0x08]            ;登記堆棧段 SS 選擇子
        mov [es:ecx+80],dx

        mov dx,[es:edi+0x04]            ;登記 程序數(shù)據(jù)段 DS(指向程序頭部段)
        mov word [es:ecx+84],dx 
        
        mov word [es:ecx+72],0          ;TSS中的 ES=0
        mov word [es:ecx+88],0          ;TSS中的 FS=0
        mov word [es:ecx+92],0          ;TSS中的 GS=0

        pushfd                          ;將EFLAGS寄存器的內(nèi)容壓入棧
        pop edx                         ;再將其彈出到EDX寄存器
        
        mov dword [es:ecx+36],edx       ;登記TSS中的EFLAGS

[如圖紅色文字部分]使用call指令進(jìn)行任務(wù)切換(位于內(nèi)核程序c15_core.asm:標(biāo)號start后面)

;創(chuàng)建TCB 這個TCB屬于即將切換去的任務(wù)
mov ecx,0x46
call sys_routine_seg_sel:allocate_memory
call append_to_tcb_link            ;將此TCB添加到TCB鏈中 


push dword 50                      ;用戶程序位于邏輯50扇區(qū)
push ecx                           ;壓入任務(wù)控制塊起始線性地址 
       
call load_relocate_program          ; 會往創(chuàng)建屬于要切換去的任務(wù)的TSS★
                                    ; 會往TCB里面填寫TSS選擇子★     
      
;32位間接遠(yuǎn)調(diào)用指令CALL                                 
call far [es:ecx+0x14]  ;執(zhí)行任務(wù)切換
                        ;ECX指向要切換任務(wù)(用戶程序)的TCB
                        ;從TCB中取出TSS基地址、TSS選擇子
                        ;CPU發(fā)現(xiàn)這是TSS選擇子冗尤,就知道要執(zhí)行任務(wù)切換
                        ;新任務(wù)的TSS完整內(nèi)容在子程序load_relocate_program中已經(jīng)填寫完畢

[如圖綠色文字部分]使用jmp指令進(jìn)行任務(wù)切換(位于內(nèi)核程序c15_core.asm:標(biāo)號start后面)

;創(chuàng)建TCB 這個TCB屬于即將切換去的任務(wù)
mov ecx,0x46
call sys_routine_seg_sel:allocate_memory
call append_to_tcb_link            ;將此TCB添加到TCB鏈中 

push dword 50                      ;用戶程序位于邏輯50扇區(qū)
push ecx                           ;壓入任務(wù)控制塊起始線性地址

call load_relocate_program          ; 會往創(chuàng)建屬于要切換去的任務(wù)的TSS★
                                    ; 會往TCB里面填寫TSS選擇子★     

;32位間接遠(yuǎn)轉(zhuǎn)移指令JMP
 jmp far [es:ecx+0x14]          ;執(zhí)行任務(wù)切換
                              ;ECX指向要切換任務(wù)(用戶程序)的TCB
                              ;從TCB中取出TSS基地址听盖、TSS選擇子
                              ;CPU發(fā)現(xiàn)這是TSS選擇子,就知道要執(zhí)行任務(wù)切換
                              ;新任務(wù)的TSS完整內(nèi)容在子程序load_relocate_program中已經(jīng)填寫完畢
                        
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末裂七,一起剝皮案震驚了整個濱河市皆看,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌背零,老刑警劉巖腰吟,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異徙瓶,居然都是意外死亡毛雇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門侦镇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灵疮,“玉大人,你說我怎么就攤上這事壳繁≌鸬罚” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵闹炉,是天一觀的道長蒿赢。 經(jīng)常有香客問我,道長渣触,這世上最難降的妖魔是什么羡棵? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮嗅钻,結(jié)果婚禮上皂冰,老公的妹妹穿的比我還像新娘。我一直安慰自己啊犬,他們只是感情好灼擂,可當(dāng)我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著觉至,像睡著了一般。 火紅的嫁衣襯著肌膚如雪睡腿。 梳的紋絲不亂的頭發(fā)上语御,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天峻贮,我揣著相機與錄音,去河邊找鬼应闯。 笑死纤控,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碉纺。 我是一名探鬼主播船万,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼骨田!你這毒婦竟也來了耿导?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤态贤,失蹤者是張志新(化名)和其女友劉穎舱呻,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悠汽,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡箱吕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了柿冲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茬高。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖假抄,靈堂內(nèi)的尸體忽然破棺而出雅采,到底是詐尸還是另有隱情,我是刑警寧澤慨亲,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布婚瓜,位于F島的核電站,受9級特大地震影響刑棵,放射性物質(zhì)發(fā)生泄漏巴刻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一蛉签、第九天 我趴在偏房一處隱蔽的房頂上張望胡陪。 院中可真熱鬧,春花似錦碍舍、人聲如沸柠座。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妈经。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吹泡,已是汗流浹背竿刁。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工求摇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓打月,卻偏偏與公主長得像辞嗡,于是被迫代替她去往敵國和親不狮。 傳聞我的和親對象是個殘疾皇子欣除,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容