系统调用

 

系统调用:在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口。这些接口让应用程序受限地访问硬件设备,提供了创建新进程并与已有进程进行通信的机制,也提供了申请操作系统其他资源的能力。这些接口在应用程序和内核之间扮演了使者的角色,应用程序发出各种请求,而内核负责处理这些请求。

为什么使用系统调用:使用系统调用主要是为了保证系统稳定可靠,避免应用程序恣意妄行。

 

 

添加自己的系统调用

 

准备:ubuntu12.04LTS    kernel 3.3.8

 

 

1.添加系统调用号

解压kernel3.3.8,进入到该目录

1.  cd
arch/x86/syscalls

(如果忘记了自己文件的位置,可以用 whereis 文件名 来查找到文件的地址)

 (syscalls系统调用)

编辑该目录下的syscall_64.tbl64位操作系统)或者syscall_32.tbl32位操作系统)

1.  vi syscall_64.tbl

按i进入插入模式,在最下面末尾添加类似的系统调用名称,这里添加312    64     test    sys_test

按Esc退出插入模式,输入 :wq   保存退出(冒号wq)。

 

 

2.    声明系统调用函数原型

进入include/linux目录,编辑syscalls.h文件

 

1.  cd include/linux

2.  vi
syscalls.h  

在末尾的#endif之前添加 asmlinkage long sys_test(int arg),Esc键退出插入模式,  :wq保存后退出

其中的asmlinkage用在大多数的系统调用中。有一些情况下是需要明确的告诉编译器,我们是使用stack来传递参数的,比如X86中的系统调用,是先将参数压入stack以后调用sys_*函数的,所以所有的sys_*函数都有asmlinkage来告诉编译器不要使用寄存器来编译。

 

 

3.添加系统调用函数的定义

kernel根目录下新建test文件夹并新建test.c文件

1.  vi test.c

输入以下代码

1.#include<linux/kernel.h>

2.  asmlinkage long sys_test(int arg)

3.  {

4.     printk(“<2>””Hello,I’m%d\n”,arg);

5.     return 0;

6.  }

 

printk中的”<2>”表示日志级别,默认为<4>

日志级别一共有8个级别,printk的日志级别定义如下(在include/linux/kernel.h中):

#define
KERN_EMERG 0/*
紧急事件消息,系统崩溃之前提示,表示系统不可用*/

#define
KERN_ALERT 1/*
报告消息,表示必须立即采取措施*/

#define
KERN_CRIT 2/*
临界条件,通常涉及严重的硬件或软件操作失败*/

#define KERN_ERR
3/*
错误条件,驱动程序常用KERN_ERR来报告硬件的错误*/

#define
KERN_WARNING 4/*
警告条件,对可能出现问题的情况进行警告*/

#define
KERN_NOTICE 5/*
正常但又重要的条件,用于提醒*/

#define
KERN_INFO 6/*
提示信息,如驱动程序启动时,打印硬件信息*/

#define
KERN_DEBUG 7/*
调试级别的消息*/

 

 

 

4.Makefile

test目录下新建Makefile文件,打开后输入obj-y := test.o

然后后在根目录下的Makefile中用ls搜索 /core ,在最后添加     空格test/

 

 

5.编译内核

编译内核,重启

  1. sudo make menuconfig
  2. sudo make -jn        //n为数字,使用n线程编译
  3. sudo make modules_install
  4. sudo make install

 

 

 6.测试系统编译

新建一个test.c  输入以下代码

1.  #include<sys/syscall.h>

2.  main()

3.  {

4.  syscall(312,666);

5.  }

 

使用gcc编译,由于printk中选择了2,所以打开编译后的文件并不会在图形界面的终端中出现。使用ctrl+alt+f1打开tty1后打开文件,显示Hello,I’m666

 

 

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *