제 2 장 어셈블러(Assemblers)

Download Report

Transcript 제 2 장 어셈블러(Assemblers)

제 3 장 로더와 링커(Loaders and Linkers)

목적 프로그램의 3 처리 과정들
-
-

Functions)
로드(load): 실행을 위해 목적 프
로그램을 메모리로 가져오는 것 3.1.1 절대 로더의 설계(Design of an
Absolute Loader)
재배치(relocation): 목적 프로그램
을 원래 정의되었던 주소와 다른  링크나 재배치 없어 간단
주소에 적재될 수 있도록 목적 프  단일 패스: p125 Fig.3.1 참조
로그램을 변경하는 것
- 헤더 검사하여 메모리가 충분한지 확인
링크(link): 둘 이상의 독립된 목적
- 텍스트 레코드 읽어 목적 코드를 메모
프로그램들을 결합하고 서로 참
리의 지정된 주소로 이동
조하기 위해 필요한 정보를 제공
- 엔드 레코드 만나면 프로그램 시작 주
하는 것
소로 점프
로더의 기능에 따른 형태
-
3.1 기본적인 적재 기능(Basic Loading
-
• 목적 프로그램: 한바이트의 16 진수 두
자리를 문자 형태의 16진수 두 바이트로
표현
• 로드된 명령: 16진수 두 자리의 값을 나
타내는 한 바이트로 표현
• 팩킹(packing): 목적 프로그램의 각 바이
트 쌍들이 로드되는 동안 한바이트로 팩
됨
로드, 재배치, 링크 모두 지원
재배치와 로드만 지원: 링커
(linker) 또는 링크 편집기(linkage
editor)가 따로 있어 링크 수행
시스템 프로그래밍
알고리즘: p126 Fig.3.2
실제 시스템에서는 목적 프로그램을 이
진 형태(임의의 2 진수)로 저장
1

3.1.2 간단한 부츠트랩 로더(A Simple
Bootstrap Loader): 절대 로더
-
-
0 번지에서 부츠트랩 프로그램 시작
입력장치 F1으로부터 OS 목적 프로그
램 읽어 80 번지에 로드
GETC 서브루틴
• F1으로부터 읽어들인 ASCII 문자를 16
진수로 변환


“1” ~ ”9” (= 16진수 31 ~ 39)
1 ~ 9 : 48(16진수 30)을 빼서
“A” ~ “F” (=16진수 41 ~ 46)
10 ~ 15 : 55(16진수 37)을 빼서
3.2 로더의 기계 종속적인 특징(MachineDependent Loader Features)
 절대 로더의 단점
로드 주소를 프로그래머가 지정해야
멀티프로그래밍 환경에서는 프로그
램의 로드 주소를 미리 알 수 없음
 재배치 가능 프로그램(relocatable
programs)이어야 함
- 라이브러리를 효율적으로 이용하기
어려움
-
• 메모리를 효율적으로 이용하려면 라
이브러리 안의 많은 서브 루틴들 중 필
요한 서브 루틴만 선택적으로 로드해
야함
• 이 경우 서브 루틴들이 모두 미리 정해
진 절대 주소를 가지고 있다면 효율적
이기 어려움
• EOF(16진수 04) 만나면 80 번지로 점프
• 30 이하의 ASCII 코드 값을 가지는 모
든 입력 문자(입력 제어 문자들)는 건너
뜀(skip)
• 16진수를 왼쪽으로 4 비트 shift하여 추
출한 첫번째 16진수에 두번째 16진수
를 더하여 두 16진수를 한 바이트로 조
합함
3.2.1 재배치(Relocation)
• 조합된 바이트는 STCH 명령에 의해 레
지스터 X가 가르키는 주소에 저장됨  재배치 로더(relocation loader) 또는 상
대 로더(relative loader): 프로그램 재배
• TIXR 명령으로 레지스터 X의 값을 1
더함
치가 가능한 로더
시스템 프로그래밍
2

재배치 방법
-
수정 레코드 사용: p64, p89 참조
• p131의 SIC/XE 프로그램 예제에서
15, 35, 65 행 직접 주소지정 방식만이
재배치의 영향을 받음
• p133 SIC 표준형 프로그램 예제에서
는 RSUB 제외한 모든 명령에 대하여
주소를 수정하기 위해 31개 수정 레
코드가 필요하므로 매우 큰 목적 프
로그램 생성
-
3.2.2 프로그램 링크하기(Program Linking)
 제어 섹션 단위로
-

(예) p136~138 Fig.3.8~3.9
-
-
• 직접 주소와 고정 명령어 형식을 사
용하는 기계에서
• 텍스트 레코드의 길이 필드 다음에 3
개의 16진수인 비트 마스크(bit mask):
해당 워드가 1로 설정되었으면 프로
그램의 시작주소 더함
• (예) FFC = 1111 1111 1100
10 ~ 55 행의 10개 워드 수정
• (예) EOO = 1110 0000 0000
-
처음 3 워드만 수정
나머지는 데이터 상수와 RSUB 문
• 210 행 LDX이 새로운 레코드로 출력
된 이유: 만일 앞의 텍스트 레코드에
위치시키면 185 행의 한 바이트 때문
에 재배치 비트와 일치 시키기 어려
우므로(한 워드는 3 바이트)
시스템 프로그래밍
REF1
• PROGA
재배치 비트 사용: p134 Fig 3.7
-
링크(link)
재배치(relocation)
로드(load)
PC 상대: 0040 -PC(=0023) = 01D
• PROGB
-
피연산자 주소: 00000
M00003705+LISTA
직접주소 확장명령: 로드 후 4040
• PROGC
-
-
피연산자 주소: 00000
M00001905+LISTA
REF2
• PROGA
-
피연산자 주소: 00000+4 = 00004
M00002405+LISTB
• PROGB
-
PC 상대: 0060 - PC(=003D) + 4 =24+3=27
• PROGC
-
피연산자 주소: 00000+4 = 00004
M00001D05+LISTB
3
-
REF3: ENDA-LISTA 값의 즉시 피연산자
-
• PROGA
• PROGA
-
- 피연산자 주소: FFFFF6
(1010(2)의 2의보수:0101(2)+1=0110(2)=6(16)
0000A의 2의보수는 FFFF5 +1 = FFFF6)
- M00005706+ENDC
- M00005706-LISTC
즉시:
• PROGB
-
피연산자 주소: 00000
M00003E05+ENDA
M00003E05-LISTA
• PROGB
• PROGC
-
-
- 피연산자 주소: FFFFF6
(1010(2)의 2의보:수0101(2)+1=0110(2)=6(16)
0000A의 2의보수는 FFFF5 +1 = FFFF6)
- M00007306+ENDC
- M00007306-LISTC
피연산자 주소: 00000
M00002105+ENDA
M00002105-LISTA
REF4:
• PROGC
• PROGA
-
-
피연산자 주소: 000014
M00005406+LISTC
• PROGB
-
REF5
피연산자 주소: 000000
M00007006+ENDA
M00007006-LISTA
M00007006+LISTC
• PROGC
-
피연산자 주소: 000030
-
M00004206+ENDA
M00004206-LISTA
M00004206+PROGC
시스템 프로그래밍
-
피연산자 주소: 000008
(ENDC-LISTC는 16진수 12는 10진수 18,
18-10은 8)
REF6~REF8는 각자
p140 Fig.3.10(a) 참조: 마지막 상수 부분은 모
두 같음
p141 Fig.3.10(b) 참조: REF4에 대한 재배치와
링크 연산
• PROGA
-
000014 + LISTC(4112=40E2+30) = 4126
• PROGB
-
ENDA-LISTA+LISTC = 4054-4040+4112
= 4126
• PTOGC
-
000030+ENDA-LISTA+PROGC = 30 +
4054 - 4040 + 40E2 = 4126
4
3.2.3 링킹 로더의 알고리즘과 자료 구조
(Algorithm and Data Structures for a
Linking Loader)
 링킹 로더(linking loader)
링크 및 재배치를 같은 방법으로 수행
SIC/XE
외부 심볼 주소 정해질때(외부 심볼을
가진 섹션이 읽혀질 때)까지 링크 못함
 이중 패스(two passes) 링킹 로더
-
• 패스 1: 모든 외부 심볼 주소 배정
• 패스 2: 실제 로드, 재배치, 링크

자료 구조
-
외부 심볼 테이블(ESTAB)
• 외부 심볼 이름, 주소
• 해쉬 구조(hashed organization)
• PROGADDR(program load address)
-
링크된 프로그램이 메모리에 로드된
시작 주소(OS가 로더에게 알려줌)
 첫번째 제어섹션의 주소

알고리즘
-
패스 1: p143 Fig.3.11 (a)
• 헤더 레코드(Header record)와 정
의 레코드(Define record)만 고려
• 변수들
-
-
PROGADDR(program load
address): OS가 알려줌
CSADDR(control section
address): PROGADDR로부터
ESTAB(external symbol table):
헤더 레코드의 제어 섹션 이름
과 정의 레코드에 나타난 모든
외부 심볼들 등록
CSLTH(control section length):
헤더 레코드에서 얻어짐
• 엔드 레코드(End record) 만나면
-
CSADDR + CSLTH
새 제어 섹션 시작 주소
• 패스 1 끝나면 대부분 로드 지도
(load map)에 ESTAB의 심볼과
주소 츨력: p143
• CSADDR(control section address)
-
현재 로더가 스캔하고 있는 제어 섹션
의 시작 주소
상대 주소 + CSADDR = 절대 주소
시스템 프로그래밍
5
-
패스 2: p144 Fig.3.11 (b)
• 실제 로드, 재배치, 링킹
• 텍스트 레코드(Text record) 읽어
로드
• 수정 레코드(Modification record)
만나면 수정에 사용될 값을
ESTAB에서 찾아 연산
• 패스 2 끝나면 실행을 위해 제어를
프로그램에게 넘겨 줌
-
-
-
어떤 시스템에서는 링킹 로더는
프로그램 시작 주소를 OS에게 넘
겨 주기만 하고 사용자가 실행 명
령을 내리기도 함
엔드 레코드 섹션의 처음 주소가
지저되어 있으면 이것을 전이점
(transfer point)으로 이용하기도
섹션 끝에 전이점 없으면
PROGADDR을 전이 주소로

참조 번호(reference number) 방식
-
모든 외부 심볼에 참조 번호 부여
• 제어 섹션 이름은 01
• 외부 심볼들은 참조 레코드에서 정
의
-
수정 레코드에서 참조 번호 이용
장점
• 같은 심볼에 대해 매번 ESTAB 탐
색하지 않아도 됨
• 한 제어 색션에서 ESTAB을 탐색하
여 한 심볼의 값능 찾으면 테이블에
참조 번호로 색인하여 등록
• 주소 수정할 때는 테이블에서 색인
으로 값을 바로 찾아냄
• p136~138 Fig.3.9 프로그램의
PROGADDR이 , p140~141
Fig.3.10 다시 참조
시스템 프로그래밍
6
3.3 기계 독립적인 로더 특징(Machine
Independent Loader Features)
3.3.1 자동 라이브러리 검색(Automatic
Library Search)
 자동 라이브러리 호출(automatic
library call)
 자동 라이브러리 탐색(library search)
-
-
-
목적 프로그램의 정의 레코드를 탐색
하는 방법은 비효율적
각 루틴의 이름과 파일 안에서의 주소
포인터를 제공하는 디렉토리 이용
• 같은 루틴이 다른 이름으로 진입 가능
-
다른 이름들을 디렉토리에 기록
목적 프로그램은 한번만 저장
로드되는 프로그램에서 호출되는 서
• 디렉토리 탐색(directory search) 포함
브루틴들이 자동적으로 라이브러리
- 어떤 OS는 라이브러리 디렉토리를 메
로부터 인출되어 주 프로그램과 링크
모리에 영구히 저장하기도
되고 로드됨
최초 입력(프로그램)에서 참조되었
으나 정의되지 않은 외부 심볼 추적 3.3.2 로더 선택 사항(Loader Options)
• 나타날 때마다 ESTAB에 등록하고 정
의되지 않았음 표시
• 정의 만나면 배정된 주소 채워 넣음
• 패스 1 끝난 후 정의되지 않은 심볼들
은 미해결(unresolved) 외부 참조임
• 모든 미해결 외부참조 해결될 때까지
라이브러리 탐색
• 라이브러리에 새로운 외부 참조 있을
수도
-
라이브러리 탐색(library search) 방법
라이브러리는 서브루틴들이 어셈블
또는 컴파일된 형태
시스템 프로그래밍

선택 사항 명시 방법
-
명령어 언어 이용
• 독립된 파일로
• 목적 프로그램 사이의 주 입력 스트림
(primary input stream)으로
-
작업 제어 언어(job control language)의
일부로
• OS가 제어 블록에 포함시켜 로더에 전
달
7

로더 선택 사항 예
-

INCLUDE program-name(libraryname)
DELETE csect-name
CHANGE name1, name2

기타 로더 선택 사항
-
LIBRARY MYLIB
-
(예) p86~90 Fig.15~17
-
-
유틸리티 서브루틴 READ, WRITE
가 RDREC와 WRREC 기능 수행
기본 로더 입력(primary loader input)
INCLUDE READ(UTLIB)
INCLUDE WRITE(UTLIB)
DELETE RDREC, WRREC
CHANGE RDREC, READ
CHANGE WRREC, WRITE
로더에게 지시
• UTLIB 라이브러리에서 READ,
WRITE 제어 섹션 포함시킴
• 로드시 RDREC, WRREC 삭제
• RDREC에 대한 모든 외부 참조를 심
볼 READ를 참조하도록 변경
• WRREC에 대한 모든 외부 참조를
심볼 WRITE를 참조하도록 변경
시스템 프로그래밍
탐색할 라이브러리 지정
실제로 수행되지 않는 서브루틴들
이 로드되고 링크되지 않도록 외부
참조가 미해결된 상태 남아 있게
(remain unresolved) 로더에 지시
NOCALL STDDEV, PLOT, CORREL
-
-
외부 참조 없음(no external
references) 지시: 외부 참조 시도하
면 오류
로드 지도(load map) 출력 여부 및
자세한 정도 지시
• 제어 섹션과 주소만
• 외부 심볼 주소 포함 여부
• 외부 심볼사이의 교차 참조(crossreference) 테이블 포함 여부
-
실행 시작 주소 지정: 목적 프로그
램에서 제공된 정보를 override
미해결 외부 참조 오류 발생시 조치
지시
8
3.4 로더 설계 선택사항(Loader Design
Options)
 로드 기능 구현 방법들
-
3.4.1 링크 편집기(Linkage Editors)
 링크 편집기: p153 Fig.3.13 참조
-
링킹 로더(Linking Loaders): 3.2.3
링크 편집기(Linkage Editors): 3.4.1
• 로드 전에 링크
• 링크와 재배치 후 파일이나 라이브
러리에 저장
• 로드시에는 단순한 재배치만
-
-
동적 링킹(Dynamic Linking): 3.4.2
• 로더는 단지 상대 주소에 로드 시작
주소 만을 더함
• 단일 패스로 처리됨
• 실행 시간에 링크
• 처음 호출된 서브루틴을 로드하고
링크할 때 OS 기능 이용
-
부츠트랩 로더(Bootstrap Loader):
3.4.3
• OS나 시스템 로더와 무관한 독립
적인 프로그램을 실행
• OS나 시스템 로더 자체를 로드
링크된 버전인 로드 모듈(load
module) 또는 실행가능 이미지
(executable image)를 파일 또는 라이
브러리로 출력
모든 제어 섹션을 링크된 프로그램의
시작으로부터 상대적으로 배치
단순한 재배치 로더(simple relocating
loader)가 로드 담당

링크 편집기와 링킹 로더
-
링크 편집기는 외부 참조와 라이브러
리 탐색 일회만 수행하므로 효율적
링킹 로더는 프로그램 실행될 때마다
외부 참조와 라이브러리 탐색
• 프로그램 수정이 많은 프로그램 개발
이나 테스트에 유리
• 사용 빈도가 낮은 경우 어셈블 버전
을 저장할 필요 없을 때 유리
시스템 프로그래밍
9

링크 편집기로 링크된 프로그램 안에외 
부 참조 정보 포함
-
제어 섹션의 교체, 외부 참조 수정 등
부분적인 재링크 허용위해
라이브러리 공간 절약
-
(예) INCLUDE PLANNER
사용자 루틴들 링크동안 라이브러
리 탐색 금지(NOCALL: p151)
실행 시간에 FTNIO와 링크된 사용
자 루틴 조합
DELETE PROJECT
INCLUDE PROJECT(NEWLIB)
3.4.2 동적 링킹(Dynamic Linking)
REPLACE PLANNER(PROGLIB)
 링크 편집기: 링크후 로드
- 교차참조(cross-reference) 많은 서브루
틴이나 제어 섹션들의 패키지 생성위해  링킹 로더: 링크와 로드 동시에
 동적 링킹: 서브루틴이 처음 불려
(예) INCLUDE READR(FTNLIB)
질 때 로드되고 링크됨
INCLUDE WRITER(FTNLIB)
INCLUDE BLOCK(FTNLIB)
INCLUDE DEBLOCK(FTNLIB)
…
SAVE FTNIO(SUBLIB)
• 이름이 FTNIO인 링크된 모듈을
SUBLIB에서 찾을 수 있음
• FTNLIB 탐색전 SUBLIB 탐색하면 모든
교차 참조가 해결되 있는 FTNIO 찾을
수 있어 효율적(사용자 프로그램과 링크
될 때 다시 링크할 필요 없음)
시스템 프로그래밍
-

dynamic linking
dynamic loading
load on call(load-and-call)
동적 링크 라이브러리(dynamic link
library)
-
-
실행 시간 지원 라이브러리(runtime support library)의 복사본을 오
직 하나만 메모리에
실행중인 모든 프로그램과 링크되
어 공유됨
10

객체지향 시스템의 동적 링킹
-
-

실행 시간에 객체와 메소드가 결
정됨
객체를 사용하는 프로그램과 무
관하게 객체 수정 가능
동적 링킹으로 객체 공유 가능
바인딩(binding; 논리 주소를 물리 주소로
사상)이 로드 시간(load time)에서 실
행 시간(execution time)으로 지연됨
(delayed)
-
동적 링킹의 장점
- 각 루틴들이 필요할 때만 로드됨
 시간과 메모리의 절약


동적 로딩과 링킹의 구현: p157
(a) OS 서비스(load-and-call) 호출
(b) 호출된 루틴이 이미 로드되어 있는지
내부 테이블(internal table) 조사하여
없으면 로드
(c) 호출된 루틴 수행
(d) 호출된 루틴 수행 완료 후 OS로 복귀
한 후 사용자 프로그램으로 제어 반
환(종료를 OS에 알리기 위해)
(e) 호출된 루틴에 할당했던 메모리는 즉
시 해제되거나 지연 해제
•
-
호츨된 루틴의 심볼과 그 실제 주소
의 연결이 호출문이 실행될 때까지
이루어지지 않음
융통성(flexibility) 제공
OS가 간섭해야하는 오버헤드
3.4.3 부츠트랩 로더(Bootstrap Loader)
 메모리가 비어있는 유휴 (empty and
idle) 상태에서는 재배치 필요 없어
절대 로더면 충분
 절대 로더를 로드
-
방법1: 오퍼레이터가 콘솔의 스위치
를 이용하여 절대 로더의 목적 프로
그램을 메모리로
지연 해제 경우 다시 그 루틴을 호출
했을 때 단순히 제어만 이동
시스템 프로그래밍
11
-
방법 2: ROM(read-obly memory)에
절대 로더 프로그램을 영구히 저장
• H/W 신호 발생하면 (시작 버튼 누르
면) 자동으로 ROM에 있는 프로그램
이 실행됨
-
-
ROM에서 직접 실행
메모리로 복사된 후 실행
방법 3(절충안): 내장(built-in) H/W
이용
• 콘솔의 스위치로 선택된 외부 장치
로부터 고정 길이의 레코드 하나를
읽어 메모리의 특정 위치에 저장
• 자동으로 제어가 저장된 레코드의
주소로 이동
• 읽어들인 레코드에는 절대 프로그
램을 로드하는 기계어 명령어 포함
• 만일 로드 과정의 명령어들을 첫번
레코드에 다 담을 수 없으면 첫번 레
코드는 다른 레코드들을 읽어 들이
고 다른 레코드들은 더 많은 레코드
들을 읽어 들임 = 부츠트랩
• 처음의 레코드(들) = 부츠트랩 로더
• 위와 같은 로더 프로그램을 OS 자신
및 모든 독자적인 프로그램의 목적
프로그램들 앞에 붙임
시스템 프로그래밍
3.5 구현 예(Implementation Examples)
3.5.1 MS-DOS Linker: Pentium, x86
 MASM은 목적 모듈(object module) 생
성: .OBJ
 링크 편집기 LINK로 목적 모듈 또는
목적 코드 라이브러리(object code
libraries) 결합하여 실행 프로그램
(executable program) 생성
 목적 모듈
-
-
-
THEADR: 오브젝트 모듈 이름(SIC/XE
의 Header record)
TYPDEF: MS-DOS 목적 모듈, 코멘트
PUBDEF: 참조될 외부 심볼 리스트
EXTDEF: 참조된 외부 심볼 리스트
(SIC/XE의 EXTREF)
LNAMES: 세그먼트와 클래스 이름
SEGDEF: 세그먼트 이름, 길이, 배열
(alignmenr) 등 정보(reference number
기법으로)
GRPDEF: 세그먼트 그룹 정보
(reference number 기법으로)
12
-
-
-
-

LEDATA: 번역된 명령어와 소스
프로그램의 데이터(SIC/XE의 Text
record)
LIDATA: 반복 패턴으로 나타나는
LEDATA
FIXUPP: 외부 참조 해결, 재배치
및 세그먼트 그룹화에 관련된 주
소 수정
MODEND(SIC/XE의 End record)
-
• 번역된 명령어와 데이터 추출
• 메모리에 실행 프로그램의이미지
생성
• LEDATA, LIDATA, FIXUPP 레코드
처리하여 얻어진 이진 데이터를 패
스 1에서 계산한 세그먼트 주소에
메모리 이미지로서 기록
• 세그먼트 안에서의 재배치 수행
-
이중 패스 LINK
-
-
패스 1
• 각 세그먼트 시작 주소 계산
• SEGDEF의 레코드 순서대로 처리
• 다른 목적 모듈에 있으나 클래스
가 같고 이릅이 같은 세그먼트들
은 결합(combination)
• 클래스는 같으나 이름이 다른 세
그먼트들은 접합(concatenation)
• 심볼 테이블 생성: 각 세그먼트 안
에서의 상대적 주소 또는 각 외부
심볼의 주소
시스템 프로그래밍
패스 2
세그먼트 시작 주소를 segment
fixups 테이블에 더함
segment fixups 데이블은 실행위해
로드될 때 실제 세그먼트 주소를
반영하는 재배치에 사용됨
• 외부 참조 해결
-
메모리 이미지를 .EXE 파일로 기록
.EXE 파일 에는
• 헤더(header)
• 세그먼트 교정 테이블(the table of
segment fixups)
• 메모리 요구(memory requirements)
• 진입점(entry points)
• 레지스터 CS, SP의 초기 값
13
3.5.2 SunOS Linkers: SPARC
 두 종류 링커
-

링크 편집기(link-editor)
실행시간 링커(run-time linker)
링크 편집기(link-editor)
-
목적 모듈(object module)
• executable, writable 등 속성가지는 섹
션들로 구성됨
• 재배치와 링크 연산 리스트 가짐
• 심볼 테이블 가짐
-
입력 파일에서 같은 속성 가진 섹션들
은 접합됨
입력 파일의 심볼 테이블은 심볼 정의
및 참조의 매치(match)위해 처리됨
출력 파일 안의 재배치 및 링크 연산
도 수행됨
시스템 프로그래밍
출력 파일안에 새로운 심볼 테이블과
새로운 재배치 명령 세트 생성
• 심볼은 실행 시간에 바인드됨(bound)
• 재배치는 로드될 때 수행되어야 함 의미
-
재배치와 링크 연산 코드
• 수정될 필드 크기와 계산식
• 특정 기계의 명령어 형식과 주소지정 모
드에 따라 다른 코드
일반적 컴파일에서
하나의 출력 모듈(output module) 생성
• 재배치 목적 모듈(relocatable object
module)
• 정적 실행 가능(static executable)
• 동적 실행 가능(dynamic executable)
• 공유 객체(shared object)
-
-
-
-
(예) SPARC에만 24개 재배치 코드
x86 상에 구현된 SunOS linkers는 11 코
드 세트 이용
심볼 참조
• 보관소(archives): 재배치 가능한 목적 모
듈들의 모임
-
심볼 참조 일어나면 그 심볼이 정의된
모듈의 이름을 심볼과 연결(3.3.1 자동
라이브러리 탐색 참조)
• 공유 객체(shared objects): 이전의 linkedit으로 생성된 분리될 수 없는 단위
-
전체 공유 객체가 출력 파일의 논리적
부분이 됨
물리적으로는 포함되지 않고 공유 객체
에 대한 종속성만 기록
공유 객체 안의 모든 심볼 사용 가능
공유 객체의 실제 포함은 실행 시간까지
지연됨(3.4.2 동적 링크 참조)
14

실행시간 링커(run-time linker)
동적 실행 가능(dynamic excutables)
과 공유 객체(shared objects)를 실행
시간에 바인드
- 공유 객체의 다른 공유 객체에의 종
속성도 검사
- 세그먼트가 로드될 때 심볼들은 바인
드됨
- 프로시주어 호출의 바인딩은 프로그
램 실행시간까지 지연됨
= 게으른 바인딩(lazy binding)
-
• 전역 프로시주어의 처음 호출시 제어
가 실행시간 링커로 넘어가 프로시주
어 링크 테이블(procedure link table)
에 주소 기록
• 다음 호출부터는 링크 테이블을 통하
여 링커의 간섭 없이 바로 프로시주
어로
-
부가적인 유연성(flexibility) 제공
• 실행 시간에 새로운 공유 객체를 동
적으로 바인드
• 다수의 공유 객체 사용 가능
• 메모리 오버헤드 감소
시스템 프로그래밍
3.5.3 CRAY MPP Linker: Cray T3E
 PEs(processing elements)로 구성됨
-
-
local memory 가짐
다른 PE의 local memory (remote
memory) 접근 가능
하나의 응용 프로그램에는 PE들로
구성된 하나의 partition (parallel
architecture)이 배당됨
공유 데이터(shared data)
• (예) 배열의 분배와 공유: p165
Fig.3.16
-
사유 데이터(private data)
• 대부분 모든 PE에 복제됨
• 한 PE에만 존재할 수도
-
프로그램 하나가 로드되면 각 PE는
다음의 사본을 가짐: p166 Fig.3.17
• 실행 코드(executable code)
• 사유 데이터(private data)
• 공유 데이터(shared data)
15

MPP linker
-
-
-

프로그램 블록 또는 데이터의 리스
트 유지
리스트의 블록들은 실행 코드, 사유
데이터, 공유 데이터 등의 공동 특
성(common property)을 공유
리스트의 블록들을 모아 각 블록 마
다 주소 지정, 재배치, 링크 수행하
여 실행 파일 생성
실행 파일에는 필요한 PE들의 수와
제어 정보 포함
공유 데이터의 분배
-
partition의 PE들의 수에 따라 분배
PE들의 수 결정 시기
• 컴파일 시간에: 이후 수정 불가능
• 링크 로드 시간에: 링커가 고정 개
수의 PEs 위한 실행 가능(executable)
모듈 생성
• 실행 시간에: partition 개수 선택
 plastic executable
- 모든 재배치 가능 목적 모듈
- 모든 링커 지시자(directives)
(고정 개수 경우 보다 매우 큰 경향)
시스템 프로그래밍
16