2009年7月31日 星期五

trace fiasco bootstrap code part 1

繼續trace fiasco的bootstrap
我發現她用了很多奇怪的macro
不過沒關係 我現在用google desktop search來作搜尋
我找了EXTERN_C_BEGIN 跟 EXTERN_C_END 及 EXTERN_C這些的定義
他們是定義在l4/pkg/l4/sys/include/compiler.h裡面
他做的工作很簡單 就是用來取代我們常常看到的 extern "C" { 跟 }
她會根據__cplusplus這個macro來作決定要不要讓這個macro有實質
__cplusplus是c++ compiler裡面原本就會有的macro 來辨別說這是不是一個c++ compiler

那為什麼要用extern "C" 的原因是因為在一個有c也有c++ code的程式中
因為對於c++來說 c算是另種language 有些地方會不一樣 所以說會要說這是另一種language
他們在編譯的時候c跟c++對function name的編譯是不一樣的 可能會造成link error

接下來trace bootstrap的startup.h的code
這邊有一個function have_hercules() 這個function好像是只有在amd64底下才有用到 其他我都沒看到又在用
另外這邊有一個變數 _mod_end我看了看 我沒發現有人用他 不知道是怎麼回事
在這裡還有一個struct是boot_info_t 他主要用的地方是在init_kip的部份 其他就沒看到了
這個startup.h大概就是這樣

接下來是看crt0.S這個檔 這是很重要的檔
根據我現在的理解 這個檔本來在compile那端就會自動產生這個檔
這裡不知道為什麼要自己寫一份
這主要是做一個c程式在開始前的startup 跟結束後的finish code
目前我看的code是在/l4/pkg/bootstrap/server/src/ARCH-x86/crt0.S
這是x86的專屬code 每個arch都有自己對應的一份
目前我知道他會跳到__main的function中
而這個function目前是定義在 l4/pkg/bootstrap/server/src/libc_support+.cc裡面
他會跳到startup這個function
目前先看到這裡 其實中間的細節是很重要的 之後再看

沒有留言:

張貼留言