Software Lab

3. DMA Reading 본문

컴퓨터 구조/DMA(Direct Memory Access)

3. DMA Reading

아임코더 2022. 9. 29. 14:56

Cycle stealig 방식의 DMA Reading 과정을 알아보자. 메모리의 "HELLO!" 데이터를 읽어와서 Disk에 기록되는 과정이다.

 

1. 준비 단계

① : CPU는 Process A를 실행중이다. 이때 char *buf의 데이터("HELLO!")를 Disk로 저장하는 write가 실행 된다. buf는 6byte 이고 시작 주소는 0x000A번지이다.

② : write는 system_call이므로 Internal 인터럽가 발생하고 Process A에서 OS로 Context Switching 된다.

③ : CPU는 IDTR에서 인터럽트 번호(0x80)에 해당하는 OS의 ISR 함수 포인터를 가져온다.

④ : 인터럽트 번호가 0x80이므로 system_call을 실행한다. system_call 안에서 sys_write를 실행한다.

⑤ : sys_write에서 DMAC(DMA Controller)의 해당 Channel에 있는 Control, Address, Count을 각각 read, 0x000A, 0x06으로 설정한다.


⑥ : sys_write에서 DC(Device Controller)를 설정한다. Disk의 경우 Sector, Track, Cylinder를 설정하는데 데이터가 기록되는 Disk의 주소이다.

⑦ : Disk가 데이터를 기록할 준비가 되었다면 DMA Reading 준비가 끝난 것이다. 이제 다음 2. 진행 단계로 넘어간다.

2. 진행 단계

① : DC는 DAM Req를 DMAC에 보낸다.

② : DMAC가 CPU에 System Bus(Address, Data, Control)의 사용을 요청하는 Bus Req를 보낸다.

③ : CPU는 Bus Grant를 DMAC에 보낸다.

④ : DMAC는 DMA Ack를 DC에게 보낸다.

⑤ : DMAC는 해당 Channel의 Address(0x000A)와 Control(read)를 각각의 Bus로 보낸다.

⑥ : Address와 Read를 받은 메모리는 해당 데이터(첫 문자 'H')를 Bus로 내보낸다.

⑦ : 데이터는 DC의 FIFO 구조의 Buffer에 저장된다. Disk는 Buffer에서 데이터를 꺼내서 설정된 Sector, Track, Cylinder에 기록한다.

⑧ : DMAC Channel에서 Address는 증가하고 Count는 감소한다.

⑨ : Count가 0이 될 때까지 ①~⑧을 반복한다. Count가 0이 되면 3. 완료 단계로 넘어간다.

3. 완료 단계

① : DMAC는 INTR를 보내 CPU에 인터럽트 처리를 요청한다.

② : INTR를 받은 CPU는 그것에 대한 응답으로 INTA를 DMAC에 보낸다. 이때 실행 중인 명령어가 있다면 그것이 온전히 끝난 후에 INTA 신호를 보내게 된다.

③ : DMAC는 CPU에 Disk에 관한 인터럽트 IRQ14 를 요청하기 위해 데이터 버스로 14를 보낸다.

④ : CPU는 데이터 버스를 통해 14를 받는다. CPU 입장에서는 INTA를 보낸 직후 받은 데이터는 IRQ 번호로 인식한다.

⑤ : CPU는 발생한 External 인터럽트 번호(IRQ14)와 Trap 영역 크기(테이블에서 Trap 다음에 External 인터럽트가 위치하기 때문에)와 IDTR(Interrupt Description Table Register) 값을 더한다. 더한 그 값은 OS의 ISR 함수 포인터가 저장된 메모리 주소이다.

⑥ : CPU는 이제 ISR의 함수 포인터를 가져와서 실행한다. 인터럽트 번호가 0x2E 이므로 ide_end를 실행할 것이다.

⑦ : OS는 대기 상태에 있던 Process A를 깨운다.

'컴퓨터 구조 > DMA(Direct Memory Access)' 카테고리의 다른 글

2. DMA Writing  (0) 2022.09.29
1. PIO vs DMA  (0) 2022.09.28
Comments