千家信息网

linux怎么在2.6内核中编译内核模块

发表于:2024-11-19 作者:千家信息网编辑
千家信息网最后更新 2024年11月19日,这篇文章主要介绍linux怎么在2.6内核中编译内核模块,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!编译内核模块的方法与编译一般应用程序的方法略有不同. 我们会发现在内核源码
千家信息网最后更新 2024年11月19日linux怎么在2.6内核中编译内核模块

这篇文章主要介绍linux怎么在2.6内核中编译内核模块,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

编译内核模块的方法与编译一般应用程序的方法略有不同. 我们会发现在内核源码树的层层目录中, 都存在有Makefile. 即这些Makefile是分层次组织的. 以往的内核版本中, 编译内核模块比较麻烦, 需要我们对这些Makefile做出许多更改. 2.6的内核采用了"kbuild"编译系统, 简化了这些问题. 关于kbuild, 可参考内核源码树中的 /Documentation/kbuild/modules.txt.

编译之前, 肯定是需要源文件的. 这些源文件可以放在内核源码树中, 也可以放在内核源码树之外的任何地方. 根据源文件存在的目录, 存在两种编译方法: 在源码树之中和在源码树之外.

在源码树中编译模块

官方内核模块的源代码都是按模块(驱动)类型组织的, 我们到内核源码树的drivers目录可以看到char, usb, block之类的子目录. 那么我们在内核源码树中添加文件时, ***也遵循这些分类. 分类的规则自己灵活把握.

下面以前面的"hello, world"这个简单的模块为例, 来看看如何在内核源码树中编译内核模块.

1, 不新建子目录

(1) 先在内核源码树中的drivers目录编辑一个c源程序, 名为hello.c.
(2) 修改drivers目录的Makefile文件, 添加: obj-m += hello.o
(3) 重新编译内核(回到源码树根目录, 运行 $ sudo make).

这样, 在drivers目录多出了这样几个文件: hello.mod.c, hello.mod.o, hello.o, hello.ko. hello.ko就是编译出来的模块了.

2, 新建子目录

如果源文件比较多, 可以在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目录中.

若在内核源码树中编译内核模块, 如果不新建子目录, 那么只需修改当前目录的Makefile, 否则应该在当前新建的子目录中新建Makefile指定编译选项, 并修改上层目录的Makefile以让kbuild能够进入新建的子目录.

在源码树之外编译模块

还是以上面的hello, world为例. 在当前目录有个hello.c:

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

obj-m := hello.o

(2)这样调用make命令:

$ sudo make -C /usr/local/src/kernel/linux-2.6.16.20 SUBDIRS=$PWD modules

这里/usr/local/src/kernel/linux-2.6.16.20是内核源码树所在的目录.

-C表示要求make先切换到-C指定的目录. SUBDIRS(也可以用M代替SUBDIRS)使make在编译内核模块之前回到当前目录.

整个编译过程实际上是执行-C指定的内核源码树的Makefile, 并通过SUBDIR指定你要编译的内核源文件的目录.

简化命令行输入

每次调用make的时候输入这些参数比较比较麻烦, 可以这样来改写Makefile以简化:

obj-m += hello.oall: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
这样, 只需在当前目录调用 $ sudo make 就可以完成上面的工作. 调用 $ sudo make clean 将删除所有新生成的文件.

上面的Makefile是这样确定内核源码树所在的目录的: 我们先到/lib/modules目录, 会看到一些以内核版本为名的目录, 目录中有一个build文件, 它是一个符号连接, 指向内核源码树. 那么如何确定进入哪个内核版本的目录呢? 这就可以通过 $ uname -r 来确定, 它指出了当前运行内核的版本.

还可以进一步简化这个Makefile:

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中一次又一次地指定内核代码树的目录.

上面的例子中只讨论了所有的代码在一个文件中的情况. 若代码分布在多个源文件中, 比如file1.c, file2.c, 生成hello.ko. 应该这样写Makefile:

  1. obj-m := hello.o

  2. hello-objs := file1.o file2.o


注意, 虽然我们的目的是生成.ko文件, 但在Makefile中写为.o!

以上是"linux怎么在2.6内核中编译内核模块"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

内核 目录 源码 编译 模块 文件 子目 子目录 源文件 面的 代码 内容 版本 中新 所在 方法 运行 只需 命令 新生 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 为什么加入服务器失败 上海盒我印网络技术有限公司招聘 xp系统服务器安全软件下载 腾讯用了什么数据库系统 快递管理系统 数据库设计 百宝庄网络技术工作室 科技公司还是互联网公司 关系数据库的说法 浪潮移动边缘计算服务器 比工业互联网还好的科技产业 我蚌埠软件开发的企业 网络安全主题活动讲话 我的世界租赁服务器怎么开挂 软件开发能认证抖音蓝V吗 理光打印机连接不上ftp服务器 导入数据库文件出现无法导入问题 常用企业网络安全软件 网络安全带字 网络技术月薪多少 梦幻西游69服务器排行2022 对网络安全的认识即评 dhcp服务器功能 网络安全文明教育宣传片视频 山东实用的外贸软件开发 公司内网访问外网数据库 ftp批量删除服务器文件 北航网络安全研究生就业前景如何 计算机网络技术资料打包下载 大学网络安全宣传周活动 数据库连接方式错误
0