[048][x86汇编语言]第十五章 习题2解答:Bochs调试完整过程

第十五章 习题2解答:切换任务 core->A->B->core

https://www.jianshu.com/p/659adf08e419

第十五章 习题2解答:完整源码

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

准备文件.lst(.lst文件的汇编地址就是定断点时的段内偏移量)

  • .lst文件根据同名.asm文件由配书工具nasmide.exe生成
c13_mbr.lst
ex15-2_core.lst
ex15-2_A.lst
ex15-2_B.lst

Bochs 调试命令(以及配置方法)

配置方法见 https://www.jianshu.com/p/e8eea9f2ceb5

  • s : 单步执行
  • b : 断点设置
  • c : 继续执行
  • r : 查看寄存器
  • sreg : 查看段寄存器
  • xp : 查看内存

调试思路

  • 程序运行的整个阶段(按照逻辑顺序由先到后,断点设差不多都设置在call 或jmp所在代码行):
  • 加载程序→内核程序;
  • 内核程序→任务A;
  • 任务A通过调用门切换到→任务B;
  • 任务B通过调用门返回到→内核程序;
  • 内核程序继续执行直到停机。

Bochs调试过程

  • 0、 ABCDABCD就是实际输入的bochs指令(按下回车出确认输入),其余的是bochs的输出信息(段选择子之类的);

  • 1、从加载程序mbr内核程序core

 s
 b 0x7c00
 c
 b 0x7d38
 c
    (0) Breakpoint 2, 0x0000000000007d38 in ?? ()
    Next at t=17419248
    (0) [0x000000007d38] 0010:0000000000000138 (unk. ctxt): jmpf ds:[edi+16]          ; ff6f10
 s
    Next at t=17419249
    (0) [0x0000000416c6] 0038:00000000000003fa (unk. ctxt): mov ecx, 0x00000030       ; b930000000
  • 2、从内核程序代码段(选择子0x38)切换到任务A
 b 0x0038:0x057c
 c
    (0) Breakpoint 3, 0x0000000000041848 in ?? ()
    Next at t=17454245
(0) [0x000000041848] 0038:000000000000057c (unk. ctxt): jmpf es:[ecx+20]          ; 26ff6914
 s
    Next at t=17454246
