sha*_*ker 7 linux operating-system kernel microkernel
我是C程序员,是Linux内核编程的新手.我发现有三种类型的内核单片,微型和模块化内核.而googling我可以找到一些网站称linux有单片内核(在Stack溢出),还有一些说微内核,其余的说混合内核.所以我在阅读模块化概念时完全感到困惑,该模块概念表示可以在不重新编译内核的情况下添加驱动程序的新模块,这与我假设Linux使用单片内核相反.单片内核在单个地址空间中运行,并且作为单个进程, 如果是这样,这也有点令人困惑
在尝试理解这些差异之前,您必须首先了解其他概念:
模块是程序的功能完整部分.模块通常具有以下属性:
在构建大型系统时,模块化编程至关重要.每个大内核都是模块化内核,无论它是单片,混合还是微内核.
有时可以动态加载和卸载模块.动态模块是任何可扩展系统的重要组成部分.这些可以是插件,或者,如果我们谈论内核,那些与内核分开开发和分发的驱动程序.
安全语言非常严格地定义程序中可能发生的事情.最重要的是,他们没有畸形程序(或无意义程序)的概念.每个程序都有效,其执行始终遵循语言规范.程序是否符合程序员的预期,在这种情况下无关紧要.
安全语言的共同特征:
您可以向此列表添加更多条目,但基本思想是保证程序只能使用有效操作访问有效的内存区域.请记住,一些不安全的语言可以共享一些甚至所有这些特征.
安全语言的示例:Python,Java,C#的安全子集.
不安全的语言定义了程序中可以做什么和不可以做什么,但是通常没有什么可以阻止程序员做错事.违反这些规则的程序称为格式错误的程序.从语言的角度来看,这样的程序是没有意义的,语言甚至没有尝试定义它的行为,因为它通常几乎不可能做到.就C来说,这样的程序的行为是不确定的.
不安全语言的示例:Assembler,C,C++,Pascal.
大多数硬件都无法为您提供安全的环境.有些处理器用于将类型信息附加到每个存储器单元(参见标记架构),但是现代处理器不会这样做,因为它使硬件复杂化,使其更慢,更昂贵且更不通用.
尽管如此,仍然提供了一些功能,以便能够在不安全的硬件环境中实现安全的环境,例如内存保护,单独的地址空间以及用户模式和内核模式(也称为管理员模式)上的执行模式分离.
内核是在裸机上运行的,因此大部分都必须用不安全的语言(如C和汇编语言)编写.另一个原因是性能 - 安全环境意味着巨大的开销.
单片内核及其模块在单个共享地址空间中运行.由于所有内容通常都是用不安全的语言编写的,因此内核的任何部分都可能会因代码中的错误而访问(并损坏)属于内核另一部分的内存.此环境的不安全特性使得无法检测到这些故障或从这些故障中恢复,最重要的是预测这些故障后的内核行为.
微内核尝试通过将内核的各个部分移动到单独的地址空间来克服这些限制,有效地将它们彼此隔离,但提供了彼此通信的安全方式(通常通过消息传递).这种分离创建了由多个不安全进程组成的安全环境,允许内核从其某些子系统的故障中恢复.
同时,单片内核可以在一个单独的地址空间(FUSE)中运行它的一部分,而没有任何东西阻止微内核能够支持与内核主要部分共享地址空间的模块.
如果大多数内核在单个地址空间中运行,则它被认为是单片内核.如果它大部分在不同的地址空间中运行,则这种内核被认为是微内核.如果内核介于两者之间并主动使用这两种方法,那么就有一个混合内核.
混合内核的概念意味着结合了两者的优点,并且是微软发明的,以促进Windows NT在90年代的销售.玩笑!但这几乎是真的.Windows NT的每个重要部分都在共享地址空间中运行,因此它是单片设计的另一个例子.
在描述能够动态加载模块的单片内核时,许多人似乎都使用这个术语.这是因为过去单片内核不支持动态模块加载,每次将模块添加到内核时都必须重新编译.微内核不是关于动态模块加载,而是关于内核的可靠性,关于其从子系统的故障中恢复的能力.
单片内核可以是模块化的,可以动态加载模块.微内核,而另一方面,已经是模块化的,并具有能够动态地加载模块-整个想法是在一个单独的地址空间中运行它们.
微内核并不是克服单片内核不安全特性的唯一方法.另一种方法是用安全的语言编写单片内核.这种方法的一个问题是安全环境应该由硬件提供(并且将非常有限),或者应该使用不安全的语言在软件中实现.这种环境的实现将非常复杂,很可能会有很多错误(想想JVM中发现的所有错误).
这样的例子是实验OS 奇点.
小智 0
好吧,考虑到我明天可能会有一个小测验,我应该能够帮助你。然而,我仍在学习,虽然我的帖子可能有一些技术错误,但它在概念上应该是合理的
基本上,正如您所理解的,操作系统有不同类型的内核。
单片内核将所有系统功能和服务集中在一个巨型程序中,占用单个地址空间。另一方面,微内核在微内核上具有最少的系统程序和服务。大多数以前被认为是内核一部分的服务(在单片内核版本期间),例如进程调度程序等,现在都位于用户空间中,并被称为服务器。这些服务器通过微内核使用进程间通信(微内核规定的一种通信形式)相互通信。模块化方法在此基础上构建,使这些“服务器”可动态加载。因此,可以动态加载特定的“服务器”(在这种类型的内核中,称为模块),而无需内核重新编译自身。
Linux 内核是一个整体内核,但大多数 Linux 版本(例如 Ubuntu、Solaris)都使用混合内核,即整体内核和模块化内核方法的混合。这是很常见的,不同的内核结构有不同的优缺点,需要混合结构来取得平衡