((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)。
阅读(2262) | 评论(0) | 转发(0) |