페이징과 세그멘테이션은 OS가 하는 겁니까? CPU가 하는겁니까?

bellus의 이미지

안녕하세요
운영체제 공부하면서 메모리 관리 기법 나오는데,, 하루종일 봐도 정리가 잘 되질 않네요..

1) 페이징의 기본단위는 왜 4KB입니까?

2) 저 기법들을 CPU가 구현하는건지 OS가 구현하는건지 제대로 개념이 안 잡힙니다. 저는 OS수준에서,, 논리주소를 RAM상의 물리주소로 전환하고,, CPU는 단지 그 주소의 값을 읽어와 연산하는 걸로 알고 있었습니다만 확실치가 않네요..

3) 일반 인텔CPU를 사는 컴을 부팅하게 되면 무조건 리얼모드로 시작한다고 하는데, 이건 단순히 8086과의 하위호환성때문입니까? 그렇담 8086 CPU에서 쓰일일이 전혀 없는 OS라면 처음 부팅에서 바로 프로텍티드모드로 들어가도 되는건가요?

일단 얼핏 떠오르는 궁금증들입니다.
체계적으로 공부하지 못한 부끄러움만 남는군요. 간략하게나마 도움이 될만한 답변들을 달아주시면 정말 감사하겠습니다.

좋은 하루 되세요~

RedPain의 이미지

bellus wrote:
안녕하세요
운영체제 공부하면서 메모리 관리 기법 나오는데,, 하루종일 봐도 정리가 잘 되질 않네요..

1) 페이징의 기본단위는 왜 4KB입니까?


만드는 사람 마음이겠죠? ㅡ.ㅡ;;
Extended Paging인가 정확한지는 모르겠습니다만 4MB로 하는 방법도 있습니다.
bellus wrote:

2) 저 기법들을 CPU가 구현하는건지 OS가 구현하는건지 제대로 개념이 안 잡힙니다. 저는 OS수준에서,, 논리주소를 RAM상의 물리주소로 전환하고,, CPU는 단지 그 주소의 값을 읽어와 연산하는 걸로 알고 있었습니다만 확실치가 않네요..

MMU( Memory Management Unit)이 합니다.
저 약자는 아마도 맞을 겁니다. -_-;;
bellus wrote:

3) 일반 인텔CPU를 사는 컴을 부팅하게 되면 무조건 리얼모드로 시작한다고 하는데, 이건 단순히 8086과의 하위호환성때문입니까? 그렇담 8086 CPU에서 쓰일일이 전혀 없는 OS라면 처음 부팅에서 바로 프로텍티드모드로 들어가도 되는건가요?

넵, 그렇습니다.
대부분 커널이 동작하자 마자 또는 커널이 동작하기 전에 커널 로더가 프로텍티드 모드로 변환하죠.

mach의 이미지

bellus wrote:

1) 페이징의 기본단위는 왜 4KB입니까?

이 경우 버츄얼메모리를 고려해야하는데요, 성능 테스트 결과의 산물입니다.
실험을 해보고 그 중 가장 나은 사이즈를 선택했습니다.
(참고: The Design of the Unix Operating System;메모리관련부분;한글판"유닉스내부구조")
bellus wrote:

2) 저 기법들을 CPU가 구현하는건지 OS가 구현하는건지 제대로 개념이 안 잡힙니다. 저는 OS수준에서,, 논리주소를 RAM상의 물리주소로 전환하고,, CPU는 단지 그 주소의 값을 읽어와 연산하는 걸로 알고 있었습니다만 확실치가 않네요..

하드웨어기술이 급속도로 발달하여 1990년대에 인텔의 경우 386프로세서 부터는 메모리관리 루틴을
CPU에 내장(MMU)하게 되었습니다. 유닉스의 경우 메모리 관리 메카니즘은 이미 1970년대에 이뤄진것입니다. 운영체제가 지원한다는 것이 기본이고, 하드웨어가 지원해 준다면, 운영체제제작자의 고생(?)이 줄어들 수 밖에 없겠지요?
bellus wrote:

3) 일반 인텔CPU를 사는 컴을 부팅하게 되면 무조건 리얼모드로 시작한다고 하는데, 이건 단순히 8086과의 하위호환성때문입니까? 그렇담 8086 CPU에서 쓰일일이 전혀 없는 OS라면 처음 부팅에서 바로 프로텍티드모드로 들어가도 되는건가요?

당근입니다. 인텔x86 CPU의 reset핀에 시그널이 발생(전원)하면 CPU는 리얼모드로 세팅됩니다.
따라서, 모든 인텔x86프로세서는 어떤 시스템(보드, 장치)에 탑재되어도 시작은 항상 리얼모드입니다.
또한가지는 리얼모드로 세팅되고 cs:ip가(마이크로프로세서의 명령 처음 시작주소) ffff:0000으로 세팅된다는
것입니다. 따라서, 인텔 프로세서를 이용하여 보드등을 제작하는 사람은 반드시 ffff:0000에 보드를 시작하는 코드를 두어야 합니다. 전원이 켜지자 마자 수행할 명령코드를 그곳에 두어야 합니다. 이곳은 PC보드의 경우
롬바이오스 영역이 되는 곳입니다.
다른 마이크로 프로세서도 유사하게 동작합니다. 단 리얼모드 프로텍티드 모드 이렇게는 하지 않습니다.
시작주소의 고정은 다른 마이크로프로세서도 동일합니다.
단지, 마이크로프로세서 제작자들은 리얼모드, 프로텍티드모드 이런거 말고, 각 마이크로프로세서를
테스트하기 위한 모드를 넣어두기도 합니다.

