ICS kernellab

发布于 2019-09-12  995 次阅读


1.设置并编译内核

安装系统:ubuntu 16.04

内核版本:4.10.0-28-generic

1

初始步骤与Tutorials.pdf类似.

如何缩减内核大小:

找到/boot/下文件config-4.10.0-28-generic并复制到待安装内核根目录下(此处为/home/yyq/linux-4.6.3),并更名为.config.

$ make menuconfig

在图形界面选择load=》确定;进入general setup ---> optimize for size选择yes, save.

1

2

终端输入以下命令,对每一个询问选择m.

$ make localmodconfig

之后正常安装:

$ make modules_install
$ make install
$ update-grub2

修改/etc/default/grub文件内

GRUB_HIDDEN_TIMEOUT=10
GRUB_HIDDEN_TIMEOUT_QUIET=true

重启,黑屏时按shift+ESC进入选择界面=>advanced ubuntu options(或者类似的选项),可以看到有4.6.3的选择项。

3

采用Tutorials.pdf的朴素方法,生成vmlinuz-4.6.3文件的大小为6.7M:

4

采用上述方法生成vmlinuz-4.6.3文件大小为5.9M:

8

Tasks

built-in是将该选项直接编译到内核里; excluded是不编译入内核;module是把该选项做成模块,模块可以单独编译,但不能单独运行,需要运行时动态链接到内核。

选择build-in会编译进内核映像。

2.添加内核函数

kernel/文件夹下新建一个文件newf.c:

#include <linux/kernel.h>
#include <linux/syscalls.h>

SYSCALL_DEFINE2(newf, int, i, char, b)
{
    printk(KERN_DEBUG "Hello! This is Student-ID(%d) from yyq\n", i);
    trace_printk("%c: yyq.\n", b);  
    tracing_off();
    return 2;
}

修改makefile文件;修改arch/x86/entry/syscalls/syscall_64.tbl ; 重新编译。

测试程序如下:

13

运行测试程序,查看内核日志结果如下(执行了多次./1):

11

利用ftrace工具查看结果:

# cd /sys/kernel/debug/tracing
# echo function > current_tracer
# echo 1 > tracing_on

执行测试文件(./1)后查看trace:

# cat trace | tail -n 30

3

PS:第一次做时没看清pdf,以为传入两参数为int和char*(字符串),结果调用syscall总是返回Killed,ftrace只能跟踪到调用了sys_newf(输出了RIP,RSP,CODE,STACK等信息,具体原因不明.)

Task

trace的大小上限:

阅读Documentation/trace/ftrace.txt得知两个主要的参数buffer_size_kb和buffer_total_size_kb,第一个为一个trace buffer大小(kb),第二个为所有trace buffer总大小(kb)。

默认值为1410 / 180480,故总共有128个trace buffer.

修改trace大小(如修改为4000kb):

# echo 4000 > buffer_size_kb 

function_graph 追踪器...:

# echo vfs_open vfs_read vfs_write > set_ftrace_filter
# cat set_ftrace_filter
vfs_open
vfs_read
vfs_write
# echo function_graph > current_tracer
# echo 5 > max_graph_depth
# echo 1 > tracing_on
# echo 0 > tracing_on
# gedit trace

trace结果如下:

4

function 追踪器追踪所有的系统函数...:

清空set_ftrace_filter,echo function > current_tracer即可.

如何保证最后一条为自己系统调用:在自定义系统调用函数中最后加入tracing_off();

结果如下:

3


WRYYYYYYYYY!