Software Lab

2. DMA Writing 본문

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

2. DMA Writing

아임코더 2022. 9. 29. 12:49

Cycle stealig 방식의 DMA Writing 과정을 알아보자.

Disk에서 "HELLO!" 데이터를 읽어와서 메모리에 올라가는 과정이다.

 

1. 준비 단계

① : CPU는 Process A를 실행중이다. 이때 Disk 데이터("HELLO!")를 char buf[0x06]로 읽어 들이는 read가 실행 된다. buf는 6 byte이고 시작 주소는 0x000A번지이다.

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

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

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

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

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

⑦ : Disk는 데이터를 DC에 있는 FIFO 구조의 Buffer에 올린다. Buffer에 데이터가 한 개라도 올라온다면 DMA Writing 준비가 끝난 것이다. 이제 2. 진행 단계로 넘어간다.

2. 진행 단계

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

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

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

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

⑤ : DC는 FIFO에서 데이터(첫 문자 'H') 한 개를 꺼내어 Bus로 내보낸다.

⑥ : DMAC는 해당 Channel의 Address(0x000A)와 Control(write) 데이터를 각각의 Bus로 보낸다.

⑦ : 메모리는 데이터, Address, Control을 받게 되고 데이터를 해당 Address에 기록한다.

⑧ : 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)' 카테고리의 다른 글

3. DMA Reading  (0) 2022.09.29
1. PIO vs DMA  (0) 2022.09.28
Comments