Antes de discutir o seu exemplo, um pequeno aviso: esta é uma versão simplificada da realidade. Há muitos casos e exceções que eu não explico, mas deve ser suficiente para você entender o que está acontecendo. ..
Dispositivos de bloco
O que está confundindo você é o uso indiscriminado do termo "dispositivo de bloqueio". Dispositivos de bloco são tipicamente HDDs, CDs, SSDs, ... Como o próprio nome diz, você não pode ler / escrever um byte individual para estes dispositivos, você precisa escrevê-los em blocos (tipicamente 512 bytes de tamanho).
Os dispositivos de bloco têm alguns registradores e pequenas regiões de memória mapeadas para o espaço de endereço do processador que pode ser usado para ler o status do dispositivo, enviar comandos etc. No entanto, eles (geralmente) não fornecem um meio de acessar os dados que eles contêm diretamente. Isso normalmente é feito enviando comandos para o dispositivo e aguardando uma interrupção de hardware sinalizando que uma operação de DMA (para leitura ou gravação) foi concluída.
Então você vê, com esses tipos de dispositivos é um pouco difícil (se não impossível) não usar a memória principal (DRAM), uma vez que sua operação envolve operações de DMA e similares. O que o DAX faz nesses casos é remover algumas das despesas envolvidas no acesso aos dados, mas não muito mais que isso.
formato de DIMM * NVMs
No entanto, recentemente algumas memórias não-voláteis (NVMs) no formato DIMM foram introduzidas no mercado. Esses dispositivos mapeiam todo o seu conteúdo para o espaço de endereço do processador e, portanto, podem ser acessados diretamente pelo processador por meio de instruções de armazenamento e carregamento. O kernel nem precisa saber que esses dispositivos estão sendo acessados: por todos os motivos, é como se o processo estivesse acessando uma página de memória com suporte a DRAM regular.
* O formato DIMM foi apenas um exemplo. Existem também outras interfaces existentes, como PCI, que fazem exatamente isso ...
A parte confusa
Aí vem a confusão ... Até recentemente, "dispositivo de armazenamento" era praticamente sinônimo de "dispositivo de bloqueio". O kernel do Linux reconhece essas novas NVMs como dispositivos de armazenamento / dispositivos de bloco e as trata de acordo criando uma entrada em / dev da mesma maneira que faria com um SSD, por exemplo. (Se você não tiver um desses dispositivos com suporte a NVM, poderá simular isso especificando que um determinado intervalo de memória de sua DRAM regular deve ser tratado como NVM. Veja aqui para mais informações sobre como fazer isso.
Se você criar um sistema de arquivos em um dispositivo como esse, ele funcionará como se estivesse usando um disco rígido comum. Ele tentará melhorar o desempenho armazenando o conteúdo em cache na DRAM. O que os sistemas de arquivos habilitados para DAX fazem é evitar a criação de caches, que deveriam acelerar o acesso, mas que, nesses casos, provavelmente piorariam o desempenho.
Even if the kernel or its modules are stored on a file system that supports DAX on a block device that supports DAX, they will still be copied into RAM.
Não consegui encontrar uma razão sólida para esse comportamento, mas acho que isso é feito por razões de segurança e desempenho para garantir que o kernel e os módulos do kernel não sejam executados de forma lenta (mais lenta que a DRAM ) e que seu conteúdo não seria mexido durante a execução do kernel.
Não deve haver, no entanto, qualquer tipo de problema para executar o seu executável diretamente a partir da NVM usando apenas memória com suporte a NVM, desde que permaneça no espaço do usuário.
Dê uma olhada nos projetos Pmem.io da Intel e Atlas da HP. São interfaces de programação criadas especificamente para esse tipo de coisa.
Agora, sobre o seu exemplo:
# mount -t ramfs -o dax,size=8m ext2 /ramdisk
# mount
rootfs on / type rootfs (rw,size=59124k,nr_inodes=14781)
proc on /proc type proc (rw,relatime)
tmpfs on /tmp type tmpfs (rw,relatime)
ext2 on /ramdisk type ramfs (rw,relatime,dax,size=8m)
#
Você não está criando um sistema de arquivos RAM-Backed EXT2. Você está criando um sistema de arquivos com RAM usando ramfs com um nome fictício ext2. Não faria diferença se você montasse assim:
# mount -t ramfs -o dax,size=8m winter_is_coming /ramdisk