1. 程式人生 > >x86組合語言 從真實模式到保護模式 疑問彙總

x86組合語言 從真實模式到保護模式 疑問彙總

x86組合語言 從真實模式到保護模式書中,14.4.6 中段長度為什麼是0xffffe 。
該段長度是4K,ESP初始值為0000 0000, 0xFFFFFFFF-0xFFFFEFFF = 4KB
實際使用的段界限是0xFFFFE * 0x1000+0xFFF=0xFFFFEFFF
從而得到0xFFFFE

;建立0特權級堆疊
mov ecx,4096
mov eax,ecx ;為生成堆疊高階地址做準備
mov [es:esi+0x1a],ecx
shr dword [es:esi+0x1a],12 ;登記0特權級堆疊尺寸到TCB
call sys_routine_seg_sel:allocate_memory
add eax,ecx ;堆疊必須使用高階地址為基地址
mov [es:esi+0x1e],eax ;登記0特權級堆疊基地址到TCB
[color=red][b] mov ebx,0xffffe ;段長度(界限)[/b][/color]
mov ecx,0x00c09600 ;4KB粒度,讀寫,特權級0
call sys_routine_seg_sel:make_seg_descriptor
mov ebx,esi ;TCB的基地址
call fill_descriptor_in_ldt
;or cx,0000_0000_0000_0000 ;設定選擇子的特權級為0
mov [es:esi+0x22],cx ;登記0特權級堆疊選擇子到TCB
mov dword [es:esi+0x24],0 ;登記0特權級堆疊初始ESP到TCB

---------------
iret/iretd 怎麼會自動切換到程式管理器任務上邊去呢? 這個中間的處理邏輯是怎麼的。。這個過程是處理器固化處理嗎? ----找到當前的TSS的頭部的前一個任務的TSS指標(即程式管理器任務)更新相關的暫存器資料切換過去的

書中只有一句話,在295 的中間, “第374行,通過iretd指令轉換到前一個任務”

這個應該是我表述有問題吧。。。 我現在的理解 :檢查NT位,如果為1,找到當前的TSS的頭部的前一個任務的TSS指標(即程式管理器任務)更新相關的暫存器資料切換過去的

NT為1,表示是巢狀任務返回,當前TSS中的連結欄位儲存前一任務的TSS的選擇子,取出該選擇子,進行任務切換完成返回。

如是NT為0,表示當前任務內返回, 從stack彈出返回指標EIP及CS,然後彈出EFLAG值。 彈出CS中RPL,確定返回後的特權級。接下來與RET類似。

In Protected Mode, the action of the IRET instruction depends on the settings of the NT (nested task) and VM flags in the EFLAGS register and the VM flag in the EFLAGS image stored on the current stack. Depending on the setting of these flags, the processor performs the following types of interrupt returns:
• Return from virtual-8086 mode.
• Return to virtual-8086 mode.
• Intra-privilege level return.
• Inter-privilege level return.
• Return from nested task (task switch).

[color=blue]If the NT flag (EFLAGS register) is cleared, the IRET instruction performs a far return from the interrupt procedure, without a task switch.[/color] The code segment being returned to must be equally or less privileged than the interrupt handler routine (as indicated by the RPL field of the code segment selector popped from the stack).
As with a real-address mode interrupt return, the IRET instruction pops the return instruction pointer, return code segment selector, and EFLAGS image from the stack to the EIP, CS, and EFLAGS registers, respectively, and then resumes execution of the interrupted program or procedure. If the return is to another privilege level, the IRET instruction also pops the stack pointer and SS from the stack, before resuming program execution. If the return is to virtual-8086 mode, the processor also pops the
data segment registers from the stack.
[color=blue]If the NT flag is set, the IRET instruction performs a task switch (return) from a nested task (a task called with a CALL instruction, an interrupt, or an exception) back to the calling or interrupted task.[/color] The updated state of the task executing the IRET
instruction is saved in its TSS. If the task is re-entered later, the code that follows the IRET instruction is executed.
If the NT flag is set and the processor is in IA-32e mode, the IRET instruction causes a general protection exception.
In 64-bit mode, the instruction’s default operation size is 32 bits. Use of the REX.W prefix promotes operation to 64 bits (IRETQ). See the summary chart at the beginning of this section for encoding data and limits.


