DMA(Direct Memory Access)
- DMA는 CPU를 대신하여 I/O장치와 Memory사이의 데이터전송을 담당하는 장치를 지칭한다.
- DMA에 의한 입출력 방식은 CPU의 개입 없이 직접 주기억 장치와 DMA 사이에서 일련의 입출력 동작이 이루어지는 방식
DMA의 특징
- CPU를 경유하지 않고 직접 기억 장치와 입출력 장치 사이에서 전송이 이루어진다.
- 하나의 입출력 명령어에 의해 하나의 블록 전체가 전송된다.
- 사이클 스틸에 의해 전송이 이루어진다.
- 전송이 끝나면 인터럽트를 발생시켜 CPU에게 알린다.
- 데이터 전송 절차 : 버스 사용 요구 -> 버스 사용 허가 -> 데이터 전송 -> 인터럽트
DMA 필요성
- 고속의 I/O 장치의 경우 인터럽트로 CPU의 실제 프로세스 작업 시간 감소
- 디스크 같은 많은 데이터를 입/출력하는 장치를 위해 CPU가 매번 전송을 제어하는 방법의 비효율성
- 인터럽트 방식이 프로그램에 의한 입출력 방식보다 효율적이지만 입출력을 위한 상태, 제어정보, 데이터 전송을 위해서 능동적인 CPU 개입이 필요 => 오버헤드 발생
DMA I/O와 Direct I/O 환경 비교
입출력 종류
- Programmed I/O : Port를 이용한 데이터 전송, 프로그램에 의해 제어, 주변장치의 상태가 준비상태가 될 때까지 CPU는 대기상태
- Interrupt Driven I/O : 입/출력 인터페이스가 주변장치 상태 값을 요청. 준비상태가 되면 입터럽트 신호가 구동되어 CPU에 I/O를 요청
- DMA : CPU의 직접적인 개입 없이 /O 장치와 Memory 사시의 데이터 전송을 담당하는 제어기를 사용
DMA 구성도
① I/O 인터페이스가 DMA 컨트롤러에게 DMA 서비스를 요청을 전송
② CPU의 HOLD Pin에 Bus Request가 전송되어 버스에 대한 제어를 DMA가 획득 (Active High)
③ CPU의 HLDA(Hold Acknowledge) Pin으로부터 DMAC에 Bus grant가 리턴됨 (Active High)
④ DMAC는 Address bus에 Address Register의 Contents를 적재한다
⑤ DMAC는 I/O Interface에게 데이터를 데이터버스에 적재하도록 DMA Acknowledgement를 전송한다
⑥ Data Byte가 Address Bus에 의해 식별된 메모리 위치로 전송된다.
⑦ I/O Interface는 데이터를 지속적으로 전송유지 한다 (Latch)
⑧ Bus Request 가 Drop되어 HOLD가 Low 상태가 되어 DMAC는 Bus에 대한 사용권을 돌려준다.
⑨ BUS Grant가 Drop되어 HLDA가 Low 상태가 된다
⑩ 이후, Address Register가 1 증가되고, Byte Count는 1 감소된다
⑪ Byte Count가 0이 아니면 Step ①로, 0이면 정지
DMA 동작모드
사이클 스틸링(Cycle Stealing)
- DMA 컨트롤러와 CPU가 동시에 Bus를 사용하고자 할 때 속도가 빠른 CPU가 속도가 느린 DMA에게 BUS 사용 우선순위를 주어 빠른 입출력이 가능하게 하는 방법
- 한번의 DMA동작 중 한 Word 정도의 데이터를 전송시 적용
버스트 모드(Burst Mode)
- 한번의 DMA동작 중 Block 단위의 데이터 전송시 적용
- 여러 개의 메모리 워드로 구성된 블록이 지속적으로 전송
- 고속의 입출력 장치를 대상으로 하며, DMA 인터페이스가 버스 사용권을 획득하면 데이터 전송이 완료 될 때까지 버스사이클 독점
참조 사이트
https://www.quora.com/What-is-the-function-of-DMA-in-a-computer
https://blog.naver.com/roser111/221642875265
http://blog.skby.net/dma-direct-memory-access/
전공 필기 스터디하면서 내가 담당한 용어 정리!
'CS > OS' 카테고리의 다른 글
[Linux] 프로세스 (0) | 2020.05.23 |
---|---|
[Linux] 쉘 스크립트 기초 문법 (1) | 2020.05.23 |
[OS] 윈도우 부팅 디스크 버전 확인하기 (0) | 2020.03.07 |
[OS] 운영체제 기초 (0) | 2020.02.29 |
[Linux] 생활코딩 리눅스 강좌 (5) (0) | 2019.10.08 |