shoelace源代码分析,bochs调试-67870


在readkernel里面有调用0x67870处的一个call,而0x67870里面有一个jmp 9020:0000的跳转,

这正是我们要找的,并没有加载完运行startminix()函数,因为那是为启动minix要做的。


最后一个断点0x67870

b 0x6101f

c

s


最后在附上:readkernel的反汇编代码,里面为适应linux-0.11启动而改动的部分加红

<bochs:29> u /180
00060e7e: (                    ): push bp                   ; 55
00060e7f: (                    ): mov bp, sp                ; 89e5
00060e81: (                    ): push di                   ; 57
00060e82: (                    ): push si                   ; 56
00060e83: (                    ): add sp, 0xfffffffa        ; 83c4fa
00060e86: (                    ): mov al, byte ptr [ds:0x9f0c] ; a00c9f
00060e89: (                    ): test al, al               ; 84c0
00060e8b: (                    ): jnz 0xe95                 ; 7508
00060e8d: (                    ): xor ax, ax                ; 31c0
00060e8f: (                    ): mov word ptr ss:[bp+0xfff6], ax ; 8946f6
00060e92: (                    ): jmp 0xf42                 ; e9ad00
00060e95: (                    ): xor al, al                ; 30c0
00060e97: (                    ): mov byte ptr [ds:0x9f0c], al ; a20c9f
00060e9a: (                    ): mov ax, 0x1f8             ; b8f801
00060e9d: (                    ): mov word ptr ss:[bp+0xfffa], ax ; 8946fa
00060ea0: (                    ): mov ax, 0x2               ; b80200
00060ea3: (                    ): push ax                   ; 50
00060ea4: (                    ): mov bx, 0x8506            ; bb0685
00060ea7: (                    ): push bx                   ; 53
00060ea8: (                    ): mov bx, word ptr ss:[bp+0x4] ; 8b5e04
00060eab: (                    ): add bx, 0x1fe             ; 81c3fe01
00060eaf: (                    ): push bx                   ; 53
00060eb0: (                    ): call 0x78ac               ; e8f969
00060eb3: (                    ): add sp, 0x6               ; 83c406
00060eb6: (                    ): test ax, ax               ; 85c0
00060eb8: (                    ): jnz 0xec2                 ; 7508
00060eba: (                    ): mov ax, word ptr ss:[bp+0xfffa] ; 8b46fa
00060ebd: (                    ): dec ax                    ; 48
00060ebe: (                    ): dec ax                    ; 48
00060ebf: (                    ): mov word ptr ss:[bp+0xfffa], ax ; 8946fa
00060ec2: (                    ): mov ax, word ptr ss:[bp+0xfffa] ; 8b46fa
00060ec5: (                    ): add ax, word ptr ss:[bp+0x4] ; 034604
00060ec8: (                    ): mov bx, ax                ; 89c3
00060eca: (                    ): mov bx, word ptr ds:[bx]  ; 8b1f
00060ecc: (                    ): mov ax, bx                ; 89d8
00060ece: (                    ): inc ax                    ; 40
00060ecf: (                    ): xor bx, bx                ; 31db
00060ed1: (                    ): push bx                   ; 53
00060ed2: (                    ): push ax                   ; 50
00060ed3: (                    ): mov ax, 0x200             ; b80002
00060ed6: (                    ): xor bx, bx                ; 31db
00060ed8: (                    ): push bx                   ; 53
00060ed9: (                    ): push ax                   ; 50
00060eda: (                    ): mov ax, word ptr ss:[bp+0xfff2] ; 8b46f2
00060edd: (                    ): mov bx, word ptr ss:[bp+0xfff4] ; 8b5ef4
00060ee0: (                    ): lea di, word ptr ss:[bp+0xffee] ; 8d7eee
00060ee3: (                    ): call 0x82bc               ; e8d673
00060ee6: (                    ): add sp, 0x8               ; 83c408
00060ee9: (                    ): mov di, 0xaedc            ; bfdcae
00060eec: (                    ): call 0x8270               ; e88173
00060eef: (                    ): jz 0xf0a                  ; 7419
00060ef1: (                    ): mov ax, 0x1               ; b80100
00060ef4: (                    ): mov [ds:0x8504], ax       ; a30485
00060ef7: (                    ): xor ax, ax                ; 31c0
00060ef9: (                    ): mov bx, 0x9               ; bb0900
00060efc: (                    ): mov [ds:0x9f08], ax       ; a3089f
00060eff: (                    ): mov word ptr [ds:0x9f0a], bx ; 891e0a9f
00060f03: (                    ): xor ax, ax                ; 31c0
00060f05: (                    ): mov word ptr ss:[bp+0xfff6], ax ; 8946f6
00060f08: (                    ): jmp 0xf42                 ; eb38
00060f0a: (                    ): mov ax, word ptr ss:[bp+0xfffa] ; 8b46fa
00060f0d: (                    ): inc ax                    ; 40
00060f0e: (                    ): inc ax                    ; 40
00060f0f: (                    ): add ax, word ptr ss:[bp+0x4] ; 034604
00060f12: (                    ): mov bx, ax                ; 89c3
00060f14: (                    ): mov bx, word ptr ds:[bx]  ; 8b1f
00060f16: (                    ): mov word ptr [ds:0xae98], bx ; 891e98ae
00060f1a: (                    ): mov ax, word ptr ss:[bp+0xfffa] ; 8b46fa
00060f1d: (                    ): add ax, 0x4               ; 050400
00060f20: (                    ): add ax, word ptr ss:[bp+0x4] ; 034604
00060f23: (                    ): mov bx, ax                ; 89c3
00060f25: (                    ): mov bx, word ptr ds:[bx]  ; 8b1f
00060f27: (                    ): mov word ptr [ds:0xae94], bx ; 891e94ae
00060f2b: (                    ): mov ax, word ptr ss:[bp+0xfffa] ; 8b46fa
00060f2e: (                    ): add ax, 0x6               ; 050600
00060f31: (                    ): add ax, word ptr ss:[bp+0x4] ; 034604
00060f34: (                    ): mov bx, ax                ; 89c3
00060f36: (                    ): mov bx, word ptr ds:[bx]  ; 8b1f
00060f38: (                    ): mov word ptr [ds:0xae9c], bx ; 891e9cae
00060f3c: (                    ): mov ax, 0x200             ; b80002
00060f3f: (                    ): mov word ptr ss:[bp+0xfff6], ax ; 8946f6
00060f42: (                    ): mov ax, 0x400             ; b80004
00060f45: (                    ): sub ax, word ptr ss:[bp+0xfff6] ; 2b46f6
00060f48: (                    ): mov word ptr ss:[bp+0xfff8], ax ; 8946f8
00060f4b: (                    ): mov ax, word ptr ss:[bp+0xfff8] ; 8b46f8
00060f4e: (                    ): xor bx, bx                ; 31db
00060f50: (                    ): mov di, 0xaedc            ; bfdcae
00060f53: (                    ): call 0x8270               ; e81a73
00060f56: (                    ): jb 0xf5b                  ; 7203
00060f58: (                    ): jmp 0xff3                 ; e99800
00060f5b: (                    ): push word ptr ss:[bp+0xfff8] ; ff76f8
00060f5e: (                    ): push word ptr [ds:0x9f0a] ; ff360a9f
00060f62: (                    ): push word ptr [ds:0x9f08] ; ff36089f
00060f66: (                    ): mov ax, word ptr ss:[bp+0xfff6] ; 8b46f6
00060f69: (                    ): add ax, word ptr ss:[bp+0x4] ; 034604
00060f6c: (                    ): push ax                   ; 50
00060f6d: (                    ): call 0xea                 ; e87af1
00060f70: (                    ): add sp, 0x8               ; 83c408
00060f73: (                    ): mov ax, word ptr ss:[bp+0xfff8] ; 8b46f8
00060f76: (                    ): xor bx, bx                ; 31db
00060f78: (                    ): push bx                   ; 53
00060f79: (                    ): push ax                   ; 50
00060f7a: (                    ): mov ax, [ds:0xaedc]       ; a1dcae
00060f7d: (                    ): mov bx, word ptr [ds:0xaede] ; 8b1edeae
00060f81: (                    ): lea di, word ptr ss:[bp+0xfff2] ; 8d7ef2
00060f84: (                    ): call 0x8328               ; e8a173
00060f87: (                    ): mov [ds:0xaedc], ax       ; a3dcae
00060f8a: (                    ): mov word ptr [ds:0xaede], bx ; 891edeae
00060f8e: (                    ): add sp, 0x4               ; 83c404
00060f91: (                    ): mov ax, word ptr ss:[bp+0xfff8] ; 8b46f8
00060f94: (                    ): xor bx, bx                ; 31db
00060f96: (                    ): mov di, 0x9f08            ; bf089f
00060f99: (                    ): call 0x8260               ; e8c472
00060f9c: (                    ): mov [ds:0x9f08], ax       ; a3089f
00060f9f: (                    ): mov word ptr [ds:0x9f0a], bx ; 891e0a9f
00060fa3: (                    ): mov ax, [ds:0x8504]       ; a10485
00060fa6: (                    ): test ax, ax               ; 85c0
00060fa8: (                    ): jz 0xfea                  ; 7440
00060faa: (                    ): mov ax, 0xc00             ; b8000c
00060fad: (                    ): mov bx, 0x9               ; bb0900
00060fb0: (                    ): push bx                   ; 53
00060fb1: (                    ): push ax                   ; 50
00060fb2: (                    ): mov ax, [ds:0x9f08]       ; a1089f
00060fb5: (                    ): mov bx, word ptr [ds:0x9f0a] ; 8b1e0a9f
00060fb9: (                    ): lea di, word ptr ss:[bp+0xfff2] ; 8d7ef2
00060fbc: (                    ): call 0x8270               ; e8b172
00060fbf: (                    ): lea sp, word ptr ss:[bp+0xfff6] ; 8d66f6
00060fc2: (                    ): jnz 0xfea                 ; 7526
00060fc4: (                    ): mov ax, 0x200             ; b80002
00060fc7: (                    ): push ax                   ; 50
00060fc8: (                    ): xor ax, ax                ; 31c0
00060fca: (                    ): mov bx, 0x1               ; bb0100
00060fcd: (                    ): push bx                   ; 53
00060fce: (                    ): push ax                   ; 50
00060fcf: (                    ): mov bx, word ptr ss:[bp+0x4] ; 8b5e04
00060fd2: (                    ): add bx, 0x200             ; 81c30002
00060fd6: (                    ): push bx                   ; 53
00060fd7: (                    ): call 0xea                 ; e810f1

