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
- interrupt
- 사설 IP
- MMU
- ack
- register
- addressing mode
- Clean code
- floating point
- osi 7
- refactoring
- float
- page
- Code complete
- physical address
- CPU
- cache
- network
- Public IP
- 가독성
- L3 Router
- private ip
- TCP
- 공인 IP
- 명령어
- 클린 코드
- L2 switch
- Sector
- 코드 컴플릿
- ALU
- 리펙토링
Archives
- Today
- Total
Software Lab
3. DMA Reading 본문
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