linux内核编译与系统调用日志收集系统调用
一.内核编译
Linux内核的体系结构是单内核的,但是充分的采用了微内核的设计思想,使得虽然是单内核,但是工作在模块化的方式下,并且这个模块可以装载或者卸载,Linux负责管理系统的进程,内存,设备驱动程序,文件和网络系统,决定系统的性能和稳定性。在Linux内核的基础上根据自己的需要,量身定制一个更加高效更加稳定的内核,需要我们来手动编译。
编译的过程如图文所示:
1.在Kernel官网下载所需的内核源码包,网址为:http://www.kernel.org,这里下载的源码包为3.10.1版本的源码包,下载之后解压,并且链接为linux,方便使用。如下所示
2.接下来配置内核,配置方法有多种
make config 遍历选择所要编译的内核特性
我这里使用的是make menuconfig 的方法,是一个基于图形化界面的配置方法,因此,需要首先下载ncurses工具,相对于命令行图形界面更加方便快捷,如下所示
2.使用make命令进行编译,这一步需要等待比较长的时间
3.编译完成之后,执行make modules_install,在执行完这一步之后我们可以在/lib/modules目录下产生一个以版本号命名的文件。
4.之后执行make install完成安装,安装之后会在/boot目录下生成一个内核文件vmlinuz-3.10.1,还有几个与当前版本编译一致的文件
5.在重启之后就会看到启动界面有两个内核的版本,如下所示,即为编译成功
二.添加系统调用日志收集程序
1.编写系统调用函数,函数如下。并将函数添加到/linux/arch/x86/kernel/目录下
1 //myaudit.c
2
3 #include <asm/uaccess.h>
4 #include <linux/proc_fs.h>
5 #include <linux/init.h>
6 #include <linux/types.h>
7 #include <asm/current.h>
8 #include <linux/sched.h>
9
10 void (* my_audit)(int, int) = 0; // 系统调用日志记录例程
11 asmlinkage void sys_syscall_audit(int syscall,int return_status)
12 {
13 if(my_audit)
14 return (* my_audit)(syscall, return_status);
15 printk("IN KERNEL:%s(%d), syscall:%d, return:%d\n", current- >comm, current->pid, syscall, return_status);
16 return;
17 }
18
19 int (* my_sysaudit)(u8, u8 *, u16, u8) = 0; //系统调用
20 asmlinkage int sys_myaudit(u8 type, u8 * us_buf, u16 us_buf_size, u8 reset)
21 {
22 if(my_sysaudit)
23 return (* my_sysaudit)(type, us_buf, us_buf_size , reset);
24 printk("IN KERNEL:my system call sysaudit() working\n");
25 return 0;
26 }
27
28 EXPORT_SYMBOL(my_audit);
29 EXPORT_SYMBOL(my_sysaudit);
接着修改Makefile文件,增加下面的两行
即在Makefile文件中添加myaudit.o以及vsmp_64.o用于编译添加的myaudit
2.添加系统调用号,修改/usr/src/linux/arch/x86/syscalls/syscall_64.tbl文件,在文件的最后添加一行如下:
3.添加声明,修改/usr/src/linux/include/syscalls.h,在文件的最后添加下面的两行
4.修改系统调用入口
在/usr/src/linux/arch/x86/kernel/entry_64.S文件中含有系统调用入口system_call,因此在该文件中添加下面的代码:
以上代码保证在每次系统调用之后都执行比较,如果系统调用号要收集的系统调用号相同,则将调用myauditsys代码段,代码段如下所示
5.编译并且加载模块
6.编译完成之后使用dmesg查看
转载于:https://blog.51cto.com/mi55u/2043522