Linux3.18.6内核添加系统调用

1.将已经下载好的内核解压,我的目录是

/home/shangsongchao/LinuxKernel/testlinux-3.18.6/linux-3.18.6

2.添加系统调用表:

在/home/shangsongchao/LinuxKernel/testlinux-3.18.6/linux-3.18.6/arch/x86/syscalls目录下,打开syscall_32.tbl

添加三个系统调用,如图358,359,360

 不需要像Linux 2.6的内核一样,在<asm/unistd.h>中添加类似于#define __NR_foo 358之类的宏定义了,3.x的内核会自动根据系统调用表的定义生成。

3.添加系统调用的服务例程

在/home/shangsongchao/LinuxKernel/testlinux-3.18.6/linux-3.18.6/arch/x86/kernel目录下,打开process_32.c

添加下面函数

/*
 * sys_foo
 * return each process kernel stack sizes
 * */
asmlinkage long sys_foo(void)
{
	return 5;
}

/*
 * sys_my_oper
 * compute numbers + - * /
 */
asmlinkage long sys_my_oper(int * result , int num1,int num2, char *op)
{
	if(*op==‘+‘)
	{
		*result=num1+num2;
	}
	else if(*op==‘-‘)
	{
		*result=num1-num2;
	}
	else if(*op==‘*‘)
	{
		*result=num1*num2;
	}
	else if(*op==‘/‘)
	{
		*result=num1/num2;
	}
	else
		return 0;
	return 0;
}

/*
 * sys_my_compute
 * compute numbers + - * /
 */
asmlinkage long sys_my_compute(int num1,int num2, char *op)
{
	long result=0;

	if(*op==‘+‘)
	{
		result=num1+num2;
	}
	else if(*op==‘-‘)
	{
		result=num1-num2;
	}
	else if(*op==‘*‘)
	{
		result=num1*num2;
	}

	else if(*op==‘/‘)
	{
		result=num1/num2;
	}
	else
		result=0;
	return result;
}

如图:

4.编译内核

在/home/shangsongchao/LinuxKernel/testlinux-3.18.6/linux-3.18.6目录下,执行一下命令:

make i386_defconfig
make # 一般要编译很长时间,少则20分钟多则数小时

5.安装内核

 sudo make modules
 sudo make modules_install
 sudo make install

6.重启查看内核版本

uname -r

7.编写C测试程序

#include<linux/unistd.h>
#include<sys/syscall.h>
#include<stdio.h>
#include <time.h>
#define _NR_my_oper 359
#define CALL_TIME 1000*1000*100
int main(){

	int num1 = 10;
	int num2 = 5;
	int result;
	long i;
	time_t *t;
	long end;
	long begin = (long)(time(t));

	for(i =0; i<CALL_TIME ;i++ ){
		syscall(_NR_my_oper, &result, num1, num2, "+");
	}
	printf("%d\n",result);

	end = (long)(time(t));
	printf("syscall:%ld\n", end-begin);
	begin = (long)(time(t));

	for(i =0; i<CALL_TIME ;i++ ){
		result = num1+num2;
	}

	printf("%d\n",result);
	end = (long)(time(t));
	printf("non-syscall:%ld\n", end-begin);

	return 0;
}

参考网址:

http://www.myext.cn/other/a_16300.html

时间: 2024-10-28 20:15:44

Linux3.18.6内核添加系统调用的相关文章

向linux内核添加系统调用新老内核比较

2.6内核 1>修改linux-source-2.6.31/kernel/sys.c文件,在文件末尾添加系统响应函数.函数实现如下: asmlinkage int sys_mycall(int number) { printk("这是我添加的第一个系统调用"); return number; } 2>在linux-source-2.6.31/arch/x86/kernel/syscall_table_32.S 中添加:.long sys_mycall 如: .long sy

移植YAFFS2文件系统到linux3.18.4内核(原)

移植YAFFS文件系统:  (linux-3.18.4内核) 1.git clone git://www.aleph1.co.uk/yaffs2  //用此获得yaffs2源码包 1.1 解压源码包 2. 打补丁 cd yaffs-dir./patch-ker.sh  c m linux-tree   比如 ./patch-ker.sh c m /home/fedora/workspace/linux-3.18.4 3. 配置内核支持YAFFS-> File systems           

