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號能避免這個問題】可以有機會在嘗試下。。

參考鏈接http://blog.chinaunix.net/uid-23440751-id-146607.html

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系統就無法跑起來了,,,,現在真不想在反彙編了。

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