linux内核编译与系统调用日志收集系统调用

一.内核编译

Linux内核的体系结构是单内核的,但是充分的采用了微内核的设计思想,使得虽然是单内核,但是工作在模块化的方式下,并且这个模块可以装载或者卸载,Linux负责管理系统的进程,内存,设备驱动程序,文件和网络系统,决定系统的性能和稳定性。在Linux内核的基础上根据自己的需要,量身定制一个更加高效更加稳定的内核,需要我们来手动编译。

编译的过程如图文所示:

1.在Kernel官网下载所需的内核源码包,网址为:http://www.kernel.org,这里下载的源码包为3.10.1版本的源码包,下载之后解压,并且链接为linux,方便使用。如下所示

groupattachment?att=24538B9F0000005200010166E44CF5

2.接下来配置内核,配置方法有多种

make config 遍历选择所要编译的内核特性

我这里使用的是make menuconfig 的方法,是一个基于图形化界面的配置方法,因此,需要首先下载ncurses工具,相对于命令行图形界面更加方便快捷,如下所示

groupattachment?att=24538B9F000000520001024E69918A

2.使用make命令进行编译,这一步需要等待比较长的时间

groupattachment?att=24538B9F000000520001036F2ACBB5

3.编译完成之后,执行make modules_install,在执行完这一步之后我们可以在/lib/modules目录下产生一个以版本号命名的文件。

groupattachment?att=24538B9F000000520001040D5CF539

4.之后执行make install完成安装,安装之后会在/boot目录下生成一个内核文件vmlinuz-3.10.1,还有几个与当前版本编译一致的文件

groupattachment?att=24538B9F0000005200010566E44CF5

5.在重启之后就会看到启动界面有两个内核的版本,如下所示,即为编译成功

groupattachment?att=24538B9F0000005200010642FB5853

二.添加系统调用日志收集程序

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文件,增加下面的两行

groupattachment?att=24538B9F000000520001074F27FCB5

即在Makefile文件中添加myaudit.o以及vsmp_64.o用于编译添加的myaudit

2.添加系统调用号,修改/usr/src/linux/arch/x86/syscalls/syscall_64.tbl文件,在文件的最后添加一行如下:

groupattachment?att=24538B9F000000520001085121DED1

3.添加声明,修改/usr/src/linux/include/syscalls.h,在文件的最后添加下面的两行groupattachment?att=24538B9F000000520001097C41EF33

4.修改系统调用入口

在/usr/src/linux/arch/x86/kernel/entry_64.S文件中含有系统调用入口system_call,因此在该文件中添加下面的代码:

groupattachment?att=24538B9F0000005200010A1EF9D500

以上代码保证在每次系统调用之后都执行比较,如果系统调用号要收集的系统调用号相同,则将调用myauditsys代码段,代码段如下所示

groupattachment?att=24538B9F0000005200010B5121DED1

5.编译并且加载模块

image.png

6.编译完成之后使用dmesg查看

image.png