实现自己的操作系统 第二部分

来源:互联网 发布:qq邮箱端口和发送smtp 编辑:程序博客网 时间:2024/04/27 16:12

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

原创粉丝点击