计算机启动流程分析--以JOS为例(从boot loader 到kernal)

    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中的调用&#

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值