본문 바로가기

CS/System programming

X86 Processor Architecture

728x90

General Concepts

어셈블리어는 컴퓨터가 어떻게 동작하는지 배우기 아주 좋은 도구이다.

1. Basic Microcomputer Design

  • CPU(The Central Processor Unit)
    • 레지스터: CPU에 있는 저장소, RAM에서 명령어를 하나씩 가져와서 여기에 저장한다.
    • high-frequency clock: CPU의 모든 작업을 동기화하고 타이밍을 맞추는 역할
    • control unit(CU): 읽어 들여오는 기계어를 control하는 역할
    • ALU: 연산을 수행한다.
  • CPU는 메인보드에 있는 CPU 소켓에 연결된 핀을 통해 컴퓨터와 연결
  • 대부분의 핀이 데이터 버스, 주소 버스, 제어 버스 등에 연결 됨
  • The memory storage unit: 컴퓨터가 실행중인 프로그램과 데이터를 일시적으로 저장하고, 이를 다른 하드웨어 장치들과 연결하여 처리하는 역할
  • CPU, memory, and programs: 모든 데이터 처리는 CPU에서 이루어진다. 따라서 메모리에 상주하는 프로그램은 실행되기 전에 CPU로 복사되어야 한다. 명령어는 한번에 하나씩 복사되거나 그룹으로 복사될 수 있다.
  • BUS: 디바이스들 간 연결해주는 통로 역할
    • Data bus: CPU와 메모리 사이 데이터와 명령어를 전달
    • I/O bus: CPU와 I/O 디바이스들간 데이터 전달
    • Control bus: 디바이스들간 동기화, CPU와 다른 하드웨어 장치가 통신할 때 필요한 제어 신호 전송, 클럭 신호, 인터럽트 신호 등
    • Address bus: CPU와 메모리 간의 주소 정보를 전송, 데이터 버스와 함께 동작, 주소 버스의 비트 수가 더 많을수록 메모리에 접근할 수 있는 주소 공간이 더 크다.
  • Clock: CPU 내부에 있는 시계 같은 거라고 볼 수 있음. CPU와 시스템 버스를 포함한 모든 작업을 일정한 속도로 동기화하기 위해 내부적으로 발생하는 펄스. 클럭이 높을수록 사이클이 빨라지고 반대는 느려짐.
    • 머신 사이클(클럭 사이클): 사이클과 거의 같은 개념. 사이클은 작업을 처리하는 기본 단위. 예를 들어 CPU와 다른 장치들 간에 정보를 주고 받을 때, 데이터와 명령어를 전송하는데 필요한 시간.
    • cycle의 길이: 하나의 클럭 펄스에 필요한 시간.
    • 클럭 사이클의 주기: 클럭의 속도(초당 진동수)의 역수로 계산. 예를 들어, 초당 10억 번 진동하는 클럭의 주기는 1나노초
    • 기계 명령어에는 적어도 하나의 클럭 사이클이 필요하다.
    • Wait states: CPU, 시스템 버스 및 메모리 회로의 속도 차이 때문에 기억 장치에 엑세스하는 명령어는 빈 클럭 사이클을 가질 수 있다. 이러한 빈 클럭 사이클을 wait states라고 한다.

2. Instruction Execution Cycle

  • CPU가 명령어를 실행하는 과정
    • 첫번째, CPU는 instruction queue라는 메모리 영역에서 명령어를 가져와야한다. 이 작업을 수행하고 instruction pointer를 증가시킨다.(다음 주소로 바꾼다)
    • 다음, CPU는 명령을 해독한다. 그리고 피연산자가 필요함을 알 수 있다.
    • 피연산자가 필요할 때, CPU는 레지스터와 메모리에서 피연산자를 가져온다.
    • 다음, CPU는 이전 단계에서 가져온 피연산자 값을 사용하여 명령을 실행한다. 몇 가지 상태 플래그 또한 업뎃한다.
    • 마지막으로 출력 피연산자가 명령의 일부일 때 CPU는 실행 결과를 피연산자에 저장한다.
  • 명령 실행 주기 동안 상호 작용하는 구성 요소 간의 관계
    • a. 메모리에서 프로그램 명령을 읽기 위해 주소가 address bus에 배치된다.
    • b. memory controller는 요청된 코드를 data bus에 배치한다.
    • c. instruction pointer는 다음에 실행할 명령어를 결정한다.
    • d. 명령어는 디코더에 의해 분석되어 ALU와 floating-point unit에 전달된다.

