- 論壇徽章:
- 13
|
本帖最后由 _nosay 于 2016-07-15 19:32 編輯
1. ENTRY(trampoline_data) (arch\i386\kernel\trampoline.S, line 37)
展開宏得到:
.globl trampoline_data // globl,全局符號(hào),詳見elf格式規(guī)范
.align 4, 0x90 // 要求下面的代碼地址,按4對(duì)齊,縫隙處填充0x90(nop指令)
trampoline_data: // 標(biāo)號(hào)
2. r_base = . (arch\i386\kernel\trampoline.S, line 38)
替換為“r_base:”,r_base值不變,區(qū)別應(yīng)該是:=左邊是變量(占內(nèi)存空間),:左邊是標(biāo)號(hào)。
詳見:
http://72891.cn/thread-4242247-1-1.html
3. extern unsigned char trampoline_data[]; (arch\i386\kernel\Smpboot.c, line 105)
匯編標(biāo)號(hào)名稱,可以在.c文件里面當(dāng)作外部“變量”使用。
trampoline_data本身在.c里面也是不占空間的,它只是個(gè)數(shù)組名而已,所以并不與它是標(biāo)號(hào)矛盾。
它的效果是:使.c文件中,trampoline_data后面的“[]內(nèi)容”,與匯編代碼中trampoline_data標(biāo)號(hào)后面的內(nèi)容一樣。
4. 內(nèi)核有些符號(hào)在代碼里找不到定義的地方,比如__bss_start、_end:
應(yīng)該是定義在鏈接腳本里面了,鏈接器根據(jù)腳本,在鏈接期間自動(dòng)添加:http://blog.csdn.net/skyflying2012/article/details/9295951
5. 常量前面必須加$,變量前面加$表示變量地址,寄存器加()表示將寄存器值視為地址,整體為該地址處的“變量” |
|