--------以下是請教關東鼠俠QQ交流記錄-----------------------------------------
你先回到前面p210
【團長】關東鼠 2017/3/20 星期一 09:58:40

看看書上那幾頁。

【連長】^魚小雄^ 2017/3/20 星期一 09:59:14

好的
10:00:52
【團長】關東鼠 2017/3/20 星期一 10:00:52

p.214
10:05:24
【團長】關東鼠 2017/3/20 星期一 10:05:24

整明白沒有?

【連長】^魚小雄^ 2017/3/20 星期一 10:05:36

還沒有。。

【連長】^魚小雄^ 2017/3/20 星期一 10:05:43

有點笨啊。。
【團長】關東鼠 2017/3/20 星期一 10:06:08

不是笨,是棧的界限這一塊確實很繞很燒腦。

【連長】^魚小雄^ 2017/3/20 星期一 10:06:15

描述符中的段界限值*0x1000+0xFFF
【團長】關東鼠 2017/3/20 星期一 10:06:42

我來問你,我們給ESP暫存器的初值是多少?

【連長】^魚小雄^ 2017/3/20 星期一 10:06:50

從14章這個程式碼裡看,他的長度4K

【連長】^魚小雄^ 2017/3/20 星期一 10:06:52

0

【連長】^魚小雄^ 2017/3/20 星期一 10:07:19

ESP 中的初值應該是0
10:07:35
【團長】關東鼠 2017/3/20 星期一 10:07:35

好,壓棧時,是先減ESP。如果運算元是2個位元組,那麼,壓棧時,ESP的新值是多少?

【連長】^魚小雄^ 2017/3/20 星期一 10:08:16

FFFFE

【連長】^魚小雄^ 2017/3/20 星期一 10:08:21

FFFE
【團長】關東鼠 2017/3/20 星期一 10:09:01

糊塗了吧?ESP是32位的暫存器。

【連長】^魚小雄^ 2017/3/20 星期一 10:09:07

是的。。

【連長】^魚小雄^ 2017/3/20 星期一 10:09:12

FFFF FFFE
10:09:36
【團長】關東鼠 2017/3/20 星期一 10:09:36

所以,每次壓棧時,ESP的值必須在棧界限值以內。
【團長】關東鼠 2017/3/20 星期一 10:10:48

對於棧來說,實際使用的段界限,是不允許訪問的最低端地址。
10:11:38
【連長】^魚小雄^ 2017/3/20 星期一 10:11:38

恩,對的。。

【連長】^魚小雄^ 2017/3/20 星期一 10:11:46

所以是用0 - 4k
【團長】關東鼠 2017/3/20 星期一 10:12:44

所以,我們這裡是界限值0xFFFFE
所以,在這裡,實際使用的段界限是0xFFFFE * 0x1000+0xFFFF=0xFFFFEFFF
【團長】關東鼠 2017/3/20 星期一 10:12:58

或者說,ESP必須大小0xFFFFEFFF
【團長】關東鼠 2017/3/20 星期一 10:13:03

大於
【團長】關東鼠 2017/3/20 星期一 10:13:21

0xFFFFFFFF-0xFFFFEFFF = 4KB

【連長】^魚小雄^ 2017/3/20 星期一 10:13:36

恩,是的,終於搞明白了


【連長】^魚小雄^ 2017/3/20 星期一 10:13:55

這個要備註下

【團長】關東鼠 2017/3/20 星期一 10:14:15

再版的時候,朕也改一下,說得更清楚些。
【團長】linux-果 2017/3/20 星期一 10:14:19

155.94.235.113這開啟速度還可以吧
【團長】linux-果 2017/3/20 星期一 10:14:23

155.94.235.113


10:19:08
【團長】關東鼠 2017/3/20 星期一 10:19:08