3. Reading from Memory

  • CPU가 메모리에서 값을 읽을 때
    • CPU는 메모리의 주소를 주소 버스에 전달한다.
    • RD핀을 활성화하여 데이터를 읽는다.
    • 이 과정은 일반적으로 한 클럭 사이클이 소요된다.
    • 메모리 장치는 한 클럭 사이클 동안 응답을 기다리고, 데이터 버스를 통해 데이터를 전송한다.
    • 데이터를 목적지 피연산자에 복사한다.
  • 폰노이만 구조의 단점: CPU <-> RAM 과정 시간이 오래 걸린다. 병목현상
  • 캐시 사용
    • 메인 메모리에서 자주 사용되는 데이터나 명령어를 일시적으로 갖고 있는, 크기는 작지만 빠른 메모리이다.
    • CPU가 더 빠르게 데이터를 처리할 수 있게 해준다. 엑세스 속도도 빠르다.
    • 프로그램은 동일한 메모리와 명령에 반복적으로 엑세스할 확률이 높다. 따라서 캐시는 이러한 값을 빠르게 엑세스할 수 있는 위치에 유지한다.
    • 프로세서가 캐시 메모리에서 데이터를 찾을 수 있을 때 hit, 캐시에서 무언가를 찾으려 하지만 실패하면 miss
  • x86에서 캐시는 L1캐시, L2캐시가 있음.
  • DRAM: 지속적으로 refresh되어야 하고 그리고 cheap.
  • SRAM: expensive하지만 지속적으로 refresh될 필요는 없다.

4. Loading and Executing a Program

  • 프로그램이 실행되기 전에 메모리에 로드되어야 한다.
  • 로드 후 OS는 프로그램이 메모리상 어디에 있는 CPU한테 알려준다.
  • 세부과정
    • OS는 disk directory에서 프로그램의 파일 이름을 검색한다.
    • 없으면 오류 띄우고 있으면 OS는 파일에 대한 기본 정보를 검색한다.(파일 크기 및 물리적 위치)
    • OS는 메모리에서 사용 가능한 위치를 결정하고 프로그램 파일을 메모리에 로드한다.
    • OS는 프로그램의 첫번째 명령어의 실행을 시작한다. 프로그램이 시작되면 프로세스라고 부르고 이에 process id를 할당해 구분한다.
    • 프로세스 자체 실행한다. 프로세스 실행을 추적하고 시스템 자원에 대한 요청에 응답하는 것은 OS의 역할이다.
    • 프로세스가 종료하면 메모리에서 제거된다.

5. History of x86

  • X86 뒤에 16, 32 같은 숫자는 레지스터의 크기이다. 즉, CPU가 담을 수 있는 데이터의 크기라고 할 수 있다.

32-Bit x86 Processors

1. Modes of Operation

  • Real-Address Mode: 8086의 동작 방식이다. 주소 체계가 20bit였으며 이로 인해 메모리는 최대 1MB 쓸 수 있었다. 또한 프로그램이 메모리나 하드웨어에 직접 접근할 수 있어서 보안이 취약했다.
  • Protected Mpde: 기존보다 메모리 크기가 늘어났다. 프로그램이 메모리에서 segments라고 불리는 공간에서 적재됐으며 프로그램이 메모리나 하드웨어에 직접 접근할 수 없게 되었다.
  • System management mode: OS에 power management나 system security 와 같은 기능을 추가한 모드이다.
  • Virtual-8086 Mode: protected mode가 돌아가는 상황에서 프로세서가 real-adress모드를 실행하기 위한 모드이다. 프로그램이 충돌하거나 시스템 메모리의 영역의 데이터를 쓰려고 하면 동시에 실행중인 다른 프로그램에 영향을 미치지 않는다.

2. Basic Execution Environment

