内核版本号一样只能说明它们使用的内核源代码是相同的。
但是最后编译出来的结果还取决于编译选项。
各个发行版在编译内核的时候所采用的编译选项如果不一样的话,那即使他们的内核版本号是一样的,编译出来的二进制内核映像肯定是不一样的。
② Linux内核源码分析:Linux内核版本号和源码目录结构
深入探索Linux内核世界:版本号与源码结构剖析
Linux内核以其卓越的稳定性和灵活性著称,版本号的精心设计彰显其功能定位。Linux采用xxx.yyy.zzz的格式,其中yy代表驱动和bug修复,zz则是修订次数的递增。主版本号(xx)与次版本号(yy)共同描绘了核心功能的大致轮廓,而修订版(zz)则确保了系统的稳定性与可靠性。
Linux源码的结构犹如一座精密的城堡,由多个功能强大的模块构成。首先,arch目录下包含针对不同体系结构的代码,比如RISC-V和x86的虚拟地址翻译,是内核与硬件之间的重要桥梁。接着,block与drivers的区别在于,前者封装了通用的块设备操作,如读写,而后者则根据特定硬件设备分布在各自的子目录中,如GPIO设备在drivers/gpio。
为了保证组件来源的可信度和系统安全,certs目录存放认证和签名相关的代码,预先装载了必要的证书。从Linux 2.2版本开始,内核引入动态加载模块机制,fs和net目录下的代码分别支持虚拟文件系统和网络协议,这大大提升了灵活性,但同时也对组件验证提出了更高要求,以防止恶意代码的入侵。
内核的安全性得到了进一步加强,crypto目录包含了各种加密算法,如AES和DES,它们为硬件驱动提供了性能优化。同时,内核还采用了压缩算法,如LZO和LZ4,以减小映像大小,提升启动速度和内存利用效率。
文档是理解内核运作的关键,《strong>Documentation目录详尽地记录了模块的功能和规范。此外,include存储内核头文件,init负责初始化过程,IPC负责进程间通信,kernel核心代码涵盖了进程和中断管理,lib提供了通用库函数,而mm则专注于内存管理。网络功能则在net目录下,支持IPv4和TCP/IPv6等协议。
内核的实用工具和示例代码在scripts和samples目录下,而security则关注安全机制,sound负责音频驱动,tools则存放开发和调试工具,如perf和kconfig。用户内核源码在usr目录,虚拟化支持在virt,而LICENSE目录保证了源码的开放和透明。
最后,Makefile是编译内核的关键,README文件则包含了版本信息、硬件支持、安装配置指南,以及已知问题、限制和BUG修复等重要细节。这份详尽的指南是新用户快速入门Linux内核的绝佳起点。
通过深入研究这些目录,开发者和爱好者可以更全面地理解Linux内核的运作机制,从而更好地开发、维护和优化这个强大的操作系统。[原文链接已移除,以保护版权]
③ Linux内核中Makefile、Kconfig和.config的关系
Linux内核编译过程中的Makefile、Kconfig和.config文件之间存在着紧密的关系,它们共同确保了庞大且分层的源码结构能够有序地编译。以下是这些问题的解答:
首先,Linux内核的庞大文件结构通过模块化管理实现关联。顶层目录下,如arch、include、drivers等子目录代表了功能和属性的集群,形成了树形结构。Kconfig文件在树中建立各层子目录间的连接,而Makefile则根据.config文件的配置选择编译哪些文件。config文件就像总控制台,指示Makefile如何操作。
当使用特定架构的芯片如RK3288时,编译仅限于该架构的代码。这得益于make命令生成的.config文件,它基于特定平台的配置,如firefly-rk3288-linux_defconfig,只编译与所选架构相关的代码。
make menuconfig的作用是生成或修改.config文件,允许用户配置和选择要编译的模块。它提供了多种配置界面,如text-based config、graphical xconfig和oldconfig,以满足不同需求。
执行make zImage命令的目的是生成内核镜像,如zImage或uImage,而firefly-rk3288.img是Firefly平台的特定版本。
最后,Makefile和Kconfig文件的编写遵循了Linux内核的结构。每个目录下的Makefile和Kconfig文件都负责指引编译过程,如hello目录的Makefile根据CONFIG_HELLO配置编译代码,my_dr目录的Kconfig则用于驱动程序菜单的构建。
理解了这些关系,你就掌握了Linux内核编译过程中的核心机制。通过模仿内核源码中的Kconfig和Makefile格式,可以自定义和扩展驱动程序的编译。定期关注嵌入式知识,持续学习和提升。
④ linux内核模块设计时,选用的内核版本需要与现在用的linux系统版本相同吗
看你开发目来标是什么版本,这个版源本要对应。
假设你学习开发 2.4.2 的内核模块,你却用 3.2.2 的内核源代码肯定是不通用的。再假设你未来要给一个运行着 2.6.18 内核的设备开发一个驱动,你却用 3.2.11 内核,开发出来的东西肯定也不行。
不过这个也两说,有的地方其实还是有通用可能的。但有的地方轻微的版本不同就有兼容问题。
这主要看内核接口的变化情况了。有一段时间 ATI 的显卡驱动就比较坑。因为总是跟不上内核的开发进度,老是不能兼容最新的内核……现在内核接口好很多,不需要每个版本都有变化了,但这个也很难说什么时候又变了。所以最好还是你的目标是什么版本,你就用什么版本。一点都不差最好。
这里主要牵扯着测试的问题。你如果熟练了,那么目标是什么你就直接写好了不用测试直接就能用也行。
⑤ 如何通过linux源码树制作linux kernel headers用于内核模块开发
先查看自己OS使用的内核版本
shana@shana:~$ uname -r
2.6.22-14-generic
如果安装系统时,自动安装了源码。在 /usr/src 目录下有对应的使用的版本目录。例如下(我是自己下的)
shana@shana:/usr/src$ ls
linux-headers-2.6.22-14
linux-headers-2.6.22-14-generic
linux-source-2.6.22
linux-source-2.6.22.tar.bz2
shana@shana:/usr/src$
如果没有源码。(一般ubuntu 都没有吧)
查看一下可一下载的源码包(切记不要使用超级用户使用此命令否则……会提示没有此命令)
shana@shana:/usr/src$ apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
xen-source-2.6.16 - Linux kernel source for version 2.6.17 with Ubuntu patches
linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches
shana@shana:/usr/src$
我选择了 linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches 这个~
然后 install 之
shana@shana:/usr/src$ sudo apt-get install linux-source-2.6.22
下载完成后,在/usr/src下,文件名为:linux-source-2.6.22.tar.bz2,是一个压缩包,解压缩既可以得到整个内核的源代码:
注意 已经切换到超级用户模式
root@shana:/usr/src#tar jxvf linux-source-2.6.20.tar.bz2
解压后生成一个新的目录/usr/src/linux-source-2.6.22,所有的源代码都在该目录下。
进入该目录
开始配置内核 选择最快的原版的配置(默认)方式 (我是如此)
root@shana:/usr/src/linux-source-2.6.22# make oldconfig
当然你也可以使用 自己喜欢的配置方式 如 menuconfig , xconfig(必须有GTK环境吧)。反正不用剪裁什么,所以不管那种方式能配置它就行了。
完成后,开始make 吧 这儿比较久 一般有1一个小时吧。(保证空间足够 我编译完成后 使用了1.8G) 我分区时分给/目录30G的空间,我没遇到这问题。倒是我朋友遇到了。
shana@shana:/usr/src/linux-source-2.6.22$ make
shana@shana:/usr/src/linux-source-2.6.22$ make bzImage
当然,第一个make也可以不执行,直接make bzImage。执行结束后,可以看到在当前目录下生成了一个新的文件: vmlinux, 其属性为-rwxr-xr-x。
然后 :
root@shana:/usr/src/linux-source-2.6.22#make moles
root@shana:/usr/src/linux-source-2.6.22#make moles_install
执行结束之后,会在/lib/moles下生成新的目录/lib/moles/2.6.22-14-generic/
。 在随后的编译模块文件时,要用到这个路径下的build目录。至此,内核编译完成。可以重启一下系统。
至此 内核树就建立啦
⑥ linux的编译内核和编译内核模块有什么区别
当然需要。。。
第一点,就是源码树中有相应的头文件和函数的实现回,没有源码树答,你哪调用去呢?(PC上编译的时候内核有导出符号,系统中有头文件,这样就可以引用内核给你的接口了,但是只能编译你PC上版本的内核可加载的模块)。
第二个,内核模块中会记录版本号的部分,需要记录版本号的原因是不同的内核版本之间,那些接口和调用可能会有比较大的差异,因此必须要保证你的代码和某个特定的内核对应,这样编译出来的模块就可以(也是只能)在运行这个内核版本的Linux系统中加载,否则一个很简单的异常就会导致内核崩溃,或者你的代码根本无法编译通过(接口名变了)。
我上面说的是编译模块的情况,当然如果是把模块直接编译到内核当中去的话,那就不用说了,没有内核源码,你无法编译内核。
⑦ 驱动开发必须使用开发板厂家提供的Linux源码吗
驱动开发环境
要进行linux驱动开发我们首先要有linux内核的源码树,并且这个linux内核的源码树要和开发板中的内核源码树要一直;
比如说我们开发板中用的是linux kernel内核版本为2.6.35.7,在我们ubuntu虚拟机上必须要有同样版本的源码树,
我们再编译好驱动的的时候,使用modinfo XXX命令会打印出一个版本号,这个版本号是与使用的源码树版本有关,如果开发板中源码树中版本与
modinfo的版本信息不一致使无法安装驱动的;
我们开发板必须设置好nfs挂载;这些在根文件系统一章有详细的介绍;
⑧ 如何确定Linux内核源代码目录即,KBUILD的路径
方法一:
确定内核源代码目录通常==文件系统中内核驱动模块的build路径
即/lib/moles/2.6.25-14.fc9.i686/build,这个build通常回为链接文件,连接到答
/usr/src/kernels/2.6.25-14.fc9.i686
此方法较准确,通常可以写如下脚本实现:
# KBUILD is the path to the Linux kernel build tree. It is usually the
# same as the kernel source tree, except when the kernel was compiled in
# a separate directory.
KBUILD ?= $(shell readlink -f /lib/moles/$(KVERS)/build)
方法二:
自己下载内核源文件包,自己指定内核的编译目录!
不推荐这种做法,还是按照各大发行版的做法比较好!这样不至于在编译下载的某个设备驱动程序时