728x90
CSAPP
7.4 재배치 가능한 목적파일
- 컴파일 파이프라인에서 어셈블리 단계의 결과물
- C 언어 프로젝트의 임시 결과물로 간주, 이후 최종 결과물을 만드는 주 재료다.
- 링커가 수행하는 과정에서 비롯된다. 링커는 재배치 가능한 목적 파일 여러개를 모아서 더 큰 목적파일을 형성하는데, 하나의 재배치 가능한 목적 파일에서 나타나는 기계 수준의 명령어는 다른 재배치 가능한 목적 파일에서 나온 기계 수준의 명령어 다음에 위치한다. (즉, 명령어가 이동할 수 있거나 재배치 가능하다는 점을 의미한다)
- 따라서, 재배치 가능한 목적 파일에서 명령어는 주소를 갖지 않는다. 링크 단계를 거치고나서 명령어는 주소를 갖는다.
7.9 실행 가능 목적 파일의 로딩
- 실행 가능 목적파일 prog를 실행하기 위해서, 리눅스 쉘의 명령줄에 그 이름을 다음과 같이 입력할 수 있다.
/prog
- prog가 내장 쉘 명령어에 대응되지 않기 때문에 쉘은 prog가 실행 가능한 목적파일 이라고 가정되며 쉘은 로더라고 알려진 메모리 상주 운영체제를 호출해서 이 프로그램을 실행한다. 모든 리눅스 프로그램은 execve 함수를 호출해서 로더를 호출할 수 있다.
- execve 함수 : 다른 프로그램을 실행하고 자신을 종료한다.
- 로더는 디스크로 부터 실행 가능한 목적파일 내의 코드와 데이터를 메모리로 복사하고, 이 프로그램의 첫 번째 인스트럭션, 즉 엔트리 포인트로 점프해서 프로그램을 실행한다. 이와 같이 프로그램을 메모리로 복사하고 실행하는 과정을 로딩이라고 한다.
- 모든 실행 중인 리눅스 프로그램은 그림과 유사한 런타임 메모리 이미지를 가진다. x86-64 리눅스 시스템에서 코드 세그먼트는 주소 0x400000에서 시작하고, 뒤이어 데이터 세그먼트가 온다. 런타임heap은 데이터 세그먼트 다음에 따라오고, malloc 라이브러리를 호출해서 위로 성장한다. 이 다음에는 공유 모듈들을 위해 예약된 영역이 존재한다. 사용자 스택은 가장 큰 합법적 사용자 주소(2^48-1) 아래에서 시작해서 더 작은 메모리 주소 방향인 아래로 성장한다. 스택 위의 영역은 운영체제의 메모리 상주 부분인 커널의 코드와 데이터를 위해 예약되어있다.
- 단순화 하기 위해서 힙, 데이터, 코드 세그먼트를 붙여서 표시했으며, 스택의 탑을 최대 합법 사용자 주소에 배치했다. 실제로는 .data 세그먼트의 정렬요건으로 인해 코드와 데이터 세그먼트 사이에 공간이 존재한다. 또한, 링커는 런타임 주소를 스택, 공유 라이브러리, 힙 세그먼트에 할당할 때, 주소공간 배치 랜덤화 ASLR를 사용한다.
- 비록 이들 영역의 위치가 프로그램이 실행될 때 매번 변경될지라도 이들의 상대적인 위치는 동일하다.
- 로더가 돌아갈 때 위 그림과 유사한 메모리 이미지를 생성한다. 실행 파일 내부의 프로그램 내부의 프로그램 헤더 테이블에 따라 실행 파일의 덩어리를 코드와 데이터 세그먼트로 복사한다. 다음으로, 로더는 프로그램의 엔트리 포인트로 점프하며, 이것은 항상 _start 함수의 주소가 된다. 이 함수는 시스템 목적파일 ctr1.o에 정의되어 있으며, 모든 C프로그램에서 이 점은 동일하다. _start 함수는 시스템 초기화 함수인 __libc_start_main을 호출하며, 이것은 libc.so 에 정의되어 있다. 이 함수는 실행 환경을 초기화 하고, 사용자 수준의 main 함수를 호출하고, 리턴 값을 처리하며, 필요한 경우 제어권을 커널로 넘겨준다.
8. 예외적인 제어 흐름
- 프로세서에 전원을 처음 공급하는 시점부터 전원을 끌 때까지 프로그램 카운터는 연속된 값들을 가정한다. 인스트럭션 Ik 에 대응되는 주소가 ak이다 ak에서 ak+1로의 전환은 제어이동이라고 부른다.
- 가장 간단한 유형의 제어흐름은 ‘점진적인’ 순서로, 각각 Ik와 Ik+1 이 메모리에 서로 나란히 있는 경우다. 일반적으로 점진적인 흐름에 갑작스럽게 변화가 생기는 경우는 jump, call 리턴 같은 친숙한 프로그램 인스트럭션에 의해 발생한다. 이러한 명령어들은 프로그램 변수에 의한 내부 프로그램 상태 변화에 프로그램이 반응하도록 하기 위하여 반드시 필요한 메커니즘이다.
- 그러나 시스템들은 또한 내부 프로그램 변수에 의해 표시되지 않으며, 프로그램의 실행과는 반드시 관련되어 있지 않은 시스템의 상태의 변화에도 반응할 수 있어야 한다. 예를 들어, 하드웨어 타이머는 규칙적인 간격으로 꺼지며, 시스템은 이것을 반드시 처리 해줘야 한다. 패킷들은 네트워크 어댑터에 도착하고 메모리에 저장되어야 한다. 프로그램은 디스크로부터 데이터를 요청하며, 그 후에 데이터가 준비되었다는 통지를 받을 때 까지 잠든 상태에 들어간다. 자식 프로세스를 생성하는 부모 프로세스는 자신의 자식이 종료할 때 통지를 받아야 한다.
- 현대의 시스템들은 제어흐름의 갑작스런 변화를 만드는 방법으로 이러한 상황에 반응한다. 일반적으로 이와 같은 급격한 변화를 예외적인 제어흐름(exceptinal control flow : ECF) 라고 부른다. 예외적인 제어흐름은 컴퓨터 시스템의 모든 수준에서 발생한다. 예를 들어, 하드웨어 수준에서 하드웨어에 의해서 검출되는 이벤트들을 예외 핸들러로 갑작스런 제어이동을 발생시킨다. 운영 체제 커널 수준의 문맥전환을 통해서 사용자 프로세스에서 다른 프로세스로 제어가 이동한다. 응용수준에서 프로세스는 시그널을 수신하는 곳에 있는 시그널 핸들러로 제어를 급격히 이동하는 다른 프로세스로 시그널을 보낼 수 있다. 개별 프로그램은 일반적인 스택 운영을 회피하고 다른 함수 내 임의의 위치로 비지역성 점프를 하는 방법으로 에러에 대응할 수 있다.
- 프로그래머로서 ECF를 이해하는 여러 중요한 이유
- 중요한 시스템을 이해하는데 도움이 된다. ECF는 운영체제가 입출력, 프로세스, 가상메모리를 구현하기 위해 사용하는 기본 메커니즘이다.
- 응용들이 어떻게 운용체제와 상호 작용하는지를 이해하는데 도움이 된다. 응용은 트랩 또는 시스템 콜이라고 알려진 ECF에 한 가지 형태를 사용해서 운영체제로 부터 서비스를 요청한다. 기본 시스템 콜을 이해하면 어떻게 이러한 서비스들이 응용에 제공되는지 이해하는데 도움이 된다.
- 재미있는 새로운 응용 프로그램 도움이 된다. 운영체제는 새로운 프로세스를 만들거나, 프로세스가 종료하기를 기다리거나, 다른 프로세서에게 시스템 내의 예외 이벤트를 알리거나, 이러한 이벤트를 감지하고 반응하는등의 작업을 위한 강력한 ECF 메커니즘을 응용 프로그램들에 제공한다. 만일 이 ECF 메커니즘들을 이해한다면, 이들을 사용해서 Unix 쉘과 웹서버 같은 흥미로운 프로그램을 작성할 수 있다.
- 동시성을 이해하는데 도움이 된다. ECF는 컴퓨터 시스템에서 동시성을 구현하는 기본 메커니즘이다.
- 소프트웨어 적인 예외사항이 어떻게 동작하는지 이해하는데 도움이 된다. 소프트웨어 예외는 프로그램이 에러 발생시에 비지역성(nonlocal)점프 (즉, 일반적인 call/return 스택 방식에 위배되는 점프)를 하도록 해준다. 비지역성 점프는 응용 수준의 ECF이며 C에서는 setjmp,longjmp함수로 제공된다.
C언어
- 배열
- 자료형 변수이름 [원소개수]
- const
- 상수, 그 값이 주어지고 그 값이 영원히 바뀌지않는다.
- 포인터
- 메모리 상에 위치한 특정 데이터의 (시작)주소값을 보관하는 변수
- 간접접근 할 때 사용한다. 프로그램은 스택과 코드 섹션에는 직접 접근이 가능하다. 힙에는 직접 엑세스하지 않는데, 프로그램의 정책은 힙에 직접적으로 엑세스하지 않는것이다.
- 포인터를 사용하는 이유
- Accessing Heap
- Accessing Resource
- Parameter Passing
- & 연산자 피연산자의 주소값을 불러온다.
-
- 연산자 피연산자의 주소에 접근한다.
- 상수 포인터
- const int* - 값을 상수화
- int* const - 주소를 상수화
- 포인터의 덧셈 → 배열 인덱스
- []연산자 → a[3] ⇒ *(a+3)
- 포인터 배열
- 2차원 배열은 메모리에 선형으로 존재한다.
가상화
- 가상화는 서버, 스토리지, 네트워크 및 기타 물리적 시스템에 대한 가상표현을 생성하는데 사용할 수 있는 기술이다.
- 가상 소프트웨어는 물리적 하드웨어 기능을 모방하여 하나의 물리적 머신에서 여러 가상 시스템을 동시에 실행한다. 컴퓨터가 하드웨어 리소스를 디지털로 분리된 여러 환경과 공유할 수 있도록 하는 프로세스다. 각 가상화된 환경은 메모리, 처리능력, 스토리지등 할당된 리소스내에서 실행된다.
- 가상화의 이점
- 효율적인 리소스 사용
- 자동화된 IT관리
- 신속한 재해복구
728x90
'Study > TIL(Today I Learned)' 카테고리의 다른 글
24.02.04 CSAPP 8.1.2 - 8.1.3, 8.5 - 8.5.4, C & C++ (3) | 2024.02.04 |
---|---|
24.02.03 CSAPP 8.1.1, AVL트리 (0) | 2024.02.04 |
24.02.01 CSAPP 7, 7.1, 7.4 (1) | 2024.02.02 |
24.01.31 CSAPP 9.9.4, 백준 (1) | 2024.01.31 |
24.01.30 퀴즈, CSAPP 9.8 - 9.9.3, 백준 (2) | 2024.01.31 |