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에 사용된다.
- 위 그림과 같이 나눠질 수 있다.
- 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와 직접 통신할 수 있도록 허용하는 프로그램
- 특정 하드웨어가 컴퓨터에 연결하기 전이나 2. 장치가 부착되고 식별된 후에 설치된다.
- OS가 하드웨어 장치 및 BIOS와 직접 통신할 수 있도록 허용하는 프로그램
- IO hierarchy(화면에 문자열을 표시하는 상황)
- 응용프로그램의 명령문은 문자열을 표준 출력에 쓰는 라이브러리 함수를 호출한다.
- 라이브러리 함수(L3)는 OS 함수를 호출하여 문자열 포인터를 전달한다.
- OS function(L2)은 루프를 사용하여 BIOS 서브루틴을 호출하고 각 문자의 ASCII 코드와 색상을 전달한다. OS는 다른 BIOS 서브루틴을 호출하여 커서를 화면의 다음 위치로 이동시킨다.
- BIOS 서브루틴(L1)은 문자를 받아 특정 시스템 font에 매핑하고 문자를 비디오 카드에 연결되어 있는 하트웨어 포트로 보낸다.
- 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 |