资源简介
本代码已经通过实际测试,代码运行良好,无bug。在Linux内核中增加一个系统调用,并编写对应的linux应用程序。利用该系统调用能够遍历系统当前所有进程的任务描述符,并按进程父子关系将这些描述符所对应的进程id(PID)组织成树形结构显示。
代码片段和文件信息
#include
#include
#include
#include
#include
#include
#define my_syscall_num 223 //系统调用号(没有被系统占用)
#define sys_call_table_address 0xc06224e0 //sys_call_table首地址通过grep sys_call_table /boot/System.map-‘uname -r‘获取
unsigned long *sys_call_table = 0;
int orig_cr0;
static int (*anything_saved)(void);
static int counter = 0;
typedef struct process
{
int pid;
int depth;
}process;
process a[512];
/* 控制寄存器cr0的第16位是写保护位。
若清零了则允许超级权限往内核中写入数据
然后写完后,又将那一位复原就行了。*/
unsigned int clear_and_return_cr0(void)
{
unsigned int cr0 = 0;
unsigned int ret;
asm(“movl %%cr0 %%eax“:“=a“(cr0));//读取cr0寄存器的值放入eax中,同时赋值给cr0
ret = cr0;
cr0 &= 0xfffeffff;
asm(“movl %%eax %%cr0“::“a“(cr0));
return ret;
}
void setback_cr0(unsigned int val)
{
asm volatile(“movl %%eax %%cr0“::“a“(val)); //读取val的值到eax寄存器,再将eax寄存器的值放入cr0中
}
void processtree(struct task_struct * pint b)
{
struct list_head * l;
a[counter].pid = p -> pid;
a[counter].depth = b;
counter ++;
for(l = p -> children.next; l != &(p->children); l = l->next)
{
struct task_struct *t = list_entry(lstruct task_structsibling);
processtree(tb+1);
}
}
asmlinkage long sys_mycall(char __user * buf)
{
int b = 0;
struct task_struct * p;
printk(“**********sys_mycall************\n“);
for(p = current; p != &init_task; p = p->parent );//通过当前current进行向上查找直到p指向根进程init_task。
processtree(pb);
if(copy_to_user((struct process *)bufa512*sizeof(struct process)))
return -EFAULT;
else
return sizeof(a);
}
static int __init init_addsyscall(void)
{
printk(“***********init_addsyscall*************\n“);
sys_call_table = (unsigned long *)sys_call_table_address;//获取sys_call_table的首地址
printk(“*********sys_call_table: 0x%p\n“ sys_call_table); //
anything_saved = (int(*)(void)) (sys_call_table[my_syscall_num]);//保存原始系统调用的地址
orig_cr0 = clear_and_return_cr0();//修改sys_call_table写属性
sys_call_table[my_syscall_num]= (unsigned long)&sys_mycall;//将223号指向自己写的调用函数
setback_cr0(orig_cr0);//恢复页表只读属性
return 0;
}
static void __exit exit_addsyscall(void)
{
//设置cr0中对sys_call_table的更改权限。
orig_cr0 = clear_and_return_cr0();//设置cr0可更改
//恢复原有的中断向量表中的函数指针的值。
sys_call_table[my_syscall_num]= (unsigned long)anything_saved;
//恢复原有的cr0的值
setback_cr0(orig_cr0);
printk(“**************call exit_addsyscall exit******************** \n“);
}
module_init(init_addsyscall);
module_exit(exit_addsyscall);
MODULE_LICENSE(“GPL“);
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
..A..H. 278 2016-12-31 23:10 ProgressTreePrint\.ProgressTreePrintKernel.ko.cmd
..A..H. 13700 2016-12-31 23:10 ProgressTreePrint\.ProgressTreePrintKernel.mod.o.cmd
..A..H. 13787 2016-12-31 23:10 ProgressTreePrint\.ProgressTreePrintKernel.o.cmd
文件 117 2017-01-01 14:40 ProgressTreePrint\.tmp_versions\ProgressTreePrintKernel.mod
文件 394 2016-12-31 19:46 ProgressTreePrint\Makefile
文件 414 2016-12-31 19:45 ProgressTreePrint\Makefile~
文件 0 2016-12-31 19:48 ProgressTreePrint\Module.markers
文件 0 2016-12-31 19:48 ProgressTreePrint\Module.symvers
文件 3114 2016-12-31 19:52 ProgressTreePrint\ProgressTreePrintKernel.c
文件 3113 2016-12-31 19:47 ProgressTreePrint\ProgressTreePrintKernel.c~
文件 79011 2016-12-31 23:10 ProgressTreePrint\ProgressTreePrintKernel.ko
文件 722 2016-12-31 23:10 ProgressTreePrint\ProgressTreePrintKernel.mod.c
文件 42852 2016-12-31 23:10 ProgressTreePrint\ProgressTreePrintKernel.mod.o
文件 37396 2016-12-31 23:10 ProgressTreePrint\ProgressTreePrintKernel.o
文件 4992 2017-01-01 14:40 ProgressTreePrint\ProgressTreePrintUser
文件 545 2016-12-31 19:05 ProgressTreePrint\ProgressTreePrintUser.c
...D.H. 0 2017-02-15 11:44 ProgressTreePrint\.tmp_versions
目录 0 2017-02-15 11:44 ProgressTreePrint
----------- --------- ---------- ----- ----
200435 18
- 上一篇:百度收录批量提交工具
- 下一篇:labview滤波器设计
相关资源
- jdk-8u221-linux-x64.tar.gz&jdk;-8u221-windows-
- dos2unix for windows
- 一个简单的LINUX防火墙
- 飞凌ok6410 linuxLED驱动及应用程序
- 理发师问题的实现
- Linux下线性和DFS遍历进程树 内核模块
- SAP JCo3在Linux下安装及连接
- 安装过Windows系统的电脑如何安装Lin
- 简单的网络嗅探器Linux 源码
- 网狐6603内核引擎源码
- linux内核 0.11版本源码 带中文注释
- cudnn-11.1-linux-x64-v8.0.4.30.tgzab
- Linux C程序设计王者归来_book_cd.7z.004
- 鸟哥的Linux私房菜:服务器架设篇第
- 《Linux-UNIX系统编程手册 上、下册 全
- linux学习资料(收集了很久)
- passpg破解64内核(静态)不支持最新
- 程序的链接和装入
- 实验四:实现一个unix命令解释程序代
-
gsnap.tar.gz linux从fr
amebuffer获取image源 - i2c_ioctl详解
- Linux网络编程超级详细笔记
- linux tftp rpm软件包
- libssl-dev库
- 基于video4linux2的双usb摄像头图像获取
- linux网络编程教学视频
- Linux下聊天系统
- linux压力测试工具stress
- 国密SM4算法ECB CBC源码及demoLinux C版
- linux基础教程.pdf
评论
共有 条评论