취미로 컴퓨터 시뮬레이터를 만들어보고 싶습니다.

사용할 언어는 c입니다.

현재 구상으론

  1. cpu 역할하는 프로세스

  2. 메모리 역할하는 프로세스

  3. 커널 + 쉘 역할 프로세스

  4. 스토리지 역할 할 텍스트 파일

인스트럭션은 16비트짜리로

add, sub, print, scan, file write, file read 등 몇 개만 만들고

(바이너리 인스트럭션 읽어서 명령, 아규먼트만 식별하고 그 실제 동작은 그거에 맞게 c code 돌림… 이것까지 다 직접 구현할 자신은 없어요…)

구동 절차는

power_on을 실행하면

cpu랑 메모리가 돌기 시작함

완벽히 하려면 cpu가 돌면서 부트영역에 있는 바이너리 읽어서 커널이 돌고 쉘 띄워야 하는데 그러려면 너무 복잡해져서 일단 지금은 스킵하고

그냥 커널 + 쉘 역할 하는(입출력 역할 하는) 프로세스 뜸

그 다음 일단 큰그림만 말하면

그렇게 뜬 쉘에서 인풋 넣으면
그걸 제가 만든 인스트럭션(16비트 바이너리)으로 변환해서

소켓 통해서 cpu 프로세스로 전달하고
cpu프로세스에선 그걸 읽어서 명령 수행하고

스토리지에 해당하는 파일에 write 하거나

경우에 따라 메모리 프로세스와 소켓 통신 통해 lru 방식으로 메모리에 write
(메모리 프로세스에서 배열에 데이터들을 담아놓으려고 합니다)

대충 이런 느낌인데

아키텍쳐에 대한 조언좀 부탁드립니다. 이런거 처음 해봐서 감이 안잡히네요…

일단 기본적인 껍데기가 완성 되면 세부적으로 하나하나 기능 추가하고 업그레이드 하려고 합니다.

참고자료, 아키텍쳐 조언 부탁드립니다 ㅠㅠ

2 Likes

안녕하세요.

시뮬레이션을 하려면 컴퓨터 구조가 어떻게 생긴지 먼저 알아야하고
그 다음 하드웨어들을 에뮬레이팅 해야합니다.

어셈블리를 죄다구현할 자신이없으시면 mips 아키텍처를 공부해보세요.

그리고 cpu 작동부터 구현해보시죠. 어셈블리와 레지스터요

Cpu작동 구현이란 게 어셈블리 인스트럭션에 해당하는 바이너리를 회로로 보내고 회로에서 처리하도록 하는 그 정도까지 말씀하시는 건가요?

정확히 무슨 말씀이신지 모르겠습니다
회로까지 직접 구현하는게 아니면
아무리 인스트럭션들을 정의해도 그걸 실행하는건 제가 만든 시뮬레이터가 아니라 그 밑에 있는 호스트os에 의존할 수 밖에 없을 것 같아서요…

시뮬레이션이라는거는 그걸 흉내내는거잖아요.

컴퓨터를 시뮬레이션하신다는게 컴퓨터가 작동하는걸 소프트웨어적으로 구현해보고 싶다는거 아니신가요?

오라클 virtualbox같은 프로그램이 그런식으로 동작하는겁니다.

맞습니다 ㅠ
지금도 계속자료 찾으면서 공부중인데
궁극적으로는 모니터까지 에뮬레이팅 해야할것 같네요 ㅠ
Cpu회로는 많이 봤는데 모니터는 또 어떻게 해야할지 고민입니다…ㅋㅋ
패널과 거기 있는 픽셀들, 그리고 그것과 상호작용하는 프로세서… 정말 복잡하네요. 공부 많이 해야겠습니다 ㅋㅋ

아키텍쳐부터 컴파일러, OS까지 모두 설계&구현하는 건 힘든 여정이 될 것 같습니다.

간단한 것부터 시작하는게 어떨까요?

1 Like

귀도야 이게 언어냐

라고 저번에 어떤분이 ㅋㅋㅋㅋ

그래서 cpu부터 해보시라는 겁니다. ^^

어셈블리어 생각보다 단순해요~

add, sub, jmp, push, pop, call ㅋㅋㅋㅋ

어셈블리어 자체는 저도 익숙하지만…

회로를 직접 구현해서 11010011이 회로를 타고 여러 멀티플렉서를 거쳐 원하는 값이 되도록 하고 그것들을 조합해서 하나의 완전히 동작하는 cpu를 구현하는 것은 별개의 문제 같습니다 ㅠ

회로까지 구현하실 필요는 없고요.
일단 레지스터만 구현을 하시면, IA-32를 참고하셔도 됩니다.

예를들어 이런식으로 어셈블리코드가 있다면

xor eax eax
inc eax
inc eax

이렇게 입력이 들어오면
한줄씩 한줄씩, xor 연산을 처리하고 inc처리하는 인터프리터처럼 만드시면 됩니다.

그 인터프리터가 어셈블리를 한줄씩 처리하고 레지스터의 값을 이용하면~
아주아주 단순한 cpu 에뮬레이터가 탄생하는것이죠 ^^/

이게 유명하죠
https://www.nand2tetris.org

취미로 히어로는 어떠신가여:joy:

Verilog로 아예 cpu를 설계해보시는건…