美文网首页
[046][x86汇编语言]第十五章 习题2解答:切换任务 co

[046][x86汇编语言]第十五章 习题2解答:切换任务 co

作者: AkuRinbu | 来源:发表于2018-07-06 23:12 被阅读7次

    学习笔记

    《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线性地址填到任务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解答:切换任务 co

          本文链接:https://www.haomeiwen.com/subject/gopbuftx.html