issue: 使用 bochs 2.6, kernel loader 無法載入 kernel
使用自動變數
u16 offset, next_cluster, cur_cluster;
在 bochs 2.6 下 kernel loader 無法載入 kernel
使用 static 變數 + gcc 4.4
static u16 offset, next_cluster, cur_cluster;
就沒問題 ,但若使用 gcc 4.7 compile, 還是一樣的問題。
很值得看看, 應該是 stack 這邊出了狀況, 看起來又不太像, 慘 ...
每一次的問題都是一次很好的學習機會。
git@github.com:descent/simple_os.git
issue:
git commit: c7229045fd1fb93edff72f2e816eedce6c408c30
fixed only under gcc 4.4
git commit: 7138421dd7c683734cdf774322821b943cc09b78
fixed under gcc 4.7
把 volatile u8 *buff 改成 u16 buff, 讓 "b"(buff)
31 __asm__ __volatile__
32 (
33 @@ -349,6 +354,10 @@ int __REGPARM read_sector(volatile u8 *buff, u8 sector_no, u8 track_no, u8 head_
34 :"a"(0x0200|blocks), "b"(buff), "c"(track_no << 8 | sector_no), "d"(head_no << 8 | disk_no)
35 );
直接吃 u16 的值, 可以修復這問題, 可是還沒找到 root cause。
26 + __asm__ __volatile__("push %eax");
27 + __asm__ __volatile__("push %ebx");
28 + __asm__ __volatile__("push %ecx");
29 + __asm__ __volatile__("push %edx");
30
31 __asm__ __volatile__
32 (
33 @@ -349,6 +354,10 @@ int __REGPARM read_sector(volatile u8 *buff, u8 sector_no, u8 track_no, u8 head_
34 :"a"(0x0200|blocks), "b"(buff), "c"(track_no << 8 | sector_no), "d"(head_no << 8 | disk_no)
35 );
36 #endif
37 + __asm__ __volatile__("pop %edx");
38 + __asm__ __volatile__("pop %ecx");
39 + __asm__ __volatile__("pop %ebx");
40 + __asm__ __volatile__("pop %eax");
似乎和 static 變數無關, 改成 push/pop 32 bit register 比較正常了。
git commit 03532548e7d57d660033e648c793a657ebe596de
似乎還得補上 push/pop %esi, %edi
git commit 38a3df774b25348aceffb479d731a5579641f595
我對在 c 語言使用 inline assembly 還不熟悉, 可能踩到什麼陷阱了。會加上 push/pop 這些暫存器只是我反組譯看到 c compiler 會用到這些暫存器, 所以加上。
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。