【转】CentOS 5.4 添加系统调用函数 及 内核编译

转自:http://blog.sina.com.cn/s/blog_62dd1eb10100glfk.html

 

首先,建议系统直接装,而不是用VM 等虚拟机装。我的很多朋友用虚拟机装的编译内核时老是出现问题。估计是虚拟机的问题。

  1. 下载内核

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

  1. 解压内核

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

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

  1. 添加系统调用。

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

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

asmlinkage long sys_mysyscall(int number)

{

printk(KERN_ALERT “ This is my syscall。 /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 这一步是添加系统调用的入口参数。

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

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

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

  1. 定制内核。

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

  1. 编译内核

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

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

  1. 安装模块。

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

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

  1. 安装内核。

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

  1. 生成镜像文件。

输入命令: 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 目录下就行了。

  1. 编辑启动文件 /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 安装内核

  1. 接下来就安心重启了。在登录界面选择 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 时,都加上这个参数,结果就只打印我需要的信息。

注:我用的内核是2.6.28,编译内核步骤:

make oldconfig(使用make menuconfig可以自己配置编译选项)

make -j5(我的机器为4核,可以多个进程同时编译)

make modules

make modules_install

make install

reboot

Then write test prog for added syscall,printk不会直接打印出来,在执行测试程序后可以使用dmesg,最后的部分既为测试程序的输出,可以使用dmesg -c只参看自己打印的信息

 


你可能感兴趣的:(【转】CentOS 5.4 添加系统调用函数 及 内核编译)