(更新中.....)
最近開始研究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系統就無法跑起來了,,,,現在真不想在反彙編了。