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系统就无法跑起来了,,,,现在真不想在反汇编了。

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