SG_IO/SG_ATA_16의 최대 전송 크기

SG_IO/SG_ATA_16의 최대 전송 크기

READ DMA EXT최대 섹터 수를 위반하고(요컨대) 가능한 모든 OS 캐싱, 버퍼링, 재정렬 등을 우회하려면 직접 원시 ATA 요청을 하드 드라이브(0x25, )에 전달해야 합니다.

HDIO_DRIVE_TASKFILE.IOCTL은 더 이상 사용할 수 없습니다 libata.

SG_IOATA 패스스루(()를 사용하는 IOCTL을 통해 목표를 달성했습니다 SG_ATA_16. 한 가지 문제를 제외하고는 완벽하게 작동합니다. 한 명령으로 최대 8192개의 섹터를 읽을 수 있습니다. I필요총 32767개의 섹터를 읽었습니다.

  • 최대 하드웨어 섹터 수(KB)32767이므로 드라이브는지원하다환승이 너무 많아서
  • 최대 섹터 수(KB)낮지만 32767 섹터까지 올려도 소용이 없습니다
  • 스케줄러로 설정되어 있습니다누프, 잔돈을 유지해주세요.
  • 버퍼 수집을 시도했지만( 연속 버퍼 슬라이스로 iovec_count>0올바르게 설정됨 iovecs) 변경 사항이 없습니다.

환경: 표준 커널이 포함된 Ubuntu 16.04/16.10/17.04/17.10, Intel 칩셋의 표준 AHCI 인터페이스에 연결된 SATA 드라이브.

내가 무엇을 하든 8193섹터부터 IOCTL은 통과한다"잘못된 인수"오류( EINVAL정확히 말하면 errno 포함)입니다. 다른 컴퓨터에서는 실행마다 약간씩 다르며(재부팅 필요 없음) 일반적으로 최대 1344 섹터로 고정됩니다.

어디서 볼 수 있나요? 데이터 전송 한도의 원인은 무엇입니까?

관련 정보