(0) [0x000000104d1c] 000f:0000000000000000 (unk. ctxt): mov ax, ds                ; 8cd8
  • 3、执行到任务A,执行调用门的语句call far[fs:TaskSwitch]
 b 0x000f:0x002f
 c
    (0) Breakpoint 4, 0x0000000000104d4b in ?? ()
    Next at t=17462166
    (0) [0x000000104d4b] 000f:000000000000002f (unk. ctxt): mov ebx, dword ptr fs:0x00000428 ; 648b1d28040000
 s
    Next at t=17462167
    (0) [0x000000104d52] 000f:0000000000000036 (unk. ctxt): callf fs:0x00000328       ; 64ff1d28030000

  • 4、通过调用门进入到内核程序公用例程段的子程序taskswitch ,并切换到任务B
 s
    Next at t=17462168
    (0) [0x000000040249] 0028:0000000000000231 (unk. ctxt): mov eax, 0x00000008       ; b808000000
 s
    Next at t=17462169
    (0) [0x00000004024e] 0028:0000000000000236 (unk. ctxt): mov es, ax                ; 8ec0
 s
    Next at t=17462170
    (0) [0x000000040250] 0028:0000000000000238 (unk. ctxt): jmpf es:[ebx+20]          ; 26ff6b14
 s
    Next at t=17462171
    (0) [0x0000001005cc] 000f:0000000000000000 (unk. ctxt): mov ax, ds                ; 8cd8
  • 5、执行到任务B的调用门返回语句call far [fs:TerminateProgram],并返回到程序管理器core的子程序terminate_current_task
 b 0x000f:0x002f
 c
    (0) Breakpoint 5, 0x00000000001005fb in ?? ()
    Next at t=17470091
    (0) [0x0000001005fb] 000f:000000000000002f (unk. ctxt): callf fs:0x00000128       ; 64ff1d28010000
 s
    Next at t=17470092
    (0) [0x000000040212] 0028:00000000000001fa (unk. ctxt): pushf                     ; 9c
  • 6、单步调试 terminate_current_task 里面的语句,terminate_current_task位于公用例程段(选择子0x28
 s
    Next at t=17470093
    (0) [0x000000040213] 0028:00000000000001fb (unk. ctxt): mov edx, dword ptr ss:[esp] ; 8b1424
 s
    Next at t=17470094
    (0) [0x000000040216] 0028:00000000000001fe (unk. ctxt): add esp, 0x00000004       ; 81c404000000
 s
    Next at t=17470095
    (0) [0x00000004021c] 0028:0000000000000204 (unk. ctxt): mov eax, 0x00000030       ; b830000000

    Next at t=17470096
    (0) [0x000000040221] 0028:0000000000000209 (unk. ctxt): mov ds, ax                ; 8ed8
 s
    Next at t=17470097
    (0) [0x000000040223] 0028:000000000000020b (unk. ctxt): test dx, 0x4000           ; 66f7c20040
 s
    Next at t=17470098
    (0) [0x000000040228] 0028:0000000000000210 (unk. ctxt): jnz .+18 (0x0004023c)     ; 7512
 s
    Next at t=17470099
    (0) [0x00000004022a] 0028:0000000000000212 (unk. ctxt): mov ebx, 0x00000ff1       ; bbf10f0000
 s
    Next at t=17470100
    (0) [0x00000004022f] 0028:0000000000000217 (unk. ctxt): callf 0x0028:00000000     ; 9a000000002800
 s
    Next at t=17470101
    (0) [0x000000040018] 0028:0000000000000000 (unk. ctxt): push ecx                  ; 51
 s
    Next at t=17470102
    (0) [0x000000040019] 0028:0000000000000001 (unk. ctxt): mov cl, byte ptr ds:[ebx] ; 8a0b
 s
    Next at t=17470103
    (0) [0x00000004001b] 0028:0000000000000003 (unk. ctxt): or cl, cl                 ; 08c9
    
 b 0x0028:0x021e
 c
    (0) Breakpoint 6, 0x0000000000040236 in ?? ()
    Next at t=17482903
    (0) [0x000000040236] 0028:000000000000021e (unk. ctxt): jmpf ds:0x00000e2d        ; ff2d2d0e0000
 s
    Next at t=17482904
    (0) [0x00000004184c] 0038:0000000000000580 (unk. ctxt): mov ebx, 0x00000f2f       ; bb2f0f0000
 s
    Next at t=17482905
    (0) [0x000000041851] 0038:0000000000000585 (unk. ctxt): callf 0x0028:00000000     ; 9a000000002800
 s
    Next at t=17482906
    (0) [0x000000040018] 0028:0000000000000000 (unk. ctxt): push ecx                  ; 51
  • 8、回到了内核代码段(选择子0x38),最终执行停机指令hlt
 b 0x0038:0x058c
 c
    (0) Breakpoint 7, 0x0000000000041858 in ?? ()
    Next at t=17487518
    (0) [0x000000041858] 0038:000000000000058c (unk. ctxt): hlt                       ; f4

调试图解

[048][x86汇编语言]第十五章 习题2解答:Bochs调试完整过程_第1张图片
1、完成 从core到A A通过调用门即将切换到任务B.png
[048][x86汇编语言]第十五章 习题2解答:Bochs调试完整过程_第2张图片
2、顺利从A切换到B 现在从B直接返回到core.png
[048][x86汇编语言]第十五章 习题2解答:Bochs调试完整过程_第3张图片
3、顺利从B返回到程序管理器core.png

你可能感兴趣的:([048][x86汇编语言]第十五章 习题2解答:Bochs调试完整过程)