linux – 模块化内核与微内核/单一内核
我是C程序员,是
Linux内核编程的新手.我发现有3种类型的内核单片,微型和模块化内核.而googling我可以找到一些网站说linux有单片内核(在Stack溢出),还有一些说微内核,其余的说混合内核.所以我在阅读模块化概念时完全感到困惑,该模块概念表示可以在不重新编译内核的情况下添加驱动程序的新模块,这与我假设Linux使用单片内核相反.单片内核在单个地址空间中运行,并且作为单个进程,如果是这样,这也有点令人困惑
解决方法
在尝试理解这些差异之前,您必须首先了解其他概念:
1.模块化编程. 模块是程序的功能完整部分.模块通常具有以下属性: >界面和实现的分离. 在构建大型系统时,模块化编程至关重要.每个大内核都是模块化内核,无论它是单片,混合还是微内核. 有时可以动态加载和卸载模块.动态模块是任何可扩展系统的重要组成部分.这些可以是插件,或者,如果我们谈论内核,那些与内核分开开发和分发的驱动程序. 2.安全和不安全的语言. 安全语言非常严格地定义程序中可能发生的事情.最重要的是,他们没有畸形程序(或无意义程序)的概念.每个程序都有效,其执行始终遵循语言规范.程序是否符合程序员的预期,在这种情况下无关紧要. 安全语言的共同特征: >他们使用垃圾收集. 您可以在此列表中添加更多条目,但基本思路是保证程序只能使用有效操作访问有效的内存区域.请记住,一些不安全的语言可以共享一些甚至所有这些特征. 安全语言的例子:Python,Java,C#的安全子集. 不安全的语言定义了程序中可以做什么和不可以做什么,但是通常没有什么可以阻止程序员做错事.违反这些规则的程序称为格式错误的程序.从语言的角度来看,这样的程序是没有意义的,语言甚至不会试图定义它的行为,因为它通常几乎不可能做到.就C来说,这样的程序的行为是不确定的. 不安全语言的示例:Assembler,C,Pascal. 3.硬件不安全,因此必须使用不安全的语言进行编程. 大多数硬件都无法为您提供安全的环境.曾经有一些处理器用于将类型信息附加到每个存储器单元(见tagged architecture),但是现代处理器不会这样做,因为它使硬件复杂化,使其更慢,更昂贵且更不通用. 尽管如此,仍然提供了一些功能,以便能够在不安全的硬件环境中实现安全的环境,例如内存保护,单独的地址空间以及用户模式和内核模式下的执行模式分离(例如,管理员模式). 内核是在裸机上运行的,因此大部分都必须用不安全的语言编写,如C和汇编语言.另一个原因是性能 – 安全环境意味着巨大的开销. 微内核和单片内核 单片内核及其模块在单个共享地址空间中运行.由于所有内容通常都是用不安全的语言编写的,因此内核的任何部分都可能因代码中的错误而访问(并损坏)属于内核另一部分的内存.此环境的不安全特性使得无法检测或从这些故障中恢复,最重要的是预测这些故障后的内核行为. 微内核试图通过将内核的各个部分移动到单独的地址空间来克服这些限制,有效地将它们彼此隔离,但提供了彼此通信的安全方式(通常通过消息传递).这种分离创建了由多个不安全进程组成的安全环境,允许内核从某些子系统的故障中恢复. 同时,单片内核可以在一个单独的地址空间中运行它的一部分(FUSE),而没有任何东西阻止微内核能够支持与内核主要部分共享地址空间的模块. 如果大多数内核在单个地址空间中运行,则它被认为是单片内核.如果它大部分在不同的地址空间中运行,则这种内核被认为是微内核.如果内核介于两者之间并主动使用这两种方法,那么就有一个混合内核. 混合内核 混合内核的概念意味着结合了两者的优点,并且是微软发明的,以促进90年代Windows NT的销售.玩笑!但这几乎是真的. Windows NT的每个重要部分都在共享地址空间中运行,因此它是单片设计的另一个例子. 在描述能够动态加载模块的单片内核时,许多人似乎都使用这个术语.这是因为过去单片内核不支持动态模块加载,每次将模块添加到内核时都必须重新编译.微内核不是关于动态模块加载,而是关于内核的可靠性,关于其从子系统的故障中恢复的能力. 答案:Linux是一个单片内核. 单片内核可以是模块化的,可以动态加载模块.另一方面,微内核必须是模块化的,并且必须能够动态加载模块 – 整个想法是关于在单独的地址空间中运行它们. 微内核并不是克服单片内核不安全性的唯一方法.另一种方法是用安全的语言编写单片内核.这种方法的一个问题是安全环境应该由硬件提供(并且将非常有限),或者应该使用不安全的语言在软件中实现.这种环境的实现将非常复杂,很可能会有很多错误(想想JVM中发现的所有错误). 这样的例子是实验OS Singularity. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |