Byte ordering
- Big endian → 주소 그대로
- ARM
- Little endian → 바이트 단위, 반대로
- 인텔 아키텍쳐
- 스트링은 바이트 단위로 기록되므로 Byte Ordering이 필요없음.
- 1바이트가 넘어가는 경우
- → 주소 같은 → 1바이트 단위, 반대로 기록됨.
- → 주소의 아랫쪽이 낮은 번지수(위)에 기록됨.
- 레지스터에도 그렇게 기록되나?
x86 동작 모드
protected mode가 뭐고, real mode랑 어떻게 다르지?
8086 프로세서와 그 후속 모델에서는 두 가지 주요 운영 모드가 있습니다: Real Mode와 Protected Mode. 이 두 모드는 프로세서의 기능과 메모리 관리 방식에서 중요한 차이를 보입니다.
Real Mode
Real Mode는 8086 프로세서가 처음 켜질 때의 기본 모드입니다. 이 모드의 특징은 다음과 같습니다:
- 16비트 모드: 프로세서는 16비트 모드로 동작하며, 모든 레지스터와 명령어는 16비트 기반입니다.
- 1MB 메모리 한계: 메모리 주소는 최대 1MB만 접근할 수 있으며, 이는 세그먼트와 오프셋을 사용하여 20비트 주소를 계산하는 방식으로 관리됩니다.
- 단순한 메모리 모델: 메모리는 세그먼트화된 구조로 관리되지만, 메모리 보호 기능은 없어 프로그램 간 메모리 침범이 가능합니다.
- 하드웨어 수준의 멀티태스킹 미지원: 운영체제가 소프트웨어적으로 멀티태스킹을 관리해야 합니다.
Protected Mode
Protected Mode는 더 고급 메모리 관리와 보안 기능을 제공합니다. 80286 프로세서에서 처음 도입되었고, 현대의 대부분의 운영 체제가 이 모드에서 실행됩니다. Protected Mode의 특징은 다음과 같습니다:
- 확장된 메모리 주소: 32비트 주소를 사용하여 더 큰 메모리 공간을 접근할 수 있습니다. 예를 들어, 80286은 16MB까지, 80386 이후부터는 4GB까지의 메모리를 지원합니다.
- 메모리 보호: 각 프로그램은 독립된 메모리 공간을 할당받으며, 다른 프로그램이나 운영 체제의 메모리에 접근할 수 없도록 보호됩니다.
- 멀티태스킹 지원: 하드웨어 수준에서 다중 태스크를 효율적으로 처리할 수 있으며, 태스크 간 전환도 하드웨어가 지원합니다.
- 세그먼트 및 페이징을 통한 메모리 관리: 메모리 세그먼트를 더 세밀하게 제어할 수 있으며, 페이징 기법을 통해 가상 메모리 관리가 가능합니다.
차이점 요약
- 메모리 보호 및 관리: Protected Mode는 메모리 보호와 가상 메모리 관리를 통해 더 안정적이고 효율적인 시스템 운영을 가능하게 합니다.
- 메모리 접근 가능 크기: Real Mode는 최대 1MB, Protected Mode는 프로세서에 따라 훨씬 더 큰 메모리를 접근할 수 있습니다.
- 운영 체제 기능: Protected Mode는 멀티태스킹과 같은 복잡한 운영 체제 기능을 효과적으로 지원합니다.
의문
protected mode와 가상메모리는 유사한 개념인건가?
그건 아님
그럼 가상 메모리가 독립된 주소공간을 가지게 하는게 아니라, protected mode가 독립된 주소공간을 가지게 하는건가?
그렇다.
protected mode는 어떻게 독립된 주소공간을 구현하나?
- 80286
- 세그멘테이션으로 구현됨
- external fragmentation으로 효율적이지 못했음
- 80386
- 여기서부터 페이지드 세그멘테이션
- internal fragmentation 발생하지만, 페이지 크기(4096kb) 이므로 external fragmentation보다 훨배 나음.
protected mode의 초기 버전, 완성 버전
- 80286 → 24비트 주소 공간 → 2^24 → 16MB 램까지 사용 가능
- 80386~ → 32비트 주소 공간 → 2^32 → 4096MB 램까지 사용 가능
16비트 레지스터가 2개면 최대 4GB까지 표현 가능한거 아닌가?
이론적으로는 맞는 말이나, 당시 하드웨어가 그렇지 않았음.
8086 Addressing (16-bit register, 20-bit address)
Real mode에서 이렇게 동작함.
그래서 부팅할 때 CPU는 CS 레지스터를 FFFF로, IP를 0000으로 초기화하고, CS:IP에 접근함
그러면 CS 세그먼트의 0000부분부터 실행되니까, 이 부분의 피지컬 어드레스는 0xFFFF0임.
그렇게 되는 이유는 레지스터는 16-bit인데, 주소체계가 20-bit라서 그렇다.
- LS 4 times (비트를 4개 밀어야함, 16진수 기준으로는 하나)
0xFFFF << 4 = 0xFFFF0
- Add Instruction Pointer
0xFFFF0 + 0x0000 = 0xFFFF0
이 부분이 BIOS 코드가 있는 부분이고, 여기서 실행된 BIOS 코드는 0x19 Interrupt를 발생시킴.
그러면 OS는 뭐 올리고~ 어쩌고 한다함.
부팅
가상 메모리
- 물리 메모리가 1GB인데 어떻게 4GB를 사용중이죠?
- 페이징 & 스왑, 사용중인 페이지만 물리 메모리에 올라온다.
- 프로세스마다 4GB의 가상 공간을 가질 수 있는 이유
- 3GB는 User Space, 1GB는 Kernel Space
- Kernel Space 중에서도 공유할 수 있는 공간(커널 코드 등-896MB) 과, 공유할 수 없는 부분 (프로세스 별로 다르게 할당되어야 함 - 128MB - 페이지 테이블 등) 이 있음.
→ 가상 메모리
메모리 관리
Segmentation기법 (80286)
segment별로 관리함. 각각 다른 protection 가능
external fragmentation 발생
Segment Protection
Global Descriptor
- 이거 메모리에 있고, 테이블로 관리된다.
→ 이 테이블은 GDTR(Global Descriptor Table Register)가 가리키고 있다.
→ CPU는 이걸 참조해서 세그먼트 접근 가능한지 등등 알아냄(아래에서 기술할 Privilege Level)
- 세그먼트의 정보를 알려준다.
- 접근 가능하다/아니다 등등.. → 여기에 DPL이 있네.! (Descriptor Privilege Level)
Privilege Level Checking
- CPL → 어쨌든 프로세스를 실행하는 건 코드를 실행하는 거니까 → 현재 프로세스의 Code Segment에 있음. → 이 부분을 가리키는 레지스터가 있음 (CS reg)
- RPL → 접근하려는 대상의 Segment