CH04_ CPU작동원리

Jobmania·2023년 4월 9일
0

컴퓨터 구조

목록 보기
4/8
post-thumbnail

4-1강 ALU와 제어장치

ALU

  • 레지스터로부터 피연산자를 받고, 제어장치로 부터 수행할 연산을 알려주는 제어 신호를 받아들임!!
  • 결과값은 숫자, 문자, 주소가 될 수있음.

    결과값은 레지스터에 저장(메모리 저장보다 접근속도 빠름). 프로그램 실행속도와 밀접!!!

  • 플래그 ( 연산결과에 대한 참고 정보)
    - 양수,음수 정보
    - 만약 연산 결과가 결과를 담을 레지스터 보다 클경우 OVERFLOW가 발생하는데 이를 알리는 플래그 생성.

    플래그 종류

연산결과는 0!

제어 장치

다음은 제어장치가 받아들이는 정보들이다.

1. 제어장치는 클럭 신호를 받아들인다!

  • 클럭 단위에 맞춰서 명령어가 실행!!
  • 컴퓨터의 모든 부품을 일사불한하게 움직일 수 있게 하는 시간단위!

2. 제어장치는 '해석해야 할 명령어'를 받아들인다!!

  • CPU가 해석해야할 정보는 명령어레지스터라고하는 특별한 레지스터에 저장됨!

3. 제어장치는 플래그 레지스터 속 플래그 값

  • 연산에 필요한 부가적인 정보값인 플래그 값도 받아들임.

4. 제어장치는 시스템버스, 그중에서 제어 버스로 전달된 제어신호를 받아 들인다.

  • cpu및 외부장치에서 들어오는 제어신호를 받아들인다.

제어장치가 보내는 신호들

1. cpu 내부에 보내는 신호

  • 레지스터 : 레지스터간 데이터 이동 및 명령어 해석
  • ALU : 수행할 연산을 지시

2. cpu 외부에 보내는 신호

  • 메모리 : 메모리 읽기, 쓰기 등
  • 입출력장치 : 입출력장치 읽기, 쓰기 등

4-2 강 레지스터

  • 레지스터 : CPU내의 작은 임시 저장장치
  • 프로그램 속 명령어 & 데이터는 실행 전후로 레지스터에 저장됨.

    레지스터값을 확인부분은 프로그래머가 많이 다루는 경우가 많다!!

반드시 알아야할 레지스터

1.프로그램 카운터
2. 명령어 레지스터
3. 메모리 주소 레지스터
4. 메모리 버퍼 레지스터
5. 플래그 레지스터
6. 범용 레지스터
7. 스택 포인터
8. 베이스 레지스터

🎇 CPU의 종류마다 레지스터 종류는 다르다!

1. 프로그램 카운터 ( 명령어 포인터)

  • 메모리에서 가져올 명령어의 주소(메모리에서 읽어 들일 명령어의 주소)

2. 명령어 레지스터

  • 해석할 명령어 (방금 메모리에서 읽어 들인 명령어) -> 이는 나중에 제어장치가 해석

3. 메모리 주소 레지스터

  • 메모리의 주소 (CPU가 주소버스를 이용할때)

4. 메모리 버퍼 레지스터

  • 메모리와 주고 받을 값( 데이터와 명령어)

예시 1~4 )

  • 프로그램이 처음실행하기 위해선 프로그램 카운터에는 1000번지가 저장됨
  • 1000번지를 읽기 위해선!! 주소 버스로 1000번지를 내보내야함. 그래서 메모리 주소 레지스터에 1000이 저장!
  • 제어장치에서 제어신호(1000번째를 읽어라) 생성
  • 메모리 버퍼 레지스터에서는 메모리값을 저장
  • 동시에 프로그램 카운터값 1증가
  • 명령어 레지스터에 저장

-> 제어장치는 명령어 레지스터의 명령어를 해석하고 제어 신호를 발생!!

순차적인 실행과 비순차적 실행

순차적인 실행 흐름이 끊기는경우 : 특정 메모리 주소로 실행흐름을 이동하는 명령어 실행시(EX) JUMP, DONDITIONAL JUMP, CALL, RET)
1200번에 2500에 점프헤라 되면 프로그램카운터엔 2500번에 저장

5. 플래그 레지스터

  • 연산결과 또는 CPU상태에 대한 부가적인 정보

6. 범용 레지스터

  • 다양한 상황에 자유롭게 사용하는 레지스터
    주소, 명령어, 등 여러값 저장 가능

7. 스택 포인터

  • 스택의 꼭대기를 가르키는 레지스터(스택이 어디까지 차있는지에 대한 표시)

스택 주소 지정방식 : 스택과 스택포인터를 이용한 주소 지정방식

🎇 스택은 메모리에서 사용할 영역이 정해져 있다! 이를 스택영역이라함!

8. 베이스 레지스터

  • 변위 주소 지정 방식에 사용 되는 레지스터

변위 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소 얻기

변위 주소 지정 방식 사용 예시)


변위 주소 지정 방식은 오퍼랜드 필드의 주소와 어떤 레지스터를 더하는지에 따라 방식이 나뉘며 상대주소 지정 방식, 베이스 레지스터 주소 지정방식등이 있다.

상대 주소 지정 방식

  • 오퍼랜드와 프로그램 카운터의 값을 더하여 유효주소를 얻는 방식

베이스 레지스터 주소 지정방식

  • 오퍼랜드와 베이스 레지스터의 값을 더해 유효주소를 얻는 방식
  • 베이스 레지스터에는 기준주소가 담긴다!

🎇메모리(주소 변환)에 대한 빌드업;;
-> cpu가 인식하는 메모리 주소와 메모리가 저장되는 주소는 다르다

