본문 바로가기
Research/Linux

Re: 리눅스 커널의 메모리에서 이해가 안가는 부분입니다.

by sunnyan 2005. 8. 31.
728x90
http://linuxkernel.net/linux/bbs_lkqna.php?db=lkqna&mode=read&num=1676&page=1&ftype=6&fval=%c7%c1%b7%b9%c0%d3&backdepth=1홍현배 wrote:
>1. 리눅스가 세그멘테이션을 쓰지 않는다고 하는데, 그럼 어떻게 프로세스가 제공하는 보호모드의 이점을 취할 수 있다는 말인가.

segmentation은 옛날 x86 구조에서 나온 쓸데없는 것입니다. 모든 architecture에서 virtual memory는 paging을 이용합니다.

>2. 프로세스는 cpu가 지원하는 보호모드를 통해서 4GB의 가상 어드레스 공간을 사용할 수 있는데 모든 프로세스에게 4GB의 공간이 할당이 되는 것인지, 4GB의 어드레스 공간을 서로 안전하게 나누어 쓰는 것인가. 모든 프로세스에게 4GB가 할당되는 것이라면 세그먼트 레지스터를 통하여 선형주소가 여러개가 된다는 것을 추론할 수 있다.

모든 프로세스가 4GB의 별개의 주소 공간을 갖습니다. 이건 segmentation을 통하는 것은 아니고 각 프로세스가 별개의 page table을 갖고 있습니다. task switching이 일어날 때마다 page table directory를 가리키는 레지스터를 해당 프로세스의 page table directory를 가리키도록 바꿉니다.

>3. 커널은 자신을 안전하게 보호하기 위해 0xC0000000 부터의 어드레스 공간을 커널주소공간으로 규정하는데, __pa() 매크로를 사용하여 ((unsigned long)(x)-PAGE_OFFSET) 물리메모리의 0번지부터 메모리 매칭을 시킨다. 그런데 어차피 페이지디렉토리와 페이지테이블로써 물리메모리에 존재하는 페이지프레임의 위치를 찾는다면 꼭 이런 과정이 필요한 이유가 무엇인지 확실히 모르겠다. 커널의 안전보장을 위한 행위인가. 커널공간은 왜 페이징개념을 사용하지 않는 것인가.

커널은 0xc0000000 이상의 주소 공간만을 사용합니다. mapping은 0xc0000000이 물리 메모리를 가리키도록 하기 위해서입니다. 그래야 0xc0000000 이상의 주소에서 동작할 수 있겠죠. 물론 paging을 사용하면 어떻게든 page table이 필요하고, 커널 공간에서도 paging을 사용합니다. 다만 user process와 같은 demand paging, swapping은 성능을 이유로 구현하지 않습니다.

>4. 유저공간은 어떻게 처리하는가. 위와는 다르게

0xc0000000 이하의 공간을 맘대로 사용합니다.

>5. ucLinux를 보면 선형주소를 그대로 물리메모리주소로 사용하는 것 같은데, 32비트 선형주소공간이 물리메모리주소지정에는 엄청나게 큰 비트열인데 상위 비트열을 모두 무시하고 하위비트열만 사용하는 것인가.

??? MMU가 없으면 virtual memory를 사용할 수 없습니다. 그래서 physical address를 그대로 사용합니다. 하드웨어에는 DRAM만 있지 않습니다. 각종 장치와 controller의 memory, register가 physical address space에 mapping되어 있습니다.

>* 운영체제 정보를 찾아보고 그리고 논리적으로 정돈을 해도 이 부분은 아직까지 미스테리로 남아 있습니다. 조금 더 생각하면 풀 수 있는 문제 겠지만...조금 성급한 마음에 이렇게 무례한 질문을 드립니다.
>
>커널 프로그래머로써 당연히 알아야 할 문제인데 전 아직도 잘 모르겠습니다.

728x90