1.1 命令lsb_release -a
lsb_release提供特定的LSB (Linux Standard Base)和发布版本相关信息。
ubuntu中运行lsb_release -a的结果如下:
内核版本为3.0.0-32-generic
② Linux 内核驱动接口详解
写作本文档的目的,是为了解释为什么Linux既没有二进制内核接口,也没有稳定 的内核接口。这里所说的内核接口,是指内核里的接口,而不是内核和用户空间 的接口。内核到用户空间的接口,是提供给应用程序使用的系统调用,系统调用 在 历史 上几乎没有过变化,将来也不会有变化。我有一些老应用程序是在0.9版本 或者更早版本的内核上编译的,在使用2.6版本内核的Linux发布上依然用得很好 。用户和应用程序作者可以将这个接口看成是稳定的。
你也许以为自己想要稳定的内核接口,但是你不清楚你要的实际上不是它。你需 要的其实是稳定的驱动程序,而你只有将驱动程序放到公版内核的源代码树里, 才有可能达到这个目的。而且这样做还有很多其它好处,正是因为这些好处使得 Linux能成为强壮,稳定,成熟的操作系统,这也是你最开始选择Linux的原因。
只有那些写驱动程序的“怪人”才会担心内核接口的改变,对广大用户来说,既 看不到内核接口,也不需要去关心它。
既然只谈技术问题,我们就有了下面两个主题:二进制内核接口和稳定的内核源 代码接口。这两个问题是互相关联的,让我们先解决掉二进制接口的问题。
假如我们有一个稳定的内核源代码接口,那么自然而然的,我们就拥有了稳定的 二进制接口,是这样的吗?错。让我们看看关于Linux内核的几点事实:
对于一个特定的内核,满足这些条件并不难,使用同一个C编译器和同样的内核配 置选项来编译驱动程序模块就可以了。这对于给一个特定Linux发布的特定版本提 供驱动程序,是完全可以满足需求的。但是如果你要给不同发布的不同版本都发 布一个驱动程序,就需要在每个发布上用不同的内核设置参数都编译一次内核, 这简直跟噩梦一样。而且还要注意到,每个Linux发布还提供不同的Linux内核, 这些内核都针对不同的硬件类型进行了优化(有很多种不同的处理器,还有不同 的内核设置选项)。所以每发布一次驱动程序,都需要提供很多不同版本的内核 模块。
相信我,如果你真的要采取这种发布方式,一定会慢慢疯掉,我很久以前就有过 深刻的教训…
如果有人不将他的内核驱动程序,放入公版内核的源代码树,而又想让驱动程序 一直保持在最新的内核中可用,那么这个话题将会变得没完没了。 内核开发是持续而且快节奏的,从来都不会慢下来。内核开发人员在当前接口中 找到bug,或者找到更好的实现方式。一旦发现这些,他们就很快会去修改当前的 接口。修改接口意味着,函数名可能会改变,结构体可能被扩充或者删减,函数 的参数也可能发生改变。一旦接口被修改,内核中使用这些接口的地方需要同时 修正,这样才能保证所有的东西继续工作。
举一个例子,内核的USB驱动程序接口在USB子系统的整个生命周期中,至少经历 了三次重写。这些重写解决以下问题:
这和一些封闭源代码的操作系统形成鲜明的对比,在那些操作系统上,不得不额 外的维护旧的USB接口。这导致了一个可能性,新的开发者依然会不小心使用旧的 接口,以不恰当的方式编写代码,进而影响到操作系统的稳定性。 在上面的例子中,所有的开发者都同意这些重要的改动,在这样的情况下修改代 价很低。如果Linux保持一个稳定的内核源代码接口,那么就得创建一个新的接口 ;旧的,有问题的接口必须一直维护,给Linux USB开发者带来额外的工作。既然 所有的Linux USB驱动的作者都是利用自己的时间工作,那么要求他们去做毫无意 义的免费额外工作,是不可能的。 安全问题对Linux来说十分重要。一个安全问题被发现,就会在短时间内得到修 正。在很多情况下,这将导致Linux内核中的一些接口被重写,以从根本上避免安 全问题。一旦接口被重写,所有使用这些接口的驱动程序,必须同时得到修正, 以确定安全问题已经得到修复并且不可能在未来还有同样的安全问题。如果内核 内部接口不允许改变,那么就不可能修复这样的安全问题,也不可能确认这样的 安全问题以后不会发生。 开发者一直在清理内核接口。如果一个接口没有人在使用了,它就会被删除。这 样可以确保内核尽可能的小,而且所有潜在的接口都会得到尽可能完整的测试 (没有人使用的接口是不可能得到良好的测试的)。
如果你写了一个Linux内核驱动,但是它还不在Linux源代码树里,作为一个开发 者,你应该怎么做?为每个发布的每个版本提供一个二进制驱动,那简直是一个 噩梦,要跟上永远处于变化之中的内核接口,也是一件辛苦活。 很简单,让你的驱动进入内核源代码树(要记得我们在谈论的是以GPL许可发行 的驱动,如果你的代码不符合GPL,那么祝你好运,你只能自己解决这个问题了, 你这个吸血鬼把Andrew和Linus对吸血鬼的定义链接到这里>)。当你的代码加入 公版内核源代码树之后,如果一个内核接口改变,你的驱动会直接被修改接口的 那个人修改。保证你的驱动永远都可以编译通过,并且一直工作,你几乎不需要 做什么事情。
把驱动放到内核源代码树里会有很多的好处:
③ Linux 内核模块开发怎么进行单元测试
usb_register_notify,你当前的系统中运行的内核缺少这个函数定义,你这个因为你要专安装的模块属,并没有在这个你运行的这个系统中编译生成,而是拿别的机器,或者别人的模块安装在你当前的机器上,不提倡。
有源码的话,在你本机上重新编译一次,模块是要和你当前运行的kernel版本相匹配的。
④ linux内核测试版本有哪些
Linux的内核版本有两种:1稳固版2开发版。
Linux内核版本号是由3个数字构成:a.b.c
a:目前发布的内核主版本。
b:偶数表示稳固版本;奇数表示开发中版本。
c:错误修补的次数。
其中第一个数字是主版本号,第二个数字是次版本号,第三个数字是修订版本号。
⑤ linux内核是什么,有啥作用 ,
Linux是一种开源电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。
操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。
计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。
Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。
(5)linux内核测试扩展阅读:
Linux内核的特性
1、可移植性
Linux是全球被最广泛移植的操作系统内核。从掌上电脑iPad到巨型电脑IBM S/390,甚至于微软出品的游戏机XBOX都可以看到Linux内核的踪迹。Linux也是IBM超级计算机Blue Gene的操作系统。
2、网络支持
作为一个生产操作系统和开源软件,Linux 是测试新协议及其增强的良好平台。Linux 支持大量网络协议,包括典型的 TCP/IP,以及高速网络的扩展(大于 1 Gigabit Ethernet [GbE] 和 10 GbE)。Linux 也可以支持诸如流控制传输协议(SCTP)之类的协议,它提供了很多比 TCP 更高级的特性(是传输层协议的接替者)。
3、动态内核
Linux 还是一个动态内核,支持动态添加或删除软件组件。被称为动态可加载内核模块,它们可以在引导时根据需要(当前特定设备需要这个模块)或在任何时候由用户插入。
4、系统管理程序
Linux 最新的一个增强是可以用作其他操作系统的操作系统。该系统对内核进行了修改,称为基于内核的虚拟机(KVM)。这个修改为用户空间启用了一个新的接口,它可以允许其他操作系统在启用了 KVM 的内核之上运行。除了运行 Linux 的其他实例之外, Microsoft® Windows® 也可以进行虚拟化。惟一的限制是底层处理器必须支持新的虚拟化指令。
⑥ linux内核加密目录下的回归测试文件tcrypt.c如何使用
INTRODUCTION
The Scatterlist Crypto API takes page vectors (scatterlists) as arguments, and works directly on pages. In some cases (e.g. ECB mode ciphers), this will allow for pages to be encrypted in-place with no ing.
Scatterlist Crypto API使用页向量(scatterlists)作为参数,并且直接按页面工作。在某些情况下(例如ECB模式密码),这将允许页面不需复制而按原地加密。
One of the initial goals of this design was to readily support IPsec, so that processing can be applied to paged skb's without the need for linearization.
这个设计的初始目标之一是快捷地支持IPsec,因此处理过程能够应用于页面式缓冲区(paged skb)而无需线性化。
DETAILS
At the lowest level are algorithms, which register dynamically with the API.
处于最底层的是算法,需动态地注册到API中。
'Transforms' are user-instantiated objects, which maintain state, handle all of the implementation logic (e.g. manipulating page vectors) and provide an abstraction to the underlying algorithms. However, at the user level they are very simple.
“转换”是由用户实例化的对象,它维护状态、处理所有执行逻辑(例如操纵页面向量)并且对底层算法提供一个抽象接口。然而,在用户层它们是非常简单的。
Conceptually, the API layering looks like this:
[transform api] (user interface)
[transform ops] (per-type logic glue e.g. cipher.c, compress.c)
[algorithm api] (for registering algorithms)
从概念上讲,API分层看似这样:
[“转换”API](用户界面)
[“转换”OPS](每种类型的接口逻辑模块,例如cipher.c, compress.c)
[“算法”API](用于注册算法)
The idea is to make the user interface and algorithm registration API very simple, while hiding the core logic from both. Many good ideas from existing APIs such as Cryptoapi and Nettle have been adapted for this.
这样做是为了使得“用户界面”和“算法注册”API更加简单,而隐藏了两者之间的核心逻辑。诸如Cryptoapi和Nettle等许多现存API的良好设计都做了这方面改编。
The API currently supports five main types of transforms: AEAD (Authenticated Encryption with Associated Data), Block Ciphers, Ciphers, Compressors and Hashes.
API目前支持五种主要类型“转换”:AEAD(带关联数据的加密认证)、分组加密、加密、压缩和哈希算法。
Please note that Block Ciphers is somewhat of a misnomer. It is in fact meant to support all ciphers including stream ciphers. The difference between Block Ciphers and Ciphers is that the latter operates on exactly one block while the former can operate on an arbitrary amount of data, subject to block size requirements (i.e., non-stream ciphers can only process multiples of blocks).
请注意,分组加密多少有些用词不准。它实际上意味着支持所有加密,包含流加密。分组加密和加密之间不同之处是后者作用于一个精确的数据块而前者可以作用于任意数量的数据,但要求以数据块大小为单位(例如非流密码只能处理数据块整数倍的数据)
Support for hardware crypto devices via an asynchronous interface is under development.
通过一个异步接口支持硬件加密设备的工作正在开发中。