关于学习MIT6.828操作系统课程lab1记录


今天把第一课的实验过一遍,然后看了一下前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!


 

posted @ 2013-05-26 22:55  javawebsoa  Views(768)  Comments(0Edit  收藏  举报