세그먼트 레지스터와 메모리주소에대한 질문

declspec의 이미지

안녕하세요

32비트 protected 모드의 CPU 에서는 보통
세그먼트 레지스터가 사실상 아무 역할을 안하는것으로 알고있습니다

CS, DS, SS 이런 레지스터의 특정비트영역이
GDT or LDT 상의 특정 오프셋에 있는 세그먼트 디스크립터를 가리키고
그 속의 BASE, LIMIT 이 0, FFFFFFFF 로 되어있어서
사실상 세그먼트 뒤의 32비트 오프셋 자체가 그냥 순수하게
MMU 로 넘어가서 페이징되는것으로 알고있는데요
혹시 잘못된점 있으면 지적바랍니다.

그리고 궁금한것이 몇가지 있습니다

1. GDT 와 LDT 의 차이가 무엇인가요?(global, local 이 뭐를 기준으로 어떻게 다른건지)
2. 세그먼트 레지스터를 참조해서 OFFSET 과 더하는 과정은 모든 메모리주소를 참조할때 무조건 일어나는건가요?,
페이징은 비활성화 시킬수가 있는데 이건 의무인가요?
3. CPU 가 메모리에 access 하기위해서 가지고있는 주소는 protected 모드에서는 반드시 가상주소인가요?(페이징을 한다면)
4. IOMMU 라는 것이 있다는데, 이게 있으면 MMU에서 변환된 메모리 주소가 다시 변환되나요?
5. CPU -> TLB or MMU(paging) -> 메모리버스 -> 메모리. 이 순서로 CPU 에서 메모리 access 가 되는게 맞을까요?

gurugio의 이미지

이렇게 세부적인 것은 자료를 찾아보시는게 정확하게 아시는데 도움이 되실겁니다.
아마 현재 보호모드를 직접 만지고계신분이 아니라면 세부적으로 기억하시기 힘들것 같습니다.
제가 기억나는대로만 말씀드리면요 (정확하지 않을 수도 있습니다만 도움이 되실수도 있으니까 적겠습니다.)

1. 리눅스는 GDT, LDT를 별로 사용하지 않지만 윈도우에서는 LDT를 프로세스마다 하나씩 가지는걸로 압니다.
즉 GDT는 운영체제의 것, LDT는 프로세스의 것이라는 차이가 있습니다.
그리고 사실상 인텔 아키텍쳐에서 페이징을 사용하면 GDT/LDT는 커널/유저모드의 권한 구별외에 하는 일이 없는것 같습니다.

2. 보호모드라는 것은 세그먼트 레지스터를 사용한다는 것입니다.
페이징은 보호모드에 확장 기능이라고 생각하면 될것 같습니다.
즉 보호모드의 정의 자체가 메모리 주소 계산에서 세그먼트 레지스터를 사용한다는 것이므로 무조건 일어납니다.
그리고 오프셋 더하는 과정보다는 권한 설정이 더 중요한 기능입니다.
오프셋 더하는 것은 리얼모드와 같은 것이고 0~3의 링 레벨의 구분으로 커널 영역을 보호하는게 보호모드의 핵심입니다.

3. 특수 레지스터를 제외하고 CPU의 일반 레지스터에 있는 모든 주소는 가상 주소입니다.

4. 위키피디아를 보니까 맵핑을 다시 한다고 하네요.

5. 캐쉬만 추가하면 순서는 맞을것 같습니다.

다시 말씀드리지만 정확하진 않습니다...갠히 혼란만 드리는건가 싶기도하네요
64비트 운영체제 만들기라는 책이 있던데 한번 보세요.

익명 사용자의 이미지

저도 한때 비슷한 의문을 가지고 있었다가 포기했지만
인텔 데이타북을 참조하시는게 빠를것 같습니다.
그런데 새로운 os를 설계하시나요?

Necromancer의 이미지

1. LDT와 GDT의 차이는.
GDT에 있는 세그먼트 정보는 GDTR을 이용해서 바로 참조할 수 있지만 LDT에 있는 세그먼트는 참조과정이 좀 복잡합니다.

세그먼트 레지스터가 어느 세그먼트를 가리키는지 확인하는 과정에서 이게 LDT에 있는 놈이라는 것을 알게 되면,
GDT에서 바로 세그먼트를 찾는 것이 아니라
LDTR을 참조해서 GDT 테이블에서 LDT테이블 위치를 찾아낸 다음
찾아낸 LDT 테이블에서 세그먼트레지스터가 가리키는 세그먼트 디스크립터를 찾아서 그걸 세그먼트로 인식하고 씁니다.
즉 변환과정이 한단계 더 들어갑니다.

GDT테이블에 들어갈 수 있는 세그먼트 종류중에 LDT라는 놈이 있는데 이게 LDT 테이블이 있는 메모리 주소를 담고 있습니다.
GDT는 시스템 내에서는 무조건 한개만 쓸 수 있지만 LDT는 여러 개가 나올 수 있고 LDTR 레지스터가 이들 중 쓸 것 하나를 가리키는 셀렉터 역할을 합니다.

GDTR은 GDT테이블 주소를 담아야 하기 때문에 48bit지만 LDTR은 16비트밖에 안 됩니다.

여담으로 보호모드에서는 세그먼트 레지스터는 셀렉터라고 부릅니다. 실제 세그먼트 정보는 GDTR, LDTR로 가리키는 곳에 테이블로 있고, 세그먼트 레지스터는 이 테이블에서 사용할 세그먼트 디스크립터(세그먼트 정보 담긴 놈)의 번호만 지정하기 때문입니다.

2. Protection Enable bit(CR0의 bit0)외에 Paging bit가 따로 있습니다(제 기억으로는 CR2의 bit 31이었던가로 알고 있습니다)
Protection Enable bit가 1이 되면 님이 여기서 말씀하신 Protected Mode 이고, 여기에 Paging bit까지 1이 되게 할려면 보호모드 셋업 이외에도 페이징관련 셋업을 또 해줘야 합니다. Protected Mode가 아닌 상태에서 Paging 활성화시키는 것은 잘 모르겠습니다. (인텔 매뉴얼 찾아봐야 할듯)

3. 페이징 비활성화면 세그먼트/오프셋 변환 후 바로 물리주소로 가고 활성화되면 모두 가상주소입니다 (페이징 변환을 한번 더 거쳐야 물리주소가 됨).

4. IOMMU는 DMA 대체용 입니다.
옛날에는 메모리컨트롤러가 외부칩셋에 있어서 DMA만 경유하면 CPU 아닌 다른 장치들(사운드카드 등)이 바로 메모리에 읽고 쓸 수 있었지만, 이제는 메모리컨트롤러가 CPU 내로 들어가면서 다른 장치에서 메모리 쓸려면 CPU 경유해야 하는데, 이과정에서 주변장치가 보내는 주소의 변환 등등 각종 문제가 생겨서 나온겁니다.

5. 네.

Written By the Black Knight of Destruction

isoo103의 이미지

인텔의 보호모드는 몇가지 메모리 모델을 지원합니다. 세그먼트 : 오프셋 모델과, 플랫모델, 그리고 혼합형 모델이 있었던것 같습니다. 윈도우 프로세스의 경우 메모리 모델이 플랫형으로 알고 있습니다. CS, DS, SS 모두다 base 어드레스가 0번지 입니다.

댓글 달기

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