终于开始KERNEL代码分析了
这一节关注KERNEL.ASM文件,如前一节所述,KERNEL.ASM代码主要目的就是将INIT段copy 到内存高处,跳转到高处的INIT段执行,旧的INIT段被用作内核数据区和Stack区。
![pic](/images/2023/02/04/38b827fc8136278fef0662199c04d189.jpg)
有一点须注意下,int 12中断获取的是内存大小,一般DOS系统内存为640KB,这里的bochs bios返回的是639KB,因为最后的1KB是bochs bios保留用的,用于 键盘缓冲区等。
retf执行后CS=内存高处段地址, IP=cont偏移地址,所以CPU往后执行的是高端内存的cont代码,然后跳转执行main.c中的main函数 (main函数也在高端内存)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
;
push es ; ES=内存高处段地址, 压栈
mov ax,cont ; ax=cont的偏移地址, 压栈
push ax ; retf执行完后,CPU自动将栈中的内容POP给IP,CS
retf
cont:
.............
mov ax,ds
mov es,ax
jmp _main
segment INIT_TEXT_END
|
KERNEL.ASM还有其它部分分布放在_TEXT,_FIXED_DATA, _BSS, _BSSEND, 如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
segment _TEXT
_nul_strtgy:
....
_nul_intr:
....
_printf
.....
segment _FIXED_DATA
;所谓FIXED_DATA,即这块内存的值是固定了,因为要和DOS系统兼容。
;存放各种数据及指针,如用户可用内存区地址,系统文件表头。。。
segment _BSS
_api_sp
_api_ss
_usr_sp
_usr_ss
_ram_top
segment _BSSEND
blk_stk_top
clk_stk_top
intr_stk_top
last
segment _STACK
|