@^魚小雄^ 你可以將這個問題寫成一個部落格,朕率文武百官前去拜讀。

【連長】^魚小雄^ 2017/3/20 星期一 10:19:25

哈哈,好的。。。

相關推薦

x86組合語言 真實模式保護模式 疑問彙總

x86組合語言 從真實模式到保護模式書中,14.4.6 中段長度為什麼是0xffffe 。該段長度是4K,ESP初始值為0000 0000, 0xFFFFFFFF-0xFFFFEFFF = 4KB實際使用的段界限是0xFFFFE * 0x1000+0xFFF=0xFFFFEF

x86組合語言-真實模式保護模式》筆記

通過硬碟控制器埠讀扇區資料 使用LBA邏輯塊編址中的LBA28,步驟如下 1. 設定讀取的扇區數量,這個數值要寫入0x1f2埠,這是一個8位埠 mov dx, 0x1f2 mov al, 0x01 ;表面寫入一個扇區 out dx, al

【OS修煉指南目錄】----《X86組合語言-真實模式保護模式》讀書筆記目錄表

學習交流加 個人qq: 1126137994 個人微信: liu1126137994 學習交流資源分享qq群: 962535112 本文是將個人的關於《X86組合語言-從真實模式到保護模式》讀書筆記做一個整體的目錄,方便

X86彙編 真實模式保護模式》 關於Bochsdbg二次啟動錯誤的解決方案

1.前言: 在本書中,Bochsdbg是一個非常重要的除錯工具,關於bochsrc檔案的配置,在檔案中的配置已經給出了,按照這步驟來完全可以。 第一次時按步驟配置,之後使用“斷點”跳轉到0x7c00主引導扇區時完全可以,但當往下學習學習到下一章再次執行時,發

真實模式保護模式的區別 真實模式保護模式切換方法

真實模式保護模式區別       從80386開始,cpu有三種工作方式:真實模式,保護模式和虛擬8086模式。只有在剛剛啟動的時候是real-mode,等到linux作業系統執行起來以後就執行在保護模式。          真實模式只能訪問地址在1M以下的記憶體稱為常規記

CPU 真實模式 保護模式 和虛擬8086模式

保護模式同真實模式的根本區別是程序記憶體受保護與否。可定址空間的區別只是這一原因的果。真實模式將整個實體記憶體看成分段的區域,程式程式碼和資料位於不同區域,系統程式和使用者程式沒有區別對待,而且每一個指標都是指向"實在"的實體地址。這樣一來,使用者程式的一個指標如果指向了系統程式區域或其他使用者程式 區域,

彙編學習筆記之真實模式/保護模式記憶體定址

真實模式下的記憶體地址     2的10次方是1K,20次方就是1M,30次方就是1G。     Intel 8086是16位CPU,它只有16位暫存器、16位資料匯流排和20位地址匯流排,它只能執行在真實模式。在真實模式,實體地址=段值*16+偏移,段值和偏移都是16位的

x86CPU 實模式 保護模式 傻傻分不清楚? 基於Xv6-OS 分析CR0 寄存器

獲取 ack oot pop -o sdn 行程 model 保護 基於Xv6-OS 分析CR0 寄存器 之前一直認為暈乎乎的...啥?什麽時候切換real model,怎麽切換,為什麽要切換? -----------------------------------

TSS詳解 ——《x86組合語言真實模式保護模式》讀書筆記33

TSS(Task State Segment,任務狀態段)詳解 1. TSS描述符 和LDT一樣,必須為每個TSS在GDT中建立對應的描述符。TSS描述符的格式如下圖: B位是“忙”位(Busy)。在任務剛剛建立的時候,它應該為0,表明任務不忙。當

進入保護模式(二)——《x86組合語言真實模式保護模式》讀書筆記14

首先來段題外話:之前我發現我貼出的程式碼都沒有行號,給講解帶來不便。所以從現在起,我要給程式碼加上行號。我寫部落格用的這個插入程式碼的外掛,確實不支援自動插入行號。我真的沒有找到什麼好方法,無奈之下,只能按照網友的說法,在VIM中給每行程式碼加上行號,然後再貼出來。 在VI

