在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目录下。以后的文件路径都是以此目录为“根目录”的。

2.1 在系统函数表中添加表项

进入arch/x86/kernel目录下,然后vim syscall_table_32.S,在此文件的最后一行添加自己的系统调用表项:

1 .long sys_rt_tgsigqueueinfo    /* 335 */
2 .long sys_perf_event_open
3 .long sys_mycall      //这是我们自己添加的表项

好了,下面开始添加系统调用号。

2.2 添加自己的系统调用号

现在进入目录 arch/x86/include/asm,该目录下有三个文件unistd_32.h, unistd_64.h, unistd.h。由于我们编译的是32位内核,所以需要在unistd_32.h中添加系统调用号。

vim unistd_32.h,在最后添加代码:

1 #define __NR_perf_event_open    336
2 #define __NR_syahello           337 //添加的
3 #ifdef __KERNEL__
4
5 /* 原本为337,但是由于我们添加了一行,所以改338*/
6 #define NR_syscalls             338  

2.3 编写自己系统调用的实现函数

由于系统调用必须编译到核心的内核镜像中去。所以我们将此函数的实现写到kernel/sys_i386_32.c中:

1 //引入头文件
2 #include <asm/page.h>
3 ........
4 //添加函数代码
5 asmlinkage  long sys_mycall(void){
6     return THREAD_SIZE;
7 }

3 编译内核

现在就可以回到linux-2.6.32.63目录进行编译了。如果以前编译过内核,最好使用make mrproper和make clear命令来清除之前的编译残留文件。如果是第一次编译内核,那么就需要对内核的编译选项进行配置,这里推荐使用make menuconfig。如果键入该命令后提示缺少ncurses库文件的话,就使用sudo apt-get install libncurses5-dev命令安装该库。之后就可以进行menuconfig配置了,建议保持默认值即可。

一切准备就绪,键入make命令开始编译内核!现在可以泡一桶coffee来慢慢喝了,为什么是一桶?因为时间真的很长~~~

时间: 2024-08-01 11:27:21

在Linux内核中添加系统调用,并编译内核的相关文章

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

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

向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

向linux内核中添加外部中断驱动模块

本文主要介绍外部中断驱动模块的编写,包括:1.linux模块的框架及混杂设备的注册.卸载.操作函数集.2.中断的申请及释放.3.等待队列的使用.4.工作队列的使用.5.定时器的使用.6.向linux内核中添加外部中断驱动模块.7.完整驱动程序代码.linux的内核版本为linux2.6.32.2. 一.linux模块的框架以及混杂设备相关知识 1.内核模块的框架如下图所示,其中module_init()(图中有误,不是modules_init)只有在使用insmod命令手动加载模块时才会被调用,

Linux操作系统中的系统调用接口函数

在分析病毒样本时发现有些系统函数是必用,有些超常用,现在都列出来,希望和大家交流 转载请注明出处:http://blog.csdn.net/u010484477     O(∩_∩)O谢谢 进程控制 fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 getdtablesize 进程所能打开的最大文件数 getpgid 获取指定进程组标识号 setpgid 设置指定进程组标志号 getpgrp 获取当前进程组

linux学习之路之手动编译内核

手动编译内核 一般来说,内核的核心功是直接在内核里,其他大多数功能具有以下三种选择: 1.不使用该功能 2.将这些功能编译成模块的形式 3.将这些功能直接编译进内核当中 那么该如何手动编译内核呢? 手动编译的方式: 使用make gconfig命令,不过使用该命令适用于Gnome桌面环境,且需要安装图形开发库 使用make kconfig命令,该命令适用于KDE桌面环境,且需要安装图形开发库 不过最常见的方式是使用make menuconfig命令来编译,使用该命令会产生一个窗口界面 在该窗口下

编译 linux 内核及添加系统调用

后面编译的是 4.2.2 在 gcc4.8 上编译4.14.14 时报不支持堆栈保护 反正都差不多就先编译了 4.2.21.下载 linux 内核源码2.解压放到 /usr/src3.创建软连接 (不一定非得打文件放到 /usr/src 看个人我直接放桌面) [email protected]:~# cd /usr/src [email protected]:/usr/src# ls linux-4.14.14 linux-headers-4.2.0-27-generic linux-heade

【内核】在Linux内核中添加对jffs2的支持

海思最新出了一款超低内存的芯片HI3518EV201(内存只有32M) 在开发过程中对内核的裁剪考验相当大,当然海思也提供了参考的裁剪方案<hi3518ev20x_mini_config.txt>. 但是不能完全按照海思提供的裁剪方案来玩,因为该内核不支持USB.不支持frame buf.不支持以太网及nfs.不支持进程间通信等. 其中不支持进程间通信是指将内核配置 General setup中的System V IPC选项去掉:System V IPC共有三种类型:System V消息队列.

linux BSP中添加新驱动

开发工作中,经常需要添加一些新的驱动,但是有时候不想自己写Makefile,或者是驱动需要编译到内核里,那我们该如何才能把驱动加到BSP里面,只需按照原来的编译步骤就能得到想要的ko文件,或者直接编译到uImage呢?一个新驱动添加大概需要以下三个步骤: 一,编写你的驱动文件,就是new_driver.c,并将其放到你想放的目录下,比如drivers/misc/ . 二,修改drivers/misc/Makefile,其格式,打开便知,如下: 1 obj-$(CONFIG_PLAT_NOMADI

Linux/Ubuntu中添加删除新用户

操作环境:Ubuntu Server 14.04,系统上仅有一个用户root 1. adduser 命令添加新用户 #adduser username 注意adduser与useradd命令的区别,useradd是Linux系统中二进制可执行程序工具,adduser是封装了useradd之后的可执行脚本.因此adduser比useradd功能更加强大和智能,adduser在创建用户同时进行创建用户主目录等其他相关工作. 2.赋予新建用户管理员权限 只需要将用户加入sudo用户组中就可以赋予用户管