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

原创 2005年05月20日 20:50:00

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

}

第一个linux内核模块的编写

最近, 感觉自己应该学一下linux的东西了, 于是,na

经典的第一个linux内核模块编程----hello,Kernel!

转自:http://edsionte.com/techblog/archives/1336学习内核模块编程,第一个小程序当然是hello,kernel!了,这应当算是一个惯例了。以前大三的时候在实验课...

编写属于你的第一个Linux内核模块

内核编程常常看起来像是黑魔法,而在亚瑟 C 克拉克的眼中,它八成就是了。Linux内核和它的用户空间是大不相同的:抛开漫不经心,你必须小心翼翼,因为你编程中的一个bug就会影响到整个系统。浮点运算做起...

编写你的第一个Linux内核模块(目前校对到杂项设备)

想要开始黑掉核?没有线索不知道如何开始?让我们向你展示如何做…   内核编程通常被视为黑魔法。在Arthur C Clarke的意义上说,它可能是。Linux内核与用户空间有很大的不同:抛开漫不经心的...

【Linux开发】编写属于你的第一个Linux内核模块

曾经多少次想要在内核游荡?曾经多少次茫然不知方向?你不要再对着它迷惘,让我们指引你走向前方…… 内核编程常常看起来像是黑魔法,而在亚瑟 C 克拉克的眼中,它八成就是了。Linux内核和它的用户空...

黑客内核:编写属于你的第一个Linux内核模块

曾经多少次想要在内核游荡?曾经多少次茫然不知方向?你不要再对着它迷惘,让我们指引你走向前方…… 内核编程常常看起来像是黑魔法,而在亚瑟 C 克拉克的眼中,它八成就是了。Linux内核和它的用户空间是...

linux内核模块编程.pdf(标记版)

  • 2009年05月18日 14:57
  • 859KB
  • 下载

Linux内核模块介绍 PPT版

  • 2017年03月24日 14:30
  • 3.43MB
  • 下载

Linux内核模块编程之Helloworld!

http://www.hustyx.com/ubuntu/4/ 下一个项目要做基于Linux的设备驱动开发,其实就是做Ophone的移植工作。刚找了本Linux设备驱动来学习学习。 首...

编译Linux内核模块的简单Makefile

  • 2012年12月23日 21:34
  • 278B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:5月18日,,,我的第一个linux内核模块
举报原因:
原因补充:

(最多只允许输入30个字)