Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- cache
- private ip
- addressing mode
- 클린 코드
- ALU
- Sector
- 가독성
- MMU
- L3 Router
- L2 switch
- Clean code
- physical address
- Public IP
- register
- refactoring
- 공인 IP
- page
- interrupt
- ack
- TCP
- network
- Code complete
- 명령어
- CPU
- 코드 컴플릿
- osi 7
- floating point
- float
- 리펙토링
- 사설 IP
Archives
- Today
- Total
Software Lab
2. DMA Writing 본문
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