操作系统学习笔记(一)
一、目的:
本文是通过对《30 天自制操作系统》的学习所作的小结,以便于日后回顾温习。主要是针
对 helloos.img 二进制文件的一个分析。
二、知识点:
在对 helloos.img 进行分析之前需提一下二部分的知识点(引导扇区区格式,opCode)
1) 引导扇区格式:
名称
开始
字节
长
度
内容
BS_jmpBOOT
BS_OEMName
0
3
BPB_BytesPerSec 11
3 一个短跳转指令
8 厂商名
2 每扇区字节数
(Bytes/Sector)
参考值
jmp Label_07c00H
nop
'QingFeng'
0x200
BPB_SecPerClus
13
BPB_ResvdSecCnt 14
BPB_NumFATs
16
17
BPB_RootEntCnt
BPB_TotSec16
19
21
BPB_Media
BPB_FATSz16
22
BPB_SecPerTrk
BPB_NumHeads
BPB_HiddSec
BPB_TotSec32
BS_DrvNum
BS_Reserved1
BS_BootSig
BS_VolID
BS_VolLab
BS_FileSysType
24
26
28
32
36
37
38
39
43
54
1 每簇扇区数
0x1
(Sector/Cluster)
Boot 记录占用多少扇区 ox1
2
1 共有多少 FAT 表
0x2
0xE0
2 根目录区文件最大数
0xB40[2*80*18]
2 扇区总数
1 介质描述符
0xF0
2 每个 FAT 表所占扇区数 0x9
2 每磁道扇区数
0x12
则由这里给出扇区数
INT 13H 的驱动器号
(Sector/track)
2 磁头数(面数)
4 隐藏扇区数
4 如果 BPB_TotSec16=0,
1
1 保留,未使用
1 扩展引导标记(29h)
4 卷序列号
11 卷标
8 文件系统类型
0x2
0
0
0
0
0x29
0
'QingFeng'
'FAT12'
引导代码及其他内
容
结束标志 0xAA55
448 引导代码及其他数据
62
510 2 第 510 字节为 0x55,第
511 字节为 0xAA
引导代码(剩余空
间用 0 填充)
0xAA55
注:1) 引导扇区前两字节为跳转指令,即指示引导程序的开始地址
2) 引导扇区以 0xAA55 为结尾,由于系统一次的读入的能力为 512 字节,因此结
尾标志 0xAA55 需在 510 地址处,以标志当前读入的为引导扇区。
2 )
helloos.img 二进制文件分析:
2.1 根据引导扇区格式进行分析
名称
一个短跳转指令
开始
字节
0
长
度
3
内容
0xEB 0X4E 0X90
参考值
Jmp 0x4e
厂商名
3
11
每扇区字节数
(Bytes/Sector)
每簇扇区数
(Sector/Cluster)
Boot 记录占用多少
扇区
共有多少 FAT 表 16
根目录区文件最大
数
17
13
14
扇区总数
介质描述符
每个 FAT 表所占扇
区数
每磁道扇区数
(Sector/track)
磁头数(面数)
隐藏扇区数
如果
BPB_TotSec16=0,
则由这里给出扇区
数
INT 13H 的驱动器
号
19
21
22
24
26
28
32
36
8
2
1
2
1
2
2
1
2
2
2
4
4
1
0xE8 0x45 0x4C 0x4F 0x49
0x50 0x4C
'HELLOIPL'
0x00 0x02
0x200
0x01
0x01 0x00
0x02
0xF0 0x00
0x40 0x0B
0xF0
0x09 0x00
0x12 0x00
0x02 0x00
0x00 0x00
0x1
0x1
0x2
0xF0
2880]
0xF0
0x9
0x12
0x2
0
0x40 0x0B 0x00 0x00
2880
0x00
0
37
保留,未使用
扩展引导标记(29h) 38
39
卷序列号
1
1
4
卷标
43
11
文件系统类型
54
8
0
0x29
0x00
0x29
0xFF 0xFF 0xFF 0xFF 0
0x48 0x45 0x4C 0x4C
0x4F 0x2D 0x4F 0x53
0x20 0x20 0x20
0x46 0x41 0x54 0x31
0x32 0x20 0x20 0x20
'HELLO-OS'
'FAT12'
引导代码及其他数
据
结束标志 0xAA55
448 引导代码及其他数据
62
510 2 第 510 字节为 0x55,第
511 字节为 0xAA
引导代码(剩余空
间用 0 填充)
0xAA55
2.2 引导代码分析:
这部分主要是根据 opCode 进行反汇编,及与汇编文件(helloos.nas)的一个比对分析
二进制代码
0xB8 0x00
0x8E 0xD0
汇编代码
Mov Ax, 0x00 0x00
Mov SS,AX
0xBC 0x00 0x7C
Mov sp,0x7C00
注释
0xB8 Mov Ax,imm16(16 位立即数)
0x8E segReg, reg16/mem16
Mov SS, AX
注:以上两条指令不是对栈指针进行初始化
0xBC MOV sp,immed16
注:指示内存加载地址,此处只能是 0x7C00
0x8E 0xD8
Mov DS,AX
0x8E 0xC0
Mov ES,AX
(BIOS 规范中定义)
0x8E segReg, reg16/mem16
根据 opCode 分析得 Mov DS,AX
注:对DS 寄存器的初始化
0x8E segReg, reg16/mem16
根据 opCode 分析得 Mov ES,AX
0xBE 0x74 0x7C
Move si,0x74 0x7C MOV si,immed16
根据 opCode 分析得 Mov SI,0x74 0x7C
注:将0x7C74 的内存地址赋给SI,即将SI 的指
针指向要打印的字符串.由于引导程序是加载在
0x7c00 的位置,所以这里是以该地址为基础再偏
移0x74 就得到了字符串地址.
0x8A 0x04
Mov AL,[si]
0x83 0xC6 0x01
ADD SI,1
Mov reg8,reg8/mem8
注:将[si]地址的一个字符给AL
0x83 = table2
0x3C 0x00
Cmp al, 0
0xC6 根据 opCode 查得 add si, imm8
最后,得 add si, 1
Cmp al,immed8
0x74 0x09
Jz 0x09
JZ immed8
如 ZF=0 pc 指针偏移 8+2 即 0x71 地址处
0xB4 0x0E
Mov ah,0x0e
0xBB 0x0F 0x00
Mov BX,15
0xCD 0x10
0xEB 0xEE
Int 0x10
JMP
putloop
MOV ah,immed8
MOV bx,immed16
INT immed8
Jmp immed8
0xEE = -17
即 pc 指针偏移-17 至 0x5F 地址处
关于 OpCode 请参考 http://ref.x86asm.net/geek64-abc.html
最后简单讲一下 OpCode
OpCode 基本有 2 部分组成(Code,modreg/rm)
Code 可从 http://ref.x86asm.net/geek64-abc.html 网页上查找
Modreg/rm 为 8bit 字符,以 2:3:3(mod,reg,r/m)的型进行分组
Mod 字段与 r/m(register/memory)字段结合在一起确定另一个操作数的寻址方式,
根据 mod 字段来确定寻址方式:
如:0x8A 0x04
查 opCode 0x8A 指令为 Mov reg8,reg8/mem8
对 0x04 进行 2:3:3 分组得 00 000 100
先查 000 得 AL
100 得[SI]
因此 0x8A 0x04 = Mov AL,[SI]
16-bit ModR/M Byte
r8(/r)
r16(/r)
r32(/r)
mm(/r)
xmm(/r)
sreg
AL CL DL BL AH CH DH BH
AX CX DX BX SP BP SI DI
EAX ECX EDX EBX ESP EBP ESI EDI
MM0 MM1 MM2 MM3 MM4 MM5 MM6 MM7
XMM
XMM
0
7
ES CS SS DS FS GS res res
XMM
1
XMM
4
XMM
2
XMM
3
XMM
5
XMM
6
eee
eee
(In decimal) /digit (Opcode)0
(In binary) REG =
Effective 聽 Address
d
1
CR2 CR3 CR4 inv
CR0 inv
DR0 DR1 DR2 DR3 DR41DR51DR6 DR7
d
2
3
4
5
.
inv
d
.
inv
d
6
7
000 001 010 011 100 101 110 111
R/
Mo
Value of ModR/M Byte (in Hex)
d
M
00 00
0 00 08 10 18 20 28 30 38
00
1 01 09 11 19 21 29 31 39
01
0 02 0A 12 1A 22 2A 32 3A
01
1 03 0B 13 1B 23 2B 33 3B
10
0 04 0C 14 1C 24 2C 34 3C
10
1 05 0D 15 1D 25 2D 35 3D
11
0 06 0E 16 1E 26 2E 36 3E
11
1 07 0F 17 1F 27 2F 37 3F
01 00
0 40 48 50 58 60 68 70 78
00
1 41 49 51 59 61 69 71 79
01
0 42 4A 52 5A 62 6A 72 7A
01
1 43 4B 53 5B 63 6B 73 7B
10
0 44 4C 54 5C 64 6C 74 7C
10
1 45 4D 55 5D 65 6D 75 7D
11
0 46 4E 56 5E 66 6E 76 7E
11
1 47 4F 57 5F 67 6F 77 7F
10 00
0 80 88 90 98 A0 A8 B0 B8
[BX+SI]
[BX+DI]
[BP+SI]
[BP+DI]
[SI]
[DI]
disp16
[BX]
[BX+SI]+disp8
[BX+DI]+disp8
[BP+SI]+disp8
[BP+DI]+disp8
[SI]+disp8
[DI]+disp8
[BP]+disp8
[BX]+disp8
[BX+SI]+disp16
[BX+DI]+disp16
[BP+SI]+disp16
[BP+DI]+disp16
[SI]+disp16
[DI]+disp16
[BP]+disp16
[BX]+disp16
AL/AX/EAX/ST0/MM0/XM
M0
CL/CX/ECX/ST1/MM1/XM
M1
DL/DX/EDX/ST2/MM2/XM
M2
BL/BX/EBX/ST3/MM3/XM
M3
AH/SP/ESP/ST4/MM4/XM
M4
CH/BP/EBP/ST5/MM5/XM
M5
DH/SI/ESI/ST6/MM6/XM
M6
BH/DI/EDI/ST7/MM7/XM
M7
00
1 81 89 91 99 A1 A9 B1 B9
01
0 82 8A 92 9A A2 AA B2 BA
01
1 83 8B 93 9B A3 AB B3 BB
10
0 84 8C 94 9C A4 AC B4 BC
10
1 85 8D 95 9D A5 AD B5 BD
11
0 86 8E 96 9E A6 AE B6 BE
11
1 87 8F 97 9F A7 AF B7 BF
11 00
0 C0 C8 D0 D8 E0 E8 F0 F8
00
1 C1 C9 D1 D9 E1 E9 F1 F9
01
0 C2 CA D2 DA E2 EA F2 FA
01
1 C3 CB D3 DB E3 EB F3 FB
10
0 C4 CC D4 DC E4 EC F4 FC
10
1 C5 CD D5 DD E5 ED F5 FD
11
0 C6 CE D6 DE E6 EE F6 FE
11
1 C7 CF D7 DF E7 EF F7 FF