向Linux 内核增加一个系统调用
实验环境: VMware虚拟机软件、Ubuntu14.04、GCC
原内核版本: 4.40-142
新编译内核版本: 2.3.36.2
一、编译、安装
1. 拷贝内核源码文件到Linux系统。
2.解压源码包到指定位置。
3.修改源程序,增加系统调用实现。
4.修改头文件,增加系统调用声明。
5.修改系统调用表,注册系统调用。
6.编译安装内核
a、make mrproper清除内核中不稳定的目标文件,附属文件及内核配置文件
b.make clean清除以前生成的目标文件和其他文件
c.make menuconfig配置内核,采用默认的内核配置即可。
d.make
e.make modules_install
f.make install
二、测试
7.进入编译后的内核系统
8.在程序中调用自己添加的系统调用
三、遇到的问题及解决如下:
错误1:
解决:安装ncurses依赖
错误2:conflicting types for ‘syscall_trace_enter’
asmregparm long syscall_trace_enter(struct pt_regs * regs)
解决:修改相关配置文件
错误3:gcc: 错误: elf_i386:没有那个文件或目录
make[2]: *** [arch/x86/vdso/vdso32-int80.so.dbg] 错误 1
make[1]: *** [arch/x86/vdso] 错误 2
make: *** [sub-make] 错误 2
解决:1、在内核目录arch/x86/vdso/Makefile中,大约在28,29行,把"-m elf_x86_64" 替换为 "-m64"
2、然后再继续找,大约在72行左右,找到VDSO_LDFLAGS_vdso32.lds = -m elf_i386 -Wl,-soname=linux-gate.so.1中的 “-m elf_i386” 替换为 "-m32"
错误4:drivers/net/igbvf/igbvf.h: At top level:
drivers/net/igbvf/igbvf.h:129:15: error: duplicate member ‘page’
make[3]: *** [drivers/net/igbvf/ethtool.o] 错误 1
解决:修改drivers/net/igbvf/igbvf.h中的128行内容如下: