프로그램 실행 시 메모리에 적재되는 최초 명령어에 대해서 질문 드립니다.
글쓴이: renboy / 작성시간: 월, 2017/04/24 - 5:58오후
안녕하세요.
현재 프로그램 컴파일 후 프로그램 실행 시 진행되는 과정에 대해서 공부 중입니다.
다름이 아니라 인터넷에 제가 궁금한 부분을 도저히 찾질 못하겠어서 이렇게 질문드립니다.
프로그램이 실행되면 메인 메모리에 명령어가 적재되는 것으로 알고 있습니다.
함수 내부에 int a=10; 코드를 선언하면 "스택 영역에 4byte 크기의 데이터 영역를 확보하고 10 값을 넣어라" 라는 명령어가 적재되는 것으로 파악하고 있습니다.
(아니라면 알려주시기 바랍니다. 이 부분이 조금 모호하네요;;)
제가 현재 가장 궁금한 점은 프로그램 실행 시 로더가 실행 파일의 헤더 파일 읽어 메인 메모리에 프로그램을 적재한다는 부분입니다.
프로그램이 최초 실행되서 메인 메모리에 프로그램이 적재된다는 것 자체가
main 함수가 실행되기 위해 필요한 인자들과 전역 변수 같은 데이터들만 우선적으로 올라가는 것 인지...
아니면 명령어들만 적재되고 명령어에 따른 동작들은 명령 처리 후에 발생하는 것인지...
위에 어떤것이 맞는지 너무나 궁금합니다.ㅠㅠ
긴 글 읽어주셔서 감사합니다.
Forums:
실행파일은 운영체제마다 약간씩 포맷이 다르긴 하지만
실행파일은 운영체제마다 약간씩 포맷이 다르긴 하지만 대부분 다음과 같은 형식으로 구성되어있습니다.
1. 코드
2. 데이터(초기화 된 데이터, 초기화 안된 데이터)
여기서 코드는 말 그대로 cpu가 알아먹을 수 있는 명령어 집합들을 이야기하고
데이터는 초기화된 데이터와 초기화 안된 데이터로 구분됩니다.
초기화된 데이터라고 하면 전역변수, static변수 중에서 초기값을 가지는 것들입니다.
반대로 초기화 안된데이터는 전역변수, static변수 중 초기값이 없는 것들입니다.
초기화 된 데이터와 안된 데이터가 뭐시 중요하냐고 하신다면...
초기화 된 데이터는 일반적으로 실행파일 내에 같이 들어갑니다.
대신 초기화 안된 데이터는 실행파일에 포함 될 필요 없겠지요. 대신 얼마만큼 메모리를 잡아먹는다.. 라는 것만 들어갑니다.
사실 로더가 실행파일을 실행하기 위한 작업은 복잡합니다.
코드를 메모리에 올려야할 것이며, 초기화된 데이터 또한 메모리에 올려야합니다. 그리고 초기화 안된 데이터는 메모리를 할당 해줘야하지요.
그리고 동적 라이브러리를 사용한다면 이를 메모리에 올려야하며, 그에 따른 함수들의 메모리 주소를 매핑해줘야합니다.
이 모든것이 다 완료되면 운영체제는 미리 약속된 가상메모리의 특정 주소로 IP(instruction pointer)를 설정하게 되고
그때부터 프로그램이 시작 되는 것입니다.
질문하신 "프로그램 실행 시 로더가 실행 파일의 헤더 파일 읽어 메인 메모리에 프로그램을 적재한다" 라는 것은 좀 포괄적인데요.
프로그램을 적재한다는 것이 실행 직전 상태까지를 의미하는지, 그렇지 않으면 실행파일에 존재하는 코드+데이터를 메모리에 적재하는지에 따라서 답이 달라질 수 있습니다.
전자라면 위에 설명드린 IP설정 전까지라고 할수 있으며, 후자라면 단순 실행파일에 기술 된 코드+데이터를 메모리에 복사하는 것으로 한정할 수 있습니다.
공부하고 있으신 책 또는 자료의 앞뒤 문맥이 중요할 것 같네요. 같이 올려보시면 답변을 얻는데 도움이 되실겁니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
자세한 답변 너무나 감사드립니다.!!
선생님. 자세한 답변 너무나 감사드립니다.
선생님의 설명으로 전체적인 감을 잡을 수 있었습니다. 감사합니다.
그런데 한 가지만 더 여쭤봐도 될까요?
말씀하신 것중 "코드를 메모리에 올려야할 것이며, 초기화된 데이터 또한 메모리에 올려야합니다"
이 부분에서 궁금합니다.
질문 1.
말씀하신 코드 내의 명령어들에 대해서 궁금합니다.
이 명령어에 들어가있는 내용들은 main 함수에 관련된 명령어들만 우선적으로 들어가있고 main 함수가 실행되면서 프로그램이 동작하고, 동작 중에 추가적으로 생성되는 명령어들이 계속해서 메인 메모리로 올라가게 되는 것인가요??
질문 2.
초기화된 데이터 또한 메모리에 올려야한다는 부분에서도... 이때도 메인 메모리에는 명령어가 올라가게 되는것인지, 아니면 바로 전역 변수가 저장되는 데이터 영역에 메모리가 올라가는 것인지 궁금합니다.
바쁘신 와중에 수고스럽겠지만 답변 부탁드리겠습니다.
감사합니다 선생님!!
1. 사실 이건 운영체제 구현에 따라서 다를 수
1. 사실 이건 운영체제 구현에 따라서 다를 수 있습니다. 말씀하신대로 운영체제가 구현을 할 수도 있는 것이지요. 하지만 메모리가 부족하다거나 그런게 아니라면 그렇게 구현할 필요는 별로 없습니다. 일반적으로 모든게 다 준비 되면(코드든 데이터든 모든걸 메모리에 다 올리고 세팅 끝나면) 땅! 하고 어플리케이션의 가장 처음 entry point부터 시작하게 됩니다.
2. 초기화된 데이터는 말씀하신 read/write가 가능한 전역변수의 데이터영역에 올라갑니다. 예를 들어 static int a = 10;이라고 되어있다고 해서 a라는 데이터 영역을 확보하고 10이라는 상수값을 a라는 데이터 영역에 복사하는 코드가 생성되고, 이게 실행되는게 아닙니다. 실행파일 내에는 a라는 변수가 존재하고(그냥 특정 주소값이 되겠지요) 거기에 10이라는 값이 존재한다. 라고만 기입되어있고 로더가 데이터 영역에 10이라는 값을 복사해줍니다. 즉, 초기화는 모두 로더가 해줍니다. 초기화 코드는 실행파일내에 존재하지 않습니다. 일반적으로는 그렇습니다. 제가 일반적이라고 하는건 이걸 로더가 안하고 초기화 코드가 생성되고 직접 값을 복사하도록 운영체제를 구현할수도 있다는 이야기입니다. 하지만 일반적으로는 로더가 그 일을 해줍니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
답변이 중복으로 올라갔는데..
삭제하는 방법을 모르겠어서 이렇게 두겠습니다;; 죄송합니다.
댓글 달기