리눅스 커널의 물리메모리 상 위치에 대해 질문드리고 싶습니다.
글쓴이: 익명 사용자 / 작성시간: 목, 2020/05/28 - 4:47오전
안녕하세요 리눅스 커널에 대해 갓 공부하기 시작한 학생입니다.
32bit 아키텍쳐의 가상메모리상에서 커널 이미지가 3g~4g 부분에 위치한다는 것은 알고 있는데, 이 커널 이미지가 물리메모리상에도 위치하고 있는건가요? 위치한다면 어느 위치에 있는건가요?
또, 가상 메모리의 3g~4g 부분에 위치한다면 이는 하나의 task의 가상메모리마다 각각의 커널 이미지가 위치하게 된다는 뜻인 것 같은데 그럼 이러한 각각의 커널 이미지들은 각자의 작업 내용을 서로 어떻게 공유하는 것인가요? (스케줄링 등을 위해)
공부를 시작한지 얼마 안되어 잘 모르는게 많습니다. 답변 주시면 감사하겠습니다.
Forums:
...
virtual memory 상에 있는 어떤 것도 실제 사용되려면 physical memory에 올라가 있어야 합니다. 커널 뿐만 아니라 유저 프로그램도 그렇습니다.
어느 위치에 놓을지는 커널 구현에 따를 만한 문제고 어떤 절대적인 이유가 있을 것 같진 않습니다.
그리고 아래 부분이 제일 뭔가 좀 사실과 다른 것 같습니다.
커널을 포함해서 어느 프로세스든 가상 메모리를 물리 메모리에 맵핑하게 됩니다. 보통은 프로세스마다 4G니 2의 64승 바이트니 하는 큰 메모리 공간을 부여받지만, 실제로 그만큼 쓰진 않죠. 따라서 실제로 사용되는 부분을 합산해 보면, 예컨대, 3기가 바이트가 안 됩니다.
따라서 커널은, 이를테면, foo라는 프로그램을 돌리는 프로세스 2094번이 실제로 사용하는 가상 메모리들만 물리 메모리의 어딘가에 맵핑합니다. 다시 말해, 예컨대 4G라는 가상 메모리 공간 전체를 미리 물리 메모리로 맵핑하지 않습니다. bar라는 다른 프로그램을 돌리는 프로세스 3012번도, 그게 실제 쓰는 가상 메모리들만 물리 메모리 다른 어딘가에 맵핑해 주는 식이죠.
그래서 물리 메모리 관점에서 보면, 여러 개의 프로세스/프로그램이 쪼개서 사용하고 있습니다.
흥미로운 건, 코드나 데이터를 공유할 때죠. 커널 코드, 데이터는 프로세스들 사이에 공유됩니다. 데이터는 커널이 런타임에 수행되면서 업데이트하는 것까지 포함해요.
이걸 "카피"로 해결한다면, 커널이 런타임에 업데이트하는 정보들, 그러니까 어떤 태스크가 있는지, 각각 무슨 파일을 열었는지, 물리 메모리의 어디를 쓰는지 등등 역시 카피해야 할 텐데 오버헤드가 크죠.
그래서 커널이 가상 메모리를 물리 메모리로 맵핑할 때, 커널 공간 (3-4기가 영역이라고 해보죠)은 프로세스에 관계없이 단 하나의 커널 코드/데이터가 올라가 있는 실제 물리 메모리 주소로 맵핑해 줍니다. 반면 유저 공간은 동일한 0x8000FF00이라는 가상 주소를 프로세스마다 각자 전혀 다른 물리 메모리 주소로 맵핑해 주고요.
그렇기 때문에 "공유"는 상대적으로 문제가 덜 되겠죠.
답변 감사드립니다! 헷갈리던 개념이 이해가 됐습니다.
답변 감사드립니다! 헷갈리던 개념이 이해가 됐습니다.
CR3
아마 참고로 보시는 책이 있다면 intel 32bit일 것 같네요.
가상 메모리를 구현한 CR3 레지스터 관련된 부분을 찾아 보세요.
process가 바뀌는 것은 해당 process 별 메모리 매핑이 바뀌는 과정이 들어갑니다.
페이지 디렉토리, 페이지 테이블들이 어떻게 process간 공유되는지 확인해보세요.
---
http://coolengineer.com
답변 감사드립니다
답변 감사드립니다
댓글 달기