* 개인 보충 공부 ( 시스템 프로그래밍 수업 내용임 )
[ main memory와 second storage의 차이 ]
main memory의 대표적인 예는 DRAM이고 seconde storage의 예는 DISK, 하드 드라이브 디스크이다.
| DRAM | DISK | |
| speed | 100ns | 10ms |
| capacity | GB | TB |
| volability | 휘발성 → 전원이 공급되어야만 데이터 유지 |
비휘발성 → 전원이 공급되지 않더라도 데이터 유지 |
| interface | Byte 단위 인터페이스( 8,32, 64bit ) | sector 단위 인터페이스 ( 512byte ) |
CPU는 Byte 단위로 데이터에 접근할 수 있다. 즉 DRAM은 바로 데이터를 읽어올 수 있지만 DISK는 데이터를 바로
읽어올 수 없다. 왜냐하면 DISK는 Byte단위가 아니라 Sector 단위로 인터페이스를 제공하기 때문이다.
CPU 입장에서 DISK에 있는 데이터에 접근하기 위해서는 DISK에 있는 데이터를 Byte 단위로 메인 메모리에
올려야한다. 그러기 위해서는 로딩 과정이 필요하다.
ex) 512Byte 중에 필요한 4,8 byte를 CPU로 가져온다.
* 로딩이 필요한 이유 : DISK와 DRAM이 제공하는 인터페이스의 차이 때문에 필요하다.
DISK는 비휘발성이고 DRAM은 휘발성이다. 데이터를 오랫동안 영속적으로 유지하기 위해서는 데이터를 DISK에
넣어놔야 한다. 하지만 DISK는 sector 단위이고, DRAM은 byte 단위이기 때문에 DISK에 있는 데이터에 접근하려면
CPU가 바로 접근할 수 없고 DRAM으로 올렸따가 이후에 CPU로 기져와야 한다.
[ Compilation System ]
1. 언어 계층 구조
① High-level language : 사람에게 가장 가까운 C file 등의 형태
② Assembly language : 어셈블리 언어의 한 문장은 High-level language를 1:1로 기계어로 바꾼다. ASM file
③ Machine language( binary code ) : CPU에 가장 가까운 2진수 Object file
2. 6개의 번역 시스템의 구성 요소 : editor, compiler, assembler, linker, loader, debugger

① editor( 편집기 )를 이용해서 C 파일을 생성한다. C 파일은 compiler에 input 값으로 들어간다.
에러가 있을 경우 compiler가 에러 메시지를 출력하고 에러가 없다면 ASM 파일이 생성이 된다.
② ASM 파일은 input으로 assembler에 들어간다. assembler는 ASM 파일을 input으로 해서 재배치 가능한
Object 파일인 기계어로 되어있는 relocatable object file을 만든다.
③ 재배치 가능한 Object 파일이 생성이 되면 내가 만든 그 object 파일과 다른 object 파일 & 라이브러리를 linker가
묶어준다. linker의 입장에서는 내가 만든 object 파일과 기존의 다른 object 파일이 input이 되고,
그 결과 binary인 최종적으로 수행 가능한 Object 파일인 Executable Object file이 만들어진다.
④ 기계어로 구성돼 있는 Executable Object file은 시스템에 올라가서 수행이 될 수 있다. file을 시스템에 올리는
역할은 Loader가 수행을 한다. Loader는 DISK에 있는 내용을 메모리에 올리는 역할을 수행한다.
⑤ 프로그램이 수행하는 도중 시스템의 상태를 확인하는 역할은 Debugger가 수행한다.
* 링크 : 실제 프로그램들은 여러 소스 파일들과 여러 라이브러리들의 내용이 합쳐져서 생성이 되므로 그 합쳐지는
과정을 linker가 수행해준다.
* loader에 의해서 컴퓨터 시스템은 메인 메모리로 올려지게 된다. 프로그램은 메인 메모리에 올라가야 CPU로 올라가서
수행이 가능하다.
* loader가 필요한 이유
최종적으로 수행 가능한 object 파일들이 loader에 의해서 메인 메모리에 올라가고, CPU에 올라가야 실행이 된다.
하지만 이 부분에서는 DRAM과 DISK가 제공하는 인터페이스 차이 때문에 로딩 과정이 필요하다. 왜냐하면
CPU는 byte 단위로 데이터를 접근하는데 DRAM은 byte 단위의 인터페이스이기 때문에 CPU가 데이터를 바로
읽어올 수 있지만 DISK는 sector 단위의 인터페이스로 CPU가 데이터를 바로 읽어올 수 없기 때문이다.
즉, 디스크에 있는 데이터에 접근하려면 CPU가 바로 접근할 수 없어 데이터를 DRAM으로 우선 올렸다가 이후에
CPU로 가져와야 한다.
* 재배치 가능한 Object 파일과 수행 가능한 Object 파일의 차이
Relocatable Object file과 Executable Object file은 둘 다 이진수( binary )로 구성이 되어있지만, relocatable
Object file은 주소가 확정이 되지 않았고 외부 참조도 확정이 되지 않은 상태이다. 즉, 이진수이지만 혼자서는
수행이 되지 못하는 언젠가는 재배치가 되어야 하는 기계어이다. 반면에 Executable Object file은 혼자
독립적으로 수행이 가능한 파일이므로 주소도 확정 및 결정이 되어있고, 메인 메모리 상의 어느 주소로 올라 가야
하는지도 다 결정이 되어있고, 외부 참조도 다 해결이 되어있는 linking이 완료된 혼자 수행 가능한 파일이다.
[ 번역 시스템 ]