폰노이만 구조: 데이터와 명령어가 서로 구분이 되지 않고 메모리 상에 적재가 되어서 메모리에서 CPU로 fetch가 이루어져 CPU에서 연산이 일어나는 구조

  • Address space(메모리에서의 주소를 의미함)
    • Real-address mode는 1MB의 주소를 가진다.(2^20 = 1048576Bytes)
    • 32bit protected mode에서 4GB이다.(2^32 = 2^30 * 2^2 = 4GBytes)
    • P6 프로세서 이후에 PAE을 통해 64GB의 physical memory 가능해졌다.
    • virtual-8086 mode에서 각 프로그램은 1MB의 메모리 영역을 갖는다.
  • Register: 데이터나 코드는 메모리에 있는데 이것들이 CPU에서 작업을 하려면 CPU에 전달돼서 잠깐 저장이 되어야하는데 그때의 역할
    • CPU 내부에 있는 빠른 메모리
    • 8개의 general-purpose register, 6개의 segment register, flag register(EFLAGS), instruction pointer(EIP)
  • General-Purpose Registers
    • arithmetic 과 data movement에 사용된다.
    • 위 그림과 같이 나눠질 수 있다.
  • Specialized Uses
    • EAX: multiplication 과 division에 자동으로 사용된다.
    • ECX: loop counter로서 사용된다.
    • ESP: 드물게 arithmetic과 data transfer에 사용되며 스택의 포인터 역할을 한다.
    • ESI and EDI: 빠른 속도의 메모리가 명령어를 전달할 때 사용된다.
    • EBP: HL에서 함수 인자나 지역 변수에 사용된다.extended frame pointer라고도 불린다.
  • Segment Register
    • Real-address mode에서 16bit segment register는 세그멘트라고 불리는 메모리 영역의 base address를 가리킨다.
    • Protected mode에서는 segment descriptor table을 참조한다.
    • 코드 세그먼트, 데이터 세그먼트, 스택 세그먼트 등이 있다.
  • instruction pointer(EIP): 다음 명령어의 주소를 가지고 있다. 임의로 수정해서 branch나 loop를 구현하기도 한다.
  • EFLAGS Register
    • CPU 내의 여러가지 연산의 결과의 상태를 확인할 수 있는 비트를 가지고 있다.
    • Control flag: CPU의 연산을 제어한다. 모든 명령이 실행되면 CPU를 중단하고 오버플로우가 발생하면 중단하는 등.
    • Status Flag: arithmetic과 논리적인 연산의 결과를 나타낸다.
  • MMX Register
    • 멀티미디어나 communication application을 향상 시키는(?) 그런 역할
    • 8개의 64bit MMX register는 SIMD를 지원한다.
    • XMM Register: 확장된 버전
  • Floating-Poing Unit(FPU)
    • 초창기에는 없었다.
    • 부동 소수점 연산을 빠르게 처리하기 위해 설계되었다.

3. x86 Memory Management

  • Real-address mode
    • 1MB의 메모리, 20bit 주소 체계
    • 한번 실행할 때 하나의 프로그램만 실행됐다. 주변 기기들에서 요청이 들어오면 interrupt 형태로 처리한다.
      • 프로그램이 메모리에 접근 가능했다.
  • Protected mode
    • 32bit 주소 체계, 4GB의 메모리
    • 각 프로그램은 각 해당하는 메모리 영역이 있음.
    • 프로그램은 서로의 코드나 데이터 영역에 침범할 수 없다.
  • Virtual-8086 mode
    • 각각 실행되는 real-address mode 프로그램에서 접근하는 주소가 실제 physical adrress의 하드웨어에 mapping되는 것은 아니다.

64-Bit x86-64 Processors

1. 특징

  • AMD64: modern 프로세서들의 아키텍쳐
  • 기존과 호환성을 고려해서 만들어졌다
  • 주소 64비트
  • 하위 48비트만 사용된다.
  • 48비트의 물리적 주소 공간을 사용하여 최대 256 테라바이트 RAM 지원한다.
  • IA-64: 인텔에서 만들었는데 기존 버전들과 호환을 하지 않고 성능도 그닥

2. 64-Bit Operation Modes

  • Compatibility Mode: 16bit와 32bit application을 재컴파일 없이 실행할 수 있다.
  • 64-bit mode: 64bit instruction 고유의 명령어 사용 가능하다. 16-bit real mode와 virtual-8086 모드 지원하지 않는다.

이 수업에서 그다지 중요하지 않아서 세부적인 내용은 건너 뛰었다.

Components of a Typical x86 Computer

1. Motherboard

  • 다양한 component들이 bus에 의해 서로 연결된다
    • CPU socket
    • Memory slot
    • BIOS chips
    • CMOS RAM
    • PCI bus connectors for IO devices
    • ETC..
  • 다음은 일반적인 시스템에서 중요한 지원 프로세서다.
    • FPU: floating point와 extended integer calculation을 다룬다.
    • Clock: 일정한 속도로 진동한다. CPU와 나머지 부품들을 동기화한다.
    • Programmable Interrupt Controller(PIC): 하드웨어 장치의 외부 interrupt 처리, 이러한 장치는 CPU를 중단하고 요청을 즉시 처리한다.
  • PCI 및 PCI Express Bus Architectures
    • PCI bus: CPU와 드라이브, 메모리 등 다른 시스템 장치 간의 연결을 제공한다.
    • PCI Express bus: 장치, 메모리 및 프로세서 간의 양방향 직렬 연결을 제공한다. 매우 빠른 속도로 데이터 전송할 수 있다.
  • Motherboard Chipset: 특정 유형의 마더보드에서 함께 작동하도록 설계된 프로세서 칩 모음. 멀티미디어 기능을 높이거나 전력 소비 줄일 수 있다.

