가상메모리 요청에 대한 질문입니다.
글쓴이: poohmong / 작성시간: 월, 2007/07/09 - 10:45오후
The Linux Kernel에서 발췌한 내용입니다.
Quote:
어떤 주어진 시간 동안 한 프로세스는 가상 메모리에 들어 있는 코드와 데이터를 모두 사용 하지는 않는다. 코드 중에는 어떤 특정한 경우, 예를 들어 프로세스가 시작될 때 또는 어떤 이벤트가 발생할 때에만 필요한 코드가 있다. 그리고 공유 라이브러리의 루틴도 모두 사용 하는 것이 아니라 일부만 사용한다. 따라서 안 쓰일 수도 있는 코드를 실제 메모리에 모두 로드하는 것은 낭비가 될 수 있다. 이러한 낭비가 시스템내의 프로세스 수만큼 반복된다면 시스템은 매우 비효율적으로 실행될 것이다. 대신에 리눅스는 요구 페이징(demand paging)이 라는 기법을 사용한다. 요구 페이징에서는 프로세스의 가상 메모리를 사용하려고 하는 순간 에, 가상 메모리를 실제 메모리로 가져온다. 따라서 리눅스 커널은 프로세스의 코드와 데이 터를 곧바로 실제 메모리에 로드하는 대신, 프로세스의 페이지 테이블을 수정하여 가상 영 역에는 존재하고 있지만 실제로는 메모리에 있지는 않다고 표시한다. 만약 프로세스가 코드 나 데이터에 접근하려고 하면, 시스템은 페이지 폴트를 발생하고, 리눅스 커널로 하여금 그 상황을 해결하라고 제어권을 넘겨준다. 이러한 페이지 폴트를 해결하려면, 리눅스는 프로세 스의 주소 공간에 있는 모든 가상 메모리 영역에 대해, 그 가상 메모리가 어디에서 왔으며 어떻게 메모리에 로드할 수 있는 지를 알아야만 한다.
여기서 요구 페이징이 어떻게 일어나는지 커널에서 알고 싶습니다.
책에선. 그에대한 언급이 실제로 어떻게 일어나는지에 대해선 없는 것 같습니다.
제가 놓친것인지 아니면 다른 것을 참고해야지는지 혹여라 작은 정보라도 알고 계신 분이 있으시면
답변 부탁드립니다.
Forums:
유저 모드의
유저 모드의 프로세스는 brk(), mmap() 등의 시스템 콜을 사용하여 자신의 address space를 넓힐수 있습니다.
이때는 커널은 (일반적으로) 그 영역의 페이지들을 바로 할당하지 않고 vm_area_struct 같은 것들만 고칩니다.
그러면 새로 할당받은 영역에 read나 write를 시도하는 순간 page fault가 발생하게 되고
커널의 page fault handler에서 물리 메모리를 할당하고 필요한 경우 파일에서 그 페이지에 넣을 내용을 로드합니다.
답변 감사합니다.
운영체제를 공부하면서 궁금증이
실제로.. 필요한 함수나 다른 정보들에 대해서
항상 물리 메모리에 올려두지 않고 가상메모리에 두고 있다가
필요한 부분을 swap in 하여서 쓰고 있다고 알고 있습니다.
dg님이 설명하셨지만..
page fault가 발생하면do_page_fault() 예외 핸들러가 호출되고 이 함수에서 do_swap_page() 함수가 호출되어
swap in을 통해서 원하는 페이지를 물리 메모리로 올린다고 알고 있습니다.
dg님께서 설명하셨던 부분에서
read write 페이지가 물리메모리에 할당이 되어있든 가상메모리영역에 할당 되있던지 상관없이 접근이 발생하는 이벤트(?)
가 어떻게 일어 나는지 궁금합니다.
이런 이벤트가 일어나고 물리메모리에 있으면 그 페이지를 사용하고 없다면 page fault가 발생하고 swap이 발생할텐데
그 전 이벤트의 일어나는 과정을 알고싶습니다.
그 내용은 Understanding
그 내용은 Understanding the linux kernel 2장이나 보호모드를 설명하고 있는 어셈블리 책이나 CPU 메뉴얼 등에 나와 있습니다.
간단히 설명하면 CPU가 0x00008004 번지를 읽어서 어떤 레지스터에 로드하는 명령을 수행한다면
CPU는 페이지 테이블을 참조하여 가상주소 0x00008004 번지의 물리주소를 알아낸 후에 메모리에서 로드가 일어나게 됩니다.
페이지 테이블은 물리메모리에 들어있고 페이지 테이블의 물리주소는 CPU의 특수 레지스터에 들어 있습니다.
또는 페이지 테이블을 참조한 결과 0x00008004에 해당하는 물리주소가 존재하지 않을 수 있습니다. 이 경우에 CPU는 page fault를 발생시키고 따라서 커널의 page fault handler가 호출됩니다.
댓글 달기