mit的java教材_关于学习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"

131a9844e7268f2543b9ff53084e4ca1.png

4f173c1e8b10f32cd6e81360ff09eace.png

对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!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值