Ezcho

System Programming - X86 Process 구조 본문

Lecture/System Programming

System Programming - X86 Process 구조

Ezcho 2023. 4. 12. 17:10

x86 프로세서 패밀리의 아키텍처

  • Intel IA-32 및 Intel 64 프로세서 • 인텔 펜티엄, 코어 듀오, 코어 2 및 코어 i 시리즈
  • AMD 프로세서 • AMD 애슬론, 페놈, FX 및 라이젠 시리즈

일반적인 Microcomputer 의 설계

 

- 메모리 저장 장치

컴퓨터 프로그램이 실행되는 동안 명령어와 데이터를 보유합니다. CPU에서 데이터요청을 받아 RAM에서 CPU로 데이터를 전송하고 CPU에서 처리 후 다시 전송합니다.

 

-CPU, 메모리및 프로그램

모든 데이터 처리는 CPU내에서 이루어지므로 메모리에 있는 프로그램은 실행되기 전에 CPU로 복사되어야 합니다. 

 

1. Micro Computer 설계

1. 버스 

• 컴퓨터의 한 부분에서 다른 부분으로 데이터를 전송하는 Parallel한  와이어 그룹
• 컴퓨터 시스템에는 보통 네 가지 버스 유형이 있습니다.

1.  데이터 버스: Insteruction들과 data를 CPU와 Memory간에 전송합니다.

2. I/O 버스: CPU와 I/O 디바이스간에 데이터를 전송합니다.

3. Control bus: 이진 신호를 사용합니다. 이는 시스템 버스에 연결된 모든 장치의 동작을 동기화합니다.(껏다 켰다 의미인듯)

4. Address bus: CPU와 메모리가 통신할때 호출되고있는 Instruction의 주소와 데이터의 주소를 보유합니다.

 

 

2. Clock

CPU와 시스템 버스를 포함한 각 동작은 일정한 비율로 진동하는 내부 클럭에 의해 동기화됩니다.

클럭은 아래와 같은 표현으로 수치화 할 수 있습니다.

1. Clock cycle: Instruction 시간에 대한 기본 단위

2. length of clock: 클럭 한 주기의 길이

3. duration of clock cycle: 클럭 사이클의 지속 시간, 클럭 속도의 역수로 계산됩니다.

 

machine Instruction은 최소 하나의 clock cycle이 필요합니다.

 

clock cycle이 모든 unit을 동기화 시키기는 못하기 때문에 대기 상태가 발생합니다. 대기상태란 메모리 엑세스와 관련이 있는데 메모리와 CPU, Systembus의 속도 차이로 인해 빈 클럭 주기를 가지는경우를 말합니다.

 

 

2. Instruction 호출 Cycle

CPU는 머신 Language를 실행하기 위해 미리 정의돈 일련의 단계를 거쳐야합니다.

1. 먼저 CPU는 명령어를 fetch the instruction 이라는 메모리 영역에서 가져옵니다. 이후 명령어 포인터를 증가시킵니다.

2. 다음으로 CPU는 명령어를 Decoding 하여 이진 비트 패턴을 확인합니다. 이 비트패턴애는 오버랜드(입력값)가 포함될 수 있습니다.

3. 오버랜드가 포함된 경우에는 CPU는 레지스터와 메모리에서 입력값을 가져옵니다. 때로는 이 과정에서 주소 계산이 필요합니다.

4. 그다음 CPU는 명령어를 실행하며, 이전 단계에서 가져온 입력값을 사용합니다. 또한 Zero, Carry, Overflow등 상태 플래그 업데이트

5. 마지막으로 출력 오퍼랜드가 명령어의 일부인 경우 CPU는 실행 결과를 오퍼랜드에 저장합니다.

예를들어 Z = X + Y는 두개의 입력 오퍼랜드와 하나의 출력 오퍼랜드를 가집니다.

 

그래서 Instruction 실행 주기는 아래와 같은 3개의 큰 과정을 포함합니다.

- Fetch, Decode, Execute

 
 

이 다이어그램은 명령 실행 주기 동안 상호 작용하는 구성 요소 간의 관계를 보여줍니다.

1. 메모리에서 프로그램 지침을 읽기 위해 주소는 Adress Bus에 배치됩니다.

2. 다음으로, 메모리 컨트롤러는 요청된 코드를 Data Bus에 배치하여 코드 캐시 내에서 코드를 사용할 수 있도록 합니다.

3. 명령 포인터의 값은 다음에 실행될 명령을 결정합니다.

4. 명령은 명령 디코더에 의해 분석되어 적절한 디지털 신호가 ALU와 부동 소수점 단위를 조정하는 제어 장치로 전송됩니다.

 

 

3. 메모리에서 데이터 읽기

 

1. RAM에서 읽어오기

4개의 개별적인 스텝을 통해 메모리에서 데이터를 읽어옵니다.

1. 주소 버스에 우선 읽고싶은 값의 주소를 넣습니다.

2. RD핀(시그널)에 내가 값을 읽어오겠다고. 상태를 수정합니다. -> RD핀 값 변경

3. 메모리 칩이 넣은 상태값에 반응하기 까지에 1사이클 기다립니다.

4. 데이터 버스는 데이터를 메모리에서 가져와서 목적지 오퍼랜드에 복사합니다.

이러한 과정은 각각 1사이클이 필요해서 메모리에서 값을 읽어오는것은 CPU레지스터에서 값을 읽는것보다 훨씬 느립니다.

 

2. Cache를 사용한 방법

- CPU는 캐시라는 고속 메모리에 가장 최근에 사용된 명령어와 데이터를 저장하여 읽고 쓰는 시간을 줄입니다.

 

1. 프로그램이 동일한 메모리와 명령어를 반복적으로 access할 가능성이 높기 때문에 cache는 이러한 값을 빠르게 액세스 할 수 있는 곳에 보관합니다.(캐시메모리)

2. CPU가 프로그램을 실행하기 시작하면 다음 1000개의 instruction을 캐시에서 로드하여 이러한 명령어가 곧 필요할 것으로 가정한다.

루프와 같은 예시가 있다.

3. 프로세서가 캐시 메모리에서 데이터를 찾을 수 있는경우를 hit 라고 합니다.

4. 반대로 캐시에서 찾을수 없다면 miss 라고 합니다.

 

3. 여러가지 캐시와 특징

X86 게열에는 두가지 캐시메모리가 존재하는데 

1. 레벨1 캐시: 이는 CPU에 직접저장됩니다.(기본캐시)

2. 레벨2 캐시: 조금 느리지만 고속 데이터버스에 의해 CPU와 연결됩니다. 

두 종류의 캐시는 최적의 방식으로 함께 작동합니다.

 

캐시메모리가 일반적인 RAM보다 빠른 이유

일반적인 메모리는 동적RAM으로 지속적으로 리프레시 해야하는 단점이있습니다. 느리지만 저렴합니다.

하지만 캐시메모리는 정적RAM으로 지속적으로 리프레시 해야하는 단점이 없습니다. 비쌉니다.

 

 

4. 프로그램 Load와 Excution

프로그램이 실행하기전, 메모리에서 로드되어야합니다. 이때 프로그램로더에 의해 로드됩니다.

로딩이 완료된 후 OS는 반드시 프로그램이 실행을 시작할 주소인 Program's entry point를 가리켜야 합니다.

 

자세한 과정

1. OS는 현재 disk directory에서 프로그램의 파일 이름을 찾습니다.

만약 찾을수 없다면 미리 지정된 디렉토리 목록(경로) 에서 찾습니다. 이래도 찾을수 없다면 오류를 출력합니다.

2. 프로그램 파일을 찾으면 OS는 디스크 디렉토리에서 해당 파일의 기본 정보를 검색합니다.

이 정보는 파일 크기와 물리적 위치를 포함하빈다.

3. OS는 다음 사용 가능한 메모리 위치를 결정하고, 프로그램 파일을 메모리에 로드합니다.

4. OS는 프로그램을 위한 메모리 블럭을 할당하고, 크기와 위치 정보를 테이블에 입력합니다.

이 과정에서 OS는 내부의 포인터 값도 조정할 수 있습니다.

5. OS는 프로그램의 첫번째 기계 명령어(entry point)를 실행합니다. 프로그램이 실행되기 시작하면 이는 곧 프로세스 가 됩니다.

6. OS는 PID를 할당하고 계속해서 사용하기위해 프로세스를 추적합니다.

7. 프로세스는 자체적으로 실행됩니다.

OS는 프로세스 실행을 추적하고, 시스템 자원(메모리, 디스크파일, IO등)에 대한 요청에 응답합니다.

8. 프로세스가 종료되면 OS는 메모리에서 이를 삭제합니다.

 

5. X86의 역사

Data Width가 시간에 지남에 따라 증가한다 8 ~ 64bits

트렌지스터 속도와 Clock Rate도 증가한다. (단시간에 많은 처리)

 

6. 32bit X86 Processors

x86에느 세가지 기본 동작 모드가 있습닙다.

1. Real-Address Mode: 초기 Intel프로세서의 프로그래밍 환경을 구현하는 모드입니다.

시스템 메모리 및 하드웨어 장치에 직접 엑세스 해야 하는 경우에 유용합니다.

2. Protected Mode: 프로세서의 기본 동작 모드로 모든 명령어와 기능이 사용 가능한 상태입니다.

프로그램은 세그먼트라는 별도의 메모리 영역을 할당받으면서 프로세서는 프로그램이 할당된 세그먼트 외부의 메모리에 접근하는것을 방지지합니다.

