전공/시스템 프로그래밍

[시스템 프로그래밍 3-1] X86 프로세서 작동모드(Real mode, protected mode, Address space)

뜨거운 개발자 2023. 3. 20. 01:07

32 bit x86 Processors

32비트 x86 프로세스라는 건 cpu속에 여러 레지스터가 들어있는데 각 레지스터의 최대 크기가 32비트(4byte)라는 것이다. 4byte를 담을 수 있는 메모리(레지스터)가 여러개 들어있다는 것을 의미!

[1] x86 프로세스의 동작모드

세가지 모드가 존재한다.

왜 이런 3가지 모드가 등장했는지 배경을 알아야 각 모드들에 대한 이해를 높일 수 있다.

최소의 x86 프로세스의 초창기 즉 8086에는 Real-Address Mode만 존재하였다.

1. Real-Address Mode

과거 8086이 처음나올 때 RAM 이 640 KB 정도여서 크기에 대해서 설정한 값들이 당시에는 충분하다고 생각한 최대 크기들이 대부분 1MB정도였다.

또한 과거에는 멀티테스킹을 지원하지 않았다.(Ms Dos시절) 그렇기에 더욱 더 메모리의 최대 크기를 상당히 작게 잡은 것이다. 

따라서 모든 주소값을 표현하는데 1MB면 충분하다고 생각했다. 당시 주소를 표현하는 비트는 20bit 여서 1MB밖에 못썼다.

또한 당시에는 보안을 생각할게 없어서 프로그램이 메모리에 직접 접근을 할 수가 있어서 프로그래머 입장에서는 편할 수 있으나 보안, 하드웨어 등에 문제에 직면하였다.

그래서 기술의 발전에 의해 메모리를 더 크게 다뤄야 함을 느끼고, 보안적으로 프로그램에게 너무 많은 권한을 지원하다보니 프로그램이 자꾸 꺼지는 등 다양한 문제점을 느꼈다.

그때 당시 모드를 Real-Address Mode라고 부른다.

특징

  • 이 모드에서는 시스템 메모리 및 하드웨어 장치에 직접 엑세스 해야하는 경우에는 유용하다.
  • 이 모드는 몇가지 추가기능을 갖춘 초기 인텔 프로세서의 프로그래밍 환경을 구현한다.(즉 오늘날에도 이 모드를 실행하면 과거의 환경처럼 구현이 되어있다.)
  • 실제 주소를 1MB 만 사용가능 (20bit)

2. Protected Mode

인텔이 이후 80286을 만드는데 이런 문제점을 인식을 하였다.

따라서 새로운 모드를 필요로 하게 되었고 Protected모드가 생겼다.

프로그램이 실행되면, Real Mode에서는 모든 메모리를 접근이 가능했지만 이제 프로그램이 너무 많은 권한을 가지고 있는 것에 대한 문제점을 알았기 때문에 Segment(프로그램이 현재 사용하는 공간이 속해있는 Segment) 단위로 접근 할 수 있게 하여서 조금 더 보안에 견고한 프로세서를 설계하였다.

이렇게 만들었지만 이전에 프로그램과 호환성을 유지하기 위해 Real Mode를 계속 유지하고 제조자는 2가지 모드를 제공하게 된 것이다.

80286은 24bit즉 16MB까지 사용할수 있다.

다만 그건 protected Mode를 사용할 때 이야기고 이전의 유산인 Real Mode를 사용하게 되면 역시 20bit 여서 1MB까지만 사용할 수 있다.

  • 이렇게 하면 장점이 이전 세대와 호환성을 유지하면서 자연스럽게 더 효율적인 프로그램 환경을 제공하기 위해 프로그래머는 Protected 모드를 기준으로 호환이 되는 방식으로 프로그램을 업그레이드 해서 더 강력한 퍼포먼스를 낼 수 있게 된다.
  • 업데이트 되는 동안에 호환성과 발전할 수 있는 길까지 열어둔 것이다.

