在单核计算环境中,内核有时可以针对特定用户应用的需要进行裁剪。
这个过程是如何工作的?它是手动的还是可以自动的?
发布于 2020-03-05 06:07:03
没有“修剪”内核。需要明确的是,所有的unikernel实现都不使用linux --他们已经编写了自己的内核(不管他们是否愿意承认这一点)。
今天已经有超过10种不同的unikernel实现,其中一些非常专注于提供绝对最少的工作。其他的,比如我工作的nanos属于'posix‘类别,这意味着如果它在linux上运行,它可能会在这里运行。
每当您看到人们谈论“只包含您需要的东西”并选择要使用的某些库时--大多数这些系统只不过是一个问候世界--这足够简单,只需大约20行汇编就可以完成。当您开始尝试运行现实世界中的应用程序时,尤其是您每天都在使用的应用程序(您是否编写了自己的数据库?您是否编写了自己的own服务器?)将你开始运行的性能等东西与实际的操作系统组件进行比较,这些组件不是你可以随意选择的。
话虽如此,支持linux的syscall集只是战斗的一部分。有很多代码进入通用操作系统,如linux (超过2000万loc,这是一个‘小’内核),或者windows或macos,它们不容易被终端用户识别。最简单的做法是根据您希望在哪个系统管理程序上运行网络驱动程序来选择使用哪个网络驱动程序(xen/kvm/hyper-v)。
更难,更不清楚的事情是在apic或x2apic之间做出选择?你的页表有几级?您是否支持smp?如果是这样的话,是怎么做的?
你不能就这样“修剪”掉这类东西。它需要有意识地添加,即使你有一个你正在“单核化”的linux,你也不能修剪它,因为它涉及到太多的代码。作为思考练习,尝试删除对多进程的支持(没有unikernel支持)。现在,您接触到了多个调度器、共享内存、消息传递、用户权限(是否有用户?)等(此列表将永远存在)。
你的问题实际上是一个非常常见的问题,它突出了对这些东西在现实生活中是如何工作的误解。
所以回答你的问题--据我所知,没有人试图自动‘修剪’内核,甚至是现有的项目,你可以通过配置文件或其他东西来选择哪种类型的功能,由于上述原因,我并不希望看到太大的进展。
https://stackoverflow.com/questions/57179052
复制相似问题