通过内核编译法向Linux内核添加系统调用

[实验内容]: 向Linux添加一个系统调用 测试该系统调用 使用ptrace或类似的系统跟踪工具来对该测试程序进行跟踪调试 [软件]:VMWare支持的Ubuntu虚拟机 VSCode [步骤] 1.在实验之前先下载好相关软件包 不过如果升级了make以后,如果内核版本低,会报错 1. sudo apt-get install make 2. sudo apt-get install gcc 3. sudo apt-get install libncurses5-dev 4. sudo apt

linux内核添加系统调用

[安装] 在vmware虚拟机上安装旧版本的Linux遇到很多问题,记录一下. 1.安装到一半出现错误redhat7.3 file /usr/bin/anaconda,line633....什么的. 解决:旧版本linux不支持SCSI磁盘,在创建虚拟机的时候选择IDE磁盘(应该是这个原因,其他的我修改的有:勾选在磁盘上创建立即能够使用的空间,内存改为1G) 2.安装完成后,出现图形化界面. 解决:ctrl+alt+F64切换字符界面. 3.在redhat7.3里面的 /usr/src找不到ke

在Linux内核中添加系统调用,并编译内核

1 环境准备 运行系统:vmware下安装的ubuntu10.10 32bit桌面版. 编译内核版本: linux-2.6.32.63 内核目录: /home/wanchouchou/linuxKernel/linux-2.6.32.63 为了方便,使用chmod 777 -R linux-2.6.32.63/ 将所有的内核文件都改为全权限,这样就可以在非root状态修改文件进行编译了. 2 添加系统调用 首先进入linux-2.6.32.63目录下.以后的文件路径都是以此目录为“根目录”的.

Linux内核中添加系统调用接口简单示例

1. Linux体系结构 Linux系统的地址空间分为用户空间和内核空间,通过系统调用和硬件中断能够完成从用户空间到内核空间的转移. 2. 系统调用接口 ① 一般情况下,用户进程不能访问内核空间.Linux内核中提供了一组用于实现各种系统功能的子程序,用户可以调用它们访问Linux内核的数据和函数,这些子程序称为系统调用接口(SCI). ② 系统调用和普通函数的区别:系统调用由操作系统内核实现,运行于内核态:普通函数调用由函数库或用户自己提供,运行于用户态. 3. 系统调用分类:主要分3大类 ①

从内核看系统调用

本周学习了孟宁老师的<Linux内核分析>,按照课程要求,做实验如下: 首先使用gdb跟踪一个系统调用,我们选择上周实验所写的代码,修改这两段代码成两个系统调用,放入根文件系统中,作为本次实验将要观察的系统调用. 修改代码如下: 1) c实现的系统调用 int mkdir_c(int argc, char **argv) { if(argc != 2) printf("Illegal parameter!!\n"); if(mkdir(argv[1]) == -1) { p

《Linux内核分析》 week6作业-Linux内核fork()系统调用的创建过程

一.进程控制块PCB-stack_struct 进程在操作系统中都有一个结构,用于表示这个进程.这就是进程控制块(PCB),在Linux中具体实现是task_struct数据结构,它主要记录了以下信息: 状态信息,例如可执行状态.就绪状态.阻塞状态等. 性质,由于unix有很多变种,进行有自己独特的性质. 资源,资源的链接比如内存,还有资源的限制和权限等. 组织,例如按照家族关系建立起来的树(父进程.子进程等). task_struct结构体内容非常庞大,暂时没有去分析源代码,以后有时间再去研究

《Linux设计与实现》笔记——系统调用工作原理、添加系统调用的过程

系统调用的意义 为了和用户空间上的进程进行交互,内核提供的提供的一组接口. 应用程序通过这组接口访问硬件和其他操作系统资源. 完成对硬件和资源访问的控制.安全.可靠,多任务.虚拟必须 硬件设备的抽象(提供设备的独立性). 异常,陷入,系统调用 : 用户空间进入内核空间的三种方式 原理 sys_write会根据系统write输出的文件,调用相应struct file ,operations中的write方法. 添加系统调用的过程 以kernel 2.6.11为例 long my_syscall(i