linux向内核中添加系统调用2
操作系统项目:向Linux内核添加一个系统调用, 打印进程树
实验环境:
VMware workstation 16
ubuntu 20.04.1
系统内核:linux 5.4.0
修改的内核:linux 5.4.5
一,配置环境
一股脑装就完了,也不知道到底哪个有用23333,不懂不懂
apt-get install libncurses5-dev libssl-dev build-essential openssl zlibc minizip libidn11-dev libidn11 flex bison
二,下载内核源码
我是在下面这个地方下载的:
http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/
三,添加一个sys_printProcessTree函数
1 添加声明 .../linux-5.4.5/arch/x86/include/asm/syscalls.h
/***LiCoreAdd****/
asmlinkage void sys_printProcessTree(void);
/***LiCoreAddEnd*/
2 添加函数 .../linux-5.4.5/kernel/sys.c
static void printchildren(struct task_struct* task, int n)
{
struct list_head *pos;
struct task_struct* p;
int i;
for(i=n;i>0;i--)
{
printk(KERN_CONT " ");
}
printk(KERN_CONT "|------");
printk(KERN_CONT "%s(%d)\n", task->comm, task->pid);
list_for_each(pos, &task->children)
{
p=list_entry(pos, struct task_struct, sibling);
if(p != NULL)
{
n++;
printchildren(p, n);
n--;
}
}
}
asmlinkage void sys_printProcessTree(void)
{
printk("=============Process Tree Start=============\n");
printchildren(&init_task, 0);
printk("=============Process Tree End=============\n");
}
3 添加调用号 .../linux-5.4.5/arch/x86/entry/syscalls/syscall_64.tbl
336 64 printProcessTree sys_printProcessTree
四,编译修改好的内核源码
1 删除无用文件
sudo make mrproper
sudo make clean
2 生成配置文件.config
此处进去直接save,然后exit,生成一个默认的.config即可
sudo make menuconfig
3 编译
j4是指用4核编译,查的说是可以加快编译速度,不过我也没有具体对比验证
sudo make -j4
4 安装
sudo make modules_install
sudo make install
五,重启使用新内核
reboot
然后直接按住shift不放,就会进入grub(手速不够的请再来一遍...)
六,测试新的系统调用
随便找个地方写个main.cpp
#include<stdio.h>
#include<unistd.h>
#include<sys/syscall.h>
#include<sys/types.h>
int main()
{
syscall(336);
return 0;
}
gcc main.cpp -o main.o
运行main.o后你会发现什么也没有输出到屏幕,因为系统调用的printk输出到了syslog中了。
位置在/var/log/syslog
可以直接
gedit /var/log/syslog
然后ctrl+f,找Process Tree Start
这里其实是希望打印出来的:
要调一下printk优先级?