LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1412|回复: 12

如何在Linux 2。4。20内核中加入自己写的驱动程序如text.c??

[复制链接]
发表于 2005-3-12 20:50:58 | 显示全部楼层 |阅读模式
如题目,想静态编译一个驱动程序到内核中,应该怎么作?大家帮帮忙,谢谢了!
发表于 2005-3-13 00:02:18 | 显示全部楼层
照着内核中的makefile文件写一个makefile文件,也可以修改相应的makefile文件。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-21 10:43:21 | 显示全部楼层
hehe,老兄可不可以详细一点啊?非常感谢了。在rh9下不行,我是这样做的:假如我的驱动程序名为test.c,将它放在/usr/src/linux/driver/char下并修改了此目录下的makefile和config.in在其中分别加入了
obj-$(CONFIG_TEST) = test.o 和bool  'My test'   CONFIG_TEST.
简单的test.c如下:
#ifndef MODULE
#define MODULE
#endif
#ifndef  __KERNEL__
#define  __KERNEL__
#endif
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/errno.h>
#include <linux/pci.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <asm/system.h>
#include <linux/ioport.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <asm/io.h>
#include <linux/types.h>

static int __init test_init(void)
{  
  printk(KERN_EMERG "HELLO test!\n");
    return 0;

}

static void __exit test_cleanup(void)
{
printk(KERN_EMERG " I  shut down device from kernerl mod \n");        
}

module_init(test_init);
module_exit(test_cleanup);

MODULE_LICENSE("GPL");
/*EXPORT_NO_SYMBOLS;*/

我想把test.c直接编译进内核,但好像不行,不知道漏了哪些环节或是什么问题,望高手指教,谢谢!
回复 支持 反对

使用道具 举报

发表于 2005-3-21 18:44:27 | 显示全部楼层
我觉得你好像没有在inin()和cleanup()里面注册啊,这个模块应该是不可以编译进内核的.
你可以先用gcc进行编译,然后在当前目录下用insmod test.o命令,然后用lsmod命令就可以看看你的模块有没有成功了.
^^加油,祝你好运!
回复 支持 反对

使用道具 举报

发表于 2005-3-21 18:46:31 | 显示全部楼层
现在才看到你的帖子,不知道现在回复迟不迟啊?
回复 支持 反对

使用道具 举报

发表于 2005-3-21 22:00:40 | 显示全部楼层
2.4内核使用init_module和cleanup_module来注册及卸载模块。

修正相关部分如下:

  1. int init_module(void)
  2. {
  3. printk(KERN_EMERG "HELLO test!\n");
  4. }

  5. void cleanup_module(void)
  6. {
  7. printk(KERN_EMERG " I shut down device from kernerl mod \n");
  8. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-22 13:43:10 | 显示全部楼层
hehe 我遍了一个简单的数据采集卡的驱动,是模块加载的,用insmod可以加载上,用open也可以打开,就是说驱动本身没有问题,只是不知道怎么样才能静态编进内核?
回复 支持 反对

使用道具 举报

发表于 2005-3-24 12:49:10 | 显示全部楼层
不知道我说的对不对
比如我写了一个mydriver.c 的驱程序,使字符设备
我把这个文件复制到/linux/drivers/char下,该目录保存了linux下的致富设备驱动程序,修改mem.c 在int char_dev_init()函数中天津如下代码
#ifdef CONFIG_MYDRIVER
//CONFIG_MYDRIVER是在配置内核的时候赋值的(在后面的代码会看到)
device_init();//设备初始化
#endif
修改 /linux/drivers/char下的Makefile文件
添加
ifeq($(CONFIG_MYDRIVER),y)
L_Objes+=mydriver.o
endif
修该 /linux/drivers/char下的config.in文件

comment Character devices
下面添加
bool support for mydriver CONFIG_MYDRIVER
这样
运行make config 、make menuconfig 会出现support for mydriver
选中
make dep
make
因该加入到内核里了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-24 13:21:26 | 显示全部楼层
hehe 好几天登不上来服务器,非常感谢zbluecn的指点,我尽快试试看。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-24 13:55:04 | 显示全部楼层
ifeq($(CONFIG_MYDRIVER),y)
L_Objes+=mydriver.o
endif

呵呵 zblucn你好,你说上面那段是不是改成
ifeq($(CONFIG_MYDRIVER),y)
obj-y            +=mydriver.o
endif

呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表