当前位置: 技术问答>linux和unix
想各位说明一下这个简单的内核模块里面各个函数的含义
来源: 互联网 发布时间:2016-09-09
本文导语: Makefile文件: obj-m +=pscmd.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 主文件: #include //for init_module() #include ...
Makefile文件:
obj-m +=pscmd.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
主文件:
#include //for init_module()
#include //for create_proc_info_entry()
#include //for 'struct task_struct'
#include
#include
static struct proc_dir_entry *e;
int list_process(char *page,char **start, off_t off,int count,int *eof,void *data)
{
int len=0;
struct task_struct *p = &init_task; //get init tasks pcb point
struct list_head *q=&p->tasks,*head=&p->tasks;
len+=sprintf(page+len,"Process messagesn");
for(q=q->next;q!=head;q=q->next)
{
p=list_entry(q->next,struct task_struct,tasks);
len+=sprintf(page+len,"PID=%d NAME=%sn",p->pid,p->comm);
}
return len;
}
static int __init ps_init(void)
{
printk(KERN_INFO"ps load succeed");
e=create_proc_info_entry("pscmd",0,NULL,list_process);
e->read_proc=list_process;
return 0;
}
static void __exit ps_exit(void)
{
remove_proc_entry("pscmd",NULL);
printk(KERN_INFO"ps leave");
}
刚开始看内核 里面有许多不懂 请各位帮帮忙说明一下这道程序
obj-m +=pscmd.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
主文件:
#include //for init_module()
#include //for create_proc_info_entry()
#include //for 'struct task_struct'
#include
#include
static struct proc_dir_entry *e;
int list_process(char *page,char **start, off_t off,int count,int *eof,void *data)
{
int len=0;
struct task_struct *p = &init_task; //get init tasks pcb point
struct list_head *q=&p->tasks,*head=&p->tasks;
len+=sprintf(page+len,"Process messagesn");
for(q=q->next;q!=head;q=q->next)
{
p=list_entry(q->next,struct task_struct,tasks);
len+=sprintf(page+len,"PID=%d NAME=%sn",p->pid,p->comm);
}
return len;
}
static int __init ps_init(void)
{
printk(KERN_INFO"ps load succeed");
e=create_proc_info_entry("pscmd",0,NULL,list_process);
e->read_proc=list_process;
return 0;
}
static void __exit ps_exit(void)
{
remove_proc_entry("pscmd",NULL);
printk(KERN_INFO"ps leave");
}
刚开始看内核 里面有许多不懂 请各位帮帮忙说明一下这道程序
|
Makefile文件:
obj-m +=pscmd.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
主文件:
#include //for init_module()
#include //for create_proc_info_entry()
#include //for 'struct task_struct'
#include
#include
static struct proc_dir_entry *e;
int list_process(char *page,char **start, off_t off,int count,int *eof,void *data) /* 列出所有进程, pid, process name */
{
int len=0;
struct task_struct *p = &init_task; //get init tasks pcb point
struct list_head *q=&p->tasks,*head=&p->tasks;
len+=sprintf(page+len,"Process messagesn");
for(q=q->next;q!=head;q=q->next)
{
p=list_entry(q->next,struct task_struct,tasks);
len+=sprintf(page+len,"PID=%d NAME=%sn",p->pid,p->comm);
}
return len;
}
static int __init ps_init(void) /* 有 __init修饰的一般是初始化函数,gcc编译链接成机器码会放到相应的区 */
{
printk(KERN_INFO"ps load succeed");
e=create_proc_info_entry("pscmd",0,NULL,list_process); /* 在/proc文件系统下创建 pscmd目录, */
e->read_proc=list_process;
return 0;
}
static void __exit ps_exit(void)
{
remove_proc_entry("pscmd",NULL); /* 移除/proc文件系统下创建 pscmd目录, */
printk(KERN_INFO"ps leave");
}
|
简单说下吧.
ps_init() 模块初始化函数
ps_exit() 模块退出调用函数
list_process() 读取虚拟文件函数
ps_init() 模块初始化函数
ps_exit() 模块退出调用函数
list_process() 读取虚拟文件函数
|
这应该是一个procfs module
e=create_proc_info_entry("pscmd",0,NULL,list_process); //创建一个proc entry
e->read_proc=list_process; //将list_process 作为e的一个redd_proc
-----------------------------------------------
proc entry有两个成员函数,赋值可以这样:
struct proc_dir_entry* entry;
entry->read_proc = read_proc_foo;
entry->write_proc = write_proc_foo;
——————————————————————————————
关于procfs的详情可以看DocBook:Linux Kernel Procfs Guide
e=create_proc_info_entry("pscmd",0,NULL,list_process); //创建一个proc entry
e->read_proc=list_process; //将list_process 作为e的一个redd_proc
-----------------------------------------------
proc entry有两个成员函数,赋值可以这样:
struct proc_dir_entry* entry;
entry->read_proc = read_proc_foo;
entry->write_proc = write_proc_foo;
——————————————————————————————
关于procfs的详情可以看DocBook:Linux Kernel Procfs Guide