리눅스 페이징에서 PAE 안쓰고 32비트 아키텍쳐일때의 구현?
안녕하세요.
리눅스 커널의 이해라는 책을 보고 있는데요..
도무지 해석이 안됩니다.
For 32-bit architectures with no Physical Address Extension, two paging levels are
sufficient. Linux essentially eliminates the Page Upper Directory and the Page Middle
Directory fields by saying that they contain zero bits. However, the positions of the Page
Upper Directory and the Page Middle Directory in the sequence of pointers are kept so
that the same code can work on 32-bit and 64-bit architectures. The kernel keeps a
position for the Page Upper Directory and the Page Middle Directory by setting the
number of entries in them to 1 and mapping these two entries into the proper entry of the
Page Global Directory.
1.
the Page Upper Directory and the Page Middle
Directory fields by saying that they contain zero bits.
-> 이 부분이 선형주소에서 해당 상위,중간 디렉토리 오프셋 지정하는 부분을 0으로 채우라는 건가요?
2.
the positions of the Page Upper Directory and the Page Middle Directory in the sequence of pointers are kept
->이게 대체 무슨 말인지 모르겠습니다. 포인터의 결과에서? 포인터가 가리키는? 아니 애당초 위에서 제거한 두 디렉토리를 유지한다는건 뭔소리인가요.
제거하겠다는 건가요 말겠다는 건가요..
3.
The kernel keeps a
position for the Page Upper Directory and the Page Middle Directory by setting the
number of entries in them to 1 and mapping these two entries into the proper entry of the
Page Global Directory.
-> 이 부분만 명확하게 설명이 되면 앞에꺼가 무슨 말인지 이해가 될텐데 전혀 이 부분 이해가 안가네요.
페이지 글로벌 디렉토리 적당한 엔트리에 2에서 언급한 위치에 유지시킨 엔트리를 연결시킨다고 하는거 같은데...
가령 어떤 선형 주소로 특정 페이지 접근한다고 할떄 페이지 글로벌 디렉토리 엔트리가 지정될텐데 그 엔트리 안에 바로 마지막 단계 테이블의 주소가 아닌
상위,중간 디렉토리 주소로 간다는 것은 결과적으로 각 글로벌 디렉토리 엔트리에 대해서 무조건 위의 상위 중간 디렉토리 엔트리로 간다는 의미가 되고
결과적으로 상위,중간 디렉토리는 무조건 각 엔트리마다 1개지만 유지가 되고 있다는 의미가 된다고 봐도 되나요?
즉 ,
글로벌 상위 중간 페이지테이블
A -> 1 -> 1 -> X
B -> 1 -> 1 -> Y
C -> 1 -> 1 -> Z
이처럼 글로벌 엔트리마다 기존처럼 상위 중간 테이블이 할당되지만 그 엔트리 수가 한개이고 바로 페이지 테이블이 연결되는 그런 의미인지..?
한글판 리눅스 커널의 이해... 이거 진짜 구글 번역기보다 못한 수준으로 번역되서(특히 이 부분) 있던 말도 빠지고 앞뒤도 꼬이고 그래서 한글판 읽어도 이해가 안가네요.
도와주세요 ㅠㅠ
...
DISCLAIMER: 전 리눅스 커널 구조에 대해 잘 모릅니다. 잘못된 해석이 있을 수 있습니다.
(Linux essentially eliminates the Page Upper Directory and the Page Middle Directory fields) by saying that they contain zero bits.
리눅스는 Page Upper Directory와 Page Middle Directory 필드를 사실상 없애버렸다(essentially eliminates). 어떻게? 얘들은 무조건 제로라고 정해 버려서.
sequence of pointers : 연속된 (여러 개의) 포인터. 아마도 포인터 A가 B를 가리키고 B가 C를 가리키고 C가 D를 가리키고...하는 상황을 나타내는 것으로 보입니다.
Essentially eliminate는 "사실상 없애버렸다", 즉 사실상 의미가 없는 것으로 만들어버렸다는 뜻이죠. 의미가 없기는 하지만 그 의미없는 포인터가 들어갈 자리는 32/64비트의 호환성을 위해 남겨두었다는 것으로 보입니다.
3번은 제가 보기에는 맞게 해석하신 것 같네요.
한글로된 책을읽으세요...
리눅스커널은 이미 한글로 번역 된 좋은책들도 많은데 구지왜 원서로보시는지...
PAE는 리눅스에서 32bit 주소를 사용할경우에 4기가 메모리 까지뿐리 지원이
되지않는 문제점을 개선하고자 생긴것입니다...
40bit address 인가? 계산해보면 암 ㅋㅋ 두어서 64G 메모리까지지원가능하게 해준것이죠..
페이징은 선형주소를 물리주소로 변환하는과정이고
선형주소를 물리적으로 변환하는과정에는 하드웨어의 지원과
소프트웨어적 처리 2가지가 존재할때 가능하다합니다.
페이징이란 소프트웨어적 지원이고 추가적으로 MMU가 존재해야
물리주소 변환이가능합니다...
물론 커널영역과같이 1:1매핑영역은 그냥 구해내면 되겠지만요...
영어는모르고 그냥 PAE라는말이있길래 주저리 떠들어봤습니다..
답변 감사합니다. 아쉽게도 답변 받기 전에 제
답변 감사합니다.
아쉽게도 답변 받기 전에 제 추측대로 한다는 사실을 찾았습니다.
ㅠㅠ 그런데 답변에 오류가 있는것 같아 끄적여봅니다.
일단 PAE라는 것은 일단 2가지에서 구현됩니다. CPU 그리고 kernel.
실제 선형 주소는 그대로 32비트 유지하면서 확장된 물리 메모리를 맵핑시켜주는 것이 kernel에서 해주는 것이구요.
그리고 실제로 그런 물리 메모리 RAM의 소자를 지정하기 위해서는 당연히 CPU의 주소선이 그정도가 있어야되죠.
64GB 메모리 지정하는데에 4GB때 32비트였는데 상식적으로 36비트 일겁니다.
그리고 한글로된 책도 안읽은 것은 아닙니다. 하지만 한글책들에서 이와 같은 자세한 내용은 생략되있습니다.
PAE 내용이야 쉬우니까 실려있겠지만 실제 리눅스에서의 페이징 구현이 4단계 테이블로 되어있고 각 아키텍쳐 상황마다
다르게 처리하여 2단계 테이블 혹은 3단계 테이블로 사용하기 위한 방식이 있다는것은 제가 가진 책에는 안나와있더군요...
그리고 이 사실이 적혀있는 리눅스 커널의 이해라는 성경과도 같은 책의 번역본은 구글번역기보다 못하게 나옵니다. 있던 말도 생략해놨고
거꾸로 쓴것도 있고...
인텔 개발자 메뉴얼을 읽어보세요
메모리 지정 방법에 대해서 자세히 나와있습니다.
PAE할당을 위해서 CPU가 반드시 32비트 이상의 메모리 주소대역을 가질 필요는 없습니다.
책으로 모든것을 배우기에는 책이 담고있는 내용으 많지는 않습니다.
리눅스 커널의 이해라는 그 갈색책인가요? 그것을 읽으시면은 대충 큰그립이 잡힐수 있다고 생각합니다.
그 책의 내용이 이해가 않된다면은 조금더 쉬운책을 보셔야 겠지요 그다음에 큰그림이 잡힌상태에서
세부적인 사항과 같은경우는 커널코드를 직접 해석해 보심이 어떠신지요..?
댓글 달기