Are the contents of the cpio archive extracted into some kind of file system that allows the kernel to find these files later ...or are the memory addresses of these files hard-coded in the kernel's code?
Em um sistema de arquivos. O tipo de sistema de arquivos usado é ramfs , ou tmpfs . Isso é explicado em detalhes, em um dos links que você mencionou.
O ramfs e o tmpfs funcionam de maneira muito semelhante; Não faz muita diferença para essa questão. Qual tipo é usado para o initramfs pode variar, e. entre as versões do kernel (se você precisar saber, leia isto . Fora do initramfs, a regra geral é sempre usar o tmpfs. O tmpfs limita o uso máximo de espaço, que protege contra a falta de memória RAM e o travamento do sistema.
Rootfs is a special instance of ramfs (or tmpfs, if that's enabled), which is always present in 2.6 systems [...]
What is initramfs?
All 2.6 Linux kernels contain a gzipped "cpio" format archive, which is extracted into rootfs when the kernel boots up.
According to: Kernel.org and Wikipedia, the Linux Kernel cpio extractor unpacks this init.ramfs section somewhere in memory [...]
A primeira parte de "ramfs-rootfs-initramfs.txt" explica que os dados do arquivo ramfs estão alocados no cache de páginas , a mesma estrutura usada para armazenar dados em cache de sistemas de arquivos físicos. As páginas de arquivos do ramfs também podem ser trocadas para um dispositivo de troca, da mesma forma que a memória de processo pode.
Eu posso dizer que o cache de páginas está bem próximo do alocador de nível mais baixo, o alocador de páginas do kernel . O alocador de página recebe todas as regiões físicas de RAM disponíveis no momento da inicialização; estes irão excluir as seções iniciais do kernel. As regiões de ram físico disponíveis são passadas para o kernel pelo bootloader / firmware. Você deve ver essas regiões em uma série de linhas no início do registro do kernel , conforme mostrado pelo comando dmesg
.
Posteriormente no log do kernel, você pode ver a mensagem quando o alocador de página recebe o init mem que não é mais necessário, incluindo a seção init.ramfs liberada. (IIRC há algum alocador muito cedo separado antes do alocador de página, mas esse não é o detalhe mais interessante na inicialização do IMO).
2. After extracting, how does the kernel find the memory addresses for the data of a particular file, ...such as the /sbin/init file ?
O cache de páginas está vinculado a partir dos inodes in-memory, também conhecidos como vnodes . Os vnodes são procurados através do cache dentry in-memory . dentry = entrada de diretório no cache.
What is ramfs?
Ramfs is a very simple filesystem that exports Linux's disk caching mechanisms (the page cache and dentry cache) as a dynamically resizable RAM-based filesystem.
Normally all files are cached in memory by Linux. Pages of data read from backing store (usually the block device the filesystem is mounted on) are kept around in case it's needed again, but marked as clean (freeable) in case the Virtual Memory system needs the memory for something else. Similarly, data written to files is marked clean as soon as it has been written to backing store, but kept around for caching purposes until the VM reallocates the memory. A similar mechanism (the dentry cache) greatly speeds up access to directories.
With ramfs, there is no backing store. Files written into ramfs allocate dentries and page cache as usual, but there's nowhere to write them to. This means the pages are never marked clean, so they can't be freed by the VM when it's looking to recycle memory.
Re: Question 1: I don't think the .init.ramfs section can be ungzip'ed to
Pode ser desativado para um buffer temporário em qualquer parte da RAM, por ex. usando o alocador de página. Dito isso, presumo que o processo de extração seja transmitido. Ou seja, ele pode usar uma abordagem semelhante para gzip -d | cpio --extract
. Essa abordagem evita a necessidade de um buffer para armazenar todo o arquivo cpio descompactado, ao copiar os arquivos do arquivo para o tmpfs.