Linux 4.9.2 下添加系统调用
来源:互联网 发布:sqlserver数据库安全 编辑:程序博客网 时间:2024/06/05 23:52
我们试图在Linux 4.9.2下添加一个系统调用,这个系统调用会统计进程的缺页数与脏页数
下载并配置Linux内核源码
在Linux官网(https://www.kernel.org/)下载内核源码。我选择的是最新的稳定版4.8.12,下载压缩包linux-4.8.12.tar.xz
由于文件系统格式的问题,不能在共享文件夹中进行一下操作(共享文件夹在windows环境中建立,为FAT32格式),所以需要将压缩包复制到linux虚拟机内部的位置,我是用的是/Documents/OSworks
然后进入目录并解压文件
cd /Documents/OSworkstar xf linux-4.8.12.tar.xzcd linux-4.8.12
代码改写
要添加一个系统调用,首先要修改系统调用表,即syscall_64.tbl。在arch/x86/entry/syscalls/syscall_64.tbl
在记录的最后添加我们的系统调用条目,记住调用号为329
321 common bpf sys_bpf322 64 execveat sys_execveat/ptregs323 common userfaultfd sys_userfaultfd324 common membarrier sys_membarrier325 common mlock2 sys_mlock2326 common copy_file_range sys_copy_file_range327 64 preadv2 sys_preadv2328 64 pwritev2 sys_pwritev2329 common pagefaultInfo sys_pagefaultInfo……………………
同时也要修改一下/include/linux/syscalls.h文件,在文件最后添加我们的函数声明:
asmlinkage long sys_pagefaultInfo(void);
为了实现缺页统计的功能,要先对原有的代码进行一些修改。修改的过程参照实验指导,包括:
在include/linux/mm.h中添加
extern ungsigned long pfconfig;
在include/linux/sched.h中添加:
unsigned long pf;
修改kernel/fork.c的dup_task_strcut函数:
static struct task_struct *dup_task__struct(struct task_struct *orig, int node){ ………………tsk->pf = 0;………………}
修改arch/x86/mm/fault.c。在这里要注意两句指令添加的地方,添加在if(major)的里面,则我们统计的是Major Faults(requiring I/O),并不实际引起硬件I/O的Minor Faults则不会被统计。
unsigned long pfcount;
………………static noinline void __do_page_fault(struct pt_regs *regs, unsigned long error_code, unsigned long address){………………if(major){pfcount++;current->pf++;………………}
然后我们编写实际的系统调用代码。我们用一个额外的文件夹info存放我们的代码文件pagefaultInfo.h以及pagefaultInfo.c
mkdir infocd info/
在pagefaultInfo.h中声明函数
asmlinkage long sys_pagefaultInfo(void);
在pagefaultInfo.c中定义函数
asmlinkage long sys_pagefaultInfo(void);
之后我们要编写寻找dirtypage数量的函数。这部分比较复杂,基本的思路是去遍历进程的页表,判断每个页表是否为firty,从而进行统计。
首先遍历所有进程(即task_struct),对每个task_struct,得到其mm_struct(表示进程地址空间的结构)。然后对每段(数据段、代码段等等),遍历其4级页表(pgd->pud->pmd->pte),然后对每个pte调用pte__ditry()函数判断是否为脏叶。
最后后要将我们的新代码加到makefile系统里面去,使得在makefile的时候能够编译并链接他们。具体做法是在info文件夹里新建文件Makefile,并添加以上信息:
obj-y:=pagefaultInfo.o
同时修改 kernel里的Makefile文件,在core-y后面添加我们的info/路径
core -y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/ info/
编译并装载内核
首先要配置内核。进入内核源代码根目录。考虑到可以配置的选项比较繁杂,可以直接拷贝当前系统中的配置文件。
cp /boot/config-$(uname -r) .config make menuconfig
这时会进入一个带GUI的内核配置界面,使用默认配置即可。Save->Exit退出配置
之后可以正式开始编译内核(下一次重新编译可以从这一步开始)
fakeroot make-kpkg kernel_image
漫长的编译之后就可以将内核加载到boot列表里了:
fakeroot make-kpkg kernel_imageupdate-initramfs –c –k 4.8.12update-grup2
然后重启系统。如果重启成功,就说明内核重编译基本成功了。
如果空间不够而且或者不准备再次重新编译内核的话,可以删除变异的中间文件
make clean
- Linux 4.9.2 下添加系统调用
- MIPS Linux 下添加系统调用
- ARM Linux下添加自定义系统调用
- Linux下添加系统调用实例
- Linux下如何添加系统调用
- 添加Linux系统调用
- Linux添加系统调用
- 添加Linux系统调用
- Linux添加系统调用
- Linux添加系统调用
- Linux添加系统调用
- 添加linux系统调用--基于3.5内核下
- 为linux添加系统调用
- 给linux添加系统调用
- 添加自定义Linux系统调用
- 如何添加linux系统调用
- Linux系统调用的添加
- 为linux添加系统调用
- FragmentManager简单解析
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- Hibernate知识点概况(四)
- js缓存代理
- TensorFlow官方教程学习笔记(五)——前馈神经网络
- Linux 4.9.2 下添加系统调用
- 数论-素数
- Linux下./configure,make,make install的作用
- align-self
- 【NOIP2014八校联考第4场第2试10.20】乐曲创作
- POJ1003 solve Hangover
- 多线程的几种控制方式
- opencv将图片变成固定比例,多余部分黑色填充
- 给你的组件添加Label