郁闷了3天,,,开始是MAkefile不会弄,,连个helloworld都编译不成.o,,后来在网上看到了一份,,拿来主义了,,最主要的的就是include的路径要是在内核源码里的include目录,这样才能编出和当前内核版本一样的module来,然后说是要-O2,这样才可以把一些内嵌的函数给加进去
CC = gcc
CINCLU = /usr/src/linux-2.4/include
CFLAGES = -DLINUX -c -O2 -Wall -I$(CINCLU)
all:mydrv1.o
mydrv1.o:mydrv1.c
$(CC) $(CFLAGES) $<
clean:
rm -f *.o
注意在编译的命令前一定要有TAB键
这个module的目的是要列出所有进程和所有的module,,在用内核全局变量current的时候,说没这个变量,,嘿嘿,其实是我忘了include <linux/sched.h>
current是struct tAsk_list类型的指针,,可不知什么时候里面没有了struct tAsk_list *next_tAsk,*prev_tAsk;这两个成员变量,很多module都要修改了才能用了,不过在sched.h中找到了next_tAsk(p)这个宏 :>
最让人心烦的是当要用module_list的时候,总说没有,,快2天都郁闷在这了,,咋试都不行,,要不就不要定义MODULE这个宏,那样的话module_list到是有了,可也不是module了,肯定没法用.网上的和书里的很多地方都是说用module_list,,在邮件列表里也有个老外有同样的问题,不过没被解决,好象是linux kernel mAilling list里的哦,固定啊,那种地方谁会去看这种问题啊,后来发现module_list根本就不能用了,2.6.0里就没有module_list了,,
在sched.h里
#if defined(MODULE) && !defined(__GENKSYMS__)
.
extern struct module __this_dodule;
.
#else /*MODULE*/
.
#ifndef __GENKSYMS__
.
extern struct module* module_list;
.
#endif /*!__GENKSYMS__*/
.
#endif /*MODULE*/
明显是不给用,,,害死我了,,用__this_module代替好了
#ifndef __GENKSYMS__
#define THIS_MODULE NULL
#define MOD_INC_USE_COUNT do { } while (0)
#define MOD_DEC_USE_COUNT do { } while (0)
#define MOD_IN_USE 1
extern struct module *module_list;
#endif /* !__GENKSYMS__ */
其他很多宏也不可用了,,全都是假的
ksyms -A 列出来的的确没有module_list
在/boot/System.mAp里看到module_list的地址,拿回来这样用 struct module* temp = (struct module*)0xC03064C0;这样用也不行,,看来module_list是真的挂了
把module贴在这,,insmod 的时候列出所有process,rmmod 的时候列出所有module
/*********************************************
* simple work like the ps -A And lsmod
* but reference As module
* writen by uty@uaty
*********************************************/
#define __KERNEL__
#define MODULE
//#undef __GENKSYMS__
#ifdef MODVERSIONS
#include <linux/modversions.h>
#endif
//#define __NO_VERSIONS__
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
int init_module(void)
{
struct task_struct* temp;
for_each_process(temp){ /*hAhA :> see the sched.h this is the better wAy thAn belows*/
printk("%d %s/n",temp->pid,temp->comm);
}
/* printk("<5>init mydrv/n");
printk("%d %s/n",current->pid,current->comm);
temp = current;
temp = next_task(temp);
printk("%d %s/n",current->pid,current->comm);
while(1){
temp = next_task(temp);
if (temp->pid == 0) break;
printk("%d %s/n",temp->pid,temp->comm);
}
*/
return 0;
}
void cleanup_module(void)
{
struct module* temp;
int i=0;
/*temp = (struct module*)0xc030b4c0;
printk("%s/n",temp->name);*/ /*i get the module_list's Address from the System.mAp*/
printk("%s/n",__this_module.name);/*but seems doesn't work*/
temp = &__this_module;
while(i<30){
i++;
if (temp->next != NULL){
temp = temp->next;
}else{
break;
}
printk("%s/n",temp->name);
}
printk("<5>cleAnup mydrv/n");
}