这是当前64位处理器和当前linux内核的上下文(我使用的是4.6.4)。
我是否有可能编写一个程序,在引导期间可以检查基本内存640 k及以下,而不是内核模块?
我正在尝试使用InfiniBand协议SRP通过InfiniBand网络远程引导卷。这很像iSCSI引导,但似乎没有什么公开的可以这样做。
我正在使用iPXE (网络引导固件)。它能够使用SRP协议连接到远程卷,并成功地加载内核和initramfs。但是,当执行传递给内核时,内核没有连接到远程卷,因此它不知道或看到它。
iPXE在一个名为sBFT的结构中留下了有关连接到谁和如何在基本内存(< 640 k)中连接的信息,这是一种sBFT表类型。
iSCSI做了非常类似的事情,引导加载程序将这些信息保存在一个名为iBFT的ACPI表中,但是有一个内核模块iscsi_ibft,它为iBFT结构提供了一个sysfs接口。我还没有看到与InfiniBand sBFT (例如ib_sbft内核模块)相当的组件。
所以,我想知道我是否想让它工作,如果有人(也许是我)需要编写不存在的ib_sbft内核模块。
或者,是否有一种方法可以让程序能够访问基本内存(< 640 k)而不存在内存冲突,并且在(可能)被其他东西覆盖之前?
我使用的是Arch,它使用mkinitcpio来制作初始的ramdisk并在早期引导过程中运行程序,但是我认为到那时已经太晚了,并且在保护模式下运行。(除非改变了,否则真正的模式以16位运行,而且我没有看到任何关于需要用16位编译的初始ramdisk程序的情况,这使我相信为时已晚。)
发布于 2016-07-18 02:54:50
从各个方面来看,initramfs文件系统只是在/上加载的另一个文件系统,在其中运行的程序是从运行中的内核下的用户空间运行的。这意味着它们与任何其他程序具有相同的限制。
您可以通过/dev/mem找到您想要的数据,但是您可能不应该依赖于特定的iPXE实现;不同的供应商和不同的PXEboot流程可以很容易地改变事情。
通常,您应该作为内核调用命令的一部分传递信息,并在/proc/cmdline中可见,用户空间程序可以解析它并执行任何必要的操作。
发布于 2016-07-19 01:15:17
从initramfs运行的程序是非常普通的程序。它们和其他Linux进程一样运行。
从真正的模式(32位x86处理器的引导时间遗留模式)切换到保护模式(32位x86处理器的正常工作模式,自286个代以来)在Linux内核启动过程中发生得非常早。就连司机也没有在那个时候开始。
如果您的外围设备将某些内容存储在特定的物理地址中,那么您可以通过设备/dev/mem访问它。您需要告诉内核不要使用这个范围的物理地址,我不知道怎么做(IIRC有一个内核命令行选项,但我现在找不到)。
然而,您所需要的可能已经存在于一个通用的ACPI特性中,它允许您访问原始的ACPI数据,而不是像iscsi_bft这样的解析数据。
https://unix.stackexchange.com/questions/296535
复制相似问题