Chinaunix首页 | 论坛 | 博客
  • 博客访问: 530768
  • 博文数量: 118
  • 博客积分: 3995
  • 博客等级: 中校
  • 技术积分: 1276
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-15 12:15
文章分类

全部博文(118)

文章存档

2014年(1)

2013年(1)

2010年(6)

2009年(27)

2008年(10)

2007年(33)

2006年(38)

2005年(2)

我的朋友

分类: LINUX

2009-02-22 01:08:55

((void (*)(void)) (ELFHDR->e_entry & 0xFFFFFF))();
这段代码有点复杂,应该说有四个部分
1. 函数指针(地址)p = ELFHDR->e_entry
2. 地址转换 p = p & 0xFFFFFF
3. 强制类型转换 (void (*)(void)) p ,即p指向这类函数 void fun(void);
4. 函数调用 (*p)()

内核编译后,链接成elf格式,线性地址0xf0100000起始的位置,然后通过mmu进行地址转换
把它映射到合适的物理地址上;启动代码(main.c)里面把内核加载到了物理地址0x00100000
起始位置,在跳转到内核执行之前线性地址通过一个临时的gdt转换成物理地址(地址值不变,
相当于没转换),所以在跳转到ELFHDR->e_entry执行前需要手动转换一下地址,即
ELFHDR->e_entry & 0xFFFFFF,这样就把0xf0100000映射成0x00100000,实现正确调用;
等到进入内核再重新初始化gdt,就能进行正确地址映射了(设KERNBASE=0xf0000000,只要
设置段基地址为-KERNBASE即可,这样映射线性地址p-> p-KERNBASE)。


阅读(2206) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~