1. 컴퓨터 하드웨어 구성
모든 컴퓨터 > 중앙처리장치 (CPU) , 주 기억장치 (main memory), I/O 장치(I/O device)로 구성 돼 있다. > 메인보드에 장착
CPU는 명령어 (instru ncition)를 실행할 수 있는 하드웨어 장치이며 , 주 기억 장치에는 프로그램과 데이터가 저장 돼 있다.
I/O장치는 사람이 컴퓨터에 명령을 내리고, 그 결과를 볼 수 있는 통로이며 또한 컴퓨터를 외부와 연결하는 인터페이스 역할을 한다.
I/O 장치 >> 키보드 마우스 모니터 네트워크 카드(NIC) USB 장치 블루투스 장치 등이 있다.
네트워크 카드를 통해 다른 컴퓨터와 데이터를 주고받을 수 있고 , USB 드라이브에 파일을 저장하고 읽을 수 도 있다.
그리고 블루투스 장치를 통해 무선으로 데이터를 주고 받을 수 있다.
+) I/O장치를 주변장치라고도 하며 영어로 페리페럴(peripheral) = '페리'라고도 한다.
2. CPU의 종류
Central Processing unit : CPU , 중앙처리장치 >> 명령여 (instrunction)를 실행할 수 있도록 설계된 하드웨어이다.
+) C언어와 같은 고급언어로 작성한 프로그램은 컴파일러에 의해 명령어의 조합으로 변환된다.
x86: Intel,AMD가 만드는 프로세서로 주로 데스크톱과 노트북 컴퓨터에 사용된다.
+) 64bit Core i7 컴퓨터에 32bit 운영체제를 설치하면?? >> 64bit 프로세서를 운영체제가 32bit 프로세서처럼 사용하겠다.
>> 64개의 철길(=하드웨어)을 만들어 놓고 기차(=소프트웨어)는 그 절반인 32개의 철길만을 사용하는 것과 같다.\
따라서, 하드웨어에 맞는 소프트웨어를 설치해야 한다.
3. 메모리에 접근한다?!
메모리에 접근한다 >> '메모리에서 데이터를 읽는 동작' 또는 '메모리에 데이터를 쓰는 동작'을 의미한다. CPU가 메모리에 접근할 때 최소 데이터 단위는 바이트(byte)이다.
메모리에 있는 특정 1-bit만 접근할 수는 없다! 그렇게 하려면 해당 bit가 포함된 1-byte를 읽고, 프로그램을 통해 특정 bit값을 확인해야한다.
ex) C언어에서 / char > 1-byte , short > 2-byte, int > 4-byte
< CPU가 내보내는 전선 (wire)의 개수에 따른 장착할 수 있는 메모리의 최대 크기에 대해 알아보자>
if > CPU가 메모리 접근 용도로 10개의 전선을 내보낸다고 가정했을때 >> CPU가 접근할 수 있는 메모리의 최대 크기는??
Sol) 10개의 전선 각각은 디지털 신호인 '0 또는 1'을 전달할 수 있다. 따라서 10개의 전선을 10-bit라고 생각할 수 있으며,
10-bit는 '0~1023' 즉 1024(=2^10)개의 다른 값을 표현할 수 있다. 앞서 설명한 것처럼, 메모리 접근의 최소 단위는 바이트이기 때문에 장착할 수 있는 메모리의 최대 크기는 1 KiB(=1024 x 1 - byte)이다. 따라서 CPU가 10개의 전선으로 내보내는 값에 따라 메모리에 있는 1024개 바이트 중 하나를 선택할 수 있다.
이러한 전선은 메모리 주소(address)를 전달하는 용도이다. < 주소(address) = 위치(location) >
메모리에 접근하려는 바이트의 위치를 알려줘야 메모리가 해당 바이트를 내어줄 수 있다.
>>bit의 개수(전선의 개수) , 1-bit (0 ,1) 2가짓수 , 2-bit(0,1,2,3,4) 4 가짓수 >> 10-bit (2^10개 = 1024개) 가짓수
ex) 512 MiB = 512 x 1024 x 1024 = 2^29 >> 29개의 전선
4. ISA?!
컴파일러 > high-level language 를 low-level language로 바꿔주는 것 ( 이 행동을 compile이라고 한다.)
low-level language란 CPU가 해석하고 실행할 수 있는 언어로, CPU가 지원하는 명령어(instruction)를 말한다.
명령어는 x86,Arm과 같은 프로세서에 따라 각각 다르다. 각 CPU가 제공하는 명령어의 집합을 Instrucion Set = ISA
컴파일을 하면 실행파일(executable) 또는 바이너리(binary)가 생성된다. > 바이너리는 0과 1로 구성
컴퓨터가 프로그램을 실행할 때, 머신코드(기계어) 는 메모리에 담겨있게 되고 CPU는 머신코드를 하나씩 읽어 들여 실행한다.
5. 컴퓨터의 기본 구조 및 동작
다시! 컴퓨터는 CPU + Memory + I/O장치 로 구성된다.
** 메모리에는 명령어와 데이터로 구성된 바이너리가 저장되어 있다. 컴퓨터를 켜면 CPU는 명령어를 읽어와 해석하고 실행한다. 그리고 명령어에 따라 메모리에서 데이터를 읽거나 메모리에 데이터를 쓰기도 한다.
[1] 주소버스 address bus , 데이터버스 data bus :
메모리에는 아주 많은 명령어와 데이터가 저장되어 있다.
메모리는 저장된 정보가 명령어인지 데이터인지 모르며, 그냥 CPU가 요청하는 위치에 있는 정보를 줄 뿐이다.
그럼 CPU가 메모리에 있는 정보에 접근(access, 읽거나 쓰려면) 어떻게 해야 할까??
+) 메모리 접근에는 읽기, 쓰기 두 가지 종류가 있다.
어느 위치에 있는 정보에 접근하려는지 메모리에 알려줘야 한다. 컴퓨터에서는 위치를 주소라는 용어로 사용한다.
CPU와 메모리를 연결하는 두 개의 굵은 선이 있다.
(1) 주소로 보내기 위한 선으로 주소버스(address bus)라고 부른다.
address bus >> CPU가 메모리에 접근하기 위해 메모리 위치를 보내는 용도이다. CPU가 일방적으로 메모리에 보내는 것이라 한 방향으로 표시돼 있다.
(2) 정보(명령어 또는 데이터)에 접근하기 위한 선으로 데이터버스 (data bus)라고 부른다.
data bus는 양방향 화살표로 되어있다. CPU로 입력되기도 하고 CPU가 출력하기도 하기 때문이다
CPU가 메모리 읽기를 하면 해당 위치에 있는 정보(명령어 또는 데이터)가 data bus를 통해 CPU로 들어오고,
메모리 쓰기를 할 때는 CPU가 메모리에 저장할 데이터를 data bus를 통해 공급한다.
data bus >> when read , data > (through data bus) > CPU
when write . (from CPU) data > (through data bus) > Memory
+) bus란?
단순히 두 개의 하드웨어 장치를 연결하는 wire의 집합을 말한다.
[2] 레지스터 파일 (register file)
register file은 CPU 내부에 있는 임시 저장소로 register의 집합을 말한다.
register는 CPU가 처리하기 전 또는 처리한 후 데이터를 임시로 저장하기 위해 사용된다.
ex) x0 x1 x2 ... x31
[3] ALU (arithmetic logical unit)
ALU는 CPU 내부에서 연산을 하는 장치이다. 연산이란 덧셈, 뺼셈과 같은 사칙연산과 AND OR XOR와 같은 논리연산
[레지스터 파일에서 두 개의 데이터를 읽어 ALU가 연산을 하고, 결과를 레지스터 파일에 저장하도록 만든 하드웨어 구조]
6. 컴파일된 명령어의 실행에 따른 CPU와 메모리 상태
(1) lw x4,20(x0) >> 메모리 20번지에 있는 데이터인 13울 읽어 x4 레지스터에 저장하는 명령어
(2) lw x5,24(x0) >> 메모리 24번지에 있는 데이터인 27을 읽어 x5 레지스터에 저장하는 명령어
b, c를 CPU레지스터로 가져와야 하는데, 첫 2개의 명령어가 이런 동작을 한다.\
(3) add x6, x4, x5 >> x6 <- x4 <- x5 동작을 하는 명령어, x4 x5 레지스터를 읽어 더하고 그 결과를 x6에 저장한다.
>> 이 코드가 b + c 에 대응됨 , 덧셈은 ALU에서 한다.
(4) sw x6, 28(x0) >> x6레지스터에 있는 데이터 40을 메모리 28번지에 저장하는 명령어이다.
>> 이 코드가 덧셈 결과를 'a'변수에 저장하는 것에 대응된다.
7. 컴퓨터는 처음에 어디에서 무엇을 실행할까?
CPU >> 메모리에서 명령어를 읽어 실행하는 하드웨어
그렇다면 처음에 CPU가 가져오는 명령어는 무엇?! ,, 그 명령어는 메모리 어디에 있을까??
[1] Program Counter (PC)
PC는 명령어를 읽을 때 사용한다. PC 레지스터는 CPU가 읽어올 명령어가 있는 위치를 담고 있다.
x86의 경우는 같은 용도의 레지스터를 IP(instruction point)라고 부른다.
>> PC,IP 모두 CPU가 읽어올 명령어의 위치(주소)를 담고 있다.
>> RISC-V CPU에서 PC 레지스터에 따라 명령어를 읽는 것을 보여준다.
PC = 0으로 되어 있어 CPU는 메모리 0번지에 있는 명령어인 lw x4,20(x0)을 읽어온다.
PC레지스터는 명령어를 읽어온 후, 자동으로 증가하도록 설계된다.
+) RV32I 명령어를 지원하는 RISC-V CPU의 경우 PC레지스터는 '4'씩 증가한다. RV32I 명령어의 크기는 모두 4-byte로,
다음 명령어의 위치는 PC + 4가 되기 때문이다.
따라서 1-18에서 CPU는
(1) PC = 0x0에 있는 lw x4,20(x0) 명령어를 읽어와 실행한다.
+) (PC = 0x0 시작 값은 가정, PC레지스터의 처음 시작 값은 CPU제조사마다 다르다.
RISC-V 경우 시작 값은 implementation-defined > 설계 제조사에서 임의로 정할 수 있다.
x86경우 0xFFFF_FFF0에서 시작하도록 설계)
(2) PC = 0x4가 되며 CPU는 메모리 4번지에 있는 lw x5,24(x0) 명령어를 읽어와 실행한다.
(3) PC = 0x8이 되고 CPU는 메모리 8번지에 있는 add x6,x4,x5 명령어를 읽어와 실행한다.
>> 이거 무한 반복
컴퓨터가 실행하는 첫 코드> DRAM기술로 만든 주기억장치(휘발성)에 들어감 > 전원이 꺼지면 명령어와 데이터는 날아감
+) 첫 명령어는 꼭 무엇이어야 한다 이런 건 없음
> 근데 주로 사용하는 명령어 Arm는 brach 명령어, x86은 jmp 명령어 주로 사용함
8. RISC VS CISC
컴퓨터를 분류하는 방법 >> 명령어의 복잡도(complexity)에 따라 분류
(complexity? : 명령어 하나를 실행하기 위해 CPU하드웨어가 해야 하는 일의 양을 의미)
명령어 복잡도는 명령어를 만드는 ISA 아키텍트가 가지고 있는 철학에 따라 달라지며
그래서 CISC와 RISC로 나뉜다.
[1] CISC (complex Instruction Set Computer)
> 명령어가 복잡한 작업을 한다는 의미
ex) CISC 컴퓨터에는 x86, IBM 360, Motorola 68000
[2] RISC (Reduced Instrution Set Computer)
> 각각의 명령어가 줄여진 아주 작은 단위의 작업을 한다는 의미
ex) RISC 컴퓨터에는 Arm, MIPS, RISC-V
복잡한(complex) 한 작업과 간단한(reduced) 작업을 한다는 건 무슨 의미??
CISC 계열 컴퓨터로 우리가 일상에서 사용하는 x86 에는 movsb라는 명령어가 있다.
+) movsb = Move String Byte > 메모리에 있는 문자열을 메모리의 다른 곳으로 복사하는 데 사용하는 명령어
Ex) movsb 명령어를 사용하여 메모리 10~15번지에 있는 문자열인 Hello! 를 20~25번지로 복사하는 예
>> C언어에서 strcpy()와 같은 기능
--- movsb 명령어를 실행하기 위해서는 먼저 esi, edi ecx 레지스터를 설정해야 한다.
(1) esi (extended source index) 레지스터는 원본 (source)문자열의 시작주소인 '10'을 담고 있어야 하고
(2) edi (extended destination index) 레지스터는 저장하려는 곳의 시작 위치인 '20'을 담고 있도록 설정 해야 한다.
(3) ecx (extended Counter) 레지스터는 복사하려는 문자의 개수를 담고 있어야 한다. (Hello!는 문자의 개수가 6)
+) extended는 16bit에서 확장된 32bit 라는 의미
+) ecx 는 반복적인 작업을 수행할 때 카운터(counter)로 사용되는 경우가 많다.
이러한 경우에는 반복 횟수를 저장하고, 해당 횟수만큼 명령어를 반복 실행한다.
(4) rep movsb 명령어를 실행하면 목적 위치에 6개 문자가 복사된다.
>> rep movsb는 명령어 하나라는 것이다. 그리고 이 명령어 하나가 strcpy()함수와 같은 기능을 한다.
+) (rep = repeat, 반복) x86에 사용하는 명령어 prefix로 ecx에 설정한 값 만큼 movsb를 반복하도록 만든다.
prefix = 접두사 >> 여기서 prefix는 rep 가 되겠습니다!
(5) CPU는 esi 레지스터가 가리키는 위치에서 1-byte인 'H'를 읽어온다. 그리고 읽어온 1-byte를 edi 레지스터가 가리키는 위치에 저장한다.
(6) 다음 문자의 복사를 위해 esi와 edi를 1만큼 증가시킨다. 따라서 esi = 11 , edi = 21
또한 ecx 레지스터 값을 1만큼 감소시켜 5가 된다. > > ello!, 5개 남았으니까
(7) 복사하는 동작을 계속해야 할지 아니면 멈춰야 할지 판단하기 위해, ecx레지스터 값이 0과 같아졌는지 확인
>> (5) ~ (7) 동작을 6번 반복
>> movsb는 하나의 예 , x86이 제공하는 많은 명령어를 생각하면
x86 프로세서 설계는 아주아주 복잡하다...
RISC 계열 컴퓨터에서 문자열 복사하는 법?!
>> string-copy를 위해 최소 6개의 명령어를 사용해야 한다.
* *어셈블리 코드 구성
(1) 메모리에서 읽는 명령어
(2) 메모리에 쓰는 명령어
(3,4) 주소를 증가시키기 위한 명령어
(5) 문자열의 개수를 감소시키는 명령어
(6) 모든 문자 복사를 완료했는지 판단하는 명령어
(1) lw x5,10( ** x6) >> 첫 문자인 H를 메모리에서 읽어 x5 레지스터에 저장한다.
(2) sw x5, 20(x7) >> 레지스터에 있는 H를 메모리 20번지에 저장한다.
(3) addi x6,x6,1 >> 읽어올 다음 문자를 가리키도록 x6을 1 만큼 증가시킨다.
(4) addi x7, x7, 1 >> 저장할 다음 위치를 가리키도록 x7을 1만큼 증가시킨다.
(5) addi x8,x8, -1 >> 앞으로 복사할 남아 있는 문자열의 개수를 만들기 위해 x8레지스터를 1만큼 감소시킨다.
(6) beq x8,x0,keepcopying >> 모든 문자열을 복사했는지 점검하기 위해 x8레지스터와 x0레지스터를 비교한다.
두 레지스터(x8,x0)가 같지 않으면 keepcopying 레이블로 되돌아가 (1) ~ (5) 명령어를 반복해서 실행하고, 같으면 종료
+) RISC-V에서 x0레지스터는 항상 0을 가지고 있다.
>> RISC 계열 컴퓨터에서는 각 명령어가 아주 간단한 단위 작업을 한다.
로직 게이트를 상대적으로 적게 사용하게 되어 하드웨어 비용 측면에서도 유리
** ask GPT >> x6이 뭐야? >> 주어진 어셈블리 명령어 lw x5, 10(x6)는 RISC-V 아키텍처의 로드 워드(load word) 명령어입니다.
여기서 x6은 베이스 주소(base address)를 나타냅니다.
베이스 주소(base address)는 메모리에서 데이터를 읽거나 쓸 때 참조할 시작 위치를 가리킵니다.
lw 명령어는 이러한 베이스 주소에서 오프셋(offset)을 더한 위치에 있는 워드(32비트 데이터)를 로드하여 지정된 레지스터(x5 레지스터)에 저장합니다.
따라서 lw x5, 10(x6)는 x6이 가리키는 메모리 주소에서 10바이트(offset)를 더한 위치에 있는 워드 데이터를 읽어와서 x5 레지스터에 저장하는 명령어입니다.
RISC-V 기본 ISA RV32I의 경우 명령어 길이는 모두 4-byte (=32bit) 이다.
x86의 경우 명령어에 따라 크기가 달라, 메모리에서 명령어를 읽어온 후
CPU가 제일 먼저 하는 작업은 명령어를 분리하는 일
+) 메모리 접근은 프로그램 실행 시간에 큰 영향을 미친다.
5번 설명 : CISC는 프로그램을 컴파일 하면 바이너리 크기가 상대적으로 적다 >> 프로그램이 메모리를 적게 차지
>> (= memory footprint)
9. 32-bit , 64bit architecture ?!
32-bit , 64bit architecture >> CPU 내부에서 데이터를 처리하는 기본 단위를 말한다.
ex) 32-bit 컴퓨터 , 32-bit데이터를 한 번에 연산할 수 있다.
ex) 32- bit CPU : ALU는 32-bit 데이터 두 개를 입력으로 받고 연산 후 32-bit 출력한다. ,, 각 레지스터의 크기도 32-bit
1.12 ~ 1.14 꼭 읽어보기
2장은 환경 세팅 설명하는 파트 우리도 같은 보드를 사용할 것 입니다!
'RISC-V CPU 설계 > 개념 정리' 카테고리의 다른 글
[RISC-V] 4.1 조합회로 (1) | 2024.05.11 |
---|---|
교과블록 4주차 개념정리(3장-4~ 3.5) (0) | 2024.04.21 |
교과블록 3주차 공부 (0) | 2024.04.17 |
교과블록 2주차 발표 (3장) (0) | 2024.04.10 |