6.828 Fall 2007 Lab1 Excercise6

Exercise 6. Reset the machine (exit bochs and start it again). Examine the 8 words of memory at 0x00100000 at the point the BIOS enters the boot loader, and then again at the point the boot loader enters the kernel. Why are they different? What is there at the second breakpoint? (You do not really need to use Bochs to answer this question. Just think.)
 
 
My words:
        boot loader载入内存中,起始地址是0x7c00,这个地址是JOS的BIOS设定的,已经写死,所以当更改编译时的相对地址(也是链接地址,就是那个link address),在系统启动时的载入也不会出错,只不过一旦在运行过程中遇到跳转指令(jmp啥啥的),或是其他涉及到地址的命令时会出错。
kernel载入到内存中的起始地址应该是0x00100000,这也是扩展内存部分的起始位置。
刚进入boot loader时kernel还没进内存,所以0x00100000那里都是0。
刚进入kernel时的断点到底是0x100000还是0x10000c,我也不确定,但是可以知道的是0x100000处的命令是
  
  
  
  
  1. movw       $0x1234,0x472# warm boot 
,这个网上有解释:
 warm boot:即告诉BIOS检测程序“不要做内存检测”。该子程序往物理内存地址0x472处写值0x1234。该位置是启动模式(reboot_mode)标志字。在启动过程中ROM BIOS会读取该启动模式标志值并根据其值来指导下一步的执行。 如果该值是0x1234,则BIOS 就会跳过内存检测过程而执行热启动(Warm-boot)过程。 如果若该值为0,则执行冷启动(Cold-boot)过程。
        而看obj/kern/kernel.asm文件中(f01000c会跟基址相加进位成0010000c),0x10000c处才是_start。在实验中,断点设置在0x100000处时,会直接启动了系统,而断点设置在0x10000c的时候是可以正常停下。

你可能感兴趣的:(职场,Boot,loader,休闲,JOS)