Boot Loader即引导程序,它在BIOS执行完毕后被执行,它的代码在JOS中由两部分组成,boot.S汇编语言文本文件和main.c的C语言文本文件,之前说到汇编代码跳转到叫做bootmain的地方,它是main.c的一个函数:
void
bootmain(void)
{
struct Proghdr *ph, *eph;
// read 1st page off disk
readseg((uint32_t) ELFHDR, SECTSIZE*8, 0);
// is this a valid ELF?
if (ELFHDR->e_magic != ELF_MAGIC)
goto bad;
// load each program segment (ignores ph flags)
ph = (struct Proghdr *) ((uint8_t *) ELFHDR + ELFHDR->e_phoff);
eph = ph + ELFHDR->e_phnum;
for (; ph < eph; ph++)
// p_pa is the load address of this segment (as well
// as the physical address)
readseg(ph->p_pa, ph->p_memsz, ph->p_offset);
// call the entry point from the ELF header
// note: does not return!
((void (*)(void)) (ELFHDR->e_entry))();
bad:
outw(0x8A00, 0x8A00);
outw(0x8A00, 0x8E00);
while (1)
/* do nothing */;
}
粗略地看这个函数,它的功能正如注释所说,是read segment,就是读取磁盘的一段数据,readseg这个函数的具体实现不再描述,但是简单研究会发现,它本质上就是IDE磁盘的原始I/O实现。
readseg的函数原型是:
readseg(uint32_t pa, uint32_t count, uint32_t offset)
第一个参数是物理地址,表示读取磁盘的内容放在物理内存地址pa处,第二个是读取的字节数,第三个是从磁盘的第几个字节开始读取。
那么根据bootmain中的调用&#