linux0.12編譯問題解決記錄

從setup跳轉到head的時候顯示“physical address not avaliable”。
bochs單步調試,發現jmp 0,8後,執行的都是空指令,按‘c’連續執行,根據退出地址8:000000000c00知道head的數據在此處,突發靈感,覺得是gcc文件頭格式變了,於是在build.c文件中構造system文件的地方,把GCC_HEADER宏加上0xc00,然後重新make,發現確實解決了這個問題。

但是出現了新問題,lss stack_start,%esp運行到這個指令,bochs就退出了。卡在了這裏好久好久好久,
今天2019/11/6號,調試了兩小時終於突發靈感解決了。首先要明白lss stack_start,%esp指令的作用,這條指令是把 stack_start地址處的內存,低地址的值給esp寄存器,高地址的值給ss段寄存器。
struct {
long * a;
short b;
} stack_start = { & user_stack [PAGE_SIZE>>2] , 0x10 };
低地址內容是 user_stack的地址值,高地址內容是0x10要給ss段寄存器的值。
根據bochs界面的顯示lss esp,ds:0x250e0,知道了stack_start 的地址,bochs執行到這一步的時候,我執行“x /320wx ds:0x25000”,查看這部分的內存,發現全是0,定位出問題發生的原因是lss指令加載到esp寄存器的值是0,並不是 user_stack的地址值,vim System.map,查找 user_stack發現它的地址值是0x37200!!!
把ss stack_start,%esp指令改爲:
mov %ax,%ss
lea user_stack,%esp
問題解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章