AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 455003
Accepted
George Robinson
George Robinson
Asked: 2018-07-13 15:14:38 +0800 CST2018-07-13 15:14:38 +0800 CST 2018-07-13 15:14:38 +0800 CST

Esquema de endereçamento do arquivo cpio compactado com gzip do initramfs durante a inicialização

  • 772

O seguinte arquivo de inicialização (vmlinux64) para o kernel Linux v2.6.21.7 (Distro: Cavium-Octeon for MIPS64):

ELF HEADER:
------------------------------------------
Magic: 0x7f 0x45 0x4c 0x46 ("ELF")
Class: 64-bit
Encoding: Big-Endian
ELF version: 1
OS ABI: System V
ABI Version: 0
Type: ET_EXEC
Machine: MIPS
Version: 1
Entry Point: 0xffffffff804b0000
Program Headers Offset: 0x40
Section Headers Offset: 0x572C70
Flags: 0x808b0001
ELF Header Size: 0x40
Program Header Entry Size: 0x38
Program Header Entries: 1
Section Header Entry Size: 0x40
Section Header Entries: 0x21
.shstrtab Index: 0x20

Tem estes segmentos e seções:

_______________________________________________________________________________________________
PROGRAM HEADERS:
_______________________________________________________________________________________________
Index Type    Flags           SizeInMem  MemVirtAddress      FileOffs  SizeInFile
-----------------------------------------------------------------------------------------------
0    PT_LOAD  Write+Read+Exec 0x5AB200   0xffffffff80100000  0x4000    0x56EAC7                                           

_______________________________________________________________________________________________
SECTION HEADERS:
_______________________________________________________________________________________________
Index Name                   Type        Flags        MemVirtAddress      FileOffs  SizeInFile
-----------------------------------------------------------------------------------------------
0                            K_NULL                                  0x0       0x0       0x0
1   .text                    K_PROGBITS  Alloc+Exec   0xffffffff80100000    0x4000  0x30DFE8
2   __ex_table               K_PROGBITS  Alloc+       0xffffffff8040dff0  0x311FF0    0x5EA0
3   __dbe_table              K_PROGBITS  Alloc+       0xffffffff80413e90  0x317E90       0x0
4   .rodata                  K_PROGBITS  Alloc+       0xffffffff80414000  0x318000   0x48B68
5   .pci_fixup               K_PROGBITS  Alloc+       0xffffffff8045cb68  0x360B68     0xB20
7   __ksymtab                K_PROGBITS  Alloc+       0xffffffff8045d688  0x361688    0x8EA0
8    __ksymtab_gpl           K_PROGBITS  Alloc+       0xffffffff80466528  0x36A528    0x2580
17  __ksymtab_strings        K_PROGBITS  Alloc+       0xffffffff80468aa8  0x36CAA8    0xEBA8
18   __param                 K_PROGBITS  Alloc+       0xffffffff80477650  0x37B650     0x6E0
19  .data                    K_PROGBITS  Alloc+Write  0xffffffff80478000  0x37C000   0x2FD20
20  .data.cacheline_aligned  K_PROGBITS  Alloc+Write  0xffffffff804a8000  0x3AC000    0x7280
21  .init.text               K_PROGBITS  Alloc+Exec   0xffffffff804b0000  0x3B4000   0x31270
22  .init.data               K_PROGBITS  Alloc+Write  0xffffffff804e1270  0x3E5270    0x3708
23  .init.setup              K_PROGBITS  Alloc+Write  0xffffffff804e4980  0x3E8980     0x5B8
24  .initcall.init           K_PROGBITS  Alloc+Write  0xffffffff804e4f38  0x3E8F38     0x6D8
25  .con_initcall.init       K_PROGBITS  Alloc+Write  0xffffffff804e5610  0x3E9610      0x10
27  .exit.text               K_PROGBITS  Alloc+Exec   0xffffffff804e5620  0x3E9620    0x30C0
28  .init.ramfs              K_PROGBITS  Alloc+       0xffffffff804e9000  0x3ED000  0x185AC7
32  .shstrtab                K_STRTAB                                0x0  0x572AC7     0x1A7
6   .rio_route               K_PROGBITS  Write        0xffffffff8045d688  0x572AC7       0x0
9   __ksymtab_unused         K_PROGBITS  Write        0xffffffff80468aa8  0x572AC7       0x0
10  __ksymtab_unused_gpl     K_PROGBITS  Write        0xffffffff80468aa8  0x572AC7       0x0
11  __ksymtab_gpl_future     K_PROGBITS  Write        0xffffffff80468aa8  0x572AC7       0x0
12  __kcrctab                K_PROGBITS  Write        0xffffffff80468aa8  0x572AC7       0x0
13  __kcrctab_gpl            K_PROGBITS  Write        0xffffffff80468aa8  0x572AC7       0x0
14  __kcrctab_unused         K_PROGBITS  Write        0xffffffff80468aa8  0x572AC7       0x0
15  __kcrctab_unused_gpl     K_PROGBITS  Write        0xffffffff80468aa8  0x572AC7       0x0
16  __kcrctab_gpl_future     K_PROGBITS  Write        0xffffffff80468aa8  0x572AC7       0x0
26  .security_initcall.init  K_PROGBITS  Write        0xffffffff804e5620  0x572AC7       0x0
29  .sbss                    K_PROGBITS  Alloc+Write  0xffffffff8066f000  0x572AC7       0x0
30  .bss                     K_NOBITS    Alloc+Write  0xffffffff80670000  0x572AC7   0x3AEF0
31  .cvmx_shared_bss         K_NOBITS    Alloc+Write  0xffffffff806aaef0  0x572AC7     0x310  
_______________________________________________________________________________________________

Observe que este arquivo ELF possui uma seção init.ramfs de 1558kB incorporada contendo arquivos essenciais para o sistema operacional. Esta seção é compactada com gzip e contém um arquivo cpio com 1805 arquivos e diretórios.

De acordo com: Kernel.org e Wikipedia , o extrator cpio do Linux Kernel descompacta esta seção init.ramfs em algum lugar da memória.

Minhas perguntas são:

  1. O que determina o endereço de memória onde o conteúdo do arquivo cpio é extraído?
  2. Após a extração, como o kernel encontra os endereços de memória para os dados de um arquivo específico, como o arquivo /sbin/init ?
  3. O conteúdo do arquivo cpio é extraído em algum tipo de sistema de arquivos que permite que o kernel encontre esses arquivos mais tarde ... ou os endereços de memória desses arquivos são codificados no código do kernel?

Re: Pergunta 1: Eu não acho que a seção .init.ramfs pode ser descompactada para o endereço de memória 0xffffffff804e9000 indicado no cabeçalho da seção do arquivo ELF, porque há apenas 1560kB de espaço disponível antes da próxima seção (". sbss") começa na memória em 0xffffffff8066f000, e o arquivo cpio descompactado ocupa 4035kB.

linux-kernel boot
  • 1 1 respostas
  • 540 Views

1 respostas

  • Voted
  1. Best Answer
    sourcejedi
    2018-07-13T15:55:25+08:002018-07-13T15:55:25+08:00

    O conteúdo do arquivo cpio é extraído em algum tipo de sistema de arquivos que permite que o kernel encontre esses arquivos mais tarde ... ou os endereços de memória desses arquivos são codificados no código do kernel?

    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.

    https://github.com/torvalds/linux/blob/v4.17/Documentation/filesystems/ramfs-rootfs-initramfs.txt

    ramfs e tmpfs funcionam de maneira muito semelhante; não faz muita diferença para esta pergunta. O tipo usado para o initramfs pode variar, por exemplo, entre as versões do kernel (se você precisar saber, leia isto ). Fora do initramfs, a regra geral é sempre usar tmpfs. tmpfs limita o uso máximo de espaço, o que protege contra a falta de RAM e travamento do sistema.


    Rootfs é uma instância especial de ramfs (ou tmpfs, se estiver habilitado), que está sempre presente em sistemas 2.6 [...]

    O que é initramfs?

    Todos os kernels Linux 2.6 contêm um arquivo compactado no formato "cpio", que é extraído para rootfs quando o kernel inicializa.


    De acordo com: Kernel.org e Wikipedia, o extrator cpio do Linux Kernel descompacta esta seção init.ramfs em algum lugar da memória [...]

    A primeira parte de "ramfs-rootfs-initramfs.txt" explica que os dados do arquivo ramfs são alocados no cache da página , a mesma estrutura usada para armazenar em cache os dados do arquivo de sistemas de arquivos físicos. as páginas do arquivo ramfs também podem ser trocadas para um dispositivo de troca, da mesma forma que a memória do processo.

    Posso dizer que o cache da página está bem próximo do alocador de nível mais baixo, o alocador de página do kernel . O alocador de páginas 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ísicas disponíveis são passadas ao kernel pelo bootloader/firmware. Você deve ver essas regiões em uma série de linhas no início do log do kernel , conforme mostrado pelo dmesgcomando.

    Mais tarde no log do kernel, você pode ver a mensagem quando o alocador de páginas recebe init mem que não é mais necessário, incluindo a seção init.ramfs liberada. (IIRC existe algum alocador muito precoce separado antes do alocador de página, mas esse não é o detalhe mais interessante na inicialização do IMO).

    2. Após a extração, como o kernel encontra os endereços de memória para os dados de um arquivo específico, ...como o arquivo /sbin/init ?

    O cache da página é vinculado aos inodes na memória, também conhecidos como vnodes . vnodes são procurados através do cache dentry na memória . dentry = entrada de diretório no cache.

    O que é ramfs?

    Ramfs é um sistema de arquivos muito simples que exporta os mecanismos de cache de disco do Linux (o cache de página e o cache dentry) como um sistema de arquivos baseado em RAM dinamicamente redimensionável.

    Normalmente todos os arquivos são armazenados em cache na memória pelo Linux. As páginas de dados lidas do armazenamento de backup (geralmente o dispositivo de bloco no qual o sistema de arquivos está montado) são mantidas em caso de necessidade novamente, mas marcadas como limpas (livráveis) caso o sistema de memória virtual precise da memória para outra coisa. Da mesma forma, os dados gravados em arquivos são marcados como limpos assim que são gravados no armazenamento de backup, mas mantidos para fins de armazenamento em cache até que a VM realoque a memória. Um mecanismo semelhante (o cache dentry) acelera muito o acesso aos diretórios.

    Com ramfs, não há armazenamento de apoio. Arquivos gravados em ramfs alocam dentries e cache de página como de costume, mas não há nenhum lugar para gravá-los. Isso significa que as páginas nunca são marcadas como limpas, portanto, não podem ser liberadas pela VM quando ela está procurando reciclar memória.


    Re: Pergunta 1: Não acho que a seção .init.ramfs possa ser descompactada para

    Ele pode ser descompactado em um buffer temporário em qualquer lugar na RAM, por exemplo, 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 ao 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.

    • 1

relate perguntas

  • Bloqueando montagem syscall

  • Por que a versão 30 das ferramentas sem fio se tornou uma versão beta permanente?

  • tamanho da pilha do programa

  • Quais dongles WiFi 802.11ac (ou posteriores) funcionam com o kernel Linux 4.13

  • SSD clonado não inicializa e imprime linhas estranhas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve