内核模块的编译

      编译内核模块的方法与编译一般应用程序的方法略有不同. 我们会发现在内核源码树的层层目录中, 都存在有Makefile. 即这些Makefile是分层次组织的. 以往的内核版本中, 编译模块比较麻烦, 需要我们对这些Makefile做出许多更改. 2.6的内核采用了"kbuild"编译系统, 简化了这些问题. 编译之前, 肯定是需要源文件的. 这些源文件可以放在内核源码树中, 也可以放在内核源码树之外的任何地方. 根据源文件存在的目录, 存在两种编译方法: 在源码树之中和在源码树之外.

 

  源码树中编译

官方内核模块的源代码都是按模块(驱动)类型组织的, 我们到内核源码树的drivers目录可以看到char, usb, block之类的子目录.

 

不新建子目录:

(1)先在内核源码树中的drivers目录编辑一个c源程序, 名为hello.c.

2)修改drivers目录的Makefile文件, 添加: obj-m += hello.o

3)重新编译内核(回到源码树根目录, 运行 $ sudo make).

 

新建子目录:

如果源文件比较多, 可以在drivers目录中新建子目录. 还是以hello, world为例:

(1) 在内核源码树的drivers目录中新建一个hello子目录, 并将hello.c放在hello目录中.
(2)
修改drivers目录的Makefile文件, 添加
: obj-m += hello/
(3)
hello目录中新建一个Makefile文件, 内容为
: obj-m += hello.o
(4)
重新编译内核(回到源码树根目录, 运行 $ sudo make).

这样, 新生成的模块文件就位于hello目录中.

 

 源码树外编译

(1)  首先在模块代码所在的目录新建一个Makefile, 内容为:

obj-m := hello.o

 

(2)这样调用make命令:
$ sudo make -C /usr/local/src/kernel/linux-2.37.6 SUBDIRS=$PWD modules

 

简化命令行输入

obj-m := hello.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean

这样不用在Makefile中一次又一次地指定内核代码树的目录,只需在源码树所在路径中输入sudo make进行编译。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值