00060fda: (                    ): add sp, 0x8               ; 83c408
00060fdd: (                    ): mov ax, 0x200             ; b80002
00060fe0: (                    ): mov bx, 0x1               ; bb0100
00060fe3: (                    ): mov [ds:0x9f08], ax       ; a3089f
00060fe6: (                    ): mov word ptr [ds:0x9f0a], bx ; 891e0a9f
00060fea: (                    ): xor ax, ax                ; 31c0
00060fec: (                    ): add sp, 0x6               ; 83c406
00060fef: (                    ): pop si                    ; 5e
00060ff0: (                    ): pop di                    ; 5f
00060ff1: (                    ): pop bp                    ; 5d
00060ff2: (                    ): retn                      ; c3

00060ff3: (                    ): push word ptr [ds:0xaedc] ; ff36dcae
00060ff7: (                    ): push word ptr [ds:0x9f0a] ; ff360a9f
00060ffb: (                    ): push word ptr [ds:0x9f08] ; ff36089f
00060fff: (                    ): mov ax, word ptr ss:[bp+0xfff6] ; 8b46f6
00061002: (                    ): add ax, word ptr ss:[bp+0x4] ; 034604
00061005: (                    ): push ax                   ; 50
00061006: (                    ): call 0xea                 ; e8e1f0
00061009: (                    ): add sp, 0x8               ; 83c408
0006100c: (                    ): mov ax, 0x1               ; b80100
0006100f: (                    ): xor bx, bx                ; 31db
00061011: (                    ): mov [ds:0xaedc], ax       ; a3dcae
00061014: (                    ): mov word ptr [ds:0xaede], bx ; 891edeae
00061018: (                    ): mov ax, [ds:0x8504]       ; a10485
0006101b: (                    ): test ax, ax               ; 85c0
0006101d: (                    ): jz 0x1022                 ; 7403
0006101f: (                    ): call 0x7870               ; e84e68
00061022: (                    ): mov ax, 0x1               ; b80100
00061025: (                    ): add sp, 0x6               ; 83c406
00061028: (                    ): pop si                    ; 5e
00061029: (                    ): pop di                    ; 5f
0006102a: (                    ): pop bp                    ; 5d
0006102b: (                    ): retn                      ; c3



