리눅스의 커널과 사용자 프로세스의 동적 메모리 요청과 물리 메모리 할당

eoskang의 이미지

1. 커널에서 동적 메모리 할당을 요청할 때와 사용자 프로세스에서 동적 메모리 할당을 요청할 때 동일한 물리 메모리 공간에서 할당받나요??

1번의 사항이 참이라면, 페이지 프레임 번호 1번은 커널의 가상주소에 매핑될 수 있고 커널이 해지한 이후에 사용자 프로세스의 가상주소에도 매핑 될 수 있다는 이야기가 됩니다.

cats96의 이미지

커널영역메모리공간은 커널로딩시 부터 존재하는공간이고,
사용자영역메모리공간은 사용자프로그램로딩시 존재하였다가 종료시 없어지는공간이므로,
사용자 프로그램만 접근 가능한공간입니다. 머 이것도 local memory area와 global memory area가 있지만 둘다 커널과의 연관성은 없습니다.

eoskang의 이미지

cats96님 답글 감사합니다. 그러나 님께서 말씀하시느 커널 영역 메모리 공간은 혹시 아래의 그림을 말하는 것이 아닌가요??

--------------
| Stack |
--------------
| Heap |
--------------
| Data |
--------------
| Text |
--------------

물론 커널에게 할당된 위의 메모리 영역은 사용자 프로세스가 접근할 수 없습니다.

제가 말하는 공간은 저런 공간을 이야기 하는것이 아니며

커널이 alloc_pages()을 호출하게 되면 Buddy System을 통해서 실제 물리 메모리에 접근하게 되는데요 이때 할당되는 물리 메모리의 공간

사용자가 do_page_fault()을 호출하게 되어 Buddy System을 통해서 할당되는 물리 메모리의 공간이 일치하는 지를 물어보는 것입니다.

headbang의 이미지

커널 모드에서나 사용자 모드에서나 사용하는 물리메모리 영역은 당연히 같습니다.
이렇게 생각하시면 됩니다.
사용자 모드에서는 바로 물리메모리 영역을 할당하지 못하고 커널 모드를 통해서 간접적으로 한다.
이럴 경우 물리메모리의 할당과 매핑은 동작은 거의 대부분 (혹은 전부?) 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은 커널 메모리 관리 모듈에서 보자면 할당되어 있는 상태입니다.

cats96의 이미지

검색해보니 아래와 같은 차이점이 있더군요.
참고하세요

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.

eoskang의 이미지

답변 감사합니다. 요구 페이징 때문에 malloc과 kmalloc의 차이가 발생하는 사실은 알고 있습니다.

제가 궁금한 사실은 위의 영문중 kmalloc returns physically contiguous memory에서의 physical memory와

다음 영문 중 malloc does not guarantee anything about the physical memory mapping에서의 physical memory가 같은 공간(풀) 인가에 대해서 입니다.

cats96의 이미지

kmalloc'ed memory is reserved and locked, it cannot be swapped.
=> kmalloc는 정해놓은 곳에 할당하고, 교환이 되지 않는다.

malloc does not actually allocate physical memory
=> malloc은 물리메모리에 할당이 되는지 보장하지 못한다.

이말은 kmalloc은 고정된공간에 할당이 되고, malloc는 call이 있을시
임의로 할당된다고 나와있네요.
고로 커널공간의 할당영역이랑, 유저영역의 할당영역은 별개라고 볼수있겠네요.

eoskang의 이미지

malloc가 호출되면 사실 brk라는 함수에 의해 힙의 공간만 확장하고 요구 페이징에 의해서 물리 메모리를 할당받게 됩니다.

즉, 물리 메모리에 할당이 되는지 보장하지 못한다는 말은 실제로 요구 페이징이 발생하지 않으면 brk로 힙의 공간만 늘린다는 말이 됩니다.

또한, 정해 놓은 곳을 할당하고 교환이 되지 않는다는 말은 free 할 경우 어떻게 동작할까요??

저 영문의 출처를 말해주시면 감사하겠습니다.

cats96의 이미지

영문글의 출처는 구글링해서 얻은것으로
kmalloc 과 malloc의 차이점을 묻는 질문에 대한 답입니다.
구글에서 kmalloc malloc로 검색하시면 바로 확인하실수있습니다.

물리 메모리에 할당이 되는지 보장하지 못한다는 말이 물리메모리가 할당이 안되는게 아니라,
아마도 어떤주소의 물리메모리가 할당되는지 보증을 못한다는 말 같네요.
물리메모리가 없이 동작한다는건 말도 안되는거고요.

* 정해 놓은 곳을 할당하고 교환이 되지 않는다는 말은 free 할 경우 어떻게 동작할까요??
==> 이건 무슨의미인가요? 위글의 내용으로 본다면 kmalloc의 경우 정해진 memory공간에 할당을 받아서 쓰는것입니다. 교환이 되지 않는다는말은 메모리영역이 교환되지 않는다는 의미인듯하네요.(고정이 되어있으니 변경이 되지 않는다는 의미로 봐도 될듯)

Necromancer의 이미지

예전에 이거 관련해서 한번 파 본 적이 있었는데.

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.