2022年Linux编程练习 .pdf
《2022年Linux编程练习 .pdf》由会员分享,可在线阅读,更多相关《2022年Linux编程练习 .pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1简单的内核程序#include /* * Kernel program needs this head file */#include /* * the PCB task_struct structures is defined * in the */#include #include /* * LSM related definitions are in this head file */#include MODULE_LICENSE( GPL); MODULE_AUTHOR( YOUR NAME ); MODULE_DESCRIPTION( Kernel Study); /* exter
2、n int register_security(struct security_operations *ops); */* * Parameters of the module (the pid of the process to be modify) */intproc2check = 0; module_param( proc2check, int, S_IRUGO); charfilename256= 0; int secondary = 0; /* static inline int file_integrity_check_security(struct linux_binprm *
3、bprm) strcpy(filename, bprm-interp); printk(KERN_ALERT the file to be run is: %sn, filename); / To do: Add code about file integrity check here 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - return 0; */* static struct security_operations
4、 kernel_security_ops = .bprm_check_security = file_integrity_check_security, ; */staticint process_op (void) / * * Linux 所有进程用 struct list_head链接起来,构成双向循环链表。* 这里使用 prev、this、 temp和next对双向循环链表进行操作。*/ struct list_head *prev, *this, *next, *temp; /* * 双向循环链表中所链接起来的每一个PCB */ struct task_struct *proc; /*
5、 * 得到当前正在运行进程的双向链表链接结构tasks。* tasks定义为: struct list_head *tasks; */ this = (struct list_head *)&( current-tasks); /current是当前的进程temp = this; /将当前进程 PCB的tasks结构保存prev = this-prev; /得到当前运行进程的前一个链接进程PCB当中的 tasksnext = this-next; /得到当前运行进程的后一个链接进程PCB当中的 tasks/* * (1)开始遍历用tasks所链接起来的双向循环链表。查询指定PCB,并进行处理。
6、* (2)注意: container_of从tasks结构得到 tasks所在结构体的首地址*/ while(container_of(this, struct task_struct, tasks)-pid) != proc2check) printk(KERN_ALERT current pid is: %dn, container_of(this, structtask_struct, tasks)-pid); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11
7、页 - - - - - - - - - / 没有找到,则查询下一个双向循环链表节点prev = this; this = next; next = next-next; /* * temp 是前面存储的遍历起点。如果当前的节点与遍历起点相同,说明整个链表已经遍历* 完毕,跳出循环;否则继续遍历*/ if (this != temp) continue; elsebreak; /* *如果是因为没有找到proc2check所指定的进程,则打印:pid未找到*/ if (this = temp) printk(KERN_ALERT pid error!n ); return -1; /* * pr
8、int the state of the process identified by variable proc2check */ /* 根据当前的 this指针( struct task_struct结构体内部的 struct list_head* tasks )* 计算 this所在结构体的首地址,也就是pid为proc2check进程的 PCB首地址。*/ proc = container_of(this, struct task_struct, tasks); if (proc-state state = 0) printk(KERN_ALERT process with pid %d
9、 is currently runnable.n, proc2check ); elseprintk(KERN_ALERT process with pid %d is currently stopped.n , proc2check ); /* * delete the process from the task_struct 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - */ /* * 将pid为proc2check的进
10、程从双向循环链表当中删除*/ prev-next = next; next-prev = prev; printk(KERN_ALERT process with pid %d is deleted from the PCBn. , proc2check ); return 0; staticint hello_init(void) printk(KERN_ALERT Hello, world!n ); /* * Register LSM hooks if (register_security(&kernel_security_ops) printk(KERN_ALERT Failure re
11、gistering the LSM module!n); return -1; */process_op (); return 0; staticvoid hello_exit(void) printk(KERN_ALERT Goodbye, cruel world!n ); module_init(hello_init); module_exit(hello_exit); 代码说明:(1)内核模块的参数。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - -
12、- - - - - - - 参数可以使用module_param宏声明, 这个宏定义在 moduleparam.h 当中。module_param带3个参数:变量名、类型和权限。其形式为:module_param(变量名 , 类型 , 权限 )。宏应该放在任何函数的外面,放在接近源文件的头部。module_param 宏参数支持如下类型:bool、invbool(将真变假,假变真) 、charp(字符指针) 、int、long、short、uint、ulong、ushort 、数组。当使用数组的时候,数组值用逗号分开作为列表。最后的模块参数是一个访问权限,参见 。S_IRUGO可读不可改变;
13、S_IRUGO | S_IWUSR允许 root 改变参数。 注意:如果参数被sysfs改变了, 除非你的内核发现了改变,否则内核没有任何办法感知该改变。你很可能不应该设置内核模块参数可写,除非你准备探测这种改变并且相应作出调整。(2)task_struct数据结构。进程属性相关的域。包括: state, pid, flag, binfmt, exit_code and exit_signal, common(命令行调用时, 可执行文件的名字 ), ptrace(调用系统调用ptrace时置位 )等。进程调度相关的域。包括: prio, run_list, array( 优先级数组 ), sl
14、eep_avg, timestamp, interactive_credit, policy( 采用时间片轮转或者实时调度方式), cpus_allowed, time_slice 等。进程关系相关的域。包括: real_parent, prent, children, sibling, group_leader 等。进程证书相关的域。包括: uid和gid, euid和egid, suid和sgid, group_info 等。进程权能相关的域。将uid=0的权限进行分割。包括: cap_effective, cap_inheritable, cap_permitted 等。进程限制相关的域
15、。包括: rlim( 资源限制 )等。进程文件系统或者地址空间相关的域。包括: fs, files, mm( 内存管理 ), active_mm( 最近最常访问的地址空间) (3)container_of函数。原型:#define container_of(ptr, type, member) ( const typeof( (type *)0)-member ) *_mptr = (ptr); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - -
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年Linux编程练习 2022 Linux 编程 练习
限制150内