커널영역메모리공간은 커널로딩시 부터 존재하는공간이고,
사용자영역메모리공간은 사용자프로그램로딩시 존재하였다가 종료시 없어지는공간이므로,
사용자 프로그램만 접근 가능한공간입니다. 머 이것도 local memory area와 global memory area가 있지만 둘다 커널과의 연관성은 없습니다.
커널 모드에서나 사용자 모드에서나 사용하는 물리메모리 영역은 당연히 같습니다.
이렇게 생각하시면 됩니다.
사용자 모드에서는 바로 물리메모리 영역을 할당하지 못하고 커널 모드를 통해서 간접적으로 한다.
이럴 경우 물리메모리의 할당과 매핑은 동작은 거의 대부분 (혹은 전부?) page fault 핸들러가 관여를 합니다.
지적질(?)을 좀 하자면 이렇습니다.
o 사용자 모드에서는 do_page_fault() 수행하지 않습니다. 커널 모드에서 수행합니다.
o do_page_fault()와 alloc_pages()의 관계는 do_page_fault()가 alloc_pages() 를 직간접적으로 호출하는 관계입니다.
(do_page_fault()에서는 한꺼번에 두개 이상의 page frame을 없을 듯 해서 alloc_pages()대신 다른 함수를 쓸 듯 합니다)
원래 질문 내용 중에서도
"1번의 사항이 참이라면, 페이지 프레임 번호 1번은 커널의 가상주소에 매핑될 수 있고 커널이 해지한 이후에 사용자 가상 주소에도 매핑 될 수 있다는 이야기가 됩니다."
-->
커널이 해지한 이후에 사용자 가상 주소에 매핑한다는 것도 있을 수 없는 상황입니다.
사용자 가상 주소 공간에 매핑하기 위해 커널이 page frame을 할당하는 것입니다.
즉, 사용자 가상 주소에 매핑되어 있는 page frame은 커널 메모리 관리 모듈에서 보자면 할당되어 있는 상태입니다.
kmalloc returns physically contiguous memory, malloc does
not guarantee anything about the physical memory mapping.
The other main difference is that kmalloc'ed memory is
reserved and locked, it cannot be swapped. malloc does not
actually allocate physical memory. Physical memory gets
mapped later, during use.
영문글의 출처는 구글링해서 얻은것으로
kmalloc 과 malloc의 차이점을 묻는 질문에 대한 답입니다.
구글에서 kmalloc malloc로 검색하시면 바로 확인하실수있습니다.
물리 메모리에 할당이 되는지 보장하지 못한다는 말이 물리메모리가 할당이 안되는게 아니라,
아마도 어떤주소의 물리메모리가 할당되는지 보증을 못한다는 말 같네요.
물리메모리가 없이 동작한다는건 말도 안되는거고요.
* 정해 놓은 곳을 할당하고 교환이 되지 않는다는 말은 free 할 경우 어떻게 동작할까요??
==> 이건 무슨의미인가요? 위글의 내용으로 본다면 kmalloc의 경우 정해진 memory공간에 할당을 받아서 쓰는것입니다. 교환이 되지 않는다는말은 메모리영역이 교환되지 않는다는 의미인듯하네요.(고정이 되어있으니 변경이 되지 않는다는 의미로 봐도 될듯)
brk()로 줄이기도 가능합니다. (segment end 지점을 낮춰버리면 됨)
보통 sbrk()로 끝지점 주소 알아낸 다음 여기에 적당히 가감해서 brk() 불러내는 식으로 돌아갑니다.
그리고 한번에 할당 요구한 공간이 크면 brk()보다는 mmap()/munmap()으로 갑니다.
swap 안된다는 것은 메모리 할당 해제와는 전혀 상관 없고요
물리메모리 모자랄 때 안쓰는 물리 메모리를 디스크로 저장한뒤 당장에 필요한 것을 물리 메모리로 올리는걸 swap이라고 하는데. 이걸 허용 안한다는 뜻입니다. 드라이버 만들다 보면 이게 필요한 경우 종종 있습니다. (ex:디스크 조작관련 코드) 리눅스는 커널이 사용하는 메모리 전체가 스왑 금지입니다.
커널영역메모리공간
커널영역메모리공간은 커널로딩시 부터 존재하는공간이고,
사용자영역메모리공간은 사용자프로그램로딩시 존재하였다가 종료시 없어지는공간이므로,
사용자 프로그램만 접근 가능한공간입니다. 머 이것도 local memory area와 global memory area가 있지만 둘다 커널과의 연관성은 없습니다.
커널 영역 메모리 공간이라 함은.???
cats96님 답글 감사합니다. 그러나 님께서 말씀하시느 커널 영역 메모리 공간은 혹시 아래의 그림을 말하는 것이 아닌가요??
--------------
| Stack |
--------------
| Heap |
--------------
| Data |
--------------
| Text |
--------------
물론 커널에게 할당된 위의 메모리 영역은 사용자 프로세스가 접근할 수 없습니다.
제가 말하는 공간은 저런 공간을 이야기 하는것이 아니며
커널이 alloc_pages()을 호출하게 되면 Buddy System을 통해서 실제 물리 메모리에 접근하게 되는데요 이때 할당되는 물리 메모리의 공간
사용자가 do_page_fault()을 호출하게 되어 Buddy System을 통해서 할당되는 물리 메모리의 공간이 일치하는 지를 물어보는 것입니다.
커널 모드에서나
커널 모드에서나 사용자 모드에서나 사용하는 물리메모리 영역은 당연히 같습니다.
이렇게 생각하시면 됩니다.
사용자 모드에서는 바로 물리메모리 영역을 할당하지 못하고 커널 모드를 통해서 간접적으로 한다.
이럴 경우 물리메모리의 할당과 매핑은 동작은 거의 대부분 (혹은 전부?) page fault 핸들러가 관여를 합니다.
지적질(?)을 좀 하자면 이렇습니다.
o 사용자 모드에서는 do_page_fault() 수행하지 않습니다. 커널 모드에서 수행합니다.
o do_page_fault()와 alloc_pages()의 관계는 do_page_fault()가 alloc_pages() 를 직간접적으로 호출하는 관계입니다.
(do_page_fault()에서는 한꺼번에 두개 이상의 page frame을 없을 듯 해서 alloc_pages()대신 다른 함수를 쓸 듯 합니다)
원래 질문 내용 중에서도
"1번의 사항이 참이라면, 페이지 프레임 번호 1번은 커널의 가상주소에 매핑될 수 있고 커널이 해지한 이후에 사용자 가상 주소에도 매핑 될 수 있다는 이야기가 됩니다."
-->
커널이 해지한 이후에 사용자 가상 주소에 매핑한다는 것도 있을 수 없는 상황입니다.
사용자 가상 주소 공간에 매핑하기 위해 커널이 page frame을 할당하는 것입니다.
즉, 사용자 가상 주소에 매핑되어 있는 page frame은 커널 메모리 관리 모듈에서 보자면 할당되어 있는 상태입니다.
검색해보니 아래와
검색해보니 아래와 같은 차이점이 있더군요.
참고하세요
There are two major differences:
kmalloc returns physically contiguous memory, malloc does
not guarantee anything about the physical memory mapping.
The other main difference is that kmalloc'ed memory is
reserved and locked, it cannot be swapped. malloc does not
actually allocate physical memory. Physical memory gets
mapped later, during use.
위 영문에서 ..
답변 감사합니다. 요구 페이징 때문에 malloc과 kmalloc의 차이가 발생하는 사실은 알고 있습니다.
제가 궁금한 사실은 위의 영문중 kmalloc returns physically contiguous memory에서의 physical memory와
다음 영문 중 malloc does not guarantee anything about the physical memory mapping에서의 physical memory가 같은 공간(풀) 인가에 대해서 입니다.
kmalloc'ed memory is
kmalloc'ed memory is reserved and locked, it cannot be swapped.
=> kmalloc는 정해놓은 곳에 할당하고, 교환이 되지 않는다.
malloc does not actually allocate physical memory
=> malloc은 물리메모리에 할당이 되는지 보장하지 못한다.
이말은 kmalloc은 고정된공간에 할당이 되고, malloc는 call이 있을시
임의로 할당된다고 나와있네요.
고로 커널공간의 할당영역이랑, 유저영역의 할당영역은 별개라고 볼수있겠네요.
malloc는..
malloc가 호출되면 사실 brk라는 함수에 의해 힙의 공간만 확장하고 요구 페이징에 의해서 물리 메모리를 할당받게 됩니다.
즉, 물리 메모리에 할당이 되는지 보장하지 못한다는 말은 실제로 요구 페이징이 발생하지 않으면 brk로 힙의 공간만 늘린다는 말이 됩니다.
또한, 정해 놓은 곳을 할당하고 교환이 되지 않는다는 말은 free 할 경우 어떻게 동작할까요??
저 영문의 출처를 말해주시면 감사하겠습니다.
영문글의 출처는
영문글의 출처는 구글링해서 얻은것으로
kmalloc 과 malloc의 차이점을 묻는 질문에 대한 답입니다.
구글에서 kmalloc malloc로 검색하시면 바로 확인하실수있습니다.
물리 메모리에 할당이 되는지 보장하지 못한다는 말이 물리메모리가 할당이 안되는게 아니라,
아마도 어떤주소의 물리메모리가 할당되는지 보증을 못한다는 말 같네요.
물리메모리가 없이 동작한다는건 말도 안되는거고요.
* 정해 놓은 곳을 할당하고 교환이 되지 않는다는 말은 free 할 경우 어떻게 동작할까요??
==> 이건 무슨의미인가요? 위글의 내용으로 본다면 kmalloc의 경우 정해진 memory공간에 할당을 받아서 쓰는것입니다. 교환이 되지 않는다는말은 메모리영역이 교환되지 않는다는 의미인듯하네요.(고정이 되어있으니 변경이 되지 않는다는 의미로 봐도 될듯)
예전에 이거
예전에 이거 관련해서 한번 파 본 적이 있었는데.
brk()로 줄이기도 가능합니다. (segment end 지점을 낮춰버리면 됨)
보통 sbrk()로 끝지점 주소 알아낸 다음 여기에 적당히 가감해서 brk() 불러내는 식으로 돌아갑니다.
그리고 한번에 할당 요구한 공간이 크면 brk()보다는 mmap()/munmap()으로 갑니다.
swap 안된다는 것은 메모리 할당 해제와는 전혀 상관 없고요
물리메모리 모자랄 때 안쓰는 물리 메모리를 디스크로 저장한뒤 당장에 필요한 것을 물리 메모리로 올리는걸 swap이라고 하는데. 이걸 허용 안한다는 뜻입니다. 드라이버 만들다 보면 이게 필요한 경우 종종 있습니다. (ex:디스크 조작관련 코드) 리눅스는 커널이 사용하는 메모리 전체가 스왑 금지입니다.
Written By the Black Knight of Destruction
Written By the Black Knight of Destruction
댓글 달기