Quando ocorre uma leitura ou gravação de disco, para onde vão os dados?
10
Eu entendo que existe um controlador de disco que contém um buffer, mas fiquei imaginando se a CPU lê diretamente desse buffer ou se os dados devem primeiro ir para um local específico na memória e permitir que sejam lidos. pela CPU?
Alguém também sabe como o buffer é chamado? E como o DMA se encaixa nisso tudo?
Para uma leitura de disco, o fluxo de dados é essencialmente:
depois que o conjunto de leitura / gravação estiver no cilindro solicitado, a cabeça r / w solicitada é selecionada.
em cada setor, o ID do setor é lido. Se o número do setor que foi lido corresponder ao número solicitado, os dados do setor serão lidos.
os dados do setor são lidos como um fluxo de bits serial e convertidos em bytes.
os bytes do setor são armazenados em um buffer do setor (geralmente SRAM no controlador); esse buffer do setor é distinto do "cache de disco".
Uma vez lido todo o setor, os dados são validados usando o ECC e, talvez, corrigidos.
uma vez validados, os dados do setor são transferidos do controlador para o PC host. Nota: a existência desse buffer do setor não é bem conhecida e há informações errôneas generalizadas de que a velocidade de transferência na interface do host (por exemplo, ATA) está vinculada ou limitada pela taxa de bits no cabeçote R / W. Isso é completamente falso, já que essas duas transferências de dados são operações independentes e seqüenciais e não simultâneas.
Como o PC recebe os dados do controlador de disco através da interface ATA, o PC pode usar E / S programada (a CPU lê repetidamente o registro de dados da porta ATA e copia o valor para a memória de destino) ou DMA (o controlador DMA é configuração para copiar N bytes do registro de dados da porta ATA para um buffer de memória sem intervenção adicional da CPU).
o "buffer" de memória do PC que recebe os dados pode ser o buffer do aplicativo (ao usar a chamada de sistema de E / S em bloco ) ou pode ser um buffer interno do sistema sob o controle do sistema de arquivos ou até mesmo memória de programa ou de dados se os dados vierem da troca área (ou arquivo de paginação).
Uma gravação no disco é semelhante, exceto que os dados são transferidos do PC para o controlador de disco, o ECC é calculado, o setor solicitado está localizado e os dados são gravados do buffer do setor no prato.
Para crédito extra:
Leia as transferências de " dispersão-coleta ", que usam o encadeamento DMA e uma lista de endereços-memória e comprimentos de buffer. Em vez de um buffer de memória grande e contíguo, uma transferência de "coleta dispersa" permite que o uso de buffers de memória não contíguos seja agregado para a solicitação de E / S do disco.
Talvez possa ser um pouco menos específico sobre as 'cabeças r / w', já que os acionamentos não mecânicos estão sendo usados com muito mais frequência atualmente, mas é uma boa resposta.
Shinrai 26/10/11
@Shinrai - Eu só tenho experiência em programação em primeira mão com unidades de disco de braço móvel (e usei unidades de cabeça fixa). Eu escolho não especular ou repetir informações de segunda ou terceira mão sobre como os SSDs operam.
sawdust
+1 para essa ótima resposta, bem documentada e escrita. Muito profissional.
climenole
2
Ele entra em uma área de memória específica em que o kernel alocou o driver do disco. Eu não acho que é nomeado especificamente. Essa área de memória geralmente é configurada como um buffer de anel . Dependendo do sistema operacional, essa memória pode ser copiada uma segunda vez no espaço do usuário para o aplicativo usar.
DMA é "acesso direto à memória", o que significa que o controlador da unidade de disco pode gravar diretamente na RAM sem que a CPU pergunte repetidamente se há mais dados disponíveis (conhecido como pesquisa - a maneira como as coisas costumavam ser feitas). Em vez disso, quando todo o buffer foi transferido, o controlador interrompe a CPU para informar que os dados estão agora disponíveis.
Se você estiver curioso sobre um nível ainda mais baixo, o driver faz chamadas ioctl .
Os buffers de anel são normalmente empregados por dispositivos de rede (por exemplo, controlador Ethernet) porque os dados podem chegar não solicitados (inesperadamente sem uma solicitação de leitura pendente). Os dados de uma unidade / controlador de disco sempre estão em resposta a uma solicitação feita pelo host. Os dados são solicitados, portanto, não há necessidade de um "buffer de anel" em um driver de disco.
Serragem
OK Eu só trabalhei com DACs no nível do driver e eles usam buffers de anel também, então eu assumi.
Ele entra em uma área de memória específica em que o kernel alocou o driver do disco. Eu não acho que é nomeado especificamente. Essa área de memória geralmente é configurada como um buffer de anel . Dependendo do sistema operacional, essa memória pode ser copiada uma segunda vez no espaço do usuário para o aplicativo usar.
DMA é "acesso direto à memória", o que significa que o controlador da unidade de disco pode gravar diretamente na RAM sem que a CPU pergunte repetidamente se há mais dados disponíveis (conhecido como pesquisa - a maneira como as coisas costumavam ser feitas). Em vez disso, quando todo o buffer foi transferido, o controlador interrompe a CPU para informar que os dados estão agora disponíveis.
Se você estiver curioso sobre um nível ainda mais baixo, o driver faz chamadas ioctl .
fonte