Pet*_* L. 21 filesystems linux-kernel
我的观点是肯定的,确实如此,因为所有对外部世界(非特权处理器模式)有用的暴露首先需要一个在外部世界中运行的进程。这将需要一个文件系统,甚至是一个临时的、内存中的文件系统。
另一位工程师不同意我的观点,但我似乎无法在所有(我不知道的)情况下证明这一点。
这个问题的答案是否取决于“跑步”的定义?
Phi*_*ing 28
这是一个相当奇怪的问题,因为您不像运行程序那样运行内核。内核是运行程序的平台。当然有设置和关闭代码,但不可能单独运行内核。必须始终有一个主要的“init”进程。如果它不存在,内核就会恐慌。如果 init 试图退出内核,它也会panic。
如今,init 进程类似于 systemd。如果没有另外指定,内核将尝试从以/sbin/init
. 在此处查看 init 参数http://man7.org/linux/man-pages/man7/bootparam.7.html紧急情况下,您可以使用init=/bin/bash
. 但是请注意您总是在文件系统上指定要运行的文件。
因此,如果内核启动时没有文件系统,则内核会发生恐慌,因为没有文件系统就无法加载 init。
由于内核的初始化阶段,可能会出现一些混淆。初始 ramdisk 从磁盘上的映像加载,其中包含重要的驱动程序和安装脚本。这些是在加载文件系统之前执行的。但是毫无疑问,最初的 ramdisk 本身就是一个文件系统。/init
调用初始 ramdisk (存储在初始 ramdisk 上)。在许多发行版中,最终调用/sbin/init
. 同样,如果没有文件系统,这是不可能的。
kas*_*erd 17
答案将取决于您的字面意思是没有文件系统,还是打算对问题的解释与实际陈述方式略有不同。对问题的解释方式略有不同的答案是:
您必须重写部分内核代码以创建没有文件系统的工作系统的原因是:
execve
需要来自文件系统的可执行文件的系统调用启动。在程序开始使用后execve
,它可以取消映射启动它的可执行文件,但为了这样做而不会立即崩溃它首先必须创建一个不受文件支持的可执行内存映射,在跳转到它并取消映射可执行文件之前,它必须使用一些有用的代码对其进行初始化。
因此,正在运行的用户模式程序可以处于没有文件支持的内存映射的状态,并且可以关闭所有文件支持的文件描述符。它不能停止拥有根目录和当前工作目录,但它可以避免这些。
因此,尽管在这种状态下您可以实现内核代码以从程序下剥离文件系统并使其继续运行,但听起来似乎没有用。并且在不经过使用文件系统的中间状态的情况下进入最终状态将是更多的工作,没有任何有用的好处。
一些特殊用例的有用设置
避免使用块设备可能很有用。在引导期间,内核会创建一个内存文件系统,并且它还可以cpio
在执行init
. 这样您就可以完全从基于内存的文件系统运行系统,而无需任何块设备来支持它。
这对于您不想保留任何状态并且希望系统在重新启动时从干净的状态启动的系统非常有用。
当然,内核和 cpio 存档必须在内核获得控制权之前以某种方式存在于内存中。他们如何到达那里是引导加载程序的工作。即使最终运行的系统不使用块设备,引导加载程序也可以从块设备加载它们。但是引导加载程序也可以在不使用块设备的情况下获取内核和 cpio 存档,例如通过网络引导。
在Linux中,几乎每个设备都是一个文件,所以你必须有一个文件系统来运行它。
归档时间: |
|
查看次数: |
5081 次 |
最近记录: |