2. Memory

  • Intel based system에서 몇가지 유형의 메모리
    • ROM: CD, DVD 등
    • EPROM
    • DRAM: 지속적로 refresh
    • SRAM: refresh 필요 x
    • VRAM: 비디오 데이터 저장
    • CMOS RAM: 시스템 셋업 정보를 저장함. 배터리를 통해 새로고침이 되므로, 컴퓨터 전원이 꺼져도 내용이 유지된다.

I/O system

1. Levels of I/O Access

  • 입출력은 하드웨어에 직접 접근하지 않아도 된다.
  • I/O는 접근 레벨을 나누어 이용가능하다.
    • High level language functions: C++이나 자바는 I/O function을 가지고 있다. 특정 OS나 시스템에 종속적이지 않고 범용적으로 쓰게 만들어졌다.
    • OS: API에서 OS 기능을 호출할 수 있다. 파일에 문자열 쓰기, 키보드에서 문자열 읽기, 메모리 블록 할당 등.
    • BIOS: 하드웨어 장치와 직접 통신하는 subroutines의 모음. 컴퓨터 제조업체에서 설치, 특정 하드웨어에 맞게 조정, OS는 일반적으로 BIOS와 통신한다.
  • Device Drivers: 프로그램의 집합
    • OS가 하드웨어 장치 및 BIOS와 직접 통신할 수 있도록 허용하는 프로그램
      1. 특정 하드웨어가 컴퓨터에 연결하기 전이나 2. 장치가 부착되고 식별된 후에 설치된다.
  • IO hierarchy(화면에 문자열을 표시하는 상황)
    1. 응용프로그램의 명령문은 문자열을 표준 출력에 쓰는 라이브러리 함수를 호출한다.
    2. 라이브러리 함수(L3)는 OS 함수를 호출하여 문자열 포인터를 전달한다.
    3. OS function(L2)은 루프를 사용하여 BIOS 서브루틴을 호출하고 각 문자의 ASCII 코드와 색상을 전달한다. OS는 다른 BIOS 서브루틴을 호출하여 커서를 화면의 다음 위치로 이동시킨다.
    4. BIOS 서브루틴(L1)은 문자를 받아 특정 시스템 font에 매핑하고 문자를 비디오 카드에 연결되어 있는 하트웨어 포트로 보낸다.
    5. vedio contoller card(L0)는 비디오 디스플레이에 대한 신호 생성
  • AL은 IO영역에서 강력하고 유연하다.
    • 레벨3: 일반 텍스트 I/O 및 파일 기반 I/O 수행 위한 라이브러리 함수 호출
    • 레벨2: 일반 텍스트 I/O 및 파일 기반 I/O 수행 위한 OS 기능 호출, GUI를 사용하는 경우 독립적인 방식으로 그래픽을 표시하는 기능
    • 레벨1: BIOS 기능 활용하여 색상, 그래픽, 사운드 등 장치별 기능 사용
    • 레벨0: 하드웨어 포트에서 데이터를 송수신하여 특정 장치에 대한 절대적 제어 가능. Not portable하고 장치 유형마다 코드가 다르다.
  • Tradeoff: 상황에 맞게 적절한 Level을 선택해야 한다.
    • Level 2(OS): 동일한 OS에서 실행하는 모든 컴퓨터에서 작동한다. I/O 장치가 특별한 기능을 지원하지 않는 경우, 운영 체제는 의도한 결과를 근사할 수 있다. 예를 들어, 두 대의 컴퓨터가 다른 해상도 기능을 갖는다면, 레벨 1의 프로그래머는 출력 형식을 조정해야 한다. I/O 호출이 실행되기 전에 여러 계층을 거쳐야 하므로 빠르지 않다.
    • Level 1(BIOS): 표준 BIOS가 있는 모든 시스템에서는 작동하지만 모든 시스템에서 동일한 결과를 생성하지는 않는다. 레벨2보다 빠름
    • Level 0(hardware): 그 특정 하드웨어서만 동작하도록 밖에 짤 수 없다. 빠르다.
  • 각 레벨이 제공하는 제어 수준과 이식성 사이에 상충 관계가 있다. 각 레벨은 고유한 장단점을 가지며, 하드웨어와 거리가 멀어질수록 제어 수준은 높아지지만 이식성은 떨어진다.
728x90

'CS > System programming' 카테고리의 다른 글

Procedures  (0) 2023.04.09
Data Transfers Addressing and Arithmetic  (0) 2023.04.08
Assembly Language Fundamentals  (0) 2023.03.20
Basic concept  (0) 2023.02.23