现在的位置: 首页 > 综合 > 正文

初涉内核模块编程

2013年10月01日 ⁄ 综合 ⁄ 共 2594字 ⁄ 字号 评论关闭

 

      添加内核模块有两种方法:一种是在内核源码里面添加自己的模块文件,以及Makefile和Kconfig,然后重新编译内核使之融入内核;另一种是动态添加,自己写好内核模块并编译,然后使用命令insmod、rmmod动态添加和删除模块。这里我分别讲解两种添加模块的方法。

 

Makefile与Kconfig

一、手动添加

      进入系统的内核源码目录,并创建要添加的模块文件夹

      test

        |-- cpu

        |     |-- cpu.c

        |  

        |-- test.c

        |-- test_net.c

        `-- test_user.c

按照上面的规则创建好目录和要添加的文件之后,我们需要为相应的目录添加Makefiel和Kconfig文件,而新增目录的父目录中的 Kconfig 和 Makefile 文件也需要修改,以便新增的 Kconfig 和 Makefile 文件能被引用.

在新增的test目录下,我们应该创建如下的Kconfig文件:

 

由于 test driver 对于内核来说是新的功能,所以首先需要创建一个菜单 test driver ;然后显示 "test  support " ,等待用户选择;接下来判断用户是否选择了 test driver ,如果是 (CONFIG_TEST=y),则进一步显示子功能:用户接口与CPU功能支持;由于用户接口功能可以被编译成内核模块,所以这里的询问语句使用了 tristate.为了使这个 Kconfig 文件能起作用,需要修改 drivers/Kconfig 文件,增加以下内容:

 

脚本中的 source 意味着引用新的 Kconfig 文件.在新增的 test 目录下,应该包含如下 Makefile 文件:

 

该脚本根据配置变量的取值构建 obj-* 列表.由于 test 目录中包含一个子目录 cpu ,当CONFIG_TEST_CPU=y 时,需要将 cpu 目录加入列表.test 目录中的 cpu 目录也需包含如下的 Makefile 文件:

  

为了使得整个 test 目录能够被编译命令作用到,  test 目录父目录(即drivers目录)中的 Makefile 文件也需新增如下脚本:

/

增加了Kconfig和Makefile 的test目录结构如下:

   test

   |-- cpu

   |   |-- cpu.c

   |   |-- Kconfig

   |   `-- Makefile

   |-- Kconfig

   |-- Makefile

   |-- test.c

   |-- test_net.c

   `-- test_user.c

这样,就添加好了,然后在终端里输入sudo make menuconfig,如果能按照顺序出现一下选项就证明添加成功了。

Device Drivers-->test Driver --->[*]test support,选择y,出现<>test user-space interface (NEW),重新编译内核使之生效。

 

二、动态添加模块

首先,编写自己的hello.c文件

 

这个最简单的内核模块只包含内核模块加载函数、卸载函数和对Dual BSSD/GPL许可权限的声明以及一些描述信息。

printf是一个变参函数,它的输出到标准输出设备,即显示器。printf可以到它的头文件里查看。printk输出到日志文件中。

下面通过些Makefile完成该模块的编译以及插入工作。

 

编写好之后,在终端输入make就可以编译该模块了。产生的hello.ko文件即为模块(这事2.6内核的模块形式),然后通过insmod命令将其加入内核。通过dmesg命令查看是否插入成功

 

再通过rmmod命令从内核中卸载

 

同样。我们也可以在日志文件中查看该模块的加载情况/etc/log/syslog文件。

 

就这么简单,就可实现内核模块的编写以及动态添加和删除了,不过中间的Makefile编写是一个重点,比如中间宏的定义和路径问题一定要准确,要不然会出现各种错误提示,相信大家多练习几遍,能够达到正确默写出.c文件和Makefile就ok了!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

抱歉!评论已关闭.