리눅스에서의 아키텍처별 메모리 관리 방법에 관해 궁금한 것이 있습니다.
글쓴이: lmk378 / 작성시간: 일, 2011/05/01 - 1:28오후
x86용 리눅스 메모리 관련 코드를 살펴보면 아키텍처의 특성에 맞도록4단계 페이징을 소스상 구현한 것을 알 수 있습니다.
헌데 arm계열의 경우 4단계 페이징을 사용하지 않음에도 불구하고 x86과 동일한 구조로 소스가 짜여저 있더군요.
예를들면 x86에는 pte pud pmd pte로 가상메모리를 나누어 물리주소로 변환하는 구조인데
이 구조는 실제 x86의 mmu가 하는 방식과 동일한 구조입니다.
헌데 이와 다른 메커니즘으로작동하는 arm의 mmu도 리눅스 소스에서는 x86과 동일한 방식으로 작성되어 있더군요.
generic한 코드를 유지하기 위해 실제 하드웨어의 작동방식이 다소 틀리더라도 맞도록 억지로 코드를 구성한 것인가요?
Forums:
흠..답변이 아직 없네요. 아시는분 없으신가요?
흠..답변이 아직 없네요. 아시는분 없으신가요?
저도 요즘 리눅스 커널의 가상메모리 관리 부분을
저도 요즘 리눅스 커널의 가상메모리 관리 부분을 공부하고 있어서 답글 달아 봅니다.
위에서 언급하신 것처럼 가상메모리주소를 실제 물리메모리주소로의 매핑은
보통 MMU(메모리 주소 관리 하드웨어 회로, 메모리 주소 디코더)를 통해서 이루어 집니다.
MMU는 하드웨어 장치이기 때문에 x86용 MMU, ARM용 MMU가 각각 장착되어 있어서
각각의 아키텍쳐별 가상메모리주소를 물리메모리주소로 연결해 줍니다.
그런데 항상 (가상메모리주소 >= 실제 물리메모리주소)의 조건 이므로
실제 물리메모리주소에서는 page fault 현상이 발생합니다.
그래서 물리메모리주소에서 가장 오래동안 사용하지 않았던 페이지를
하드디스크에 스와핑하고 이곳에 지금 사용하려고 하는 가상메모리 주소의
내용을 올리고 하는 종류의 다양한 메모리관리 알고리즘을 사용하게 되는데,
이 알고리즘은 x86, ARM, MIPS 등의 아키텍쳐에 상관없이 동일할듯 합니다.
그래서 리눅스에서 동일한 코드를 사용하는듯...
From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
답변 감사드립니다. 제가 글솜씨가 없어서 혼란스럽게
답변 감사드립니다.
제가 글솜씨가 없어서 혼란스럽게 적어논것 같습니다.^^;
제가 궁금했던점은 다른 arch가 동일한 소스코드를 사용하는 이유보다는
어떻게 다른 arch에서 동일한 코드로 구현이 가능한가 입니다.
MMU의 동작방식과는 전혀 무관한 부분입니까?
한참 지난 글이지만 여차여차해서 이해한 정도로 자답을
한참 지난 글이지만 여차여차해서 이해한 정도로 자답을 달아봅니다.(답이 아닐수도 있습니다.)
mmu의 물리주소 변환은 알.아.서. 합니다. 레지스터 세팅만 해주면 알아서 합니다. 신경쓸 필요가 없습니다.
즉 소프트웨어가 할 일은 위의 "레지스터 세팅" 부분인데 이것을 어떻게 효율적으로 관리할지가 바로
커널이 할 일입니다. 때문에 굳이 arm, x86을 구분하여 구성할 필요가 없는 것입니다.(라고 이해합니다.)
잘못된 부분이 있다면 태클 환영합니다.
댓글 달기