Linux源码-为什么Linux没有二进制的内核接口,也没有稳定的内核接口。
阅读数:205 评论数:0
跳转到新版页面分类
Linux
正文
二进制内核接口
假设我们有一个稳定的内核内部使用的接口,那么就一定会出现一个二进制接口吗?
- 依赖于你使用的C编译器版本,不同的内核数据结构会包含不同的结构形式,也可能以多种形式包含函数(如是否内联)。个性化的函数组织还不是很重要,但是不同的数据结构形式却是很重要的。
- 依赖你所选择的编译选项:(1)不同的结构会包含不同的域(2)有些函数可能根本不会实现(3)内存可能会以不同的形式划分。
- Linux可以运行在不同的处理器架构上,没有办法让一个二进这制驱动跨架构运行。
可以通过指定内核配置编译模块,使用与内核编译的同版本的C编译器来编译模块,来解决这些问题。但是,这很快会成为噩梦,因为Linux的版本和每个版本运行的不同编译项实在太多,而且同一个Linux发布版本还会包含多个不同的内核,对应不同的硬件。
稳定的内核使用接口
Linux的内核开发不断快速迭代的,所以当内核开发者在当前接口中发现bug或发现有更好的方法时,他们会修改当前的接口。这样的话,函数名可能改变、结构可能增加或缩减,函数参数可能重新修改。如果是这样的话,所以使用这些接口的部分也会连带一起修改。
以内核使用的USB接口为例:
- 数据流的传输从同步改为异步,这样就简化了很多驱动的复杂度,也提高了USB驱动的传输速度。
- 修改了USB驱动从USB内核分配数据包的方式,这样所有的驱动就需要向USB内核提供更多的信息,通过这些信息可修复多种死锁。
所有的开发者都认同,一些重要的改变需要进行并进行一些解释,如果Linux要保证稳定的内核使用接口,就会导制USB开发者进行额外的工作,而所有的Linux USB开发者都是在他们自己的时间时进行开发工作,这显然是不合适的。
安全问题对Linux很重要,如果发现安全问题,会在很短的时间内进行修复,所以使用这个接口的驱动也会同时修复。所以不太方便保证内核使用接口的稳定性。
内核接口会定期进行清理,没有人使用的接口会被删除,这样可以保持内核的精简。
那么,如果你开发一个Linux内核驱动,就应该尽量把它加入到主内核树中,这样当内核接口改变时,它们被修改内核接口的开发者一同修改维护。
相关推荐
说明:这种方式只是用于方便阅读代码,因为可以在源代间快速索引跳跃。但是最后可能会有一些warning,可以不必关心,如果是强迫症,可以使用下面这种方式来去掉。
一、官网
https://www.kernel.org/
二、源代码结构
arch目录
包含了所有硬件体系结构特定的内核代码,每种硬件平台占一个相应的目录。在x86体系结构下,包括kernel
一、安装内核源码
如果你安装全部的sources,把内核tarball放在你有权限的目录下,解压缩,不要使用/usr/src/linux这个目录,因为这是linux系统使用的目录。
xz -cd li
PGP帮助确保Linux内核社区的代码完整性,通过PGP签名邮件交换来在开发者间建立可信通信。
Linux内核代码发布成两种主要格式:
分布式源码库(git)
周期性发布的快照(tarballs
使用魔数来保护内核数据结构是一个非常好的主意,这就允许你在运行期检查一个结构是否已经被攻击,或者你已经给一个例行程序通过了一个错误的结构。
使用魔数值的方法是在结构的开始处声明的,如下:
struct
C程序员通常认为volatile表示某个变量可以在当前执行的线程外被改变,因此在内核中用到共享数据结构时,常常会有C程序员使用volatile这类变量,然而在内核中使用volatile几乎总是错误的。
一、概述
Linux内核源码中的头文件非常多,它们定义了各种结构体、宏、函数原型等,以供内核自身以及内核模块使用。
二、主要头文件
include/: 这是最主要的头文件目录,包含了大量的子目录,
一、概述
在 Linux 内核中,__setup 宏和 early_param 宏是用于设置内核启动参数(也称为内核命令行参数)的处理函数的。这些参数在系统启动时由引导加载程序(比如 GRUB)传递给
一、概述
在Linux内核开发中,BUG_ON 宏是一个非常有用的调试工具。它用于在内核代码中检测异常情况,当检测到某个条件为真时,它会导致内核崩溃(crash),这通常意味着出现了严重的错误,需要开
一、概述
在Linux内核源代码中,command_line是一个字符串,它包含了在引导时传递给内核的启动参数。这些参数可以在内核启动时由引导加载器(如GRUB)设置,也可以在编译内核时静态设置。
启