1. 程式人生 > >ubuntu 12.04編譯及除錯linux-0.11

ubuntu 12.04編譯及除錯linux-0.11

(更新中.....)

最近開始研究linux-0.11,編譯過程就遇到各種奇葩情況......好不容易編譯通過了....可是還是不能載入執行....

下面是我學習過程記錄:

1.開始我用gcc-3.2.2-5.i386.rpm編譯linux-0.11,

你也知道rpm包在ubuntu下不能使用,於是我就用alien_8.78.tar.gz轉換,轉換會生成一個usr目錄,裡面包含lib,share, bin子目錄

在終端輸入

export PATH=/home/robocup3d/oldlinux/usr/bin/:$PATH

然後make 既可以編譯通過了

然後在bochs-2.2.1裡面載入可以正常執行,但是要是在bochs-2.5就是Reset-floppy-called 錯誤....真心不知道這又是什麼情況導致的錯誤,望大神指導!

接著我就想能不能用gcc-4.8.1編譯呢?

很幸運編譯沒有出現差錯,通過了,但是用bochs-2.5執行卻是卡在這個介面

接下來就是痛苦的反彙編的過程中....

首先發現 init/main.c有問題

static inline _syscall0(int,fork)
static inline _syscall0(int,pause)
static inline _syscall1(int,setup,void *,BIOS)
static inline _syscall0(int,sync)

這幾個函式不是以inline方式編譯的程式碼,查質料說gcc-4.8.1的static inline屬性只是建議編譯器去內聯,但是gcc-3.2.2編譯的就是內聯的。解決方法是:

static inline int fork(void) __attribute__((always_inline));
static inline int pause(void) __attribute__((always_inline));
static inline int sync(void) __attribute__((always_inline));
static inline int setup(void* BIOS) __attribute__((always_inline));

這樣宣告函式就可以了...編譯過後就是內聯的了....但是執行還是卡住在上面那個介面

kernel/fork.c檔案

在copy_process()函式中 *p = * current; 語句前新增 __asm__ volatile ("cld");

kernel/super.c檔案

read_super()函式中

*((struct d_super_block *) s) =
        *((struct d_super_block *) bh->b_data);語句前新增__asm__ volatile ("cld");

fs/inode.c檔案

read_inode()函式中

*(struct d_inode *)inode =
        ((struct d_inode *)bh->b_data)
            [(inode->i_num-1)%INODES_PER_BLOCK];語句前新增__asm__ volatile ("cld");

接下來在編譯執行卻是無限輸出Reset_floppy called錯誤,

2.Reset-floppy called 錯誤

用gcc-4.8.1編譯的結果對比gcc-3.2.1編譯的結果,發現函式呼叫那塊差異很大....尤其就是static宣告的函式......不知道什麼原因???

今天無意間看見一個大神寫的編譯記錄,說明這個問題的形成

ROOT_DEV = 0x021d, bootimage放軟盤0,rootimage放軟盤1.但這樣嘗試後出現了問題,就是不斷的出現reset_floppy called。從網上搜到一個解釋。。但自己沒弄成功一個

reset-floppy 反覆出現的問題(a盤啟動盤 b盤檔案系統的case)原因:
mount_root -> read-super -> check_disk_change -> floppy_change -> floppy_on -> ticks_to_floppy_on 會啟動b盤的驅動器, 這會導致unexpected_floppy_interrupt被call,

然後recalibrate被設為1
當do_fd_request第一次被call用於讀取super block的時候, 遇到recalibrate==1 就呼叫recalibrate_floppy;

問題來了, current_drive變數還沒有機會被賦值, 它應該等於1卻是0;

於是導致recalibrate出錯, recal_interrupt設reset=1 -> reset_floppy -> reset_interrupt -> recalibrate_floppy(current_drive依然並且永遠是錯的) -> recal_interrupt->reset_floppy->...
不斷的死迴圈和列印Reset-floppy called


在recalibrate_floppy中向hardware傳遞正確的driver號能避免這個問題】可以有機會在嘗試下。。

3.Unable to read root

此問題用grep搜尋,在原始檔搜尋沒有任何這樣的輸出語句.....真讓人鬱悶.....就開始google吧,

看到大神的解答....

在出現“Insert rootimage...”時可直接按回車鍵。如果此時bootimage的509,510位元組是0x00,0x00的話,那麼你就需要切換到Bochs的配置介面(按CONFIG按鈕)把“1”中的Image改換成rootimage-0.11再繼續操作。

這個問題解決了....接下來又來一個噩夢啊....沒有任何錯誤提示,直接卡在下面這個介面,求大神指導啊?????

3.奇葩的問題,今天第一編譯執行,盡然可以正常運行了,,,,高興壞了,可是悲劇緊跟就來,第二次在執行還是開在上面的介面,然後在重新copy一份rootimage-0.11在執行還是可以執行,就是第二次用rootimage-0.11系統就無法跑起來了,,,,現在真不想在反彙編了。