Linux 内核编译 添加系统调用
2011-06-17 13:36
756 查看
主机: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文件添加
这函数是宏定义,在./include/linux/syscalls.h里。
5、重新编译内核,这次只需编译内核,驱动部分没有改变不用再编译一遍,以节省时间。
执行make bzImage,然后参考上面的内核编译步骤即可。
测试代码:
编译执行
结果如下:
现在内核版本: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; }
编译执行
结果如下:
相关文章推荐
- Linux 内核编译 添加系统调用
- Linux内核2.6.34.14添加系统调用及编译方法(CentOS-6.4-x86_64)
- 编译 linux 内核及添加系统调用
- 【转】linux内核编译与系统调用的添加(适合3.0及以后版本内核)
- Linux编译内核(4.2.6)并添加系统调用
- 【Linux】Linux添加系统调用以及内核编译过程
- Linux 内核编译 添加系统调用
- 树莓派1代·添加一个linux系统调用·编译内核
- Linux 3.10.12通过编译内核添加系统调用
- Linux 内核编译 添加系统调用
- 【Linux编译内核】Linux添加系统调用
- Linux 内核编译 添加系统调用
- linux-3.4.6内核添加yaffs2文件系统支持后编译出错
- Linux 变更内核 添加系统调用
- 给linux系统添加系统调用_2_修改内核
- Linux添加内核系统调用报告
- 利用模块添加系统调用(不重新编译内核)
- Linux添加内核系统调用报告
- Ubuntu 14.04 内核版本Linux 3.13 添加系统调用
- linux采用编译内核的方法增加系统功能调用