2-1
实现了内存的检测。
下一步:读kernel.bin到内存。
目前内存信息放在8000:f000开始的4k空间中。以后此空间会被拷贝到“0页”,即0x00104000处。
Linux中关于内存检测的参数在e820.h中。
内存检测结果如下:
00 00 00 00 00 00 00 00 00 FC 09 00 00 00 00 00 01 00 00 00
00 FC 09 00 00 00 00 00 00 04 00 00 00 00 00 00 02 00 00 00
00 00 0E 00 00 00 00 00 00 00 02 00 00 00 00 00 02 00 00 00
00 00 10 00 00 00 00 00 00 00 EF 01 00 00 00 00 01 00 00 00
00 00 FF 01 00 00 00 00 00 F0 00 00 00 00 00 00 03 00 00 00
00 F0 FF 01 00 00 00 00 00 10 00 00 00 00 00 00 04 00 00 00
00 00 FC FF 00 00 00 00 00 00 04 00 00 00 00 00 02 00 00 00
1E 0E 00 48 74 09 B4 88 CD 15 3D 40 00 72 26 B4 05 FF 1E 0E
BaseAddrLow BaseAddrHigh LengthLow LengthHigh Type
0x00000000 0x00000000 0x0009FC00 0x00000000 1
0x0009FC00 0x00000000 0x00000400 0x00000000 2
0x000E0000 0x00000000 0x00020000 0x00000000 2
0x00100000 0x00000000 0x01EF0000 0x00000000 1
0x01FF0000 0x00000000 0x0000F000 0x00000000 3
0x01FFF000 0x00000000 0x00001000 0x00000000 4
0xFFFC0000 0x00000000 0x00040000 0x00000000 2
1为可使用,其它为系统保留。
2-2
实现了kernel.bin的拷贝,并写了一个示例的kernel.bin。能够成功运行。
现在开始最花时间的就是调试了。今天找到一个以前的bug,就是读簇号的,代价是一个下午。
下面即将进入保护模式。
2-3
现在能够成功跳入保护模式了。
小端格式是指低地址放低字节,高地址放高字节。
大端格式是指低地址放高字节,高地址放低字节。
原先的理解似乎反了。
Debug时的段地址和程序直接运行时的段地址是不一样的。
由实模式跳转到保护模式时,需要使用的命令:
jmp dword far [PTR_STARTBASE32]
其中PTR_STARTBASE32指向一个6字节的空间,前4字节为IP,后2字节为段地址。
下一步要做的:
解析elf文件,makefile也需要改到Linux下了。
2-4
2006-1-4
实现了elf文件的解析。
cygwin:
ld -s -o kernel kernel.o
ld: warning: cannot find entry symbol _mainCRTStartup; defaulting to 00401000
ld可使用-e选项指定入口参数;cygwin不支持-melf_i386选项,所以不能使用它来编译。
mount -t smbfs //192.168.1.111/download /mnt/sinshare
可用于装载网络上的windows文件系统。
下面的问题主要就是调试了。在保护模式下必须使用bochs虚拟机调试。
调试主要选项:
b 设置断点
b 0x30400
info break 显示断点信息
c 继续执行,直到遇上断点
s 单步执行
dump_cpu 显示CPU各寄存器的信息
disassemble start end 反汇编一段内存
disassemble 0x30400 0x3040D
xp /nuf address 查看内存内容
xp /40bx 0x9013e
查看从0x9013e开始的40字节内存
2-5
2006-1-5 19:56
将源代码重新组织了一下,重写了makefile
elf格式:
text段在最前面;然后是data;最后是bss。
nasm中使用org进行重定位只能用在文件开头,以后要重定位的话不能再用这种方法,这一点与masm很不相同。
以后的重定位只能使用“times 0x1000 - ($-$$) db 0”的方法。
2-6
2006-1-5 20:35
重新调换了保护模式中的gdtr
elf可执行文件中的标号地址已经加上了重定位的偏移量,即“ld -s -Ttext addr”中addr的值。
这和elf的.o文件是不一样的。
2-7
2006-1-6 15:58
将内核的虚拟地址改成了0xC0100000
对前8M空间进行了分页操作。
此后所有的地址都要经过一个0xc0000000的偏移,这与linux的相同。
使用jmp语句时,很多情况下都只是短跳转,无法进入虚拟地址。
stosl无法使用,编译的时候自动跳过了,不知道为什么。
2-8
2006-1-9 14:44
实现了软中断的调用。
gdt和idt中的内容都应该是经过页式映射的线性地址。
代码地址:
http://d.download.csdn.net/filedown2008/aHR0cDovL2RsMi5jc2RuLm5ldC9kb3duNC8yMDA4MDMzMC8zMDIxMzU0MTgyMi56aXA=!398454