我的问题在于一个段落,段落如下所示,我看不懂加粗的句子。如果不需要调用消息传递,如何完成进程间的通信?
模块
也许当前最好的操作系统设计方法涉及 使用可加载内核模块 (LKM)。在这里,内核有一组核心 组件,并可以在启动时通过模块链接其他服务 或在运行时。这种类型的设计在现代实现中很常见 UNIX,例如 Linux、macOS 和 Solaris,以及 Windows。
设计思路是让内核提供核心服务,而 其他服务是动态实现的,因为内核正在运行。链接 动态服务比直接向内核添加新功能更可取, 每次进行更改时都需要重新编译内核。 因此,例如,我们可能会构建 CPU 调度和内存管理 算法直接进入内核,然后添加对不同文件的支持 系统通过可加载的模块。
整体结果类似于一个分层系统,因为每个内核部分 有定义的、受保护的接口;但它比分层系统更灵活, 因为任何模块都可以调用任何其他模块。该方法也类似于 主模块只有核心功能的微内核方法 以及如何加载和与其他模块通信的知识;但它 效率更高,因为模块不需要调用传入的消息 为了沟通。
Linux 使用可加载内核模块,主要用于支持设备 驱动程序和文件系统。 LKM 可以在系统启动(或引导)时或在运行时(例如 USB 设备被启动时)“插入”到内核中。 插入跑步机。如果 Linux 内核没有必要的驱动程序,可以动态加载。 LKM 可以从 内核在运行时也是如此。对于 Linux,LKM 允许动态和模块化 内核,同时保持单体系统的性能优势。我们 在最后的几个编程练习中介绍在 Linux 中创建 LKM 本章。
答案 0 :(得分:3)
在操作系统中,为什么可加载内核模块 (LKM) 不需要调用消息传递来进行通信?
简单的答案是因为它们被加载到内核空间并动态链接;内核可以使用“基本正常”的函数调用而不是任何更昂贵的(消息传递、远程过程调用等)来与其通信。
注意:通常(特别是对于 *nix 系统)驱动程序会提供一组指向内核的函数指针(例如,一个用于 open()
,一个用于 read()
,一个用于 {{1} } 等)在某种“设备上下文”结构中;允许内核通过调用驱动程序的函数。函数指针(例如“ioctl()
”)。
"该方法也类似于微内核方法,因为主模块只有核心功能和如何加载和与其他模块通信的知识;但效率更高,因为模块不需要调用传入的消息为了交流。”
这一段有可能给你一个错误的印象。仅就可扩展性而言,模块化整体内核类似于微内核(并且两者都比“字面上的整体(一块,如石头)”内核更具可扩展性)。在其他方面(例如安全性),模块化单片内核与微内核极为不同。
专门针对Linux;您可以将其视为近 3000 万行(以每年超过 100 万行的速度增长)潜在安全漏洞,这些漏洞以最高权限级别运行,可以完全访问每条数据,平均发现大约 150 个关键漏洞每年的漏洞(谁知道有多少未被发现的关键漏洞)。
微内核的主要目标之一是在“内核核心”和其他一切之间放置隔离屏障;这样您最终可能会得到几千行不会增长的内核(以及安全性的显着改进)。正是那些需要较低效率通信(例如消息传递)的隔离屏障。
<块引用>“...但它更有效,因为模块不需要调用消息传递来进行通信。”
这可以更准确地表述为“...但它更有效,因为模块不需要通过隔离屏障。”
请注意,消息传递只是通过隔离屏障的一种方式——有共享内存、信号、管道、套接字、远程过程调用等。没有说微内核必须使用消息传递,你可以设计一个完全不使用消息传递的微内核。