* 참고
가상메모리부분에서, TLB Fault handler에 대해 언급하면, 논리 주소를 램상의 물리주소로 매핑하는 과정에서,
논리주소가 실제 메모리에 없는 경우가 있습니다. Swap 또는 실제로 할당되지 않았기 때문이지요. 이때
하드웨어가 Fault를 발생시키고, 운영체제 제작자가 fault handler를 작성하게 됩니다. 당연히 핸들러
내에서는 메모리를 swap또는 할당하게 되겠지요. 폴트 메카니즘이니까 이전 명령을(폴트 발생시킨명령) 다시 수행하게 됩니다. 이때는 메모리가 램상에 존재하므로 정상동작하게 됩니다.

1)  char *ptr;
2)  ptr = (char *)malloc(10); //운영체제가 논리적으로 메모리를 할당;실제 메모리는 할당안됨
3)  i++
4) *(ptr+0) = '0'; // 실제메모리가 없으므로 fault발생;운영체제는 폴트핸들러에서 처리수행;다시 이명령어를 수행

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

bellus의 이미지

답변 감사드립니다. 조금씩 궁금증이 풀리네요.
또한 mach님 마지막 참고 너무 좋았습니다. 사실 RAM상에 존재하지 않는 페이지는 언제 RAM에 올려지는지도 궁금했거든요,, fault handler에서 하는거였군여~

그럼 추가질문입니다~~
MMU가 CPU에 내장되어 있다고 하셨는데,, 그렇담 OS가 CPU에게 주소를 보낼때 이 주소는 어떤 모드의 주소형태..라는 정보를 함께 보내는건가요? MMU에는 각 모드별 주소처리 루틴이 미리 지정되어있는거구.. 이런 식인건가요?

익명 사용자의 이미지

참고사항 적어봅니다.
Intel pentium 계열의 경우 Reset핀에 신호가 주어지면 다음과 같이
Register기본설정치가 설정됩니다.
여기서 CR0는 항상 RealMode를 가르키도록 되는것이죠.

EAX = 0 (CPU 자체 테스트 실패시 0이 아닌값 : 문제점에 해당하는 값)
EDX = 0x0500xxxx (xxxx는 Pentium 의 버젼번호)
EBX = ECX = ESP = ESI = EDI = 0
EFLAGS = 0x00000002
EIP = 0x0000fff0
CS = 0xf000
DS = ES = FS = GS = SS = 0
GDTR = TSS = 0
CR0 = 0x60000010
CR2 = CR3 = CR4 = 0
DR0 = DR1 = DR2 = DR3 = 0
DR6 = 0xffff0ff0
DR7 = 0x00000400

Necromancer의 이미지

CPU 계열별로 약간씩 틀립니다.
(범용레지스터나 세그먼트레지스터같은 경우는 다 같지만, 일부 특수목적용
레지스터에서는 약간 차이가 있습니다.)

자세한 내용은 아래 문서에서 찾아보시기 바랍니다.
인텔에서 공개하고 있는 cpu 매뉴얼입니다.
(어디있는지는 생각이 안나네요... 찾으려면 시간 걸릴듯)

http://www.intel.com/design/pentium4/manuals/245470.htm
http://www.intel.com/design/pentium4/manuals/245471.htm
http://www.intel.com/design/pentium4/manuals/245472.htm

minzkn wrote:
참고사항 적어봅니다.
Intel pentium 계열의 경우 Reset핀에 신호가 주어지면 다음과 같이
Register기본설정치가 설정됩니다.
여기서 CR0는 항상 RealMode를 가르키도록 되는것이죠.

EAX = 0 (CPU 자체 테스트 실패시 0이 아닌값 : 문제점에 해당하는 값)
EDX = 0x0500xxxx (xxxx는 Pentium 의 버젼번호)
EBX = ECX = ESP = ESI = EDI = 0
EFLAGS = 0x00000002
EIP = 0x0000fff0
CS = 0xf000
DS = ES = FS = GS = SS = 0
GDTR = TSS = 0
CR0 = 0x60000010
CR2 = CR3 = CR4 = 0
DR0 = DR1 = DR2 = DR3 = 0
DR6 = 0xffff0ff0
DR7 = 0x00000400

그리고 x86에서 페이징의 기본단위가 4K인 이유는 위 인텔 문서를 읽어보면 나와
있습니다. (alpha나 sparc같은 다른 아키텍쳐에서는 기본단위가 8K, 16K도 있습니다)

세그먼테이션과 페이징......... 이건 CPU와 OS가 협동을 하게 됩니다.
OS는 부팅시에 세그먼테이션과 페이징을 위한 환경을 조성해 놓습니다.
(스왑공간 활성화시키고, 페이징 자료 구조체 생성, 페이징과 관련된
상황에 대응하는 핸들러 코드 등의 세팅), 그다늠 CPU의 해당 기능이
작동하도록 해 놓으면, CPU는 OS가 세팅해 놓은 정보를 보고 그것을
따라서 돌아갑니다.

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