您的位置:首页 > 其它

LAB1实验

2012-04-12 13:35 211 查看
Part 1:

遇到问题1:我将JOS放在Windows的目录下 ,通过VMware设置共享该文件夹来编译JOS,但是Windows更改linux下设置的权限,导致GDB无法调试QEMU.

解决方法:将JOS放在虚拟机下的linux的目录下 2011.12.13

问题2: make qemu-gdb启动qemu后,在令一个终端中gdb调试,则qemu关闭,原因不知

原因:可能是安装qemu时使用的root权限,而使用qemu时,为用户态权限

解决方法:执行make qemu-gdb与执行gdb的两个权限相同。(注意启动gdb时,别忘记进入到lab的目录下)

Part2 :

main.c 的作用是将内核ELF文件读写到内存0x10000开始的地方 2012.1.10

boot loader的入口地址为0x7c00,kernel的入口地址为0x10000c 2012.1.13

问题1: i386-jos-elf-objdump 无法找到?

由于我们采用fedaro,没有自己建立编译链,所以这里使用objdump
2012.1.10

问题2:如果将boot/makefrag中的链接地址由0x7c00改为0x7ccc,则boot部分执行,但是kernel跑不起来

这是为什么呢?2012.1.11 其实并没有执行boot loader,本系统中VMA=LMA,所以当bios跳转到0x7c00时,boot loader无法执行,导致kernel无法加载,进而无法执

行。2012.4.4

Kernel的LMA和VMA的地址不一致?请参看part3开头部分,Kernel的LMA和VMA就是不一样,而boot loader的LMA和VMA 是一样的2012.4.7

问题3:boot.asm中,7d74语句(也就是ELFHDR->e_entry)语句中,call *0x10018

但是GDB中,如果开始便设置断点0x100018,便开始C命令,执行不到0x10018,便把内核给启动起来了,这是为什么呢?2012.1.13

在0x7d74处设置断点,执行到此处,而后用si命令执行一条指令,就跳转到0x10000c处了,...这个为什么?

难道内核入口地址为0x10000c? 经验证,果然如此,与objdump -f kernel看到的一致

问题4:boot loader编译为ELF格式吗?Kernel编译为ELF格式,那么在硬盘中如何指定boot loader 放在第一个扇区,kernel放在哪里呢? Kernel与bootloader是放在文件系

统中吗?2012..4.4

boot loader为ELF格式,在obj/boot中;kernel也为ELF格式,在obj/kern中。而最后 生成的image应该为这两个的结合(猜测)2012.4.7

Part3 :

问题1: kernel的LMA和VMA为什么不一致?

因为一般在虚拟地址空间中,操作系统占据高地址内存,而用户程序占用低地址内存,所以kernel的VMA为很大的值0xf0100000开始的。

而LMA为kernel的加载地址,这个加载器就是boot loader,boot loader将kernel加载到物理内存LMA地址处,那么怎么让这个地址与VMA地址对应起来,这就需要 MMU地址映射来实现了。LMA由程序加载进内存物理地址和加载器有关。(boot/boot.S set up an identity mapping from linear addresses to physical addresses)

Exercise7解答:

将mov %eax,%cr0 注释(comment out)后,执行到0x10002d: jmp *%eax处出错,因为map不成功,则eax中的地址0xf010002f无效,所以出错。这也看出,程序中地址都是virtual地址,gdb调试时也是虚拟地址。2012.4.7
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: