Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92398
  • 博文数量: 12
  • 博客积分: 1499
  • 博客等级: 上尉
  • 技术积分: 240
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-20 10:01
文章分类
文章存档

2010年(1)

2008年(11)

我的朋友

分类:

2008-09-20 16:49:14

0x03: JOS的启动过程

启动只有两个文件: boot.S 和 main.c.
从实现可以发现,JOS在启动方面的做法是,首先用汇编代码尽早设置好c函数运行所需要的条件,然后迅速转入用C语言实现。
此外,JOS用到了目前通用的ELF格式。

boot.S的作用:
1. cli, cld,然后清空ds,es和ss的内容。
2. Enable A20, 使得内存管理范围超出1M之外。
3.  设置gdt,然后打开保护位(cr0)。
4. ljmp到保护模式,转入32位保护模式。
5.  设置ds,es,fs,gs和ss为保护模式下数据段描述符的地址(0x10)。
6.  设置好栈,进入C代码中的函数bootmain(), 继续启动过程。

此时,内存布局及内存中的内容大致如下:
|-------------|
|        |
|        |
|-------------|    <-- 0x7dff(the end of bootcode)
|        |
|-------------|    <-- 0x7c64(gdtdesc)
|        |
|-------------|    <-- 0x7c4c(gdt)
|        |
|        |
|        |
|        |
|-------------|    <-- 0x7c00 (esp)
|        |
|        |
|        |
|-------------|    <-- 0x00000000


main.c的作用:
1. 将磁盘(即kernel)的前8个扇区的内容读入某内存地址(任意地址均可,只要不影响启动。jos使用地址为0x10000, 在boot代码所用内存区间(0x7c00-0x7dff)之外,因此是安全的),并且分析其是否为正确的ELF格式文件。
2. 若为正确ELF文件,则根据这8扇区内容将kernel中对应的program segment读入内存中对应的位置(ph->p_va).
3. 从kernel的e_entry位置开始执行。
此时,将进入kernel的主体代码,boot代码任务结束。

(转贴请注明: by: chunchengfh, from: chunchengfh.cublog.cn)
阅读(1770) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~