Virtual-8086모드: 8086모드는 Protected Mode의 특수한 경우로 MS-dos프로그램과 같은 Real-AddressMode 소프트웨어를 안전한 환경에서 직접 실행할 수 있습니다. 메모리에 데이터를 쓰려고 시도하더라도 동시에 실행중인 다른 프로그램에 영향을 미치지 않습니다. 최신 OS는 별도로 여러 가상 8086을 실행할 수 있습니다.

 

3. SMM(System management Mode): SMM은 전원 관리 시스템, 보안과 같은 기능을 구현하기 위한 OS메커니즘을 제공합니다. 

 

2. Adress Space

32비트 x86에서 주소공간

• Real Address mode 에서 프로그램은 1Mbyte의 범위만 처리할 수 있습니다.

• Protected mode 에서는 최대 4GB의 선형 주소 공간이 사용됩니다.

• P6 프로세서를 시작으로, 확장된 물리적 주소 지정을 통해 총 64GB의 물리적 메모리를 처리할 수 있습니다.
• 프로세서가 Protected mode 에 있고 Virtual-8086 모드에서 여러 프로그램을 실행하는 경우, 각 프로그램에는 자체 1-MByte 메모리 영역이 있습니다.

 

3. 레지스터

레지스터는 CPU내부에 직접적으로 위치한 고속 저장 공간입니다.

일반적인 메모리보다 훨씬 빠르게 접근가능하도록 설계되었습니다.

예를들어 처리루프가 속도 최적화 되려면 루프 카운터(변수 i)는 레지스터에 보관됩니다.

8개의 범용 레지스터, 6개의 segment 레지스터, 프로세스 상태 플레그 레지스터(EFLAGS) 및 명령어 포인터(EIP)가 존재합니다.

 

32bits x86 의 레지스터 세트

 

1. 범용 레지스터 - 6개

주로 산술 및 데이터 이동에 의해 사용됩니다. 그림처럼 EAX레지스터의 하위 16비트는 AX라는 이름으로 참조될 수 있습니다.

 이런식으로 범용레지스터들은 16비트의 하위비트 레지스터로 쪼개지고, 8비트로 또 쪼개집니다.

 

 

1. EAX: 하위 16비트가 AX라는 이름으로 참조됩니다. 자동으로 곱셈및 나누셈 명령에 사용됩니다.(확장된 AX레지스터)

2. ECX: CPU가 자동으로 루프카운터로 사용합니다.

3. ESP: 스텍에서 데이터를 참조하기 위해 사용합니다.

일반적인 산술 및 데이터 이전에는 사용되지않고 Extended Stack Pointer레지스터 라고 불립니다.

4. ESI및 EDI: 고속 메모리 전송 명령에서 사용됩니다. Extended Source Index 및 Extended Destination index 라고 불립니다.

5. EBP: EBP는 스택에서 고급 언어의 참조 함수 매개변수 및 로컬 변수에 사용됩니다. 일반 산술 및 데이터 이전에는 사용하지 않는것이 좋습니다. Extended Frame Pointer Register 입니다.

 

일반 목적 레지스터

세그먼트 레지스터(Segment Register)

real Adress mode 에서 사용되는 16비트의 세그먼트 레지스터는 세그먼트 베이스 주소를 나타냅니다.

Protected mode에서는 세그먼트 레지스터가 세그먼트 디스크립터 테이블의 포인터를 가지고 있습니다.

일부 세그먼트는 프로그램 명령어(Code)를 보유하고, 다른 세그먼트는 변수(Data)를 보유하며, 스택 세그먼트는 로컬 함수와 매개 변수를 보여줍니다.

 

EIP(명령 포인터): 명령 포인터는 다음에 실행될 명령어의 주소를 포함하는 레지스터입니다. 특정 기계 명령어는 EIP를 조작하여 프로그램이 새로운 위치로 분기하도록 합니다.(아직 안배움)

 

EFLAGS 레지스터

EFLAGS 레지스터는 CPU의 동작을 제어하는 개별 이진 비트로 구성되어있습니다. 또한 CPU의 동작 결과를 나타내는 비트들도 포함하고 있습니다. 일부 명령어는 프로세서 플래그를 테스트하고 조작할 수 있습니다. 플래그는 크게 두개로 구분할 수 있습니다.

1. 제어 플래그

CPU의 동작을 제어하는 역할을 합니다. 예를 들어,

모든 명령어 실행 후 CPU를 멈추게 하는 플래그,

산술 오버플로우가 감지되면 인터럽트를 발생시키는 플래그,

Virtual 8086모드로 진입하는 플래그

보호 모드로 진입하는 플래그

등이 있습니다. 프로그램은 EFLAGS 레지스터의 개별 비트를 설정하여 CPU 동작을 제어할 수 있습니다.

 

