⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 (ldd) ch01-linux内核简介(转载).txt

📁 献给ARM初学者
💻 TXT
📖 第 1 页 / 共 2 页
字号:
      ”,其中并没有确定某种设备与信息组织的方式有关;由于文件系统将原始数据组织为
      高层信息,它实际上是软件驱动程序。
       
      如果你考虑到Unix系统对底层文件系统的依赖程度,你就可以意识到软件概念对系统操
      作的重要性。文件系统信息解码的能力位于内核分层的最底层,而且是最重要的;甚至
      如果给自己的CD-ROM写一个新的块设备驱动程序时,要是不能对其上数据上运行ls或cp
      ,那个驱动程序就根本没有什么用处。Linux支持文件系统模块,它的软件接口声明了可
      以操作在文件系统节点,目录,文件和超级块上的操作。因此,接口与实际数据传出传

      以操作在文件系统节点,目录,文件和超级块上的操作。因此,接口与实际数据传出传
      入磁盘是完全独立的,这是由块设备驱动程序完成的。对程序员来讲,由于正式内核中
      已经包含大部分重要文件系统类型的代码,编写一个文件系统模块是很不寻常的要求。
       
      安全问题
      最近讨论安全问题很是时髦,而大多数程序员都考虑过系统的安全问题,所以,为防止
      产生误解,一开始我就要谈论这个问题。
       
      安全性有两方面。一个问题是由于用户对程序的误操作或发掘出错误造成的;另一个问
      题是由程序员实现的(错误)功能造成的。显然,程序员比普通用户拥有更多的权利。
      换句话说就是,以root权限运行从朋友那拿来的程序比给他/她一个root外壳要危险得多
      。尽管访问编译器本质上不是安全性漏洞,但当所编译的代码执行时,还是会出现漏洞
      ;要小心处理模块,因为内核模块可以做任何事。模块比超级用户的外壳的威力还要强
      大,它的特权是由CPU确认的。
       
      所有系统中的安全性检查都是内核代码完成的。如果内核有安全性漏洞,系统就有漏洞
      。在内核正式发布版本中,只有root可以加载模块;系统调用create_module检查调用进
      程的用户ID。因此在正式内核中,只有超级用户,或是成功地称为root的闯入者可以利
      用特权代码的威力。
       
      幸亏在编写设备驱动程序或别的模块时,很少需要考虑安全性问题,因为访问块设备的
      进程已经受到更通用的块设备技术的严格控制了。例如,对于块设备来说,安全是由文
      件系统节点的权限和mount命令处理的,因此,在实际的块设备驱动程序中通常没有什么

      件系统节点的权限和mount命令处理的,因此,在实际的块设备驱动程序中通常没有什么
      好检查的。
       
      尽管如此,从收到第三方软件开始,尤其是当软件涉及到内核时,要格外小心;由于每
      个人都可以访问源代码,都可以改写和重新编译这些东西。如果可以信任发布版中已经
      编译好的内核,就要避免编译来源不可靠的内核——如果你不能以root身份运行编译好
      的二进制代码,那最好不要运行编译好的内核。例如,有敌意改动过的内核可能允许任
      何人加载模块,因此通过create_module就可以打开一个不希望出现的后门。
       
      如果确实在模块相关部分考虑到安全性问题,我敦促你看一看securelevel内核变量是怎
      样使用的。当我写这些的时候,Linux社团里正在讨论控制securelevel变量来防止模块
      加载和卸载。很有趣,你可以注意到最近的内核支持在内核编译时可以删除对模块的支
      持,这样就关闭了所有安全性有关的漏洞。
       
      版本编号
      做为开始研究编程前的最后一点,我很愿意就Linux非同寻常的版本编号这个问题加以说
      明,同时说明本书使用哪个版本的内核。
       
      首先要注意,Linux系统使用的每个软件包都有它自己的发行号,它们之间有一些内部的
      依赖关系:你需要在特定版本的软件包上使用特定版本的另一个软件包。Linux发布版的
      开发者通常要处理大量软件包的匹配问题,而使用者从预先打包的发布版本上安装软件
      ,无需考虑版本问题。而另一方面,那些更换和升级系统软件的人都要自己处理版本问
      题。所幸的是,一些最新发布的版本允许单个软件包的升级,它是通过检查软件包间的

      题。所幸的是,一些最新发布的版本允许单个软件包的升级,它是通过检查软件包间的
      依赖性实现的,这可大大简化了使用者为维护系统软件一致所要做的事情。
       
      在本书中,我假定你有2.6.3版或更新的gcc编译器,1.3.57版或更新版本的模块工具,
      以及最新的程序开发用GNU工具(最重要的是gmake)。这些要求不是那么严格,由于几
      乎所有的Linux安装版上都配有GNU工具,这些版本都相对较旧(此外,内核2.0版及其后
      继版本不能用比版本2.6还旧的gcc编译)。注意,最近的内核包含一个称为Documentati
      on/Changes的文件,它罗列了所有编译和运行这个内核版本所需要的软件。1.2的源码中
      没有这个文件。
       
      只要涉及到内核部分,我将集中介绍2.0.X和1.2.13版本,编写适用于这两个版本的代码
       
      偶数内核版本(如1.2.x和2.0.x)是稳定版本,专门用于发布的版本。而相反,奇数版
      本是开发中的一个快照,相当短暂;最新的版本代表最新的发展状况,但可能过几天就
      过时了。
       
      这里没有别的通用原因来解释为什么要运行1.3和2.1核心,除非他们是最新的版本。不
      过有时你会选择运行一个开发用内核,或时由于它有一些在稳定版本中没有的特性,而
      你正好需要这些特性,或者很简单,你就是自己改动了这些版本的一些特性,并且你没
      有时间更新你的补丁。不过还是要注意,实验用内核没有什么保证,如果由于在非当前
      奇数版本的内核中的臭虫导致你丢失数据,没人帮得了你。不过,本书支持直到2.1.43
      版的开发用内核,最后一章介绍如何编写可以区分2.0和2.1.x之间不同之处的驱动程序

      版的开发用内核,最后一章介绍如何编写可以区分2.0和2.1.x之间不同之处的驱动程序
       
      至于1.2.13,尽管相当旧,我仍觉得这是一个很重要的版本。尽管在某些平台上2.0.x比
      1.2.13要快得多,但1.2.13非常小,对想使用旧硬件的人来说是个很好的选择。基于386
      处理器,带小RAM的低价系统非常适合于做嵌入式系统或自动化控制器,用1.2.13比2.0.
      x也许会更快,由于1.2.13是以前1.2.x版本的错误修订版,我不想考虑更早的1.2内核。
       
      无论什么时候,只要1.2.13和2.0或最新的2.1版不兼容,我都会告诉你。
       
      不管怎样,我的主要目标版本是Linux 2.0,本书介绍的一些特征在旧版本中是没有的。
      大多数样例模块在很多内核版本中都是可以编译和运行的;特别是它们都已经在2.0.30
      版本上测试过了,而且大多数也都经过了1.2.13版本的测试。有时,我的例子不支持1.2
      ,但只在本书的第二部分中出现这样的情况,这部分对设计来讲更深入,并且可以不用
      考虑旧版本。
       
      由于Linux已不再只是“PC兼容机的Unix变体”了,它的另一个特点是,它是平台独立的
      操作系统。事实上,除了x86以外,它也成功地用于Axp-Alpha,Sparc处理器,Mips
      Rx000和其他一些平台。本书也尽力达到平台无关性,而且所有的例子代码都在PC,Alph
      a平台和Sparc机器上测试过。由于代码在32位和64位处理机(Alpha)上测试过,它们应
      该可以在其他平台上编译和运行。正如你所预料的,依赖特殊硬件的编码不能适用于所
      有的平台,但在源代码中都有所说明。
       

       
      许可证术语
      Linux是按GNU“General Public License”(GPL)分布许可证的。这是由自由软件基金会
      为GNU计划设计的文档。GPL允许任何人重新发布,出售GPL的产品,只要允许接收者从源
      码重新建立二进制文件的精确副本。另外,任何从GPL产生的软件产品也必须按GPL发布
       
      这种许可的主要目的是通过允许每个人随意修改程序来推广知识;同时,向公众出售软
      件的人仍可以做他们的工作。尽管这是个很简单的目标,还是有一些正在进行的有关GPL
      及其使用的讨论。如果你想读到这些许可证,你可以在你系统的若干个地方找到它们,
      包括目录/usr/src/linux,有一个称为COPING文件。
       
      当涉及到第三方和定制的模块时,它们不属于内核,因此你无需限制它们使用GPL许可证
      。模块通过明确的接口使用内核,它不是内核的一部分,这种关系和用户程序通过系统
      调用使用内核很相似。
       
      简而言之,如果你的代码深入内核内部而你又想发布代码,你必须使用GPL。尽管自己修
      改自己使用不是非要使用GPL,如果你要发布代码,就必须在发布中包含源代码——人们
      获得你的软件包,并且可以随意修改它,重建二进制文件。换句话说,如果你写了一个
      模块,你就可以按照二进制格式发布你的模块。然而,由于模块通常要针对要连接的内
      核重新编译(在第2章“编写和运行模块”中的“版本相关性”一节中,第11章“Kernel
      d和高级模块化”的“模块中的版本控制”一节中都有所介绍),这也不总是可行的。对
      发布模块的二进制代码一般障碍是,模块包含了定义或声明在内核头文件中的代码;不

      发布模块的二进制代码一般障碍是,模块包含了定义或声明在内核头文件中的代码;不
      过这个障碍并不能成立,因为头文件是内核公共接口的一部分,因此它不受许可证制约
       
      至于谈到本书,大部分源码都是可以重新发布的,或者以源码形式,或者以二进制代码
      形式,不论O’Reilly还是我都不对任何基于此的工作有任何许可证权。所有程序都可以
      通过FTP从ftp://ftp.ora.com/pub/examples/linux/drivers/下载,而且同一个目录下
      的LICENCE文件有具体的许可证说明。
       
      当例子中包含了部分内核代码时,GPL就适用了:与源码一同发行的文本很清楚地说明了
      这一点。这仅对某些源文件是有效的,对本书主题而言,这是次要的。
       
      全书概貌
      从此开始,我们进入内核编程的世界。第2章介绍模块化,解释了这门技艺的秘密,并给
      出了运行模块的代码。第3章,字符设备驱动程序,讨论字符设备驱动程序并且给出了基
      于内存的设备驱动程序的完整代码,可以按你的喜好进行读写。使用内存做为设备的硬
      件基础,可以使任何人运行例子代码,而无需增加特殊硬件。
       
      调式技术对程序员来讲是至关重要的,这些内容在第4章“调试技术”中介绍。这样,运
      用我们新的调试技巧,我们将面对字符设备驱动程序高级功能,如阻塞型操作,select
      的使用以及非常常用的ioctl调用;这是都是第5章“字符设备驱动程序的扩展操作”的
      主题。
       

       
      在涉及硬件管理之前,我们先解剖几个内核软件接口:第6章“时间流”,讲解内核是如
      何管理时间的,第7章“获取内存”,讲解内存分配。
       
      接下来我们着重于硬件:第8章“硬件管理”,介绍I/O端口的管理和设备中的内存缓冲
      区管理;之后在第9章“中断处理”介绍中断处理。遗憾的是,由于需要某些硬件支持来
      测试中断的软件接口,不是每个人能运行本章给出的样例代码。我已经尽我全力保持所
      需的硬件支持减少到最小,但你还得亲自动手用烙铁做你的硬件“设备”。这个设备仅
      仅是一个加到并口上的跳线,所以我希望这不是问题。
       
      第10章“合理使用数据类型”又提供一些有关编写内核软件和一致性问题的建议。
       
      在本书的第二部分,我们更加雄心勃勃;因此从第11章开始,我们重新讨论模块化,更
      加深入讨论这个问题。
       
      第12章“加载块设备驱动程序”介绍了如何实现块设备驱动程序,强调和字符设备驱动
      程序的区别。接下来,第13章“Mmap和DMA”讲解了我们原先在内存管理中留下来的问题
      :mmap和DMA。到此为止,关于字符设备和块设备驱动程序的所有问题我们都介绍过了。
       
       
      接下来介绍第三类设备驱动程序:第14章“网络设备驱动程序”讨论一些关于网络接口
      的细节,剖析了样例网络设备驱动程序的代码。
       

       
      有些设备驱动程序的功能直接依赖于外设所在的接口总线,所以第15章“外设总线概貌
      ”介绍了现在经常用到的总线实现的主要功能,着重介绍内核支持的PCI总线。
       
      最后,第16章是内核源代码的一次检阅:对那些想理解全部设计的人来讲,这是一个起
      点,但他们可能会被Linux浩如烟海的代码吓倒。
       
      在Linux2.0版发布后不久,2.1开发树开始引入不兼容性;这是在第一个月中引入的最重
      要的内容。第17章“近期发展”,它几乎可以看作是附录,它收集所有在2.1.43版本发
      布之前不兼容的东西,并且提供了解决这些兼容性问题的方法。在这章的最后,你可以
      编写出一个设备驱动程序,它能够在1.2.13版本上编译,运行,也可以在所有2.0和2.1.
      43版本之间的内核上编译,运行。2.2很有希望会和2.1.43非常相似,你的软件需要为此
      做好准备。
       
       
       
      -----------------------------------------------------------------------------
      * SCSI时Small Computer System Interface(小型计算机系统接口)的缩写;它时工作
      站市场上形成的标准,也广泛应用在PC领域。
       
      --
     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -