增加内核系统调用

总述:为了增加系统调用,首先我们需要了解一下大概的过程,我们需要更改操作系统的源代码,在代码中的合理位置中添加入我们自己的系统调用代码,然后对代码进行手动编译,之后,对内核进行替换,使我们的系统能使用我们修改过的内核代码。最后,重启系统,编写测试代码。另外,更新源代码,如果可以的话,尽量先在虚拟机中尝试,因为,可能是危险的。

1.先记录现在的系统内核版本号,这一步不是必须的,但是为了便于之后我们观察的系统内核是否替换成功,所以,我们进行此步。在shell中运行一下内容
uname -a
我们可以看到系统返回结果
Linux qian 3.5.0-42-generic #65~precise1-Ubuntu SMP Wed Oct 2 20:57:18 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
这里,我们难看出我们当前系统的信息,我们比较关心的内容是3.5.0-42-generic,我们当前系统使用的内核版本为3.5.0-42-generic

2.下载源代码。这一步也不是必须的,你也可以使用系统中带有的源代码,在/usr/src/中,不过,我们这里认为,既然要编译源代码,那么,我们不如顺便更新一下我们系统的内核版本(因人而异,如果只是想学习,下个老版本的内核,还是比较靠谱的,可以在网上找到较多的资料,新的内核源码,则意味着是一种挑战,还有不太稳定)。
废话不多说了,网址https://www.kernel.org/,找一个合适的版本下载,这里我们直接选择了3.12,2013年11月03日才发布的,也就是昨天发布的,我们决定挑战一下。

3.下载之后,是一个压缩文件,叫做linux-3.12.tar.xz,这里我们这里把其移动也一定到/usr/src/中(顺便提议下,移动应该不是必须的,这些后来才知道,受网上教程影响,我们做了移动),在shell中进入下载目录后,执行命令
sudo mv linux-3.12.tar.xz /usr/src/
输入密码,移动成功,之后,我们进行文件解压,进入/usr/src/后键入命令
sudo tar -xvf linux-3.12.tar.xz
解压文件,我们可以看到,解压出文件夹linux-3.12

4.下载并安装用于源码配置的工具,这一部分,可以参考一下ubuntu论坛的文章,http://forum.ubuntu.org.cn/viewtopic.php?t=134404,不过他编译的内核为2.6.25,我们这里只是将命令粘出来,实际上就是下载了几个包,在我们编译配置的可能会用到。
sudo  apt-get install build-essential kernel-package   libncurses5-dev

5.更改源代码。这一步是关键的,现在,重新明确我们的目的,我们在源代码中添加一个系统调用。(合理顺便提醒一下,更改的时候,可能会提醒文件只读,这时,可能需要使用较高的权限才能更改,可以用sudo或者su,这里不再介绍)
我们在 /usr/src/linux-3.11.2/kernel/sys.c中
添加了文件头
#include <linux/linkage.h>
在文末添加了函数实现代码
asmlinkage int sys_helloworld(){
     printk(KERN_EMERG "=====hello world!(by qian, 2013.11.14)=======");
     return 1;
}
之后,我们在/usr/src/linux-3.12/arch/x86/syscalls/syscall_64.tbl中在合适的位置(具体位置可以参照原有文件的内容进行仿照)上添上我们的系统调用号内容
314     common  helloworld      sys_helloworld

6.开始编译设置。
如果你不是第一次进行编译内核,请先执行,对之前的设置等进行清理
sudo make mrproper
之后,我们运行
sudo make menuconfig
里面有许多的配置选项,可以进行一一设置,当然,大家请谨慎设置,可以去网上搜索教程,搞清楚每项的具体意义再做设置。而这里,因为我们的目的是添加一个系统调用,所以不再一一详解,如果您也没兴趣看这些,那么,下面这条命令也许适合一点。
sudo make olddefconfig

7.OK,我们一切准备妥当了,准备我们漫长的编译过程吧,保守估计1个小时以上,机器不同,可能差别很大也可能是2个小时,甚至3个小时。
好吧,可以先清理一下
sudo make-kpkg clean
之后,开始编译(这里,注意,我们将版本的参数设置为了qian20131104,这里,你可以根据自己的情况进行改动)
sudo make-kpkg --initrd --append-to-version=qian20131104 kernel_image kernel-headers

8.安装内核
编译完成之后,我们可以看到在/usr/src/中生成了两个deb的文件,这就是我们刚才编译后的成果。
我们现在进行安装
sudo dpkg -i linux-image-3.12.0qian20131104_3.12.0qian20131104-10.00.Custom_amd64.deb  linux-headers-3.12.0qian20131104_3.12.0qian20131104-10.00.Custom_amd64.deb
好吧,生成的文件名貌似真的有点儿长了,不过还好,我们可以通过tab键进行补全,这里,我们把两个文件都进行了安装。成功之后,在/usr/src/中生成了一个文件夹,即linux-headers-3.12.0qian20131104,也就特属于我们自己的内核。

9.现在,应该重启了。
当然,如果你都做得对的话,应该是可以正常启动的,至于,如果启动不了的话,自己google答案吧,看看有没有和你同病相怜的,反正,楼主的是启动了。
现在,先看一下我们的成果吧,在shell中输入
uname -a
好的,出来了,
Linux qian 3.12.0qian20131104 #1 SMP Tue Nov 5 15:11:23 CST 2013 x86_64 x86_64 x86_64 GNU/Linux
和原来的对比一下,看来,我们一定安装了3.12.0qian20131104内核。有没有成就感哈。

10.到这里,别忘了我们的任务,添加系统调度,这里来写个测试文件"test.c",看一下我们写的系统调度是否添加成功了。

#include <stdio.h>
int main()
{
     int t;
     t = syscall(314);
     if(t==1)
          printf("欢呼吧,少年!");
     else
          printf("error!");
     return 0;
}

然后,编译,运行,

gcc test.c -otest
./test

OK,结束了,如果成功了,那么就“欢呼吧,少年!”。

11.后话
好吧,虽然我们成功了,但是,看一下,我们还是有几步貌似是不必要的,首先,源代码应该不必要非得移动到/usr/src/,实际上,移动倒是造成了我们一些阻碍,在修改代码时,不得不使用超级权限。
另外,貌似进行配置文件时,如果决心使用sudo make olddefconfig命令时,貌似我们安装的几个包也可以省了。那几个包主要使用配置界面时才会用到。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值