Isso está no contexto dos atuais processadores de 64 bits e dos kernels atuais do Linux (estou usando o 4.6.4.)
É possível escrever um programa que durante a inicialização possa examinar a memória base, 640k ou menos, sem que seja um módulo do kernel?
Estou tentando inicializar um volume remoto em uma rede InfiniBand usando o protocolo SRP InfiniBand. É muito parecido com o iSCSI de inicialização, mas parece que não há nada público para realmente fazer isso.
Estou usando o iPXE (firmware de inicialização de rede). Ele pode se conectar usando o protocolo SRP ao volume remoto e carregar com êxito o kernel e o initramfs. Mas, quando a execução é passada para o kernel, o kernel não está conectado ao volume remoto, então ele não sabe nada sobre isso ou vê-lo.
O iPXE deixa as informações sobre quem se conectar e como na memória básica (< 640k) em uma estrutura chamada sBFT, que é um tipo de tabela ACPI.
O iSCSI faz algo muito semelhante, com o carregador de boot deixando essa informação em uma tabela ACPI, chamada de iBFT, mas há um módulo do kernel iscsi_ibft que fornece uma interface sysfs para a estrutura iBFT. Eu não vejo um equivalente ainda para um sBFT InfiniBand, como um módulo de kernel ib_sbft.
Então, eu estou querendo saber se eu quero que isso funcione, se alguém (talvez eu) precise escrever o módulo do kernel ib_sbft inexistente.
Ou existe uma maneira de eu ter um programa capaz de acessar a memória de base (< 640k) sem uma violação de memória e antes de (supostamente) ser substituído por outra coisa?
Estou usando o Arch Linux, que usa o mkinitcpio para criar o ramdisk inicial e executar programas durante o processo de inicialização, mas estou pensando que já é tarde demais e está sendo executado no modo protegido. (A menos que seja alterado, o modo real é executado em 16 bits e não vejo nada sobre os programas ramdisk iniciais que precisam ser compilados em 16 bits, levando-me a acreditar que é tarde demais.)