ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [OS] 32 bit OS vs 64 bit OS
    ComputerScience/OS 2024. 3. 12. 00:06
    728x90

    컴퓨터 시스템? CPU, OS?

    컴퓨터 시스템은 하드웨어와 소프트웨어로 나눌 수 있는데,

    CPU는 하드웨어가 되고 OS는 소프트웨어가 될 수 있다.

     

    우리가 흔히 컴퓨터 시스템을 논할때 컴퓨터 시스템이 32비트다 혹은 64비트다 라고 하는 것은 하드웨어와 소프트웨어 즉, CPU와 OS 모두를 포함하여 이야기 하는 것이라고 하는데..

    32비트? 64비트?

    OS관점에서 32/64비트와 CPU관점에서의 32/64비트, 또 시스템 관점에서의 32/64 비트는 비슷하면서도 조금씩 다른 의미를 갖고 있다.

     

    OS를 이야기 할때, 32/64 비트는 CPU가 단일 연산에 수행할 수 있는 데이터의 최대 크기를 뜻한다.

    또한 CPU 관점에서는 이 비트가 레지스터 크기를 말할수도 있다는데.. 많이 헷갈린다. 이에 대해 좀 더 자세히 알아보자.

    32비트 CPU와 64비트 CPU

    CPU에서 비트는 주로 CPU의 레지스터 크기를 나타낸다.

    이는 CPU가 한 번에 처리할 수 있는 데이터의 최대 크기와 메모리와의 데이터 전송 시 한 번에 이동할 수 있는 데이터의 양을 의미한다.

    • 32비트 CPU
      레지스터의 크기가 4바이트로 한 번에 32비트(4바이트) 데이터를 처리할 수 있음을 의미한다.
      즉, 레지스터에 최대 4바이트 크기의 연산 결과를 저장할 수 있다.
      따라서 32비트 아키텍쳐에서는 메모리 주소도 32비트로 표현되어, 최대 4GB($2^{32}$)까지의 메모리를 직접 주소지정 할 수 있다.
    • 64비트 CPU
      한 번에 64비트(8바이트) 데이터를 처리할 수 있음을 의미한다.
      즉, 레지스터에 최대 8바이트 크기의 연산 결과를 저장할 수 있다.
      따라서 64비트 아키텍쳐에서는 메모리 주소도 64비트로 표현되어, 최대 16EB($2^{64}$, 약 18.4억 GB)까지 메모리를 직접 주소지정 할 수 있다.

      하지만,
      실제로 많은 현대의 64비트 프로세서 아키텍처, 특히 x86-64 아키텍처(AMD64 또는 Intel 64라고도 함)에서는 모든 64비트를 메모리 주소 어드레싱에 사용하지 않는다.

      대신, 하위 48비트 또는 그 주변의 비트 수만을 실제 메모리 주소 어드레싱에 사용한다.


      이는 현재 기술 수준과 실제 응용 프로그램의 요구 사항을 고려할 때, 16엑사바이트(EB)라는 엄청난 메모리 양이 실용적이지 않기 때문이라고 한다.

      x86-64 아키텍처에서 초기에는 실제로 48비트의 메모리 주소를 사용하여, 이론적으로 최대 256TB(테라바이트)까지의 메모리를 지원할 수 있다.

    32비트 운영체제와 64비트 운영체제

    OS의 비트가 의미하는 것은, OS가 지원하는 메모리 주소 공간의 크기와 OS가 관리할 수 있는 프로세스와 데이터에 대한 처리 능력을 의미한다.

    • 32비트 운영체제
      32비트 주소를 사용하여 메모리를 관리하며, 이는 이론상 최대 4GB($2^{32}$)의 메모리 주소 공간을 관리할 수 있다.
      32비트 애플리케이션을 실행하기 위해 설계되었으며, 각 애플리케이션은 2GB 또는 3GB의 가상 메모리 공간을 할당받을 수 있다.
      • 예시: Windows XP, Windows 7(32 비트 버전), Linux(32 비트 버전)
    • 64비트 운영체제
      64비트 주소를 사용하여 메모리를 관리하며 최대 16EB(엑사바이트; $2^{64}$) 혹은 약 18.4억 GB의 메모리 주소 공간(RAM)을 지원한다.
      64비트 애플리케이션은 더 큰 메모리 공간을 활용할 수 있으며, 시스템의 효율성과 성능을 개선할 수 있다.
      • 예시: windows 10(64 비트 버전), macOS, Linux (64비트 버전)

    결국, CPU에서 비트는 하드웨어 레벨에서의 데이터 처리 능력과 메모리 주소 지정 범위에 직접적으로 관련되고 OS의 비트는 소프트웨어 레벨에서의 애플리케이션 지원, 메모리 관리 능력, 시스템 리소스의 활용 방식에 관련된다고 볼 수 있다는데..


    아직 두 관점에서의 정확한 차이를 이해하기 어려운 것 같다. 일단 하단의 표를 보면서 둘 사이의 관계를 좀 더 살펴보자

    가능한 CPU와 운영체제 조합

    CPU OS 가능여부 동작 모드
    32bit 32bit O 32bit
    32bit 64bit X X
    64bit 32bit O 32bit (하위호환)
    64bit 64bit O 64bit

    여기서 주의깊게 봐야하는 점은, 32비트 CPU에서 64비트 운영체제는 구동이 불가능 하다는 점이다.

    그 이유는 다음과 같다.

    1. 명령어 세트 아키텍처
      64비트 운영체제는 64비트 명령어 세트(ISA)를 기반으로 한다. 32비트 CPU는 이러한 명령어를 해석하고 실행할 능력이 없다.
    2. 메모리 주소 지정
      64비트 운영체제는 더 넓은 메모리 주소 공간을 지원하도록 설계되었다.
      32비트 CPU는 이론적으로 최대 4GB의 메모리만 직접 주소 지정할 수 있으며, 만약 64비트 운영체제가 더 넓은 주소 공간을 요구한다면, CPU는 이를처리할 수 없다.
    3. 레지스터 크기
      64비트 운영체제는 64비트 데이터 처리를 위해 설계된 넓은 레지스터를 활용한다.
      32비트 CPU는 이러한 레지스터 크기를 지원하지 않으며, 따라서 64비트 애플리케이션과 운영체제의 효율적인 실행이 불가능하다.

    실행가능한 어플리케이션 종류

    CPU 응용 프로그램 가능 여부 동작 모드
    32bit 32bit O 32bit
    32bit 64bit X X
    64bit 32bit O 32bit (하위호환)
    64bit 64bit O 64bit

    결국 OS나 응용프로그램 모두 SW이다. HW에서 지원이 되지 않는다면 불가능한 것이라고 이해를 하게 되었다.

    또한 컴퓨터 시스템이 32비트라는 것은 OS, CPU 모두 32비트라는 의미이고, 64비트라는 것은 OS, CPU 모두 64 비트라는 것이다!

    ISA(Instruction Set Architecture)

    나는 처음에 64 bit OS, 32 bit OS에서 말하는 bit가 명령어의 크기인줄 알았는데, 아니었다.

    명령어의 크기는 ISA(Instruction Set Architecture)에서 정의된다.

     

    ISA는 추상적인 부분으로, 하드웨어 구현과는 독립적인 부분이다. 즉, 소프트웨어 개발자가 하드웨어의 구체적인 세부 사항을 알 필요 없이 프로그램을 작성할 수 있도록 해주는 하드웨어와 소프트웨어 사이의 계약이자 인터페이스 같은 것이다.

    ISA의 주요 요소

    1. 명령어 집합
      프로세서가 인식하고 실행할 수 있는 모든 명령어의 집합이다.
      특정한 연산(ex. 산술 및 논리 연산, 데이터 전송 연산, 제어 연산)을 수행한다.
    2. 데이터 타입
      프로세서가 처리할 수 있는 데이터의 종류와 크기를 정의한다.
      예를 들어 정수, 부동 소수점 수, 벡터 등이 될 수 있다.
    3. 레지스터 세트
      프로세서가 사용할 수 있는 레지스터의 종류와 수를 정의한다.
    4. 메모리 주소 지정 방법
      프로세서가 메모리 주소를 참조하는 방법을 정의한다.
      프로그램이 어떻게 명령어를 메모리에서 읽고 쓸 수 있는지를 결정한다.
    5. 명령어 형식
      명령어 구조를 정의하고, 명령어 코드(opcode)와 필요한 경우 피연산자(operand)를 어떻게 나타내는지를 포함한다.
    6. 명령어 실행의 의미
      명령어가 나타내는 구체적인 작업을 정의한다.

    ISA의 종류

    • CISC (Complex Instruction Set Computer)
      • 정의: 복잡한 명령어 세트를 가진 컴퓨터 아키텍처. 각 명령어는 여러 단계의 작업을 수행할 수 있으며, 하드웨어 단에서 복잡한 작업을 처리할 수 있도록 설계되었다.
      • 예시: Intel의 x86 아키텍처
    • RISC (Reduced Instruction Set Computer)
      • 정의: 간소화된 명령어 세트를 가진 컴퓨터 아키텍처. 각 명령어는 간단하며 빠르게 실행될 수 있도록 설계되었다. RISC는 명령어의 수를 줄이고, 각 명령어의 실행 시간을 최소화하여 성능을 향상시키고자 한다.
      • 예시: ARM, MIPS, PowerPC, RISC-V 등이 있습니다.
    • VLIW (Very Long Instruction Word)
      • 정의: 매우 긴 명령어 단어를 사용하는 컴퓨터 아키텍처. 복수의 연산을 하나의 긴 명령어로 표현하며, 컴파일러가 명령어를 병렬로 조직하여 처리 성능을 최적화한다.
      • 예시: Intel의 Itanium 아키텍처
    • EPIC (Explicitly Parallel Instruction Computing)
      • 정의: 병렬 처리를 명시적으로 지원하는 컴퓨터 아키텍처. VLIW의 한 형태로 볼 수 있으며, 컴파일러가 명령어를 병렬로 실행할 수 있도록 명령어 간의 의존성을 최소화한다.
      • 예시: EPIC은 주로 Intel의 Itanium 프로세서에 적용되었습니다.
    • SIMD (Single Instruction, Multiple Data)
      • 정의: 단일 명령어로 다수의 데이터에 동시에 연산을 수행하는 기술. 이는 데이터 병렬 처리에 유용하며, 벡터 연산이나 과학 계산, 그래픽 처리 등에 활용된다.
      • 예시: Intel의 SSE, AVX; ARM의 NEON

    운영체제와 ISA의 관계

    ISA는 특정 CPU나 CPU 패밀리를 위해 설계되며, OS는 이러한 아키텍쳐를 기반으로 구축된다.

     

    운영체제는 하드웨어에 대한 추상화 레이어를 제공하기 때문에 특정 ISA에 작성된 소프트웨어가 해당 하드웨어 위에서 실행될 수 있도록 지원한다.

     

    OS별로 ISA가 다르다는 것은 운영체제가 특정 하드웨어 아키텍처와 그 아키텍처의 ISA를 지원하도록 설계되었다는 의미이다.

     

    예를 들어, Windows, Linux, MacOS와 같은 운영체제는 x86(IA-32)x86(AMD64) 아키텍처와 같은 특정 ISA를 지원한다. 반면 iOS와 iPadOS는 주로 ARM 기반의 ISA를 사용하는 Apple의 Mobile 기기들을 위해 설계되었다.

    • ARM
      저전력, 고효율의 모바일 디바이스와 임베디드 시스템에 주로 사용된다. 간단한 명령어 세트를 사용하여 에너지 효율을 높인다.
      현재 내가 사용하고 있는 Mac의 M2도 ARM 기반이다.
    • x86
      Intel과 AMD가 생산하는 CPU에 사용되는 ISA로 PC, 서버 등 다양한 곳에 사용된다. 복잡한 명령어 세트를 사용하여 다양한 작업을 한번에 처리할 수 있다.

    그렇다면, ARM 기반 프로세서에서 x86 기반 프로그램을 실행할 수 없을까?

    아니다. 가상화 기술이나 이진 변환과 같은 기술을 통해서 이를 해결할 수 있으나, 추가적인 오버헤드나 성능 저하를 초래할 수 있다는 단점이 있다.

     

    내가 현재 pintOS 프로젝트에서 사용하고 있는 OS도 Linux의 x86-64(AMD64) 기반으로 이루어져있기 때문에, 내가 사용하고 있는 M2 Mac에서 이를 구동하기 위해서는 가상화 기술을 이용하여 구현해야만 한다.

     

    실제로 나는 현재 docker를 활용하여 AMD64 리눅스 운영체제를 구동하고 있다.

     

    하지만 docker는 전통적인 하드웨어 가상화 기술과는 다른 개념이다.

    docker 컨테이너는 가벼운 가상화 형태로 호스트 OS(MacOS)의 커널을 공유하면서도 마치 각 컨테이너가 별도의 OS 인스턴스처럼 동작하게 한다.

     

    가상화 과정에서 일반적으로 QEMU와 같은 에뮬레이터를 사용하여 다른 아키텍처의 바이너리를 실행할 수 있다.

     

    QEMU는 하드웨어 가상화를 지원하는 호스트 시스템에서 다양한 게스트 OS를 실행할 수 있게 해주는 범용 오픈소스 에뮬레이터이다. 여기서 docker가 이러한 에뮬레이션 레이어를 통합하여, 별 다른 설정 없이 다른 아키텍처의 어플리케이션을 컨테이너화하고 실행할 수 있게 해

    준다.

     

    사실 더 나아가면 docker와 관련된 깊은 이야기를 해야할 것 같아서 docker와 관련된 이야기는 여기까지만 하겠다.. 나중에 더 공부해야 할 것이다.

    x86-64? x86? AMD64? IA-32?

    • x86-64
      • x86은 Intel 사의 1978년 출시된 8086 CPU에 기반한, 이에 호환되는 프로세서 계열을 가리키는 데 사용되었다.
        이 명칭은 80186, 80286, 80386, 80486 등 Intel의 다양한 프로세서 모델 번호에서 따왔으며, 이후 "x86"이라는 용어는 이들과 호환되는 32비트 아키텍처의 프로세서들을 일컫게 되었다. 즉, 그냥 모델 번호이다.
      • 64는 64비트 처리 능력을 의미한다. 즉, 위에서 설명했듯 한 연산에 최대 64비트의 데이터를 처리할 수 있음을 의미한다.
        AMD에서 최초 개발하였기 때문에 "AMD64"라고 불렸다. Intel은 이와 같은 아키텍처를 "Intel 64"로 명명했고, 결론적으로 두 회사의 아키텍쳐를 모두 포함하여 "x86-64"라고 부르는 것이라고 보면 된다.

        x86-64 시스템에서도 32비트 애플리케이션이 실행 가능하다.
        32비트 애플리케이션을 실행할 때, CPU는 "호환 모드(Compatibility Mode)"라고 불리는 특별한 운영 모드로 전환되어 CPU가 32비트 명령어를 실행한다.
    • x86
      x86아키텍처는 최대 32비트까지만 처리가 가능하다.

    • IA-32
      Intel Architecture 32-bit를 뜻하며, Intel이 개발한 32비트 CPU 아키텍처를 의미한다.
      Intel의 80836 CPU에서부터 시작되었다.
      IA-32는 x86 아키텍쳐의 한 부분이다!

    쉽게 생각해서 64가 붙으면 x86기반인데 32비트, 64비트 모두 처리가 가능한 x86이라고 보면 된다.

    Reference

    https://4ngeunlee.tistory.com/270

    https://eine.tistory.com/entry/64%EB%B9%84%ED%8A%B8-32%EB%B9%84%ED%8A%B8-CPU%EC%99%80-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

Designed by Tistory.