리눅스 메모리 관리 관련 질문입니다.
리눅스 메모리 관리 관련 책을 보다가 시원하게 이해가 안되어서 질문 드립니다.
하나의 프로세스에서 사용하고 있는 메모리는 current 마크로를 추적하여 task_struct에 있는 struct mm_struct mmap 포인터를 따라가서 이놈이 가르키고 있는 링크드 리스트 형태의 vm_area_struct를 뒤져보면 모두 나온다고 알고 있습니다. 여기서 알아낸 주소값들은 모두 virtual address들이고요...
질문 드리겠습니다.
(1) 응용 프로그램에서 malloc()등을 이용해서 메모리를 할당하면 이때 새로운 struct vma_area_struct가 하나 생성되어 링크드리스트에 삽입되거나 혹은 하나의 vm_area_struct로 합칠 수 있는 경우면 하나로(하나의 region으로) 합치는게 맞나요 ?
(2) struct vm_area_struct내의 vm_start/vm_end 포인터 값은 virtual address의 시작과 끝의 주소값을 가르키고 있는데요...이들의 physical memeory 값을 알기 위해서는 struct mm_struct내의 pdg 값을 통해서(혹은 cr3 레지스터값을 통해서) 해당 페이지 테이블을 찾아서 접근하는게 맞나요 ?
(3) 32bit 구조를 갖는 시스템에서 프로세스는 4기가의 가상 메모리 공간을 가집니다. 이중에서 0~3기가 까지는 응용에서 사용하는 메모리 공간이고 나머지 1기가는 커널 주소 공간으로 매핑시킨다고 하고 모든 프로세스는 이 1기가 공간을 공유한다고 하더군요...그렇다면 여기서 1기가의 커널 주소 공간 또한 struct vm_area_struct가 가르키는 가상 주소 공간에 매핑이 되나요 ? 그리고 이공간은 모든 프로세스 들의 vm_area_struct가 동일하게 가르키고 있는것 맞나요 ?
(4) 커널 영역에서는 0~4기가의 메모리 주소 공간을 모두 접근할 수 있다고 알고 있습니다. 그렇다면 사용자 영역에서 작성한 자료구조들(예를 들면 링크드리스트 형태의 자료구조들)을 커널 메모리 공간에서 접근하는게/혹은 복사하는게 가능할 것 같은데요... 예전에 이런 질문을 이곳 게시판에 했었는데 안된다고 답변들 들어서요...왜 안되는지 저의 짧은 지식으로는 알 수가 없네요...
(5) i386 구조의 리눅스 환경에서는 segmentation과 paging을 적절히 적용해서 사용한다고 알고 있습니다. segmentation이라는게 프로그램을 구조적으로(코드영역, 스택영역, bss 영역등등..)으로 나누어서 쓰는것으로 알고 있습니다.그렇다면 segmentation과 paging을 함께 사용한다는 것은 segmentation으로 프로그램을 나누어서 나눈 영역들을 각각의 다른 페이지에 할당한다는 건가요 ? 그게 맞다면 strct vm_area_struct구조체는 segmentation로 각각 나뉘어진 영역별로 하나씩 혹은 뭉쳐서 할당되는 건지요 ?
질문을 하면서 느끼는 거지만 모르는것을 질문하려고 해도 어렵다는 것을 느낍니다. 내가 모르고 있는게 정확히 어느 부분이고 아는 부분이 어느 부분인지를 모르니....여튼 질문이 좀 거시기 합니다만, 여러 고수님들의 답변 부탁드립니다.
커널세계에서 사용자 공간으로 액세스 됩니다. 단~
(3)질문에 대해
-> kernel space에는 특별히 access right를 정한 memory region개념이 없는 걸로 알고 있습니다. 그러므로 커널에서는 액세스에 매우 신중해야 합니다. 아무데나 막쓸 수 있으니 corruption이 일어날 수있습니다. 그러나 커널용 페이지 테이블은 존재함
(4)질문에 대해
-> 커널세계에서 사용자 공간으로 액세스 됩니다. 단 그 때 당시 그 커널이 접근하고자 하는 사용자 프로세스와 동일한 주소공간을 가지고 있어야 합니다. 그러기 위해서는 해당 사용자 프로세스가 시스템 콜로 커널에 들어간 상태여야 하지요. 즉 process A, B가 있는데 A가 스스로 시스템 콜을 통해 커널 모드로 제어 흐름을 바꾼 상태에서 A의 가상주소로 들어갈 순있어도 B가 A의 가상주소에 있는 자료에 접근할 수 없습니다. 주로 copy_from_user() 라는 걸 쓰죠.
(5) 질문에 대해
segment라는 단어는 워낙이 일반적인 단어라서 여러군데에서 쓰입니다. 님이 말하는 segmentation-paging은 CPU가 알고 있는 logical address 를 linear address - physical address로 바꾸는 과정을 말하는 거죠. 프로그램 구조(예를 들어 code segment, bss segment)와는 다른 이야기입니다.
/***************************************
Being the one is just like being in love.
***************************************/
댓글 달기