Linux模块试写

来源:互联网 发布:网络设计师工资 编辑:程序博客网 时间:2024/06/14 02:10

简述:实现的是一个简易的模块test.ko

输入一个state(用来表示进程的状态) ,可一个得到该状态的进程pid

module功能打印所有state的进程pid


test.c:

#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/sched.h>// task_structMODULE_LICENSE("GPL");    static int  state;          //print 0: runnable process ,-1: unrunnable process , >0 stopped processmodule_param(state,int,0644);   static int __init test_init(void)   {       printk(KERN_ALERT "Module Test Starts!\n");    struct task_struct *p;    for (p = &init_task ; (p = next_task(p)) != &init_task ; ){        if(p->state == state){if(state == 0)             printk(KERN_ALERT "RUNNABLE process: %d !\n",p->pid);          else if(state == -1)             printk(KERN_ALERT "UNRUNNABLE process: %d !\n",p->pid);         else if(state > 0)             printk(KERN_ALERT "STOPPED process: %d !\n",p->pid);         else             printk(KERN_ALERT "WRONG STATE! \n");        } }    return 0;   }   static void __exit test_exit(void)   {       printk(KERN_ALERT "Finished ,all the process states are listed above!\n");   }   module_init(test_init);   module_exit(test_exit);


Makefile:

####---Makefile----#####OBJ = testobj-m := $(OBJ).oKERNELDIR = /lib/modules/`uname -r`/buildPWD=`pwd`default :$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesinstall:insmod $(OBJ).kouninstall:rmmod $(OBJ).koclean:rm -rf *.o *.mod.c *.ko *.symvers



cd到test 文件夹,

输入:make


之后发现又新建了.ko文件



输入: su

进入 管理员root操作部分


输入: insmod test.ko state=0

安装模块, 0表示runnable的进程;-1表示unrunnbale的进程 ;>0表示stopped状态的进程


输入:dmesg 显示printk的输出



后面是删除module

输入: rmmod test.ko   完成卸载模块


附:

如果要开机自动加载的话,

修改/etc/rc.local,添加make clean -> make -> insmod  /路径 .ko文件  输入(param= ,param=, ...)

如图:



原创粉丝点击