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格式的,大概百度不支持)
下载内核
编译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格式的,大概百度不支持)
相关文章推荐
- 【转】CentOS 5.4 添加系统调用函数 及 内核编译
- ubuntu10.04编译添加系统调用的内核
- 【Linux】Linux添加系统调用以及内核编译过程
- 树莓派1代·添加一个linux系统调用·编译内核
- ubuntu 12.10 x64 下编译新内核 + 系统调用方法
- 【转】linux内核编译与系统调用的添加(适合3.0及以后版本内核)
- 驱动模块的编写##向内核添加系统调用函数
- Linux编译内核(4.2.6)并添加系统调用
- Linux 内核编译 添加系统调用
- Linux 内核编译 添加系统调用
- Linux 内核编译 添加系统调用
- Ubuntu14.10编译安装3.17.4内核及系统调用测试
- Ubuntu 14.04 内核版本Linux 3.13 添加系统调用
- Linux 内核编译 添加系统调用
- 利用模块添加系统调用(不重新编译内核)
- Linux内核2.6.34.14添加系统调用及编译方法(CentOS-6.4-x86_64)
- Linux 内核编译 添加系统调用
- 在Linux内核中添加系统调用,并编译内核
- 【Linux编译内核】Linux添加系统调用
- 利用模块添加系统调用(不重新编译内核)