Compiler
- high-level language code를 입력으로 받아서, assembly language code를 출력함.
- compiler가 출력한 내용에는 pseudo instruction이 포함될 수도 있음(assembler는 이해하지만 machine은 이해할 수 없음)
Assembler
- assembly language code를 입력으로 받아서, object code, information table을 출력함.
- pseudo instruction을 대체하고 machine language로 바꾸게 됨.
Producing Machine Language
- arithmetic, logical, shift 등은 이미 필요한 정보가 instruction 내에 모두 포함되어 있음. branch, jump는 PC-relative address를 기준으로 파악 가능함.
- 그런데 label이 아직 확인되지 않은 앞의 것인 경우에는 코드에서 그 label로 branch하라고 했을 때 알 수가 없음. 따라서 two passes를 돌면서, 첫 패스에서는 label의 위치를 기억하고, 두번째 pass에서 이 위치를 이용하여 코드를 만듦.
- jump, branch의 PC-relative address를 위해서는 offset을 half-word 단위로 계산해서 position-independent code를 만들어 주면 됨.
- 그런데 static data로 접근하기 위해서는 최종적인 32-bit address가 필요하고, 이는 당장 결정될 수 없음.
- 이러한 문제를 해결하기 위해 symbol table(label, data 영역에 대한 정보를 포함), relocation table(최종적으로 absolute address를 결정해야 하는 항목들. 이는 이후에 linker를 통해 최종 주소를 결정한다)
Object File
- file header, text segment(machine code), data segment(static data), relocation information(need to be fixed up later), symbol table(labels and static data the can be referenced), debugging information
Linker
- object code files, information tables를 입력으로 받아서 executable code로 만듦.
- 여러 object file들을 하나의 executable로 만들어 주기 때문에 linker라고 불림.
- 모든 text segment를 가져와서 모아주고, 모든 data segment를 가져와서 모아주고, reference 문제를 해결(absolute address로 채워줌)함.
Resolving References
- PC-relative addressing은 relocate할 필요가 없으나, absolute function address, external function reference, static data reference는 모두 relocate해 주어야 한다.
- linker는 first word of first text segment가
0x10000
위치에 있다고 가정한다. 각 text, data segment의 길이와 순서를 알고 있으므로 absolute address를 계산할 수 있다. - data 또는 label reference에 대해 symbol table을 먼저 찾아보고, 없으면 library file을 찾아본다.
Dynamically-Linked Libraries
- 상기한 방식은 statically-linked approach로서 library도 executable의 일부로 포함됨. 만약 library를 업데이트하면 다시 컴파일해야만 이를 포함시킬 수 있다.
- 그래서 runtime에 library를 링크하는 DLL이 사용되고 있다.
- 디스크 용량과 메모리를 줄일 수 있고, 업그레이드가 라이브러리 파일의 교체만으로 이루어지므로 간단하다. 하지만 런타임에 time overhead가 발생하고, executable만으로는 실행할 수 없게 된다.
- 현재 사용하는 DLL 방식은 machine code level에서 link하고 있다.
Loader
- executable code를 입력으로 받아서 프로그램을 실행함. 현실에서 loader는 바로 OS다.
- loader는 executable file의 헤더를 읽어서 사이즈를 파악하고, 이를 담을 수 있는 새로운 address space를 만든다. 이 address space로 instruction, data를 복사하고, argument를 stack으로 복사한다. 그리고 machine register를 초기화한 뒤 start-up routine으로 간다. 여기서는 PC를 지정하고, argument를 stack에서 register로 복사해준다.
'컴퓨터 > 컴퓨터구조' 카테고리의 다른 글
[UCB CS61C] Lec14 Intro to Synchronous Digital Systems (0) | 2024.01.12 |
---|---|
[UCB CS61C] Lec11, 12 RISC-V Instruction Formats (0) | 2024.01.10 |
[UCB CS61C] Lec10 RISC-V Memory and Calling Conventions (1) | 2024.01.09 |
[UCB CS61C] Lec09 RISC-V Logical Instructions (0) | 2024.01.09 |
[UCB CS61C] Lec08 RISC-V (lw, sw, decision making) (0) | 2024.01.05 |
댓글