您的位置:首页 > 其它

ubuntu 8.10 添加系统调用函数 及 内核编译

2010-03-23 18:37 337 查看
首先,建议系统直接装,而不是用VM 等虚拟机装。我的很多朋友用虚拟机装的编译内核时老是出现问题。估计是虚拟机的问题。

下载内核


编译Linux内核,首先是在官方网站下载Linux内核,我下的是目前最稳定的最新版本:2.6.29.1。是一个完整版。

解压内核

把下载的内核拷贝到目录usr/src/下。然后解压:tar -jxvf linux-2.6.29.1.tar.bz2.

解压完后,在该文件夹下,会产生一个新的文件linux-2.6.29.1

添加系统调用。

这一步是很关键的,如果错误了,就不能在我编译的内核里打印我的大名了。这里需要修改三个文件的内容:

(1)首先是kernel/sys.c文件。在这个文件末尾添加系统调用的实现函数:

asmlinkage long sys_mysyscall(int number)

{

printk(KERN_ALERT “这是 林泉居士 写的系统调用函数。\n”);

return number;

}

(2)在arch/x86/kernel/syscall_table_32.S中添加:.long sys_mysyscall

(3) /usr/src/linux-2.6.29.1/arch/x86/include/asm

unistd_32.h中添加:#define __NR_mysyscall 333 这一步是添加系统调用的入口参数。

清除以前编译的内核文件。

修改完以上三个文件就可以了。接下来是激动人心的时刻。要开始编译系统内核了。

在编译内核之前,可以先用如下命令make mrproper清除以前编译的东西。

定制内核。

我直接选择 make oldconfig.用以前的内核配置。

编译内核

你可以输入以下命令:make, 然后打开google的个人首页听歌吧,(因为Linux下连网页游戏都玩不了,实在郁闷)。

以下是编译内核的一个过程的截图(图1-1),大概在60分钟左右吧,会编译结束,出现图2-2 的界面:,

安装模块。

接下来该做的就是安装模块了,输入命令:make modules_install

安装结束会有如下界面(图1-3)

安装内核。

直接输入命令:make install 。这两步都很快。

生成镜像文件。

输入命令:mkinitramfs -o initrd.img-2.6.29.1 2.6.29.1。

完成之后会在目录/usr/src/linux-2.6.29.1下生成一个压缩包一样的东西:initrd.img -2.6.29.1,把这个东西拷贝到/boot 目录下就行了。

编辑启动文件/boot/grub/menu.lst

在其中添加以下东西就可:

title Ubuntu 林泉居士, kernel 2.6.29.1
root (hd0,4)
kernel /vmlinuz-2.6.29.1root=/dev/hdd6

initrd /initrd.img-2.6.29.1

title Ubuntu 林泉居士, kernel 2.6.29.1 (recovery mode)

root (hd0,4)
kernel /vmlinuz-2.6.29.1 root=/dev/hdd6 ro single
initrd /initrd.img-2.6.29.1

图1-1 编译内核的过程

图1-2 编译内核结束

图1-3 安装内核

接下来就安心重启了。在登录界面选择Ubuntu 林泉居士, kernel 2.6.29.1进入系统。

这时我们可以用VI写一个测试函数,看自己的系统调用是否成功。

#include”stdio.h”

// #define __NR_mycall 333

int main()

{

syscall(333,1)//这里也可写成函数名syscall(mycall,1),直接用系统调用号看上去更简单。

return 0;

}

在Vi里编译运行一下。不会有什么效果,然后输入命令dmesg,就看到自己的名字了:如图1-4.

图1-4 dmesg命令后打印的结果

心得体会:

第一次编译linux系统内核,真的花了不少时间。我对linux系统内核一共编译了6次,其中三次把内核搞坏了,好在我的电脑里装了几个版本的内核,电脑还能正常进入。大概用了两天加一个通宵的时间,这个期间内,我的电脑一直在运行。

其实,我以前并不是很喜欢用linux系统,第一感觉不熟悉,第二感觉不方便。这次之所以会坚持编译内核,而且在系统崩溃了三次,五次失败的基础上仍然坚持,仅仅是因为我想挑战一下自己。每一次的失败并没有让我灰心,反而更激发了我挑战的决心。

在这个过程中我遇到的几个问题如下:

(1)由于linux内核更新的比较快,我开始用的是2.6.27.11版本的,而我下载的内核是2.6.29.1版本的。按照老师给的课件,或是按照网上的一些文章修改内核时,发现有一个文件unistd_32.h这个文件找不到。于是我就用搜索,把所有这样的文件都找出来,但有不知道改那个文件,于是干脆都改了。

(2)在配置系统内核时,开始我用的是make menuconfig,因为网上的文章这样推荐,我于是照着做,结果发现里面的选项根本不懂。后来就按照以前的配置直接跳过了:make oldconfig

(3)有几次在安装内核是突然提示磁盘空间不够,我又迷惑了,然后打开添加删除程序,把一些不常用的软件都删了,可空间仍然不够,我又不知道那些东西能删,那些东西不能删,就干脆直接把以前的内核删了,结果就成功了。

(4)内核编译成功之后,写程序测试我的系统调用,结果就是不出结果,我还以为是我的内核改错了,就有重新修改编译。结果发现仍然不行,机子没有崩溃,人都快崩溃了。最后发现系统的printk不会直接打印出来,而是需要命令:dmesg,于是照着做,竟打印出很多东西,最后一行会有我的名字,最后在网上查了一下这个命令的使用,发现它有一个参数:

-c,清除缓存中的系统信息。于是每次用dmesg时,都加上这个参数,结果就只打印我需要的信息。

(截图进放不进去,是png格式的,大概百度不支持)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: