Questões sobre internals do kernel Linux [closed]

3

Eu estava lendo "drivers de dispositivos Linux, 3ª edição" e enfrentei alguns itens do kernel que não entendi bem. Espero que os gurus deste fórum me ajudem.

  1. O kernel Linux opera internamente com endereços virtuais ou físicos? O que mais me confunde é que existem vários tipos de endereços (lógicos, virtuais, bus e físicos) e são todos válidos e operáveis pelo kernel.

  2. É correto que as instruções da CPU não consigam endereçar diretamente os dados armazenados em dispositivos periféricos e, portanto, a memória endereçável seja usada, ou seja, buffers, para essas finalidades?

  3. Um processo pode durar ao solicitar um semáforo (que tem um valor 0) e tem que esperar por ele?

  4. Operações atômicas - estas são garantidas por instruções específicas da CPU?

por wag 31.01.2011 / 08:34

2 respostas

3

É melhor não fazer várias perguntas de uma só vez, pois nem todos podem ou vão responder a tudo. Ainda assim, vou dar uma resposta curta para cada um.

Does the Linux kernel internally operate with virtual or physical addresses? What especially confuses me is that there are several types of addresses (logical, virtual, bus and physical) and they are all valid and operable by the kernel.

Sim. Partes diferentes do kernel usam diferentes espaços de endereçamento.

Enquanto o código do kernel está processando uma chamada de sistema, seus mapeamentos de memória incluem todo o espaço de memória do kernel e todo o espaço de memória do processo (a menos que seu kernel tenha alta memória configurada, mas é muito complicado entrar aqui). Esses são todos endereços lógicos (também conhecidos como virtuais): os bits de alta ordem do endereço indicam qual página procurar na MMU , e os bits de baixa ordem são um endereço linear dentro da página. Os mapeamentos de memória dentro da MMU mudam sempre que ocorre uma alternância de tarefas (a alteração da tabela de páginas na MMU é uma grande parte de uma alternância de tarefas).

Alguns drivers de dispositivo precisam manipular os endereços de memória válidos para o dispositivo que estão dirigindo. Geralmente são endereços físicos, embora algumas arquiteturas possuam um IOMMU para que os dispositivos também vejam endereços lógicos próprios. É claro que o subsistema de gerenciamento de memória no kernel precisa manipular muitos tipos diferentes de endereços.

Is that correct that CPU instructions can't directly address data stored in peripheral devices and therefore addressable memory is used, i.e. buffers, for these purposes?

Isso é dependente da arquitetura. A maioria das arquiteturas tem algum tipo de DMA (acesso direto à memória) , que permite que pelo menos alguma comunicação com dispositivos seja feita via RAM. Além disso, em algumas arquiteturas (por exemplo, ARM), todos os acessos a dispositivos são feitos com instruções de carga e armazenamento em endereços apropriados, enquanto outros (por exemplo, i386) têm instruções específicas do processador para essa finalidade. Consulte E / S mapeada pela memória para obter mais detalhes.

Can a process sleep when requesting a semaphore (which has a value 0) and has to wait for it?

Sim, usar um semáforo ( down e amigos) é uma operação de bloqueio. Isso é bem explicado no livro.

Atomic operations -- are these guaranteed by specific CPU instructions?

Sim. Os detalhes são muito específicos da arquitetura. Todas as plataformas destinadas a multitarefa fornecem pelo menos uma primitiva atômica para sincronização, como compare-and-swap , < href="http://en.wikipedia.org/wiki/Test-and-set"> teste-e-definir , load-link + store-condicional , etc. Além de usar a primitiva correta, o código pode precisar tomar o cuidado de usar corretamente memória barreiras em sistemas multiprocessadores. O kernel do Linux fornece uma implementação de suas primitivas de sincronização para cada arquitetura suportada, de modo que você, por sua vez, só precisa usar as primitivas portáveis do kernel.

    
por 31.01.2011 / 21:28
2

Eu posso tentar responder 1,3 e 4.

O kernel do Linux usa diferentes etapas para transformar o código do programa em sinais elétricos.

Endereço lógico : estão incluídos nas instruções no idioma da máquina para endereçar uma operação ou instrução. Dividido em segmento e offset.

Endereço Linear : a unidade de segmentação traduz endereços lógicos em endereços lineares. Este é um número hexadecimal (na arquitetura de 32 bits: 0x00000000-0xffffffff ) endereçando o espaço na memória.

Endereço Físico : Além disso, a Unidade de Paginação converte os endereços lineares em físicos. Esses são sinais elétricos endereçando células de memória através de pinos em microprocessadores.

Endereço de barramento : usado por todos os dispositivos de hardware, exceto a CPU, para endereçar as células de memória (o DMA não exige a CPU, mas ainda endereça). Esses endereços são praticamente idênticos aos físicos, exceto em algumas outras arquiteturas, como SPARC e Alpha, que incluem uma Unidade de Gerenciamento de Memória de E / S separada.

O kernel opera com todos os endereços, e cada um deles é uma etapa entre a solicitação de um usuário e o processamento real dessa solicitação no nível do hardware.

Se um processo se aproximar de um semáforo com valor 0 ou inferior, ele é suspenso até que o valor atinja 1 ou mais. Isso só ocorre para processos que podem dormir. Um manipulador de interrupção não pode dormir e, portanto, é proibido usar semáforos.

As operações atômicas podem ser obtidas usando as instruções da linguagem Assembly, que são definidas por:

  • Zero ou um acesso à memória
  • Prefixado com LOCK_PREFIX

No nível C, o kernel fornece o tipo atomic_t e as macros prefixadas com atomic_
(que adiciona LOCK_PREFIX às instruções de montagem).

    
por 31.01.2011 / 11:13