终于开始KERNEL代码分析了

这一节关注KERNEL.ASM文件,如前一节所述,KERNEL.ASM代码主要目的就是将INIT段copy 到内存高处,跳转到高处的INIT段执行,旧的INIT段被用作内核数据区和Stack区。

pic

有一点须注意下,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