在没有源码的情况下,猜测是正确的,

今天看到了shoelace.cdif文件的关键的修正部分:


X+ #define SETUPSEG 0x9020
X+ extern void startlinux();
X+ unsigned getdev();
X+
X  static inode_nr
X  readkernel F1(buffer *, bp)
X  
X***************
X*** 627,641 ****
X  
X      if ( (long) (* (unsigned int *) (&((char *) bp)[build_base]) + 1)
X           * SECTOR_SIZE != filesize) {
X!       printf("%s conflicting size information\n", filename);
X!       longjmp(errjmp, 1);
X!     }
X!
X!     fsck_ds = * (unsigned int *) (&((char *) bp)[build_base+2]);
X!     fsck_pc = * (unsigned int *) (&((char *) bp)[build_base+4]);
X!     fsck_cs = * (unsigned int *) (&((char *) bp)[build_base+6]);
X!
X!     bpinx = SECTOR_SIZE;
X    }
X  
X    bpsize = sizeof(*bp) - bpinx;
X--- 634,667 ----
X  
X      if ( (long) (* (unsigned int *) (&((char *) bp)[build_base]) + 1)
X           * SECTOR_SIZE != filesize) {
X!   /*    printf("%s conflicting size information\n", filename);
X!       longjmp(errjmp, 1);*/
X!       unsigned *myptr = (unsigned int *) (&((char *) bp)[508]);
X!       /*char *myroot = getenvs(SaveConfigPtr,"rootdev");
X!       if (strcmp(myroot,"bootdev"))
X!         *myptr = atoi(myroot);
X!       else
X!         *myptr = 0;
X!       if (*myptr == 0)
X!       { if (diskcode)
X!           *myptr = DEV_HD0 + bootpart;
X!         else
X!           if (n_sectors = 15)
X!             *myptr = 0x208;
X!           else
X!             *myptr = 0x21c;
X!       }*/
X!       Linux = 1;
X!       LoadPoint = 0x90000;
X!       bpinx = 0;
X!     }
X!     else {
X!       fsck_ds = * (unsigned int *) (&((char *) bp)[build_base+2]);
X!       fsck_pc = * (unsigned int *) (&((char *) bp)[build_base+4]);
X!       fsck_cs = * (unsigned int *) (&((char *) bp)[build_base+6]);
X!       bpinx = SECTOR_SIZE;
X!     }
X!
X    }
X  
X    bpsize = sizeof(*bp) - bpinx;
X***************
X*** 644,654 ****
X--- 670,687 ----
X      copyto((char *) bp + bpinx, LoadPoint, bpsize);
X      filesize  -= bpsize;
X      LoadPoint += bpsize;
X+     if (Linux && (LoadPoint==0x90C00))
X+     {
X+       copyto((char *) bp + SECTOR_SIZE, (ADDRESS)0x10000, SECTOR_SIZE);
X+       LoadPoint = 0x10200;
X+     }
X      return 0;
X    }
X  
X    copyto((char *) bp + bpinx, LoadPoint, (unsigned int) filesize);
X    filesize = 1;
X+   if (Linux)
X+     startlinux();
X    return ROOT_INODE;
X  }



