디스크 읽기 또는 디스크 쓰기가 발생하면 데이터는 어디로 갑니까?


10

버퍼를 포함하는 디스크 컨트롤러와 같은 것이 있지만 CPU 가이 버퍼에서 직접 읽거나 데이터가 먼저 메모리의 특정 위치로 이동 한 다음 스스로 읽을 수 있는지 궁금합니다. CPU에 의해?

누구도 버퍼가 무엇인지 알고 있습니까? 그리고 DMA는이 모든 것에 어떻게 적합합니까?

답변:


20

디스크 읽기의 경우 데이터 흐름은 본질적으로 다음과 같습니다.

  • 읽기 / 쓰기 어셈블리가 요청 된 실린더에 놓인 후 요청 된 r / w 헤드가 선택됩니다.
  • 각 섹터에서 섹터 ID를 읽습니다. 읽은 섹터 번호가 요청 된 섹터 번호와 일치하면 섹터 데이터를 읽습니다.
  • 섹터 데이터는 직렬 비트 스트림으로 읽히고 바이트로 변환됩니다.
  • 섹터의 바이트는 섹터 버퍼 (일반적으로 컨트롤러의 SRAM)에 저장됩니다 . 이 섹터 버퍼 는 "디스크 캐시"와 다릅니다.
  • 전체 섹터가 읽 히면 ECC를 사용하여 데이터의 유효성을 검사하고 수정 될 수 있습니다.
  • 일단 검증되면, 섹터 데이터는 컨트롤러에서 호스트 PC로 전송됩니다. 참고 :이 섹터 버퍼의 존재는 잘 알려져 있지 않으며 호스트 (egATA) 인터페이스의 전송 속도가 R / W 헤드의 비트 전송률에 의해 제한되거나 제한된다는 잘못된 정보가 널리 퍼져 있습니다. 이 두 데이터 전송은 독립적이고 순차적 인 작업이며 동시 적이 지 않기 때문에 이는 완전히 잘못된 것입니다.
  • PC가 ATA 인터페이스를 통해 디스크 컨트롤러로부터 데이터를 수신함에 따라 PC는 프로그래밍 된 I / O (CPU가 ATA 포트의 데이터 레지스터를 반복적으로 읽고 값을 대상 메모리에 복사 함) 또는 DMA (DMA 컨트롤러는 ATA 포트의 데이터 레지스터에서 추가 CPU 개입없이 메모리 버퍼로 N 바이트를 복사하도록 설정).
  • 데이터를 수신하는 PC의 메모리 "버퍼"는 응용 프로그램의 버퍼 ( 블록 I / O 시스템 호출 사용시 )이거나 파일 시스템 제어 하의 내부 시스템 버퍼이거나 데이터가 스왑에서 온 경우 프로그램 또는 데이터 메모리 일 수 있습니다. 영역 (또는 페이지 파일).

디스크에 쓰기는 데이터가 PC에서 디스크 컨트롤러로 전송되고 ECC가 계산되고 요청 된 섹터가 찾은 다음 섹터 버퍼에서 플래터로 데이터가 기록된다는 점을 제외하면 비슷합니다.

추가 크레딧 :

DMA 체인 과 메모리 주소 및 버퍼 길이의 분산 수집 목록 을 사용하는 " 산란 수집 "전송 에 대해 읽어보십시오 . 하나의 큰 연속 메모리 버퍼 대신 "스 캐터 수집"전송을 통해 비 연속 메모리 버퍼 사용을 디스크 I / O 요청에 대해 집계 할 수 있습니다.


1
요즘에는 비 기계식 드라이브가 훨씬 더 자주 사용되고 있기 때문에 'r / w 헤드'에 대해서는 다소 덜 구체적 일 수 있지만 좋은 대답입니다.
Shinrai

@ Shinrai-이동 암 디스크 드라이브에 대한 직접 프로그래밍 경험이 있으며 고정 헤드 드라이브를 사용했습니다. SSD의 작동 방식에 대한 2 차 또는 3 차 정보를 추측하거나 반복하지 않기로 선택합니다.
톱밥

문서화되고 쓰여진이 위대한 답변에 +1. 매우 전문적입니다.
climenole

2

커널이 디스크 드라이버를 할당 한 특정 메모리 영역으로 들어갑니다. 나는 그것이 특별히 지명되었다고 생각하지 않습니다. 이 메모리 영역은 일반적으로 링 버퍼 로 구성됩니다 . OS에 따라이 메모리는 응용 프로그램에서 사용할 수 있도록 사용자 공간에 두 번째로 복사 될 수 있습니다.

DMA는 (- 방식 일 폴링으로 알려진 디스크 드라이브의 컨트롤러가 직접 더 많은 데이터를 사용할 수있는 경우를 물어 반복 CPU를하지 않고 RAM에 쓸 수 있다는 것을 의미한다 "직접 메모리 접근"입니다 사용 할 수있는). 대신, 전체 버퍼가 전송되면 컨트롤러가 CPU를 인터럽트하여 데이터를 사용할 수 있음을 알립니다.

더 낮은 수준에 대해 궁금한 경우 드라이버가 ioctl을 호출합니다.


1
링 버퍼는 일반적으로 네트워크 장치 (예 : 이더넷 컨트롤러)에 의해 사용됩니다. 데이터가 요청하지 않은 상태로 도착할 수 있기 때문입니다 (예기치 않은 읽기 요청이 없을 경우). 디스크 드라이브 / 컨트롤러의 데이터는 항상 호스트의 요청에 응답합니다. 데이터를 요청하므로 디스크 드라이버에 "링 버퍼"가 필요하지 않습니다.
톱밥

저는 드라이버 수준에서 DAC 와만 작업했으며 링 버퍼도 사용하므로 가정했습니다.
Aaron D. Marasco
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.