1. nano & vi : 소스코드 및 C file을 만드는 editor
nano hello.c
vi hello.c
2. gcc : 작성한 소스코드를 컴파일 해주는 명령어이다.
gcc는 complier → assembler → linker까지 모두 수행해준다.
hello.c 파일의 high-level language를 가지고 assembly 파일을 만들고, 재배치 가능한 object 파일을 만들고,
linking 까지 모두 수행해 최종적으로 수행가능한 파일을 만든다.
gcc hello.c
3. ./a.out : 실제 수행 가능한 object 파일을 리눅스 환경에서는 별도의 이름을 지정해주지 않는다면 a.out으로
만들어진다. loader에서 실제 시스템이 올라가서 출력이 된다.
./a.out
즉, hello.는 편집기를 통해 생성이 되고, a.out은 gcc로 컴파일 → 어셈블러 → 링커를 모두 거치면서 최종적으로
만들어진 바이너리 파일이다. 실제 수행을 하면 hello.c 내부에 작성된 소스코드가 실행이 된다.
* 번역 시스템 세분화

1. gcc -s [ 소스코드 ] : 컴파일러, 어셈블러, 링커 과정을 다 실행하는 것이 아니라 컴파일러에서 컴파일만 수행한다.
명령어를 수행하고 컴파일만 수행된 어셈블리 파일이 생성이 된다.
( ls로 확인해보면 hello.c와 hello.s 파일이 존재한다. )
2. as는 리눅스에서 사용하고 있는 어셈블러에 대응하는 명령어이다.
→ 어셈블리 파일을 인수로 받기 때문에 hello.s를 input으로 받고 그 어셈블리 언어를 기계어로 바꾸는 작업을 하고
-o 옵션을 사용해서 hello.o Object 파일을 생성한다.
( ls로 확인하면 hello.c, hello.o, hello.s 파일이 존재한다. )
* .c는 편집기로 작성한 소스코드 파일이고, .s는 컴파일러가 만든 어셈블리 파일이고, .o는 어셈블러가 만든 재배치
가능한 Object 파일이다.
3. collect2는 linker에 해당한다.
nano hello.c를 실행하면 hello.c 파일이 생성이 되고 gcc -s hello.c를 통해 컴파일만 수행한 hello.s라는
어셈블리 파일을 생성할 수 있다. 그 다음 as -o hello.o hello.s를 통해 hello.o라는 재배치 가능한 Object 파일이
생성이 된다. 최종적으로는 a.out이라는 파일을 생성할 수 있다.
* hello.c : high-level language
hello.s : assembly language
hello.o & a.out : machine language
( hello.o : 재배치 가능한 오브젝트 파일, a.out : 수행 가능한 오브젝트 파일 ( binary ) )
'2CHAECHAE 학교생활 > OSNW실습' 카테고리의 다른 글
| [ OS/NW 실습 ] 6주차 - 소켓 네트워크 프로그램 개발 ① 네트워크 프로그램의 흐름, 클라이언트 프로그램 만들기 (0) | 2022.10.28 |
|---|---|
| [ OS/NW 실습 ] 5주차 - 네트워크 OSI 모델 7 계층 구조 (0) | 2022.10.08 |
| [ OS/NW 실습 ] 4주차 - 파일 아카이브, 프로세스 (0) | 2022.09.30 |
| [ OS/NW 실습 ] 4주차 - 패키지 관리, 소프트웨어 컴파일 (0) | 2022.09.30 |
| [ OS/NW 실습 ] 3주차 - 리눅스 명령어 (0) | 2022.09.21 |