일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 사설 IP
- network
- 코드 컴플릿
- ack
- float
- 명령어
- L2 switch
- 리펙토링
- L3 Router
- MMU
- physical address
- osi 7
- Public IP
- floating point
- refactoring
- 클린 코드
- Sector
- ALU
- Code complete
- page
- register
- Clean code
- 공인 IP
- private ip
- CPU
- cache
- 가독성
- TCP
- interrupt
- addressing mode
- Today
- Total
목록전체 글 (94)
Software Lab

Disk에는 데이터들이 다음과 같은 구조로 저장된다. MBR(Master Boot Recorder) : 0번 섹터에 저장되고 부팅 시 Disk에서 제일 처음 읽어 들여 실행되는 영역이다. 각 파티션 위치들을 식별하고 Kernel을 읽어 들여 실행하는 역할을 한다. Kernel : 운영체제에서 코어 프로그램에 해당한다. FAT(File Allocation Table) : Windows 계열에서 사용하고 디스크에서 파일들의 저장 위치, 크기 등의 정보를 가지고 있다. Linux에는 비슷한 역할을 하는 Super-Block이 있다. Files(a.txt, b.jpg, d.png ...) : File들이 크기에 따라 여러 Cluster에 걸쳐서 저장된다. 그런데 b.jpg 를 자세히 보면 연속되지 않은 여러 C..

파일은 Cluster 단위로 저장되므로 사용 못 하는 나머지 공간이 생기게 된다. 이것을 Gap 이라고 한다. 아래 조건에서 2300 byte 파일을 저장해보자. 그렇다면 2개의 Cluster가 필요하고 1796 byte의 Gap이 발생한다. Bytes/Sector = 512 Sector/Cluster= 4 Cluster size = 512 * 4 = 2048 Gap = (512 * 4) * 2 - 2300 = 1796 byte Cluster의 크기가 커질수록 한 번에 처리 할 수 있는 데이터양이 많아지므로 처리 속도가 빠르다. 대신 Gap이 커지므로 사용 못 하는 공간이 많이 생긴다. 아래는 Windows에서 디스크 포맷 시에 Cluster의 크기를 설정할 수 있다.

Cylinder : 각 플래터(Platters)에서 z축으로 동일 위치에 있는 Track 들을 모아 놓은 것이다. 원통 모양이 된다. 원통 제일 바깥쪽이 0번이고 안쪽으로 갈수록 1씩 증가한다. Track : 플래터에 있는 동심원이다. 보통 양면을 사용하므로 플래터가 4개라면 Track은 8개가 있게 된다. HDD(Hard disk drive)에는 Track별로 접근하는 각각의 Header가 있다. Sector : Track은 Sector로 나뉘게 된다. Disk는 Sector 단위로 데이터를 저장하고 읽어 들인다. 보통 한 Sector의 크기는 512 bytes이다. Cluster : 연속된 Sector 여러 개가 모여서 하나의 Custer가 된다. OS는 Cluster 단위로 파일을 저장하고 읽어 들..

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 안..

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_c..

메모리와 I/O Decvices 간에 데이터를 전송하는 방식은 PIO, DMA 두가지가 있다. 전송량이 많을수록 PIO에 비해 DMA가 CPU 사용량이 적다. 그렇기 때문에 DMA 방식에서 CPU는 다른 작업을 할 수 있으므로 효율성이 좋아진다. PIO(Programmed Input/Output) : 중간에 CPU를 거쳐서 데이터를 전송하는 방식이다. DMA(Direct Memory Access) : 중간에 CPU 개입 없이 바로 데이터를 전송하는 방식이다. DMA는 아래 3가지 방식이 있다. Cycle stealing : DMAC가 word 단위의 데이터 전송마다 CPU에게 System Bus의 사용권을 요청한다. CPU는 System Bus를 사용하지 않는 Cycle에만 사용권을 주기 때문에 IDEL..

Keyboard 같이 외부 입출력(I/O Devices) 장치에 의해 발생하는 external 인터럽트 과정을 살펴보자. 여러 I/O 장치들에서 동시다발로 인터럽트 요청이 발생 할 수 있다. 그래서 이런 요청들을 차례대로 제어하기 위해서는 PIC(Programmable Interrupt Controller) 장치가 필요하다. 메인보드의 South bridge 칩에 들어 있다. ① : Process A에서 Keyboard 데이터를 입력 받기 위해 getchar() 함수를 실행한다. getchar 함수 내부에는 system_call의 sys_read가 호출된다. 이때에는 Internal 인터럽트가 발생하고 Process A에서 OS로 Context Switching 된다. ② : Keyboard 데이터가 입..

exit 같은 system_call 함수가 호출할 때 발생하는 Internal 인터럽트 과정을 살펴보자. ① : Process A에서 system_call을 실행하기 위한 명령어들을 실행하게 된다. 어떤 종류의 system_call을 호출할 것인지는 eax 값으로 결정된다. 그림에서 왼쪽 아래 테이블은 eax 값에 해당하는 system call 종류를 나타낸다. sys_exit 실행하기 위해 eax에 0x01 값을 넣는다. 다음으로 int 0x80 명령어를 실행한다. ② : CPU는 발생한 인터럽트 번호와 IDTR(Interrupt Description Table Register) 값을 더한다. 더한 그 값은 OS의 ISR 함수 포인터가 저장된 메모리 주소이다. ③ : CPU는 이제 ISR의 함수 포인터..