Linux 内核编译 添加系统调用

本文介绍如何在Ubuntu 11.04上从2.6.38内核升级到2.6.39,并添加自定义系统调用。包括下载内核、配置、编译、安装新内核及引导配置等步骤。此外,还详细说明了如何在内核中增加一个新的系统调用并测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主机:Ubuntu 11.04

现在内核版本:2.6.38.9

编译的目标内核版本:2.6.39

编译成功后修改内核,添加个系统调用,并重新编译内核,编写C程序,调用自己添加的系统调用

首先编译内核

1、从下载Linux内核版本2.6.39

2、解压内核到任意目录(这里不用必须解压到/usr/src/下,Linus也说不必那样做,况且自己也试验成功)

3、进入内核目录

4、首先配置make menuconfig配置裁剪内核(如果没有什么必要可以复制/boot/config-***,这是现在的内核配置)

cp /boot/config-*** ./.config

5、开始编译,可以执行make all,当然也可以分步完成

make dep

make clean

make bzImahe

make modules

6、安装内核驱动

make modules_install

7、安装内核

make install

8、生成引导镜像文件,并将其复制到/boot目录下

mkinitramfs -o initrd.img-2.6.39 2.6.39

cp initrd.img-2.6.39

9、最后更新grub

update-grub2

启动新的内核,成功。

下面是添加系统调用。

1、首先打开文件./arch/x86/include/asm/unistd_32.h

在最后添加系统调用号,如下:

#define __NR_name_to_handle_at 341

#define __NR_open_by_handle_at 342

#define __NR_clock_adjtime 343

#define __NR_syncfs 344

#define __NR_my_call 345 /*This is added by yan,this is a test for system call*/

2、打开./arch/x86/kernel/syscall_table_32.S

末尾添加系统调用的函数地址项,如下:

.long sys_prlimit64 /* 340 */

.long sys_name_to_handle_at

.long sys_open_by_handle_at

.long sys_clock_adjtime

.long sys_syncfs

.long sys_my_call

3、打开./include/linux/syscalls.h添加系统调用函数的声明

asmlinkage long sys_my_call(int num); /*This is added by yan*/

注意添加位置,因为其中有选择编译#ifdef和#ifndef

4、打开./kernel/sys.c文件添加

SYSCALL_DEFINE1(my_call,int,num) { prink("This is a sample test output from kernel!/n/tAnd this is added by yan/n/t"); return num; }

这函数是宏定义,在./include/linux/syscalls.h里。

5、重新编译内核,这次只需编译内核,驱动部分没有改变不用再编译一遍,以节省时间。

执行make bzImage,然后参考上面的内核编译步骤即可。

测试代码:

#include <stdio.h> #include <unistd.h> #include <syscall.h> #define __NR_my_sys_call 345 int main(void) { int input; printf("Input a num"); scanf("%d",&input); long a=syscall(__NR_my_sys_call,input); printf("The return from kernel is %ld",a); return 0; }

编译执行

结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值