04-1. ALU와 제어장치
ALU
- ALU는 레지스터를 통해 피연산자를 받아들이고, 제어장치로부터 수행할 연산을 알려주는 제어 신호를 받아들임
- 레지스터와 제어장치로부터 받아들인 피연산자와 제어 신호로 산술 연산, 논리 연산 등 다양한 연산을 수행함
- ALU가 내보내는 대표적인 플래그는 아래와 같다
플래그 종류 | 의미 | 사용 예시 |
부호 플래그 | 연산한 결과의 부호를 나타낸다 | 부호 플래그가 1일 경우 계산 결과는 음수, 0일 경우 계산 결과는 양수를 의미한다. |
제로 플러그 | 연산 결과가 0인지 여부를 나타낸다 | 제로 플러그가 1일 경우 연산 결과는 0, 0일 경우 연산결과는 0이 아님을 의미한다. |
캐리 플래그 | 연산 결과 올림수나 빌림수가 발생했는지를 나타낸다. | 캐리 플래그가 1일 경우 올림수나 빌림수가 발생했음을 의미하고, 0일 경우 |
오버플로우 플래그 | 오버플로우가 발생했는지를 나타낸다 | 오버플로우 플래그가 1일 경우 |
인터럽트 플래그 | 인터럽트가 가능한지를 나타낸다. | 인터랩트 플래그가 1일 경우 인터럽트가 가능함을 의미하고, 0일 경우 인터럽트가 불가능함을 의미한다. |
슈퍼바이저 플래그 | 커널 모드가 실행 중인지, 사용자 모드로 실행 중인지를 나타낸다. | 슈퍼바이저 플래그가 1일 경우 커널 모드로 실행 중임을 의미하고, 0일 경우 사용자 모드로 실행 중임을 의미한다. |
- 플래그 레지스터는 이름 그대로 플래그 값들을 저장하는 레지스터임