Ms Dos를 사용하면 결국 Real 모드로 동작하기 때문에 주어진 성능 퍼포먼스를 전부 활용하지 못하게 돼서, 그 문제점을 인식한 MS는 windows를 발표해서 protected mode를 지원하게 됐다.

특징

  • 프로그램은 세그먼트라는 메모리 영역이 제공된다. (프로그램은 이 영역 밖을 침범할 수 없다.)
  • 프로세서는 프로그램이 할당된 세그먼트 외부의 메모리를 참조하는 것을 방지한다.
  • 32비트 보호모드에서는 최대 4G바이트의 선형 주소공간 사용된다. (주소공간 32bit)
  • P6 프로세서부터 Extended physical addressing 기법이 최대 64GB의 물리적 메모리 공간을 지정할 수 있게 됐다.

2-1 . Virtual-8086 Mode: a special case of protected mode

Protected모드 중 특수한 하나이다.

즉 과거 Dos (Real Mode) 를 기준으로 만들어진 프로그램들을 실행하고 싶을 때 존재하는 모드이다.

windows창 에서 콘솔창을 띄우게 되고 (가상의 창) 그곳에서 Ms-Dos를 실행시킨다. 그것을 virtual 8086 mode라고 한다.

보호모드에서 Real-address 모드가 동작하는 특별한 케이스이다.

여기서 ms -dos를 여러개 띄울 수 있어서 멀티태스킹이 가능해져 버린다.

따라서 이 친구들은 메모리가 1MB로 제한되어있다. 따라서 이것 자체가 1MB짜리의 컴퓨터라고 생각하고 실행이 되는 것이라고 이해하면 된다. (!!가상환경!!) 그래서 safe environmet라고 부른다.

특징

  • 보호 모드 위에서 가상 8086 모드를 실행하는 경우 각 프로그램에는 고유한 1바이트의 메모리 영역이 생긴다.
  • 따라서 최신 OS에서는 여러개의 개별 가상 8086을 돌릴 수 있는 것이다.

3. System management mode (SMM)

(이런 게 있다 정도만 알고 있자.)

운영체제에게 더 발전된 형태의 전원 관리던가, 조금 더 발전 된 보안기능을 제공하기 위해서 등장한 모드이다.

 

[2] 32 bit x86 프로세스의 주소 공간

  • 주소란 메모리에서의 데이터나 명령어가 있는 주소를 의미한다.
  • 폰노이만 구조의 핵심은 데이터와 명령어는 구분이 되지 않고 메모리상에 적재가 돼고 메모리상에서 Cpu로 가져오는 방식(fetch) 가져와서 cpu에서 연산을 진행한다.
  • cpu는 명령어랑 데이터를 가져와야 하므로 그 공간의 주소를 알고 있어야 하는데 그 주소를 여기서 말하는 Address space의 address이다.
  • Address space란 메모리 상에서 그 주소가 어떤 공간을 가지고 있는가 위치를 의미한다.

Address Space

  • Real-address mode 프로그램은 1MB의 범위를 갖는 주소를 사용할 수 있다.
  • protected 모드에서는 주소공간의 크기가 최대 4 GB까지 가능하다.
  • 모드에 따라서 사용 가능 용량이 달라지고 하는데, 사실 이 최대 공간은 32Bit x86 프로세스의 스펙에 관련된 부분이다.
  • 이 스펙을 암기하는 것보다, Address Space가 왜 이렇게 결정되는지 이해하는 것이 더 중요하다.

왜 Address Space 가 이렇게 주어질까?

일반적으로 메모리를 표현하는 방식이 배열처럼 표현을 많이 한다.

흔히 우리는 배열처럼 표현을 했을 때 한칸을 1Byte로 표현을 한다.(이유 : 컴퓨터의 저장하는 가장 기본단위가 Byte : 8bit 이기 때문에)

실제로 우리 컴퓨터의 버스가 1byte보다 크기 때문에 사실 엄밀히 말하면 4byte씩 접근하거나 8byte씩 접근하는 경우도 있지만 가장 작은 단위는 1byte이다.

