Linux 2.6 和2.4 驱动开发有什么不同,特别是驱动模块

zdhzidy 2004-11-16 03:57:42
如题
请问那里有相应的资料。麻烦大家介绍一下。
...全文
100 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
binjuny 2004-11-17
  • 打赏
  • 举报
回复
现在让我们来看一个例子,分析一下新的内核编译系统如何来编译并加载一个简单的模块。这个模块是一个“hello world”模块,代码和2.4模块代码基本类似,只是 module_init 和 module_exit 要换成 init_module 和 cleanup_module (内核2.4.10模块已经使用这种机制)。这个模块命名为 hello.c,Makefile 文件如下:

  清单 3. 驱动程序 makefile 文件示例

     KERNEL_SRC = /usr/src/linux
     SUBDIR = $(KERNEL_SRC)/drivers/char/hello/
     all: modules

     obj-m := module.o
     hello-objs := hello.o

     EXTRA_FLAGS += -DDEBUG=1

     modules:
        $(MAKE) -C $(KERNEL_SRC) SUBDIR=$(SUBDIR) modules

  makefile 文件使用内核编译机制来编译模块。编译好的模块将被命名为 module.ko,并通过编译 hello.c 和连接 vermagic 而获得。KERNEL_SRC 指定内核源文件所在的目录,SUBDIR 指定放置模块的目录。EXTRA_FLAGS 指定了需要给出的编译期标记。

  一旦新模块(module.ko)被创建,它可以被新的模块工具加载或缷载。2.4中的原有模块工具不能用来加载或缷载2.6的内核模块。这个新的模块加载工具会尽量减少在一个设备仍在使用的情况下相应的模块却被缷载的冲突发生,而是在确认这些模块已经没有任何设备在使用后再缷载它。产生这种冲突的原因之一是模块使用计数是由模块代码自己来控制的(通过MOD_DEC/INC_USE_COUNT)。

  在2.6中,模块不再需要对引用计数进行加或减,这些工作将在模块代码外部进行。任何要引用模块的代码都必须调用 try_module_get(&module),只有在调用成功以后才能访问那个模块;如果被调用的模块已经被缷载,那么这次调用会失败。相应的,可以通过使用 module_put() 来释放对模块的引用。

CoolQ 2004-11-17
  • 打赏
  • 举报
回复
visit www.lwn.net.
there are a series of articles about porting 2.4 driver to 2.6
ChChip 2004-11-16
  • 打赏
  • 举报
回复
顶顶顶顶顶顶顶顶顶顶顶顶顶顶
zdhzidy 2004-11-16
  • 打赏
  • 举报
回复
还是自己顶阿 阿阿阿
zdhzidy 2004-11-16
  • 打赏
  • 举报
回复
自己顶!!

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