Linux模块试写

简述:实现的是一个简易的模块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_struct
MODULE_LICENSE("GPL");    
static int  state;          //print 0: runnable process ,-1: unrunnable process , >0 stopped process
module_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 = test
obj-m := $(OBJ).o
KERNELDIR = /lib/modules/`uname -r`/build
PWD=`pwd`

default :
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

install:
	insmod $(OBJ).ko

uninstall:
	rmmod $(OBJ).ko

clean:
	rm -rf *.o *.mod.c *.ko *.symvers




cd到test 文件夹,

输入:make

Linux模块试写_第1张图片


之后发现又新建了.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=, ...)

如图:

Linux模块试写_第2张图片


你可能感兴趣的:(linux,struct,Module,makefile)