사람이 세는 숫자는 제한이 없지만 주소값은 표현할 수있는 범위의 제약이 존재한다.

즉 주소값을 저장하는 메길 수 있는 공간(주소값을 표현하는 비트)을 사용을 하는데, 즉 주소를 표현하는 비트수를 가지고 memory space가 결정이 되는 것이다.

real 모드 에서 Addresss Space 예시

Real-address mode를 사용할 때 16bit컴퓨터를 사용했다. (레지스터 16비트) - 그런데 이때 당시 8086의 데이터의 크기는 16비트를 사용했지만 주소의 크기로는 (Address space)는 20bit로 사용을 한 것이다.

ex ) 0번째 주소는 0000/0000/0000/0000/0000 번지가 되고 가장 마지막 주소는 1111/1111/1111/1111/1111 이 되는 것이다.

이렇게 번지수를 말하기 어려우니까 16진수를 사용한다.

따라서 0000/0000/0000/0000/0000 →0x00000 번지가 된다. - 이것이 메모리 주소를 의미한다.

그러므로 1111/1111/1111/1111/1111 →0xFFFFF번지가 마지막 번지가 되는 것이다.

이것의 예시로 볼 때 주소를 나타내는 총 자릿수가 20자리인 2비트 숫자가 되고 주소로 나타낼 수 있는 범위가 2^20 개까지 주소를 나타낼 수 있음을 알 수가 있다.

따라서 2^20은 1M 이므로 우리는 주소값을 나타낼 수 있는 byte범위가 1M개이다.

*(1K- 1024) (1M- 1024^2) 즉 1MB 는 1048516 Byte) 표현할 수 있는 셀이 1 M이다.

중요 특징

레지스터 갯수 16 bit 인데 메모리 20bit였다. 따라서 주소를 저장하는 방식이 조금 달랐다.

  • 주소는 20bit여서 레지스터가 16비트라서 주소를 한번에 표현 할 수가 없는 것이다.
  • 따라서 이때 사용하는 방식이 층과 호수를 분리하는 느낌으로 이해하면 되는 방식을 사용하였다.
  • 주소를 층과 호수로 분리한 것처럼 2개로 분리하여서 segment라는 개념이 등장하게 되었다.
    • segment는 층수에 해당하고 offset은 호실 수에 해당한다.
    • 이 두가지를 결합해서 주소를 레지스터에서 표현하였다.

여기서 나오는 segment 운영체제가 protected 모드일 때 프로그램에게 할당하는 단위의 segment 는 이름만 같고 아무런 관련이 없습니다.

32 bit processor에서 변화

원래 real모드에서는 20bit만큼을 address space로 사용을 했는데 32bit processor들은 주소공간도 32bit 를 사용해버렸다.

따라서 주소 공간이 더 길어진 것이다. 가능한 주소의 갯수도 늘어났다. 2^32은 (2^30 은 G) 4 G가 된다.

32 bit 모드에서는 최대 주소값은 4G까지 사용이 가능하다.

64 bit를 우리가 대부분 사용할 텐데, 과거에 32bit운영체제에서는 8GB램을 꽂았을 때 다 사용을 못하고 우리는 겨우 4GB 좀 안되게 밖에 사용을 못하게 되는 이유가 인식을 할 수 있는 최대 범위가 4G이기 때문인 것이다.

최대 쓸 수 있는 주소가 정해져 있기 때문에 그런 것이다.

the P6 processor 부터 Extended physical addressing(PAE)라는 기술이 등장했다.

이 기술은 실제로는 32비트지만 36 비트를 사용하는 것 처럼 사용이 되는 새로운 기능이 등장을 하게 돼서 64GB까지도 인식을 할 수가 있었다. 이건 운영체제와 Cpu모두 지원을 해야 사용이 가능한 기능이었다.

포인터 주소의 크기는 일반적으로 8byte 지만 이건 항상 그런것은 아니고 address space 체계에 따라서 다르다.

 

728x90
반응형