Linux操作系统分析(4)- 更新内核与添加系统调用

来源:互联网 发布:sql2005数据库备份 编辑:程序博客网 时间:2024/05/14 09:15

更新内核

直接安装的系统内核版本一般不是最新,用

[plain] view plaincopy
  1. uname -a  

命令可以查看内核的版本号,比如我的就是:



下面来手动更新内核到最新的稳定版本。


1.获取源码

进入kernel.org,下载最近版本内核源码,



最新的稳定版本是3.9.4.

下载好之后解压到 /usr/src 文件夹下

[plain] view plaincopy
  1. sudo tar -xvf linux-3.9.4.tar.xz -C /usr/src/  


2.配置内核

将原来的配置文件拷过来

[plain] view plaincopy
  1. cp /usr/src/linux-headers-2.6.32-27-generic/.config .config  


首先进行一下配置,进入到 /usr/src//linux-3.9.4 文件夹下,执行

[plain] view plaincopy
  1. make menuconfig  

报错:

 *** Unable to find the ncurses libraries or the
 *** required header files.


缺少ncurses库(一个管理应用程序在字符终端显示的函数库),怒装之:

[plain] view plaincopy
  1. sudo apt-get install ncurses-dev  

重新执行make menuconfig

选Load,然后Ok,然后Save。


3.编译和安装

终端执行:

[plain] view plaincopy
  1. make bzImage #编译kernel    
  2. make modules #编译模块    
  3. make modules_install  #先安装模块  
  4. make install #安装内核  

编译的时间由机器性能决定。


make install之后,grub已经自动更新,不用再手动设置引导。

重启,进入ubuntu,更新后的第一次加载会有些慢。

再次查看内核版本,终端运行

[plain] view plaincopy
  1. uname -a  


添加系统调用

系统调用的原理如下:


源码目录下涉及内核的三个文件有:

/kernel/sys.c                                         //定义系统调用

/arch/x86/syscalls/syscall_32.tbl      //设置系统调用号

/include/linux/syscalls.h                     //系统调用的头文件


下面来实现一个简单的系统调用。

1)系统调用函数的实现。

在/kernel/sys.c的最后添加下面的代码:


[plain] view plaincopy
  1. asmlinkage int sys_callquansilang(int num)  
  2. {  
  3.     printk("Hi,I'm Quansilang. My student No. is sa*****310!");  
  4.     return 1;  
  5. }  

2)设置系统调用号

编辑arch/x86/syscalls/syscall_32.tbl 文件,发现已经由350个定义号的系统调用,照葫芦画葫芦娃,在最后添加自己的系统调用:

[plain] view plaincopy
  1. 351 i386    callquansilang      sys_callquansilang  

注意要与之前定义的函数对应。


3)添加系统调用的声明到头文件

打开 /include/linux/syscalls.h ,倒数第二行添加

[plain] view plaincopy
  1. asmlinkage int sys_callquansilang(int num);  

4)重新编译内核并安装。

[plain] view plaincopy
  1. sudo make mrproper    #清除久的编译文件  
  2. sudo make             #编译  

安装:

[plain] view plaincopy
  1. make modules_install  #先安装模块  
  2. make install          #安装内核  

重启系统。


5)测试

创建一个main.c

[cpp] view plaincopy
  1. #include <unistd.h>  
  2. #include <stdio.h>  
  3. int main()  
  4. {  
  5.     syscall(351,1);  
  6.     return 1;  
  7. }  


编译运行,然后用

[plain] view plaincopy
  1. sudo dmesg -c  

查看系统调用log(写系统log会有一点延迟)。




参考

向linux内核添加系统调用新老内核比较 - http://www.cnblogs.com/albert1017/archive/2013/05/27/3101760.html

ubuntu 12.10 x64 下编译新内核 + 系统调用方法  -  http://blog.csdn.net/dslovemz/article/details/8744352

Linux添加内核系统调用报告 - http://blog.csdn.net/yming0221/article/details/6559767

原创粉丝点击