在linux内核中添加系统调用,打印当前进程的树形结构

#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");

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值