Os programas initramfs podem acessar toda a memória - eles são executados no modo real ou protegido?

1

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.)

    
por user1902689 18.07.2016 / 03:54

2 respostas

0

O sistema de arquivos initramfs é, para todos os efeitos, apenas outro sistema de arquivos que é carregado em / , e programas executados nele são executados a partir do espaço do usuário no kernel em execução. Isso significa que eles têm as mesmas limitações que qualquer outro programa.

Você pode encontrar os dados desejados por meio de /dev/mem , mas provavelmente não deve confiar em implementações específicas de iPXE ; diferentes fornecedores e diferentes processos PXEboot poderiam facilmente mudar as coisas.

Normalmente, as informações que você deve passar como parte do comando de chamada do kernel tornam-se visíveis em /proc/cmdline , onde os programas de espaço de usuário podem analisá-lo e fazer o que for necessário.

    
por 18.07.2016 / 04:54
0

Programas executados a partir do initramfs são programas perfeitamente comuns. Eles são executados como qualquer outro processo do Linux.

A mudança do modo real (o modo herdado de inicialização dos processadores x86 de 32 bits) para o modo protegido (o modo de trabalho normal dos processadores x86 de 32 bits desde a geração 286) acontece muito cedo no processo de inicialização do kernel Linux. Até mesmo os condutores não começaram nesse ponto.

Se o seu periférico armazenar algo em um endereço físico específico, você poderá acessá-lo por meio do dispositivo /dev/mem . Você precisará dizer ao kernel para não usar esse intervalo de endereços físicos, eu não sei como fazer isso (o IIRC tem uma opção de linha de comando do kernel para isso, mas não consigo encontrá-lo agora).

O que você precisa já pode existir como parte de um recurso genérico da ACPI, dando acesso aos dados brutos da ACPI, mas não aos dados analisados como iscsi_bft .

    
por 19.07.2016 / 03:15