- 论坛徽章:
- 13
|
本帖最后由 _nosay 于 2016-07-15 19:32 编辑
1. ENTRY(trampoline_data) (arch\i386\kernel\trampoline.S, line 37)
展开宏得到:
.globl trampoline_data // globl,全局符号,详见elf格式规范
.align 4, 0x90 // 要求下面的代码地址,按4对齐,缝隙处填充0x90(nop指令)
trampoline_data: // 标号
2. r_base = . (arch\i386\kernel\trampoline.S, line 38)
替换为“r_base:”,r_base值不变,区别应该是:=左边是变量(占内存空间),:左边是标号。
详见:
http://bbs.chinaunix.net/thread-4242247-1-1.html
3. extern unsigned char trampoline_data[]; (arch\i386\kernel\Smpboot.c, line 105)
汇编标号名称,可以在.c文件里面当作外部“变量”使用。
trampoline_data本身在.c里面也是不占空间的,它只是个数组名而已,所以并不与它是标号矛盾。
它的效果是:使.c文件中,trampoline_data后面的“[]内容”,与汇编代码中trampoline_data标号后面的内容一样。
4. 内核有些符号在代码里找不到定义的地方,比如__bss_start、_end:
应该是定义在链接脚本里面了,链接器根据脚本,在链接期间自动添加:http://blog.csdn.net/skyflying2012/article/details/9295951
5. 常量前面必须加$,变量前面加$表示变量地址,寄存器加()表示将寄存器值视为地址,整体为该地址处的“变量” |
|