프로세스 실행에 대한 질문...
글쓴이: 익명 사용자 / 작성시간: 수, 2002/09/18 - 8:45오후
개념적인 것에 요즘 무지 궁금증이 생깁니다. 그전에는 그냥 막
프로그래밍만 하고 그랬는데... 질문은 다음과 같습니다.
int main(void)
{
int a = 5;
f(a);
return 0;
}
int f(int x)
{
return x;
}
간단하게 이런 프로그램이 있다고 했을 때 shell에서 컴파일된 실행
파일을 치고 엔터를 치면 fork되면서 Entry Point인 main이
OS에서 확인되어 메모리로 로딩되고 main()함수 다음부터 실행하다가
함수 f(a);가 호출 될 때
이 프로그램의 프로세스 스택영역 중 Ret에 현재 수행중인 위치를
저장하고 함수 f()로 분기하는걸로 알고 있는데...
함수 f()로 분기 할 때 인터럽트가 걸려 OS의 도움으로 함수 f()를
호출하여 f()의 코드가 있는 영역이 실행되게 되는지 아니면 이미
컴파일 했을 때
함수 f();의 정의부분 시작 어드레스가 정해져서 그냥 함수 f()로 분기
하는지 궁금합니다.
즉, 함수로 분기 할 때 OS의 도움으로 분기하느냐? 아니면 그냥
분기하느냐가 궁금합니다.
Forums:
Re: 프로세스 실행에 대한 질문...
OS 의 도움으로 커널 모드로 들어가야 하는건, 시스템 콜입니다.
그냥 단순한 함수는, code 세그먼트에 들어가서 바로, 콜할때,
그 주소로 넘어가게 됩니다. 파라매터는 각 방식에 따라서 틀리게
동작하구요. 그럼 고운 하루되시길...
Re: 보호모드상에서 프로그램의 동작..
궁금이님이 질문하신 내용은
운영체제 수업이나 컴파일러 수업때 나오는 내용이네요..
우선 결론은 요즘같은 보호모드상에서 프로그램이
실행될때에는 간접적으로(어찌보면 운영체제가 없으면
실행이 불가능하니 직접적이라고 봐두되나요 ^^) 도움을 받습니다.
먼소리고 하니..
컴파일과 링크가 되는 과정에서 함수나 여러 변수들, 특히 스태틱이나
전역변수의 상대적인 주소가 결정이 됩니다.
(이 주소 정보와 프로그래머가 지어준 원래 변수명 그리고 소스에서
위치 정보를 디버깅 정보라고 하는데, 프로그램 실행시는 필요가 없어서
빠지지만 디버깅을 한다하고 컴파일러와 링커한테 알려주면,
디비거가 이 정보를 가지고 컴퓨터만 알아 듣는 주소 정보를
사람도 알아보게 소스에서의 위치, 구조체라면 그 상세한 내역을 보여주
죠..)
그런데 바이너리에 포함된 주소는 실제의 물리적인 메모리가 아닌
가상의 주소이니까 이것이 실제적인 메모리의 주소로 변환이 되어야
하는데, 이때 운영체제의 도움이 필요 합니다.
가상메모리를 실제 물리적인 메모리로 주소변환 과정에
cpu의 MMU(Memory Management Unit)가 관여를 하는데
이때 사용하는 가상메모리와 실제메모리간의 맵핑을 담당하는
자료구조를 os가 관리를 해줍니다.
또 주소가 변환이 이루어 지는 과정에서도..
스왑아웃이 된 상황이라면 페이지 폴트가 일어나서
운영체제가 디스크에서 다시 메모리로 스왑인 시켜주는
과정이 일어나죠..
이게 운영체제가 프로그램을 실행 시킬때 거들어 주는 내용입니다.
그러나 실행하는 함수자체의 주소는 상대적이기는 하지만,
프로그램이 가지고 있습니다.
좀더 자세히 설명을 하자면 링커와 로더에 대한 설명도 있어야 하는데
이것은 궁금이 님이 더 궁금하면 아래의 책을 읽어 보세요
Linkers and Loaders
http//www.wowbook.com/generic/book/info/book_detail.asp?isbn=ISBN1-55860-496-0
또, 보호모드에 관해서 더 알고 싶다면,
이호님이 작성하신 Intel 80386 Protected Mode (한글)
http//www.ezdoum.com/stories.php?story=02/05/10/5990080
Overview of the Protected Mode Operations of the Intel Architechrure
http//www.ezdoum.com/stories.php?story=02/04/13/8727926
의 자료를 추전합니다.
그리고 리눅스에서 메모리관리가 궁금하시다면
http//www.ezdoum.com/stories.php?story=02/05/01/2631437
이것도 도움이 될껍니다.
댓글 달기