您可以向此列表添加更多条目,但基本思想是确保程序只能使用有效操作访问有效的内存区域。请记住,某些不安全的语言可能共享其中一些或甚至所有这些特征。
安全语言的示例:Python、Java、C# 的安全子集。
不安全语言定义了程序中可以和不可以做什么,但通常很少或根本没有阻止程序员做错事情的措施。违反这些规则的程序称为格式错误的程序。从语言的角度来看,这种程序是没有意义的,语言甚至不尝试定义它的行为,因为这通常几乎不可能做到。在 C 中,这种程序的行为是未定义的。
不安全语言的示例:汇编语言、C、C++、Pascal。
单内核可以是模块化的,并且可以动态加载模块。另一方面,微内核必须是模块化的,并且必须能够动态加载模块 - 整个想法是在一个单独的地址空间中运行它们。
使用微内核并不是克服单体内核的不安全性的唯一方法。另一种方法是用安全语言编写单体内核。这种方法的一个问题是,安全环境应该由硬件提供(并且将非常有限)或者应该使用不安全语言在软件中实现。这种环境的实现将非常复杂,并且很可能会有许多漏洞(想想在JVM中发现的所有漏洞)。
这种方法的一个例子是实验性操作系统 Singularity 。
请参考此前的StackOverflow问题获取有关您问题的一些信息。简而言之,您似乎想知道...
...读取模块化概念,即可以添加新驱动程序模块而无需重新编译内核,这与我对Linux使用单片内核的假设相矛盾。单片内核在单个地址空间和单个进程中运行...
这两个概念(“模块化内核”和“单个地址空间”)实际上并不矛盾。您可以构建一个新的内核模块,而无需重新编译整个Linux内核。当您加载此新的内核模块时,它实际上将被加载到正在运行的内核本身的同一地址空间中。来自上面链接的内容...
不要将模块化内核的术语与单片内核混淆。某些单片内核可以编译为模块化(例如Linux),重要的是模块被插入并从处理核心功能(内核空间)的相同空间运行。
正如您发现的那样,有几种方法可以对内核进行分类,不同类型并不一定互斥。
考虑到明天我可能会有一次关于这个问题的测验,我应该能够帮助你。然而,我还在学习中,虽然我的帖子可能会有一些技术上的错误,但概念上是正确的。
基本上,正如您所了解的,操作系统有不同类型的内核。
微内核与单体内核相反,它将最少的系统程序和服务放在微内核上。之前被认为是内核一部分(在单体内核版本中)的大多数服务,例如进程调度等,现在处于用户空间,并称为服务器。这些服务器通过微内核使用进程间通信进行通信,这是一种由微内核制定的通信形式。这种模块化方法通过使这些“服务器”动态可加载来构建。因此,在不需要内核重新编译的情况下,可以动态加载特定的“服务器”(在这种内核类型中称为模块)。
Linux内核是一个单体内核,但大多数Linux的变种如Ubuntu、Solaris使用混合内核,即单体内核和模块化内核方法的混合。这是相当普遍的,不同的内核结构有不同的优缺点,需要采用混合结构来取得平衡。