X.text
X.define _startlinux
X.text
X
XSETUPLEN = 4                | nr of setup-sectors
XBOOTSEG  = 0x07c0            | original address of boot-sector
XINITSEG  = 0x9000            | we move boot here - out of the way
XSETUPSEG = 0x9020            | setup starts here
XSYSSEG   = 0x1000            | system loaded at 0x10000 (65536).
X
X| ROOT_DEV:    0x000 - same type of floppy as boot.
X|        0x301 - first partition on first drive etc
XROOT_DEV = 0x302 | 0x306
X
X_startlinux:
X     mov    ax,#BOOTSEG
X     mov    ds,ax
X     mov    ax,#INITSEG
X     mov    es,ax
Xgo:    mov    ax,cs
X    mov    ds,ax
X    mov    es,ax
X| put stack at 0x9ff00.
X    mov    ss,ax
X    mov    sp,#0xFF00        | arbitrary value >>512
X
Xok_load_setup:
X
X| Get disk drive parameters, specifically nr of sectors/track
X
X    mov    ch,#0x00
X    seg cs
X|    mov    sectors,cx
X    mov    ax,#INITSEG
X    mov    es,ax
X
X
X
X    seg cs
X
X| after that (everyting loaded), we jump to
X| the setup-routine loaded directly after
X| the bootblock:
X
X    jmpi    0,SETUPSEG
X
X
X


