#include<linux/init.h>
#include<linux/init_task.h>
#include<linux/list.h>
#include<linux/module.h>
#include<linux/sched.h>
#include<linux/sem.h>
#include<linux/pid.h>
#include<linux/fs.h>
#include<linux/pid_namespace.h>
#include<linux/kernel.h>
#define SYS_CALL_TABLE 0xffffffff8276bf40
#define NEW_SYS_CALL_NUM 400
// global decalre
unsigned long* sys_call_table;
short bc[400][2];
short visited[400];
//function declare
static void printbytree(short bc[400][2], short floor, short deep, short visited[]);
asmlinkage long sys_call_print_pid_bytree(void);
//static int clear_cr0(void);
//static void setback_cr0(int val);
static void printbytree(short bc[400][2], short floor, short deep, short visited[])
{
short i;
if (deep > 13) return;
for (i=0;i<deep-2;i++) printk(KERN_CONT " | ");
if (i+1 == deep-1) printk(KERN_CONT " |-");
printk(KERN_CONT "[%5d]\n", bc[floor][0]);
visited[floor] = 1;
for (i=0;i<400;i++)
{
if (bc[i][1] == bc[floor][0] && visited[i] == 0) printbytree(bc, i, deep+1, visited);
}
return;
}
asmlinkage long sys_call_print_pid_bytree()
{
struct task_struct *task;
short top, i;
i = 0;
top = 0;
for (i=0;i<400;++i)
{
bc[i][0] = bc[i][1] = -1;
visited[i] = 0;
}
for_each_process(task)
{
if (top < 400)
{
bc[top][0] = task->pid;
bc[top++][1] = task->parent->pid;
}
}
printk(KERN_DEBUG"the top is %d\n", top);
for (i=0;i<top;i++)
{
if (bc[i][1] == 0) printbytree(bc, i, 1, visited);
}
return 0;
}
unsigned long clear_cr0(void)
{
unsigned long cr0 = 0;
unsigned long ret;
printk("------------>>7<<------------");
asm volatile("movq %%cr0, %%rax":"=a"(cr0));
ret = cr0;
printk("******0x%lx", cr0);
cr0 &= 0xfffffffffffeffff;
printk("******0x%lx", cr0);
printk("------------>>8<<------------");
asm volatile("movq %%rax, %%cr0"::"a"(cr0));
asm volatile("movq %%cr0, %%rax":"=a"(cr0));
printk("******0x%lx", cr0);
printk("------------>>9<<------------");
return ret;
}
static void setback_cr0(int val)
{
asm volatile("movq %%rax, %%cr0"::"a"(val));
}
static int k__init(void)
{
int original_cr0;
printk("------------>>add kernel module<<------------");
printk("------------>>1<<------------");
printk("------------>>add kernel module<<------------2");
sys_call_table = (unsigned long*)(SYS_CALL_TABLE);
printk(">>>>>>>>>>0x%ln", sys_call_table);
printk("------------>>add kernel module<<------------3");
original_cr0 = clear_cr0();
printk("------------>>add kernel module<<------------4");
sys_call_table[1] = (unsigned long)&sys_call_print_pid_bytree;
printk("------------>>add kernel module<<------------5");
setback_cr0(original_cr0);
printk("------------>>add kernel module<<------------6");
sys_call_print_pid_bytree();
return 0;
}
static void k__exit(void)
{
printk("------------>>remove kernel module<<------------");
}
module_init(k__init);
module_exit(k__exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Liwenchi");
在linux内核中添加系统调用,打印当前进程的树形结构
最新推荐文章于 2021-04-29 22:17:09 发布