Eu preciso passar uma solicitação ATA direta e crua para um disco rígido (0x25, READ DMA EXT
), para desobedecer a contagem máxima do setor (longa história) e para ignorar todos os possíveis caches, buffers, reordenamentos do sistema operacional e outros.
HDIO_DRIVE_TASKFILE
IOCTL não está mais disponível devido a libata
.
Eu atingi a meta com um SG_IO
IOCTL com passagem ATA ( SG_ATA_16
). Funciona perfeitamente, exceto um problema: posso ler no máximo 8192 setores em um comando. Eu preciso de ler um total de 32767 setores.
iovec_count>0
, defina corretamente iovecs
para fatias de buffer consecutivas), sem alteração. Ambiente: Ubuntu 16.04 / 16.10 / 17.04 / 17.10 com kernels padrão, unidade SATA conectada à interface AHCI padrão no chipset Intel.
Não importa o que eu faça, começando com 8193 setores, o IOCTL fica com o erro " Invalid argument " (precisamente, com EINVAL
errno). Em outra máquina, ela varia ligeiramente de rodar para rodar (sem reinicialização), geralmente ocupando no máximo 1344 setores.
Onde procurar? O que pode causar um limite de transferência de dados?