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
遇到问题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
相关文章推荐
- # 操作系统实验报告:ucore-lab1
- 操作系统实验报告:ucore-lab1
- CSAPP 六个重要实验 lab1
- MIT操作系统课程CS6.828实验(3) —— 启动PC(Lab1)
- lab1的实验练习答案
- 操作系统实验报告 lab1
- Lab1实验报告
- 软件测试实验LAB1
- ucore操作系统lab1实验准备知识
- 对VLAN间路由实验的总结
- 第9周实验报告5
- 实验八
- MySQL事物系列:3:innodb_flush_log_at_trx_commit小实验
- 20145211 《Java程序设计》实验报告三:敏捷开发与XP实践
- 南邮微机实验 串行口的测试
- 【iCore4 双核心板_FPGA】例程十五:基于单口RAM的ARM+FPGA数据存取实验
- 如何跨VLAN访问的实验2
- C++程序设计实验报告(六十四)---第十周任务3
- Oracle 10g rac+asm 磁盘头备份与恢复实验
- Linux实验之Makefile