实现自己的操作系统 第二部分
2008-03-28 13:23
330 查看
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
实现了内存的检测。
下一步:读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
相关文章推荐
- 实现自己的操作系统 第一部分
- 实现自己的操作系统 第三部分
- 实现一个定制的3DListview——第二部分
- 搭建FreeRadius实现远程登录认证(第二部分)
- [操作系统概念]第二部分——多线程
- java实现mysql的主从切换(第二部分)
- Cocos2d-x简单游戏<捕鱼达人>代码实现|第二部分:子弹、渔网、大炮类
- 用TCP/IP实现自己简单的应用程序协议:成帧器部分
- XRecyclerView实现RecyclerView下拉刷新上来加载 自己做了部分修改,使代码更简洁易用
- 看门外汉如何实现:C#操作 MongoDB基本CURD的事务控制之 第二部分
- 23-《电子入门趣谈》第四章_自己制作电路板-4.3Altium Designer (第二部分)
- 比特币系统采用的公钥密码学方案和ECDSA签名算法介绍——第二部分:代码实现(C语言)
- 《自己动手写操作系统 》第九章 一 简易硬盘驱动的实现
- 淘宝diamond使用心得 服务端+客户端+部分自己实现的代码
- C++类模板 实现循环队列的顺序存储结构算法 《数据结构》(北京科海) 部分摘抄 自己编写实现
- C++类模板 实现队列的链式存储结构算法 《数据结构》(北京科海) 部分代码摘抄,自己编写运行
- 初步理解spring ioc原理(读完可自己实现依赖注入部分的spring框架)
- 自己实现spring核心IOC部分
- Flex之旅:第二部分:容器与布局(7)---使用IdeferredInstance 创建模板,实现组件的延迟加载
- 使用反射在NET中实现动态工厂(第二部分)