2. 상태 플래그

CPU가 수행하는 산술 및 논리 연산의 결과를 출력합니다.

각 플래그들은 산술 또는 논리 연산 결과에 대한 정보를 저장합니다. CPU는 오버플로우도 모르고, Sign, Unsign 으로 값이 들어오는것도 판단하기엔 연산이 복잡해지니까 이런것들을 따로 빼서 저장합니다.

 

1. Carry Flag(CF)

부호 없는(unsigned) 산술 연산에서 목적지(destination) 레지스터에 결과 값이 들어갈 수 없을 정도로 큰 경우에 설정됩니다.

예를 들어, 8비트의 부호 없는 정수 값이 있을 때, 덧셈 연산을 수행하고 결과 값이 8비트 범위를 초과할 경우 Carry Flag가 설정됩니다.

2. Sign Flag

산술 연산 결과 값이 음수일 경우 설정됩니다. 부호 있는 정수의 최상위 비트가 1이면 결과 값은 음수가 됩니다. 따라서, 이 최상위 비트를 검사하여 음수 여부를 판단하고 Sign Flag를 설정합니다.

4. Zero Flag (ZF)

산술 연산 결과 값이 0일 경우 설정됩니다. 연산 결과가 0이 아닌 경우 ZF가 클리어(clear) 상태가 됩니다.

5. Auxiliary Carry Flag (AF)

8비트의 부호 없는 정수에서 하위 4비트와 상위 4비트의 연산 과정에서 캐리(Carry)가 발생할 경우 설정됩니다.

6. Parity Flag (PF)

연산 결과 값의 최하위 비트에 1의 개수가 짝수 개인 경우 설정됩니다. 예를 들어, 8비트의 값이 0xF5인 경우 이진수로 변환하면 11110101이 되며, 이 값의 최하위 비트에는 1의 개수가 4개입니다. 따라서, Parity Flag가 클리어(clear) 상태가 됩니다.

 

 

MMX 레지스터

MMX 레지스터

  • MMX 기술은 인텔 프로세서의 기능 중 하나로, 멀티미디어 및 통신 애플리케이션의 성능을 향상시킵니다. 이 기술은 SIMD(Single-Instruction, Multiple-Data)이라고 불리는 특수 명령어를 지원하는 여덟 개의 64비트 MMX 레지스터를 통해 구현됩니다.
  • MMX 레지스터는 별도의 레지스터인 것처럼 보이지만, 실제로는 부동 소수점 유닛에서 사용하는 동일한 레지스터의 별칭(alias)입니다.

XMM 레지스터

  • x86 아키텍처는 128비트의 여덟 개의 XMM 레지스터를 가지고 있습니다.
  • 이들 레지스터는 스트리밍 SIMD 확장 명령어 집합에서 사용됩니다.

 

FPU 레지스터

FPU는 고속 부동 소수점 산술을 수행합니다. 한때 이것을 수행하기 위해서 별도의 보조 프로세서 칩이 필요했지만 최근에(Intel 486이후 메인 프로세서 칩과 통합되었습니다.)

4. 메모리 관리

x86프로세서는 모드에 따라 메모리관리방식이 조금 달라집니다.

1. Real mode

20비트 주소 버스와 32비트 CPU레지스터로 인해, 메모리주소는 00000 ~ FFFFF 까지 1MB만 사용가능합니다.

프로세서는 한번에 하나의 프로그램만 실행 할 수 있으나, 주변 기기에서 들어오는 인터럽트 요청을 처리하기 위해 일시중단 할수 있습니다.

어플리케이션 프로그램은 하드웨어와 직접적으로 연결된 주소를 포함하여 모든 메모리 위치에 접근할 수 있습니다.

MS-DOS는 리얼 모드에서 실행되며, 윈도으95와 98도 이 모드에서 부팅할 수 있습니다.

 

2. Protected mode

32비트 주소버스와 32비트 CPU로 인해, 하나 이상의 프로그램을 동시에 실행할 수 있습니다.

각 프로그램은 총 4GB메모리를 할당받을 수 있습니다.

각 프로그램을 자체적으로 예약된 메모리 영역을 할당받을 수 있습니다.

프로그램들은 서로의 코드와 데이터에 임의로 접근하지 못하도록 보호됩니다.

Windows 와 Linux는 프로텍티드 모드에서 실행됩니다.

 

3.Virtual-8086

컴퓨터가 프로텍티드 모드에서 실행되었을때, Virtual 8086 기계를 생성하여 자체 1MB의 주소 공간을 갖춘 80x86컴퓨터가 리얼모드에서 동작하는것처럼 시뮬레이션 합니다.

많은 수의 창을 동시에 실행할 수 있다.

 

 

 

 

 

 

 

 

 
 

 

Comments