커널모드에서 세그멘 테이션

익명 사용자의 이미지

질문있습니다.

사용자 모드에서 세그멘테이션이 일어나는 것은 확실히 알겠는데...

커널 모드에서는 어떻게 되는지 모르겠습니다.

예를 들어 buddy system이나 slab을 이용할 때는 어떻게 되는지...

또 vmalloc 을 사용할 때는 어떻게 되는지...

커널 모드에서는 가상메모리를 사용하지 않잖아요?(확실히 모르겠네요..)
세그멘트를 지원하는 공간이 가상 메모리인데 이것이 없으니 세그멘테이션
이 안되나요??? 으악 모르겠습니다...

도움을 부탁드립니다. 관련 자료 있는 곳이라도 가르쳐 주십시오...

익명 사용자의 이미지

질문하신 분께서 뭔가를 잘못 이해하고 계신듯 합니다.
리눅스에선 세그멘테이션이 사용되지 않습니다.
대신에 페이징 기법이 사용됩니다.
(그 이유는, 인텔 아키텍쳐에서 세그멘테이션을 사용하는것은
논리주소를 세그멘테이션을 사용해서 선형주소로 바꾸는데
이럴 필요가 없다는 것이죠.. 그냥 모든 프로세스가 선형주소를
공유하면 메모리 관리를 구현하는게 간단해 집니다.
또 RISC계의 프로세서와 호환을 위해서 이기도 합니다.
일부 RISC칩들이 매우 제한적으로 세그먼테이션으 사용되기때문에
그렇죠..)

커널의 메모리 관리하는 부분을 보면
우선 물리적인 메모리는, 페이지라는 단위로 관리가
됩니다.

사용자가 요청을 하던 커널이 요청을 하던
일딴 페이지 할당을 요청을 하게됩니다.
이때 페이지 할당을 할때, 버디시스템이 사용이됩니다.

슬랩할당자는, 커널에서 메모리 요청이 필요할 때마다
페이지 할당, 해제를 반복하니까, 성능을 높이기 위해서
몇가지 자료 구조를 buddy 알고리즘에 의해서
할당을 받고 다시 그 할당받은 공간을 slab이란 알고리즘을
사용해서 사용하는 것이죠..

페이지를 할당을 받았다는 것은,
가상메모리가 지원된다는 것입니다.
커널이던 프로그램이던 선형적인 주소공간으로
프로그램이 이루어지고, 이것을 중간에서
실제 메모리로 맵핑이 이루어 지는 것은 커널과 cpu의
역활입니다.
또 메모리가 페이지 단위로 관리 되니까
페이지 테이블의 비트정보를 가지고 스와핑도 쉽게 되지요

아래의 url은 제가 메모리관리를 공부하면서 참고로 한
자료들인데, 검색어를 폭넓게 넣었더니 아닌것도 많지만
필요한 자료들은 많이 있습니다.
http//www.ezdoum.com/search.php?query=%B8%DE%B8%F0%B8%AE

이호님이 커널공부하기란 글에서
메모리 관련 부분을 공부할때 키워드를 정리하신게 있는데
이것을 기준으로 지식을 체계화를 하시면 좋을꺼 같네요'

2.1 메모리 관리
@ 가상 메모리(virtual memory)의 개념
-> 가상 메모리의 개념과 목적
-> 물리적인 메모리(physical memory)와 가상 메모리(virtual memory)의
구별
-> 주소공간(address space)에 대한 이해
@ 페이징(paging)의 개념
-> 페이징의 목적과 구현방법
-> 물리적인 페이지(page frame)과 가상 메모리의 페이지의 구별
-> 페이지 테이블(page table)에 대한 이해
@ 핵심 메모리 관리 메커니즘
-> 메모리 매핑(memory mapping)
-> 요구 페이징(demand paging)
-> 쓰기시 복사(copy on write)
-> 스와핑(swapping)
-> 공유 메모리(shared memory)
-> 접근 권한(access right)
@ 메모리 할당과 해제
-> RAM의 페이지들을 관리하는 방법
-> page 단위의 할당과 해제 방법
-> 슬랩 할당자(slab allocator)에 대한 이해
-> 메모리가 부족할 때 처리하는 방법
@ (Optional) 하드웨어 캐시에 대한 이해

익명 사용자의 이미지

윗분이 매우 좋은 설명을 해 주셨는데요..

혹시나 원질문 하신 분이 헷갈리실까봐 몇마디 덧붙여 봅니다^^;

사실 intel 아키텍처에서는 segmentation이 강제적입니다.

즉, 사용하지 않고 싶어도 꼭 사용을 해야 된다는 것이죠..

i386 linux에서는 segmentation을 활용하지 않으므로(사용하지 않는게 아
니구요)

그것을 있으나마나 한 것으로 만들기 위해서

모든 segment의 시작선형주소를 0, 마지막선형주소를 4G-1로 설정합니다.

그리고 사실 i386 linux에서 segment selector나 segment descriptor같은

것들이 활용되는 부분이 있는데, 그것은 user/kernel 모드의 구분입니다.

Code segment selector의 CPL부분이 바로 현재 previlege를 나타내죠.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.