学习笔记
《x86汇编语言:从实模式到保护模式》
https://www.jianshu.com/p/d481cb547e9f
本章习题 二
2.修改本章源程序,使之能够顺序完成以下工作:
① 从程序管理器任务切换到任务A,显示一条消息;
② 再从任务A切换到任务B,显示一条消息;
③ 从B直接返回到程序管理器任务。
代码使用
准备工作,源码文件
- 加载程序使用配书代码包里的
c13_mbr.asm
- 内核程序文件
ex15-2_core.asm
(修改自:内核程序c15_core.asm
) -
任务A文件
ex15-2_A.asm
(修改自:用户程序c15.asm
) -
任务B文件
ex15-2_B.asm
(修改自:用户程序c15.asm
)
代码编译、运行
- 1、nasmide.exe编译全部源文件,得到
XXX.bin
二进制文件; - 2、fixvhdwr.exe把二进制文件写入虚拟硬盘
c13_mbr.bin LBA: 0
ex15-2_core.bin LBA: 1
ex15-2_A.bin LBA: 50
ex15-2_B.bin LBA: 100
- 3、运行虚拟机 VM VirtualBox
第十五章 习题2 从core到A 从A到B 再从B直接回到core.png
代码修改
用户程序 任务A ex15-2_A.asm
1、头部段,修改4处:修改salt_items
、增加标号salt_end
、增加TaskSwitch
以及增加target
-
target
字段用来存放想要切换去的目标任务的TCB线性地址
;符号地址检索表
salt_items dd (salt_end-salt)/256 ;#0x24
salt: ;#0x28
;...其他不变...
TaskSwitch db '@TaskSwitch'
times 256-($-TaskSwitch) db 0
salt_end:
target dd 0 ;#0428
header_end:
2、代码段:把原先的调用门返回语句call far [fs:TerminateProgram]
删除,替换为下面的调用门call far[fs:TaskSwitch]
(这是内核程序新增的子程序)
;------------------ex15-2---------------------------
mov ebx,[fs:target]
;切换到目标程序 任务B
call far[fs:TaskSwitch]
;---------------------------------------------------
用户程序 任务B ex15-2_B.asm
1、头部段的修改 同 任务A ex15-2_A.asm
2、代码段:保留最初的调用门返回
;------------------ex15-2---------------------------
call far [fs:TerminateProgram] ;退出,并将控制权返回到核心
;---------------------------------------------------
内核程序 ex15-2_core.asm
1、公用例程段sys_routine
,新增子程序taskswitch
;--------------------------ex15-2----------------------------------
taskswitch: ;从当前任务切换到其他任务
mov eax,mem_0_4_gb_seg_sel
mov es,eax
jmp far [es:ebx+0x14]
;------------------------------------------------------------------
2、内核数据段core_data
新增表项
- 新增
salt_5
表项,存放子程序taskswitch
的入口地址(成为最后一个表项)
;--------------------------ex15-2----------------------------------
salt_5 db '@TaskSwitch'
times 256-($-salt_5) db 0
dd taskswitch
dw sys_routine_seg_sel
;--------------------------ex15-2----------------------------------
- 表项长度的计算也要对应进行修改
salt_item_len equ $-salt_5
3、内核代码段core_code
子程序load_relocate_program
修改
- 现在,会压入3个参数
load_relocate_program: ;加载并重定位用户程序
;输入: PUSH 用户程序的切换目标程序的TCB线性地址
; PUSH 逻辑扇区号
; PUSH 任务控制块基地址
;输出:无
- 那么,就需要丢弃对应数量的参数
3*4
(子程序最后一条ret
)
;------------------- ex15-2--------------------------------
ret 3*4 ;丢弃调用本过程前压入的参数
;----------------------------------------------------------
- 新增回填用户程序
target
的语句(假设,想要从A->B,那么就要在加载任务A的时候,把任务B的TCB线性地址填到任务A的target标号
处)
;------------------------------------------
;用户程序的切换目标程序的TCB线性地址
mov edx,[ebp+13*4] ;参数[1]
mov [edi+0x428],edx
;------------------------------------------
4、内核代码段core_code
的start
标号后新增功能语句
;-------------------------------- ex15-2 ---------------------------------------------------
;加载任务B
mov ecx,0x46
call sys_routine_seg_sel:allocate_memory
call append_to_tcb_link
push dword 0 ;参数[1] 用户程序的切换目标程序的TCB线性地址
push dword 100 ;参数[2] 任务B 程序位于 LBA:100
push ecx ;参数[3] 任务B TCB线性地址
mov ebx,ecx ;保存任务B的 TCB线性地址
call load_relocate_program
;加载任务A
mov ecx,0x46
call sys_routine_seg_sel:allocate_memory
call append_to_tcb_link
push ebx ;参数[1] 压入任务B的TCB线性地址
push dword 50 ;参数[2] 任务A 程序位于 LBA:50
push ecx ;参数[3] 任务A TCB线性地址
call load_relocate_program
;切换到任务A
jmp far [es:ecx+0x14] ;CPU从TCB中取出TSS基地址、TSS选择子
;CPU发现这是TSS选择子,就知道要执行任务切换
;-------------------------------------------------------------------------------------------
网友评论