Chapter 1 x86 体系结构与PC 系统概要.....................................1 1.1 x86 CPU 结构...............................................................................................................1 1.1.1 冯诺依曼架构和CISC 指令集......................................................................1 1.1.2 CPU 结构........................................................................................................1 1.1.3 CPU 工作模式................................................................................................2 1.2 x86 体系结构概览........................................................................................................3 1.3 PC 系统.........................................................................................................................5 1.3.1 PC 系统概述...................................................................................................5 2.3.2 总线拓扑.........................................................................................................6 2.3.3 存储器与I/O 编址.........................................................................................6 2.3.4 关于系统的启动与引导.................................................................................8 Chapter 2 Bochs 工程概述....................................................... 11 2.1 开源项目Bochs 介绍.................................................................................................11 2.2 版本2.2.1 源码组织..................................................................................................11 2.3 工程类结构.................................................................................................................12 2.4 主体框架结构分析.....................................................................................................13 2.4.1 Bochs 工程中的重要类................................................................................13 (1) VM 控制台界面类.............................................................................................13 (2) CPU 模拟............................................................................................................14 (3) Memory 模拟......................................................................................................14 (4).I/O device 模拟...................................................................................................15 2.4.2 入口函数main()及Win32 Gui 初始化........................................................15 2.5 Bochs 的工作方式......................................................................................................18 Chapter 3 CPU 类的源码分析...................................................20 3.1 CPU 类概述................................................................................................................20 3.1.1 CPU 逻辑结构框图......................................................................................20 3.1.2 类BX_CPU_C 成员归纳.............................................................................20 3.2 类BX_CPU_C 源码分析..........................................................................................21 3.2.1 CPU 特性声明..............................................................................................21 3.2.2 类bxInstruction_c 成员分析........................................................................22 3.2.3 类BX_CPU_C 源码注释.............................................................................22 3.3 通用寄存器.................................................................................................................29 3.3.1 数据结构与注释...........................................................................................29 3.3.2 通用寄存器归纳...........................................................................................30 3.4 段寄存器、全局寄存器GDI 和IDT ........................................................................31 3.4.1 数据结构与注释...........................................................................................31 3.4.2 段寄存器结构分析.......................................................................................33 3.5 CPU 状态字EFLAGS................................................................................................35 3.5.1 数据结构与注释...........................................................................................35
Bochs项目源码分析与注释 Table of Content Chapter 1 x86 体系结构与 PC 系统概要1 1.1 x86 CPU 结构1 1.1.1 冯诺依曼架构和CISC 指令集 1.1.2 CPU 结构 1.1.3 CPU 工作模式 1.2 x86 体系结构概览 1.3 PC 系统 1.3.1 PC 系统概述 2.3.2 总线拓扑 2.3.3 存储器与I/O 编址 2.3.4 关于系统的启动与引导 Chapter 2 Bochs 工程概述 2.1 开源项目Bochs 介绍........................................11 2.2 版本2.2.1 源码组织..................................................................................................11 2.3 工程类结构.................................................................................................................12 2.4 主体框架结构分析.....................................................................................................13 2.4.1 Bochs 工程中的重要类................................................................................13 (1) VM 控制台界面类.............................................................................................13 (2 ) CPU 模拟............................................................................................................14 (3) Memory 模拟......................................................................................................14 (4 ).I/O device 模拟...................................................................................................15 2.4.2 入口函数main()及Win32 Gui 初始化........................................................15 2.5 Bochs 的工作方式......................................................................................................18 Chapter 3 CPU 类的源码分析...................................................20 3.1 CPU 类概述................................................................................................................20 3.1.1 CPU 逻辑结构框图......................................................................................20 3.1.2 类BX_CPU_C 成员归纳.............................................................................20 3.2 类BX_CPU_C 源码分析..........................................................................................21 3.2.1 CPU 特性声明..............................................................................................21 3.2.2 类bxInstruction_c 成员分析........................................................................22 3.2.3 类BX_CPU_C 源码注释.............................................................................22 3.3 通用寄存器.................................................................................................................29 3.3.1 数据结构与注释...........................................................................................29 3.3.2 通用寄存器归纳...........................................................................................30 3.4 段寄存器、全局寄存器GDI 和IDT ........................................................................31 3.4.1 数据结构与注释...........................................................................................31 3.4.2 段寄存器结构分析.......................................................................................33 3.5 CPU 状态字EFLAGS................................................................................................35 3.5.1 数据结构与注释...........................................................................................35 Understanding the source code of bochs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值