4-3 강 명령어 사이클과 인터럽트

  • CPU는 하나의 명령어를 처리하는 과정에 어떤 정해진 흐름이 있다. 그 흐름을 반복하며 명령어를 처리하는데 이러한 정형화된 흐름을 명령어 사이클 이라고 한다.!
  • CPU는 정해진 흐름을 처리해 나가지만, 흐름이 끊어지는 상황이 발생, 이를 인터럽트!

명령어 사이클

인출 사이클

실행 사이클


  • 인출, 실행 사이클 반복하다가 필요한 경우 간접사이클

인터럽트

  • 방해하다 중단시키다..
  • CPU가 정해진 흐름을 중단, 얼른 처리해야할 다른 작업이 생겼을때!

동기 인터럽트 (예외 라고도 함)

  • CPU가 발생시키는 인터럽트 : CPU가 예기치 못한 상황을 접했을 때!
  • 디버깅, 실행중 메모리주소에 값이 없을 때
  • 예외가 발생하면 cpu는 하던일 중단하고 해당 예외를 처리함.

폴트

  • 예외를 처리한 직후 예외가 발생한 명령어부터 실행을 재개하는 예외

    예시 : 메모리에 데이터 값이 없다면 cpu는 폴트를 발생시키고 보조기억장치에서 필요한 데이터를 메모리에 들고와 저장 및 실행 재개

트랩

  • 예외를 처리한 직후 예외가 발생한 명령어의 다음 명령어부터 실행을 재개하는 예외

    예시 : 디버깅( 프로그램 개발 중 발생한 문제를 진단 및 해결하는 작업)

중단

  • cpu가 실행중인 프로그램을 강제로 중단시킬 수 밖에 없는 심각한 오류를 발견했을때 발생하는 예외

소프트웨어 인터럽트

  • 시스템 호출이 발생하였을 때 발생

비동기 인터럽트 (하드웨어 인터럽트)

  • 주로 입출력장치에 의해 발생하는 인터럽트 ( 마치 알림)
  • 마우스 우클릭, 키보드 입력,

왜 사용함?

입출력 작업을 효율적으로 처리하기위해 하드웨어 인터럽트 사용
- 입출력 장치는 CPU보다 상대적으로 속도가 느리기 때문에 인터럽트를 사용하지 않는다면 CPU 사이클 낭비가 일어남!(주기적으로 확인하는 작업이 필요)

하드웨어 인터럽트 처리 순서

  1. 입출력 장치는 CPU에 인터럽트 요청 신호를 보냅니다.
  2. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인합니다.
  3. CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아 들일 수 있는지 여부를 확인합니다.
  4. 인터럽트를 받아들일 수 있다면 CPU는 지금까지 작업을 백업합니다.
  5. CPU는 인터럽트 벡터를 참조하여, 인터럽트 서비스 루틴을 실행합니다.
  6. 인터럽트 서비스 루틴 실행이 끝나면 (4) 에서 백업해 둔 작업을 복구하여 실행을 재개합니다.

인터럽트 요청 신호

  • 정상적인 실행흐름을 끊는 것이기때문에 신호를 보냄

인터럽트 플래그 레지스터

  • CPU가 인터럽트 요청을 수용하기 위해서 플래그 레지스터 인터럽트 플래그가 활성화 되어있어야함! -> 만약 CPU가 중요한 작업을 처리하는 과정에서 어떠한 방해도 받지 않아야 된다면 인터럽트 플래그는 불가능으로 설정됨.
  • 만약 가능이라고 설정 되었다면 요청신호를 받아들이고 인터럽트를 처리함!

    🎇 모든 인터럽트를 인터럽트 플래그로 막을 수 있는 건아니다!
    - 막을 수 있는 인터럽트 (대부분)
    - 막을 수 없는 인터럽트 ( 정전, 하드웨어 고장 등 긴급)

인터럽트 서비스 루틴 ( = 인터럽트 핸들러)

  • CPU가 인터럽트를 받아 들이기로 햇따면 인터럽트 서비스 루틴 실행
  • 어떤 인터럽트 발생시 어떻게 처리하고 작동해야 되는지 정보로 이루어진 프로그램 ( 메모리에 저장되어있음)

인터럽트 벡터

  • 각각의 인터럽트를 구분하기 위한 정보
  • EX) 마우스 루틴 A, 프린터 루틴 B , 키보드 루틴 C
  • 인터럽트 벡터 테이블( 벡터에 대한 정보)가 메모리에 저장되어 있음!
  • 인터럽트 요청 + 인터럽트 벡터를 같이 데이터버스에 보냄!

CPU가 인터럽트를 처리한다

== 인터럽트 서비스 루틴 실행 후 본래의 작업으로 돌아온다


하드웨 인터럽터 처리에 관해

  • 인터럽트 서비스 루틴은 프로그램과 마찬가지로 명령어와 데이터로 이루어져 있어, 프로그램 카운터 및 레지스터를 사용한다.
  • 기존의 값을 덮어버리면 안되기 때문에 백업을 수행함
  • 백업은 스택영역에 보관!

정리

  • 인터럽트 요청신호 : CPU에 작업을 방해하는 인터럽트에 대한 요청
  • 인터럽트 플래그 : 인터럽트 요청 신호를 받아들일지 무시할 지를 결정하는 비트
  • 인터럽트 벡터 : 이넡럽트 서비스 루틴의 시작 주소를 포함하는 인터럽트 서비스 루틴의 식별 정보
  • 인터럽트 서비스 루틴 : 인터럽트를 처리하는 프로그램

전체 과정 !

profile
HelloWorld에서 RealWorld로

0개의 댓글