인프런의 개발자를 위한 컴퓨터 공학1 : 혼자 공부하는 컴퓨터 구조 + 운영체제 강의를 듣고, 학습 및 요약
2-1. ALU와 제어장치
- ALU는 계산하는 장치
- 제어장치는 제어 신호를 발생시키고 명령어를 해석하는 장치
1. ALU - 내보내는 정보
- 계산을 하기 위해서는 피연산자와 수행할 연산이 필요
- 2+2를 계산하기 위해서는 2라는 피연산자와 +라는 수행할 연산이 필요함
- ALU는 레지스터로부터 피연산자를 받아들이고, 제어장치로부터 제어 신호를 받아들이고, 결과값을 레지스터에 저장한다.
- CPU가 레지스터에 접근하는 속도가 메모리에 접근하는 속도보다 빠르기 때문에 레지스터에 저장함!
- 플래그 : 연산 결과에 대한 부가 정보
- ex) 양수와 음수를 구분할 때 플래그 사용
- 플래그는 플래그 레지스터에 저장됨
- 만약 연산 결과가 결과를 담을 레지스터에 비해 너무 크면 플래그에 담기게 된다. => ex) 오버플로우 플래그
플래그 종류 | 의미 | 사용 예 |
부호 플래그 | 연산한 결과의 부호를 나타냄 | 1일 때 결과 음수, 0일 때 결과 양수 |
제로 플래그 | 연산 결과가 0인지 여부 나타냄 | 1일 때, 결과 0, 0일 때 결과는 0이 아님 |
캐리 플래그 | 연산 결과 올림수나 빌림수 발생했는 지 나타냄 | 1일 때 올림수나 빌림수 발생, 0일 때 발생하지 않았음 |
오버플로우 플래그 | 오버플로우가 발생했는지 나타냄 | 1일 때, 오버플로우 발생, 0일 때 발생하지 않았음 |
인터럽트 플래그 | 인터럽트가 가능한지 나타냄 | 1일 때, 인터럽트 가능, 0일 때 인터럽트 불가능 |
슈퍼바이저 플래그 | 커널모드로 실행 중인지, 사용자 모드로 실행 중인지를 나타냄 | 1일 때, 커널 모드로 실행 중, 0일 때, 사용자 모드로 실행 중 |
2. 제어장치
1) 받아들이는 정보
- 클럭 : 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위
- 클럭 신호에 맞춰서 명령어들이 수행된다.
- 제어장치는 실행하고자 하는 명령어를 받아들인다.
- 해석할 명령어는 명령어 레지스터에 담긴다.
- 제어장치는 클럭과 해석할 명령어를 받아서 ALU에 전달한다.
- 입출력장치를 비롯해 외부 주변장치에서 제어 신호를 발생할 수 있기 때문에 제어장치에서 이러한 제어 신호도 받는다.
2) 내보내는 정보
- 기본적으로 제어 신호를 내보낸다.
- CPU 내부에 전달할 수 있고, CPU 외부에 전달할 수 있다.
- CPU 내부에 전달할 때 레지스터나 ALU에 전달할 수 있다.
- 레지스터에 전달하는 신호 => 레지스터를 움직이게 하는 신호, ALU에 전달하는 신호 => 수행할 연산을 지시하는 제어신호
- CPU 외부에 전달할 때 메모리나 입출력장치에 전달할 수 있다.
- 메모리에 전달하는 신호 => 메모리를 읽거나 쓰는 것을 지시하는 신호, 입출력장치에 전달하는 신호 => 입출력장치를 읽거나 쓰는 것, 테스트를 지시하는 신호
2-2. 레지스터
CPU 내부의 작은 임시저장장치
프로그램 속 명령어 & 데이터는 실행 전후로 레지스터에 저장
- CPU 내부에는 다양한 레지스터들이 있고, 각기 다른 역할을 가진다.
- 프로그램 카운터, 명령어 레지스터, 메모리 주소 레지스터, 메모리 버퍼 레지스터, 플래그 레지스터, 범용 레지스터, 스택 포인터, 베이스 레지스터
프로그램 카운터 | 메모리에서 가져올 명령어의 주소(메모리에서 읽어들일 명령어의 주소) |
Instruction Pointer(명령어 포인터)라고 부르는 CPU도 있음 | |
명령어 레지스터 | 해석할 명령어(방금 메모리에서 읽어들인 명령어) |
제어장치가 해석하고 제어신호를 내보냄 | |
메모리 주소 레지스터 | 메모리의 주소 |
CPU가 읽어들이고자 하는 주소를 주소 버스(주소를 주고 받는 통로)로 보낼 때 거치는 레지스터 | |
메모리 버퍼 레지스터 | 메모리와 주고받을 값(데이터와 명령어) |
CPU가 정보를 데이터 버스로 주고받을 때 거치는 레지스터 |
각 레지스터에 데이터가 담기는 과정
더보기
예시) 프로그램을 이루는 명령어가 각각 하나의 메모리 번지를 차지하고 있다. (맨 처음부터 실행된다.)
- 처음부터 실행되기 때문에 프로그램 카운터에는 1000이 저장된다.(메모리에서 읽어들일 명령어의 주소)
2. 프로그램 카운터에 저장되어 있는 주소를 메모리 주소 레지스터로 복사된다.
3. 메모리한테 몇 번지 주소를 읽어야 하는 지(주소버스) 메모리를 읽는 제어 신호(제어버스)와 함께 보낸다.
4. 메모리는 주소의 저장된 값(1101)을 메모리 버퍼 레지스터로 데이터 버스를 통해서 저장한다.
- 이 때 프로그램 카운터에는 다음으로 실행할 주소 값이 들어가야되기 때문에 프로그램 카운터가 1이 증가 된다.
- 이 것이 프로그램을 순차적으로 실행할 수 있는 원리가 된다.
- BUT! 순차적인 실행 흐름이 끊기는 경우
- 특정 메모리 주소로 실행 흐름을 이동하는 명령어 실행 시(JUMP, CONDITIONAL JAMP, CALL, RET)
- 인터럽트 발생 시 등
5. 메모리 버퍼 레지스터에 있는 제어장치에게 명령어(1101)을 해석시키기 위해서 명령어 레지스터에 저장한다.
플래그 레지스터 | 연산 결과 또는 CPU 상태에 대한 부가적인 정보 |
현재 CPU가 어떤 연산을 하고 있었는 지와 CPU 상태에 대한 정보를 알 수 있음 | |
범용 레지스터 | 다양하고 일반적인 상황에서 자유롭게 사용 |
메모리 주소 레지스터에는 주소만 담을 수 있고, 메모리 버퍼 레지스터에는 명령어, 데이터만 담을 수 있으면 범용 레지스터에는 주소, 명령어, 데이터 다 담을 수 있음 | |
스택 포인터 | 주소 지정에 사용 |
스택 주소 지정 방식 : 스택과 스택 포인터를 이용한 주소 지정 방식 - 스택 포인터 : 스택의 꼭대기를 가리키는 레지스터 (스택이 어디까지 차 있는지에 대한 표시) |
|
베이스 레지스터 | 주소 지정에 사용 |
변위 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더해 유효 주소 얻기 - 기준 주소 저장 |
특정 레지스터를 이용한 주소 지정 방식
- 스택 주소 지정 방식
- 변위 주소 지정 방식
연산 코드(이런 내용을 수행해라) | 레지스터(이 레지스터 값과) | 오퍼랜드(이 주소를 더한 곳에 있는 데이터로) |
변위 주소 지정 방식에는 두가지가 있음
- 상대 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 프로그램 카운터의 값을 더해 유효 주소를 얻는 방법
- 프로그램 카운터 + 오퍼랜드 필드의 값(변위) = 코드 실행!
- 실행할 명령어의 주소에서 거기서 필드의 값을 더한다.
- 베이스 레지스터 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 베이스 레지스터의 값을 더해 유효 주소를 얻는 방법
- 베이스 레지스터(기준 주소) + 오퍼랜드 필드의 값(변위) = 코드 실행!
- 즉 상대 주소 지정 방식과는 다르게 기준 주소가 기준이 되어서 거기서 필드의 값을 더해준다.
'cs' 카테고리의 다른 글
[혼공운영체제] 4. 빠른 CPU를 위한 설계 기법 (0) | 2023.04.16 |
---|---|
[혼공운영체제] 3. 명령어 사이클과 인터럽트 (0) | 2023.04.16 |
방화벽(Firewall)의 동작 원리 (0) | 2023.04.10 |
CORS (0) | 2023.04.08 |
[혼공운영체제] 1. 데이터와 명령어 (0) | 2023.04.06 |