5月18日,,,我的第一个linux内核模块

郁闷了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");

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值