[혼자 공부하는 컴퓨터구조+운영체제]04장 CPU의 작동 원리
04-01 ALU와 제어장치
ALU
ALU가 받아들이는 정보
- 레지스터를 통해 피연산자를 받는다.
- 제어 장치로부터 제어 신호를 받는다.
ALU가 내보내는 정보
- ALU는 연산한 결괏값을 내보내 일시적으로 레지스터에 저장한다.
- 메모리에 자주 접근하면 프로그램 실행 속도가 느려지기 때문
- ALU는 결괏값 외에 플래그를 내보낸다.
- 플래그: 연산 결과에 대한 추가적인 상태 정보
- 부호 플래그, 제로 플래그, 캐리 플래그, 오버플로우 플래그, 인터럽트 플래그, 슈퍼바이저 플래그 등
- 플래그는 플래그 레지스터에 저장된다.
- 플래그: 연산 결과에 대한 추가적인 상태 정보
ALU에는 이 외에도 가산기, 보수기, 시프터, 오버플로우 검출기 등의 회로가 존재한다.
제어장치
- 제어 신호를 내보내고 명령어 해석
- 제어 신호: 컴퓨터 부품을 관리하고 작동시키기 위한 일종의 전기 신호
제어장치가 받아들이는 정보
- 클럭
- 컴퓨터 부품이 움직이는 시간 단위
- 해석해야 할 명령어
- 명령어 레지스터에서 불러와 해석한 뒤 제어신호 생성
- 플래그 값
- 플래그 레지스터에서 불러와 이를 참고하여 제어 신호 생성
- 제어 신호
- 시스템 버스, 특히 제어 버스로 전달된 신호를 받아들임
제어장치가 내보내는 정보
- CPU 외부에 전달하는 제어 신호
- 제어 버스로 제어 신호를 내보냄
- 메모리에 전달하는 제어 신호
- 메모리의 값을 읽거나 새로운 값을 쓸 때 내보내는 신호
- 입출력장치(보조기억장치 포함)에 전달하는 제어 신호
- 입출력장치의 값을 읽거나 새로운 값을 쓸 때 내보내는 신호
- CPU 내부에 전달하는 제어 신호
- ALU에 전달하는 제어 신호
- 수행할 연산을 지시할 때 내보내는 신호
- 레지스터에 전달하는 제어 신호
- 레지스터 간 데이터를 이동시킬 때 내보내는 신호
- 레지스터에 저장된 명령어를 해석할 때 내보내는 신호
- ALU에 전달하는 제어 신호
04-2 레지스터
프로그램 속 명령어와 데이터는 실행 전후로 반드시 레지스터에 저장된다.
반드시 알아야 할 레지스터
- 프로그램 카운터(Program Counter, PC)
- 메모리에서 읽어올 명령어 주소 저장
- 명령어 포인터(Instruction Pointer, IP)라고도 함
- 명령어 레지스터(Instruction Register, IR)
- 메모리에서 읽어온 명령어를 저장
- 제어장치가 이곳의 명령어를 가져가 해석한 뒤 제어 신호 발생
- 메모리 주소 레지스터(Memory Address Register, MAR)
- 메모리의 주소 저장
- CPU가 주소 버스에 보내는 값이 거치는 레지스터
- 메모리 버퍼 레지스터(Memory Buffer Register, MBR)
- 메모리와 주고받을 데이터와 명령어 저장
- CPU가 데이터 버스에 보내는 값이 거치는 레지스터
- 플래그 레지스터
- 연산 결과 또는 CPU 상태에 대한 부가적인 정보 저장
- 범용 레지스터(general purpose register)
- 데이터와 주소 모두 저장 가능
- CPU 안에 여러 개 존재
- 스택 포인터
- 베이스 레지스터
메모리에 저장된 프로그램 실행 과정
- 프로그램 카운터에 프로그램이 저장된 메모리의 주소(A) 저장
- 메모리 주소 레지스터에 A를 저장
- 주소 버스로 A를 내보내기 위함
- 메모리 주소 레지스터 값(A)을 주소 버스를 통하여 메모리로 전달
메모리 읽기
제어 신호를 제어 버스를 통하여 메모리로 전달 - 메모리의 A 주소에 저장된 값(B)이 데이터 버스를 통해 메모리 버퍼 레지스터로 전달
- 프로그램 카운터 증가
- 이는 다음 명령어를 읽을 준비 작업
- 프로그램 카운터가 증가해야 프로그램을 순차적으로 실행할 수 있다.
- JUMP, CALL 등의 명령어가 실행되는 경우 또는 인터럽트가 발생한 경우, 프로그램은 순차적으로 실행되지 않는다.
- 메모리 버퍼 레지스터에 저장된 값(B)이 명령어 레지스터로 이동
- 제어장치가 명령어 레지스터의 B 명령어를 해석하고 제어 신호 발생
특정 레지스터를 이용한 주소 지정 방식
스택 주소 지정 방식
- 스택과 스택 포인터를 이용한 주소 지정 방식
- 스택 포인터: 스택에 마지막으로 저장된 값의 위치를 가리키는 레지스터
- 스택의 어디까지 데이터가 채워져 있는지에 대한 표시
- 스택 영역: 스택처럼 사용하기로 암묵적으로 약속된 메모리 영역
변위 주소 지정 방식
- 유효 주소 = 오퍼랜드 필드의 값(변위) + 특정 레지스터의 값
- 변위 주소 지정 방식을 사용하는 명령어는 연산 코드 필드, 레지스터 필드, 오퍼랜드 필드를 포함
- 레지스터 필드의 값과 오퍼랜드 필드의 값을 더해 유효 주소 도출
상대 주소 지정 방식
- relative addressing mode
- 유효 주소 = 오퍼랜드 필드의 값 + 프로그램 카운터의 값
- 프로그램 카운터 ⇒ 실행할 명령어 주소
- 오퍼랜드 ⇒ 실행할 명령어로부터 떨어진 거리
- 실행할 명령어로부터
오퍼랜드
만큼 떨어진 주소로 이동하게 된다. if
문처럼 분기하여 특정 코드를 실행할 때 사용
베이스 레지스터 주소 지정 방식
- base-register addressing mode
- 유효 주소 = 오퍼랜드 필드의 값 + 베이스 레지스터의 값
- 베이스 레지스터 ⇒ 기준 주소
- 오퍼랜드 ⇒ 기준 주소로부터 떨어진 거리
- 기준 주소로부터
오퍼랜드
만큼 떨어진 주소로 이동하게 된다.
04-3 명령어 사이클과 인터럽트
명령어 사이클
- 명령어 사이클: 하나의 명령어가 처리되는 주기
- 인출 사이클(fetch cycle)
- 메모리에 있는 명령어를 CPU로 가져오는 단계
- 실행 사이클(execution cycle)
- CPU로 가져온 명령어를 실행하는 단계
- 제어장치가 명령어 레지스터에 담긴 값 해석 → 제어 신호 발행
- 간접 사이클(indirect cycle)
- 실행 사이클에 돌입하기 전, 피연산자 주소를 찾기 위해 메모리 접근이 더 필요한 경우 실행되는 단계
- 인터럽트 사이클(interrupt cycle)
- 실행 사이클이 끝나고 인터럽트가 발생한 경우 실행되는 단계
인터럽트
- 인터럽트: CPU 작업을 방해하는 신호
- 동기 인터럽트(예외, exception)
- CPU에 의해 발생
- CPU가 실행하는 프로그래밍 상의 오류 등
- 비동기 인터럽트(인터럽트, 하드웨어 인트럽트)
- 주로 입출력장치에 의해 발생
하드웨어 인터럽트
하드웨어 인터럽트가 있기 때문에 CPU는 작업 완료를 기다릴 필요 없이, 입출력 작업 중에도 다른 명령어를 처리할 수 있다.
인터럽트 처리 순서
- 입출력장치가 CPU에 인터럽트 요청 신호 전송
- CPU는 인터럽트 요청을 확인
- CPU는 실행 사이클이 끝나고 명령어를 인출하기 전, 항상 인터럽트 여부를 확인
- 인터럽트 플래그를 통해 인터럽트를 받아들일 수 있는지 확인
- CPU가 중요한 작업 중이라 인터럽트가 불가하다고 설정되어 있다면 인터럽트 요청 무시
- 하드웨어 인터럽트에는 정전, 하드웨어 고장 등 인터럽트 플래그가 무시할 수 없는 인터럽트(non maskable interrupt)도 존재
- 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 스택에 백업
- CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴 실행
- 인터럽트 서비스 루틴(ISR, 인터럽트 핸들러)
- 인터럽트에 대한 처리와 작동 방식으로 이루어진 프로그램(명령어와 데이터)
- 메모리에 여러 개의 인터럽트 서비스 루틴이 저장되어 있음
- 인터럽트 벡터
- 인터럽트 서비스 루틴을 식별하기 위한 정보
- 인터럽트 서비스 루틴의 시작 주소를 담고 있음
- 하드웨어 인터럽트 요청을 보낸 대상이 데이터 버스를 통해 CPU로 인터럽트 벡터 전달
- 인터럽트 서비스 루틴(ISR, 인터럽트 핸들러)
- 인터럽트 서비스 루틴 실행이 끝나면 스택에 백업해둔 작업을 복구하여 재실행
예외의 종류
예외가 발생하면 CPU는 하던 일을 중단하고 예외를 처리한 뒤, 본래 작업으로 돌아온다.
- 폴트(fault)
- 예외 처리 후, 예외가 발생한 명령어부터 실행 재개
- 트랩(trap)
- 예외 처리 후, 예외가 발생한 명령어의 다음 명령어부터 실행 재개
- 주로 디버깅에 사용
- 중단(abort)
- CPU가 실행 중인 프로그램을 강제로 중단해야 하는 심각한 오류를 발견한 경우 발생
- 소프트웨어 인터럽트(software interrupt)
- 시스템 호출이 발생했을 때 생기는 예외
This post is licensed under CC BY 4.0 by the author.