제어장치
- 제어장치는 제어 신호를 내보내고, 명령어를 해석하는 부품
- 제어신호는 컴퓨터 부품들을 관리하고 작동시키기 위한 일종의 전기신호
- 첫쨰 제어장치는 클럭 신호를 받아들임
- 클럭이란 컴퓨터의 모든 부품을 일사분란하게 움직일 수 있게 하는 시간단위임
- 둘째 제어장치는 해석해야 할 명령어를 받아들임
- CPU가 해석해야 할 명령어는 명령어 레지스터라는 특별한 레지스터에 저장됩니다
- 제어장치는 이 명령어 레지스터로부터 해석할 명령어를 받아들이고 해석한 뒤, 제어 신호를 발생시켜 컴퓨터 부품들에 수행해야 할 내용을 알려줌
- 셋째 제어장치는 플러그 래지스터 속 플래그 값을 받아들임
- 넷째 제어장치는 시스템 버스, 그중에서 제어 버스로 전달된 제어 신호를 받아들임
- 제어장치는 클럭, 현재 수행할 명령어 플래그, 제어 신호를 받아들임
- 제어장치는 CPU 내부와 외부로 제어 신호를 내보냄
- 제어장치가 메모리에 저장된 값을 읽거나 메모리에 새로운 값을 쓰고 싶다면 메모리로 제어 신호를 내보냄
04-2. 레지스터
반드시 알아야 할 레지스터
- 상용화된 CPU 속 레지스터들은 CPU마다 이름,크기, 종류가 매우 다양함
- 이 중 가장 대중적인 레지스터는 Intel x86, ARM임
프로그램 카운터
- 메모리에서 가져올 명령어의 주소, 즉 메모리에서 읽어 들일 명령어의 주소를 저장함
- 프로그램 카운터를 명령어 포인터라고 부르는 CPU도 있음
명령어 레지스터
- 메모리에서 읽어 들인 명령어를 저장하는 레지스터
- 제어장치는 명령어 레지스터 속 명령어를 받아들이고 이를 해석한뒤 제어신호를 내보냄
메모리 주소 레지스터
- 메모리의 주소를 저장하는 레지스터
- CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 메모리 주소 레지스터를 거침
메모리 주소 레지스터
- 메모리의 주소를 저장하는 레지스터
- CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 메모리 주소 레지스터를 거침
메모리 버퍼 레지스터
- 메모리와 주고 받을 값(데이터와 명령어)을 저장하는 레지스터
- 즉 메모리에 쓰고 싶은 값이나 메모리부터 전달받은 값은 메모리 버퍼 레지스터를 거침
- CPU가 주소 버스로 내보낼 값이 메모리 주소 레지스터를 거친다면, 데이터 버스로 주고받을 값은 메모리 버퍼 레지스터를 거침
범용 레지스터
- 이름 그대로 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터
- 범용 레지스터는 데이터와 주소 모두 저장 가능함
플래그 레지스터
- 연산결과 또는 CPU 상태에 대한 부가적인 정보를 저장하는 레지스터
스택 주소 지정 방식
- 스택 포인터는 스택 주소 지정 방식에 사용됨
- 스택 주소 지정 방식은 스택과 스택 포인터를 이용한 주소 지정 방식
- 스택 포인터는 스택의 꼭대기를 가리키는 스택에 마지막으로 저장한 값의 위치를 저장하는 레지스터
- 스택 영역은 메모리 안에 스택처럼 사용할 영역이 정해저 있는 것
특정 레지스터를 이용한 지정 방식(2) : 변위 주소 지정 방식
- 오퍼랜드 필드의 값(변위)와 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식
- 그래서 변위 주소 지정 방식을 사용하는 명령어는 연산 코드 필드, 어떤 레지스터의 값과 더할지 나타내는 레지스터 필드, 주소를 담고 있는 오퍼랜드 필드가 있음
상대 주소 지정 방식
- 오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식
- 프로그램 카운터에는 읽어 들일 명령어의 주소가 저장되어 있음
- 예를 들어 오퍼랜드가 음수, -3이었다면 CPU는 읽어 들이기로 한 명령어 부터 세 번째 이전 번지로 접근함
- 하지만 3이라면 세 번째 이후 번지로 접근함
베이스 레지스터 주소 지정 방식
- 오퍼랜드와 베이스 레지스터 값을 더하여 유효 주소를 얻는 방식
- 여기서 베이스 레지스터는 기준 주소, 오퍼랜드는 기준 주소로부터 떨어진 거리로서 역할을 함
- 즉 베이스 레지스터 주소 지정 방식은 베이스 레지스터 속 기준 주소로 부터 얼마나 떨어져 있는 주소에 접근할 것인지를 연산하여 유효주소를 얻어내는 방식
04-3. 명령어 사이클과 인터럽트
명령어 사이클
- 프로그램 속 각각의 명령어들이 일정한 주기가 반복되며 실행하는데 이 주기를 명령어 사이클이라고 함
- 메모리에 있는 명령어를 CPU로 가져오는 단계를 인출 사이클이라고 함
- CPU로 가져오는 명령어를 실행하는 단계를 실행 사이클이라고 함
- 명령어를 실행하기 위해서는 메모리 접근을 한번 더 해야하는데 이 단계를 간접 사이클이라고 함
인터럽트
- CPU의 작업을 방해하는 신호를 인터럽트라고 함
- 인터럽트의 종류에는 두 가지가 있는데 동기 인터럽트와 비동기 인터럽트가 있음
- 동기 인터럽트는 CPU에 의해 발생하는 인터럽트
- CPU가 실행하는 프로그래밍상의 오류와 같은 예외적인 상황이 마추쳤을때 발생하는 인터럽트가 동기 인터럽트
- 이런 점에서 동기 인터럽트는 예외라고 부름
- 비동기 인터럽트는 주로 입출력장치에 의해 발생하는 인터럽트
- 세탁기 완료 알림, 전자레인지 조리 완료 알림과 같은 알림 역할을 함
하드웨어 인터럽트
- 알림과 같은 인터럽트임
- CPU는 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 이런 알림과 같은 하드웨어 인터럽트를 사용함
하드웨어 인터럽트 처리 순서
- 입출력장치는 CPU에 인터럽트 요청 신호를 보냅니다
- CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인합니다
- CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는 지 여부를 확인합니다
- 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업합니다.
- CPU가 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행합니다
- 인터럽트 서비스 루틴이 끝나면 4번에서 백업해둔 작업을 복구하여 실행을 재개합니다
- 인터럽트 요청 신호는 CPU에 정상적인 실행의 흐름이 끊길 것 같을때 CPU에게 한번더 물어보는 것을 뜻함
- 인터럽트 플래그는 CPU가 인터럽트 요청을 수행하기 위해서 활성화 해야하는 것
- 말 그대로 하드웨어 인터럽트를 받아들일지, 무시할지 결정하는 플래그
- 만약 인터럽트 플래그가 불가능으로 설정되어 있다면 CPU는 해당 인터럽트 요청이 와도 무시함
- 반대로 가능으로 설정되어 있으면 요청을 받아들이고 처리함
- 하드웨어 인터럽트에는 막을 수 있는 인터럽트와 막을 수 없는 인터럽트가 있음
- 인터럽트 서비스 루틴은 인터럽트를 처리하기 위한 프로그램 또는 인터럽트 핸들러라고 부름
- 인터럽트 서비스 루틴은 키보드가 어떤 인터럽트 요청을 보냈을때는 어떻게 작동하고, 마우스가 요청했을 때, 프로그램에 문제가 생기는 등, 어떻게 처리하고 작동해야 할지에 대한 정보로 이루어진 프로그램임
- 인터럽트 백터는 인터럽트 서비스 루틴을 식별하기 위한 정보임
추가로!!
- 폴트는 예외를 처리한 직후 예외가 발생한 명령어부터 실행을 재개하는 예외임
- 트랩은 예외를 처리한 직후 예외가 발생한 명령어의 다음 명령어 부터 실행을 재개하는 예외
- 디버깅이란 프로그램 개발 중에 발생한 문제를 진단하고 해결하기 위한 작업
- 중단은 CPU가 실행중인 프로그램을 강제로 중단시킬 수 밖에 없는 심각한 오류를 발견했을 때 발생하는 예외
- 소프트웨어 인터럽트는 시스템 호출이 발생했을 때 나타남
'공부 기록일지' 카테고리의 다른 글
유성이의 공부일지(6) - 혼자공부하는 컴퓨터 구조 + 운영체제 6장 (0) | 2024.07.06 |
---|---|
유성이의 공부일지(5) - 혼자공부하는 컴퓨터 구조 + 운영체제 5장 (0) | 2024.07.04 |
유성이의 공부일지(3) - 혼자공부하는 컴퓨터 구조 + 운영체제 3장 (0) | 2024.07.02 |
유성이의 공부일지(2) - 혼자공부하는 컴퓨터 구조 + 운영체제 2장 (0) | 2024.07.01 |
유성이의 공부일지(1) - 혼자공부하는 컴퓨터 구조 + 운영체제 1장 (0) | 2024.06.30 |