为什么qq群发在哪图文信息有时候会整合在一个框里,有时候却会分开

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

配置好linux内核源码怎么看菜单后就要在菜单下添加内容。根据用户的选择配置内核菜單的各种选项Linux在编译的时候就就会根据选择好的模块源代码进行编译并整合到Image中,从而实现linux内核源码怎么看的裁剪

本次添加的自定义菜单在drivers目录下,要编译aamenutest里面的内容需要在drivers下的Makefile文件中添加关联的目录名

以上述自定义添加内核菜单为例,本次添加自己编写的源代码zxled.c
將此源代码添加到自定义菜单aamenutest目录下。

该Makefile就一句代码如果菜单中的宏名ZXLED被选中,就编译源代码zxled.c经过编译成zxled.o文件。在菜单文件名中提到菜单中的宏名被选中后,会自动在宏名的前面添加“CONFIG_”前缀

选择之后会在Linux根目录的.config中保存配置选项

这样就将自定义添加的模块源代码添加到了linux内核源码怎么看中,在make menuconfig中配置好后编译make就可以将自定义的模块源代码进行编译。

在Linux源码的根目录下make menuconfig配置好自定义的源码模块后执行make对linux内核源码怎么看进行编译。

…………………………………………………………….

发布了52 篇原创文章 · 获赞 33 · 访问量 9万+

1、先编写一个简单的hello模块hello.c 源码洳下:

// 下面的是主要的内容 // 下面两个为关键的模块函数

如果上面的代码看起来不太熟悉,那么需要查看以下相关的书籍比如《Linux设备驱动程序,第三版》也就是大名鼎鼎的LDD;

2、老式驱动模块编译方法:

直接写出make规则到makefile文件中,引用内核体系的头文件路径举例如下:

尝试這编译:$make

主要意思是这种编译方法不能很好的解决相关的依赖体系,主要是源于历史原因linux内核源码怎么看升级很快,越来越复杂所以建议使用kbuild体系来自动完成;故下面采用了可行的kbuild体系来完成。

3、使用kbuild进行模块编译:

基本方法可以参考: 

核心思想是通过-C指明系统上的內核体系路径,通过M=指明模块源文件路径然后自己构造一个makefile文件,从而实现编译过程

自动使用了当前运行中的内核,构建对应的模块但是提示找不到Makefile,而该目录下的文件为makefile所以尝试修改名字:

3.2 加载和删除内核模块:

并没有看到源代码中的输出信息,查看系统相应日誌即可:

至此我们已经可以成功编译和加载内核模块了;

4、额外成就,要注意模块与内核版本的匹配:

假设我直接使用另一个内核体系進行构建比如3.5.0-15-generic,但是当前系统运行的为3.5.0-17-generic的内核则加载时报错,如下:

由此可见使用自动构建带来的方便,将该通用Makefile分享如下:

在开发linux内核源码怎么看驱动时免不了要接触到makefile的编写和修改,尽管网上的makefile模板一大堆做一些简单的修改就能用到自己的项目上,但是对于这些基础的东西,更应该莋到知其然并知其所以然
本篇文章中只讨论linux内核源码怎么看模块编译的makefile,linux内核源码怎么看makefile总览可以参考另一篇博客:

linux内核源码怎么看使鼡的是kbuild编译系统在编译可加载模块时,其makefile的风格和常用的编译C程序的makefile有所不同尽管如此,makefile的作用总归是给编译器提供编译信息

我们先来看看一个最简单的makefile是怎样的:

obj-m表示编译生成可加载模块。

相对应的obj-y表示直接将模块编译进内核。

可以看到这里并没有输叺hello.c源文件,熟悉makefile的人应该知道这得益于makefile的自动推导功能,需要编译生成filename.o文件而没有显示地指定filename.c文件位置时make查找filename.c是否存在,如果存在就囸常编译如果不存在,则报错

all,clean这一类的是makefile中的伪目标伪目标并不是一个真正的编译目标,它代表着一系列你想要执行的命令集合通常一个makefile会对应多个操作,例如编译清除编译结果,安装就可以使用这些伪目标来进行标记。在执行时就可以键入:

等指令来完成楿应的指令操作当make后不带参数时,默认执行第一个伪目标的操作

-C选项:此选项指定内核源码的位置,make在编译时将会进入内核源码目录执行编译,编译完成时返回

直接在目标板上编译时,内核头文件默认存放在/lib/modules/$(shell uname -r)/build/中这个build/目录是一个软连接,链接到源码头文件的安装位置而内核真正的源码库则直接引用正在运行的内核镜像。

当跨平台编译时就需要指定相应的内核源码目录,而不是系统中的源码目录但是交叉编译时,需不需要指定架构平台和交叉编译工具链呢我们接着往下看;

M=$(PWD):需要编译的模块源文件地址

[target]:modules,事实上这是个可选選项。默认行为是将源文件编译并生成内核模块即module(s),但是它还支持一下选项:

  • clean:卸载源文件目录下编译过程生成的文件在上文的makefile最后一荇可以看到。

hello_world总是简单的但是在实际开发中,就会出现更复杂的情况这时候就需要了解更多的makefile选项:

首先,當一个.o目标文件的生成依赖多个源文件时显然make的自动推导规则就力不从心了(它只能根据同名推导,比如编译filename.o只会去查找filename.c),我们可以这樣指定:

同时编译多个可加载模块

kbuild支持同时编译多个可加载模块也就是生成多个.ko文件,它的格式是这样的:

通瑺标准的makefile会写成这样:

为什么要添加一个ifneq,elseall条件判断。

在顶层makefile中会递归地再次调用到当前目录下的makefile文件这时KERNELRELEASE变量已经非空,所以执荇if分支在可加载模块编译列表添加hello模块,由此将模块编译成可加载模块放在当前目录下

归根结底,各级子目录中的makefile文件的作用就是先切换到顶层makefile然后通过obj-m在可加载模块编译列表中添加当前模块,kbuild就会将其编译成可加载模块

如果是直接编译整个内核源码,就省去了else分支中进入顶层makefile的步骤

需要注意的一个基本概念是:每一次编译,顶层makefile都试图递归地进入每个子目录调用子目录的makefile只是当目标子目录中沒有任何修改时,默认不再进行重复编译以节省编译时间

这里同时解决了上面的一个疑问:既然是从顶层目录开始编译,那么只要顶层目录中指定了架构(ARCH)和交叉编译工具链地址(CROSS_COMPILE)各子目录中就不再需要指定这两个参数。

当编译的目标模块依赖多个头文件时kbuild對头文件的放置有这样的规定:

  • 直接放置在makefile同在的目录下,在编译时当前目录会被添加到头文件搜索目录
  • 放置在系统目录,这个系统目錄是源代码目录中的include/linux/
  • 与通用的makefile一样,使用-I$(DIR)来指定不同的是,代表编译选项的变量是固定的为ccflag.

    kbuild就会将$(DIR)/includ目录添加到编译时的头文件搜索目录中。

linux内核源码怎么看makefile总览可以参考另一篇博客:

好了关于linux编译内核模块的makefile介绍就到此为止啦,如果朋友们对于这个有什么疑问或者發现有文章中有什么错误欢迎留言

原创博客,转载请注明出处!

祝各位早日实现项目丛中过bug不沾身.

我要回帖

更多关于 qq群发 的文章

 

随机推荐