今天把第一课的实验过一遍,然后看了一下前512字节的bootloader的代码。对bios的int0x10 软中断服务程序进行了一点实验。整个过过程遇到些问题,记录一下,以免忘了没有地方找!
1:在编译lab下代码时遇到的问题:
lib/printfmt.c:42:对‘__udivdi3’未定义的引用
lib/printfmt.c:50:对‘__umoddi3’未定义的引用
原因:由于在printfmt.c文件中用了libgcc.a中的库函数,但是我的开发环境是64位的gcc,所以找不到这个库文件。
解决:
sudo apt-get install gcc-multilib
sudo apt-get install ia32-libs lib32gcc1 lib32stdc++6
安装完上面的库后,在GNUmakefile中将GCC_LIB改为下面这样:
GCC_LIB :=-L /usr/lib/gcc/x86_64-linux-gnu/4.7.2/32 -lgcc
如果我们编译时用的gcc是64位的,大多人都是64位的,在cc和ld时,要在makefile中加入下面这样生成32位代码的选项:
LDFLAGS := -m elf_i386
CFLAGS += -Wall -Wno-format -Wno-unused -Werror -gstabs -m32
上面那样,基本上就没有什么问题了。
安装qemu,pc虚拟机:
这个比较简单,没有多大问题:
git clone http://pdos.csail.mit.edu/6.828/qemu.git -b 6.828-0.15
./configure --disable-kvm --target-list="i386-softmmu x86_64-softmmu"
make && sudo make install
安装比较顺利。
下面是用qemu的过程:
在lab1g下面,make后,如果生成了kernel.img就行了,
然后make qemu就能启动我们的kernel.img内核了。
问题:如果在make的时候,生成的boot文件过大,超过了512字节,
解决:那是编译器的问题,我换成了gcc4.5
sudo apt-get install gcc4.5
问题:在用gdb来和qemu联合调试时,不能正常的通过.gdbinit文件加载kernel文件,
解决: gdb -q -iex "set auto-load safe-path /home/administrator"
对boot.S和main.c稍微看了一下:
boot.S做了如下工作:
1:enable A20地址线
2:设置好gdt,转换成32位的protected mode
3:设置好栈指针
4:跳转到main.c的bootmain函数
main.c做了如下工作:
1:复制8个sector大小的kernel文件到ram中,
2:给程序发配segment地址,不太了解
3:跳转到kernel部分运行
kenel文件是elf格式的,从在qemu中运行,可以知道kernel只是读取我们输入的内容,然后打印出一些信息。
目前是两个命令:help ,kerninfo。
学习这个真是比较麻烦!come on!