[046][x86汇编语言]第十五章 习题2解答:切换任务 core->A->B->core

学习笔记

《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
    [046][x86汇编语言]第十五章 习题2解答:切换任务 core->A->B->core_第1张图片
    第十五章 习题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线性地址填到任务Atarget标号处)
;------------------------------------------
;用户程序的切换目标程序的TCB线性地址
mov edx,[ebp+13*4]          ;参数[1]
mov [edi+0x428],edx
;------------------------------------------
         

4、内核代码段core_codestart标号后新增功能语句

    ;-------------------------------- 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选择子,就知道要执行任务切换
        
        ;-------------------------------------------------------------------------------------------

完整源码

https://www.jianshu.com/p/81a518d918d8

调试过程

https://www.jianshu.com/p/7a4f07810789

你可能感兴趣的:([046][x86汇编语言]第十五章 习题2解答:切换任务 core->A->B->core)