x86分頁機制——《x86組合語言真實模式保護模式》讀書筆記42

1. 為什麼會有分頁機制? 有些資料說是為了實現“虛擬記憶體”,真的是這樣嗎?如果沒有分頁機制,能否實現“虛擬記憶體”?答案是肯定的。 當同時執行的任務很多時,記憶體可能就不夠用。這時候作業系統就該大展身手了。每個段描述符都有A位,每當訪問一個段時,處理器都

視訊記憶體文字模式詳解 ———《x86組合語言真實模式保護模式》讀書筆記補遺02

文章修改記錄 修改日期 修改內容 2018-2-4 修改了一處錯別字;增加了表格的使用方法 今天我們討論如何程式設計以在螢幕上顯示出彩色的文字。 為了顯示文字,通常需要兩種硬體——顯示器和顯示卡。 顯示卡的作用是為顯示器

任務和特權級保護(一)——《x86組合語言真實模式保護模式》讀書筆記27

本文及後面的幾篇文章是原書第14章的讀書筆記。 1.LDT(區域性描述符表) 在之前的學習中,不管是核心程式還是使用者程式,我們都是把段描述符放在GDT中。但是,為了有效實施任務間的隔離,處理器建議每個任務都應該有自己的描述符表,稱為區域性描述符表LDT

儲存器的保護(三)——《x86組合語言真實模式保護模式》讀書筆記20

儲存器的保護(三) 修改本章程式碼清單,使之可以檢測1MB以上的記憶體空間(從地址0x0010_0000開始,不考慮快取記憶體的影響)。要求:對記憶體的讀寫按雙字的長度進行,並在檢測的同時顯示已檢測的記憶體數量。建議對每個雙字單元用兩個花碼0x55AA5

程式的載入和執行(三)——《x86組合語言真實模式保護模式》讀書筆記23

程式的載入和執行(三)——讀書筆記23 接著上次的內容說。 關於過程load_relocate_program的講解還沒有完,還差建立棧段描述符和重定位符號表。 1.分配棧空間與建立棧段描述符 462 ;建立程式堆疊段描述符 463

x86 組合語言真實模式保護模式

1.邏輯地址的作用:程式在記憶體中載入的位置變了,仍然可以執行。 為了在硬體一級提供對“段地址:偏移地址”記憶體訪問模式的支援,處理器至少要提供兩個段暫存器,分別是程式碼段(Code Segment,CS)暫存器和資料段(Data Segment,DS)暫存器

8086鍵盤輸入實驗——《x86組合語言真實模式保護模式》讀書筆記07

1.BIOS中斷 我們可以為所有中斷型別自定義中斷處理過程,包括內部中斷、硬體中斷和軟中斷。 BIOS中斷,又稱BIOS功能呼叫,主要是為了方便地使用最基本的硬體訪問功能。通常,為了區分針對同一硬體的不同功能,使用暫存器AH來指定具體的功能編號。 比如說,以下的指令用於從鍵

x86匯編語言:模式保護模式》檢測點和習題答案

style 出現 x86匯編 內存操作 3.1 fff 地址 blog strong 檢測點1.1:按順序分別為:13 15 78 255 128 56091 檢測點1.2:按順序分別為:1000 1010 1100 1111 11001 1000000

Linux kernel boot process——真實模式(real mode)到保護模式(protected mode),再到分頁(paging)

        本文簡要介紹X86-32架構下的Linux kernel被boot loader(如grub)載入到記憶體後,如何從最初的真實模式,切換到保護模式,並開啟分頁機制。本文不涉及boot loader如何將核心載入到記憶體,因為這是boot loader的事,跟

Linux kernel boot process——真實模式(real mode)到保護模式(protected mode),再到分頁(paging) .

       本文簡要介紹X86-32架構下的Linux kernel被boot loader(如grub)載入到記憶體後,如何從最初的真實模式,切換到保護模式,並開啟分頁機制。本文不涉及boot loader如何將核心載入到記憶體,因為這是boot loader的事,跟核