CS 354 - VirtualBox상에서 XINU 실행하기

XINU 프론트엔드 머신에 SSH하기 귀찮다고요? Intel Galileo 보드가 부팅하는데 30초 기다리기 싫다고요? 그럼 이 페이지가 도움이 될 수 있습니다! XINU 커널/OS를 VirtualBox(혹은 다른 선호하는 hypervisor 상에서)나 아무 x86_32 (i386) 머신에서 실행하는 방법을 보여드리겠습니다!

절차

x86_32 지원 패치해넣기

CS 354 강의에서 주어진 기본 코드는 인텔 Galileo 보드 상 Quark 프로세서만 지원하는데, 코드 일부분이 실행되고 있는 프로세서가 Quark임을 가정하고 돌아가기 때문에 콘솔 인쇄 같은 부분이 작동하질 않습니다. 직렬(serial) 포트를 Quark의 UART 기기에 바로 매핑해버리는 것이 예시 중 하나죠.

따라서 x86_32 (i386) 지원을 패치해넣어야 됩니다. 운좋게도, XINU의 공식 홈페이지에 편집된 코드가 있는데, 이는 별도의 빌드 VM과, Galileo 보드들이 작동하는 방식과 비슷하게 TFTP와 xboot로 이미지를 읽어오는 백엔드 VM을 필요로 합니다.

불필요한 복잡함을 덜어내고 grub 부트로더가 담긴 ISO 이미지를 만들텐데, grub가 곧바로 XINU 실행파일을 돌리도록 만들 수 있습니다. (이게 왜 가능하냐면 컴파일된 실행파일에는 올바른 멀티부트(Multiboot) 헤더가 포함되어 있기 때문이죠.)

일단, 수정되지 않은 XINU 코드 모음집을 다운받은 후, 다음 단계에서 Quark 지원을 날려버리기 때문에 branch를 생성해두는 것을 추천합니다. (패치 이후에 Galileo 보드에서 이미지가 부팅되지 않는다는 걸 얘기했었나요? 지금이라도 알았으니 다행이지)

그 다음 이 Gist에 나와있는 git 패치를 적용합니다.

이 패치는 다음을 포함하고 있습니다 (실은 4개의 커밋을 쑤셔넣었는데 정답들이 담겨있는 레포지터리를 공개할 수 없다고, 무슨 무슨 학업 표절이라나 뭐라나):

패치 이후 make를 사용해서 빌드를 생성합니다. 이제 xinu.bin이나 xinu.xbin 대신 xinu.elf 파일이 현 폴더 안에 생성됩니다.

grub ISO 만들기

다음으로, mkiso.sh 스크립트를 실행하여 ISO를 생성합니다.

참고로 스크립트는 grub-mkrescue를 필요로 하는데, grub2(라고 거의 대부분 부르는) 패키지 안 포함되어 있습니다. grub-mkrescuexorriso라는 명령을 필요로 하는데, libisoburn(라고 거의 대부분 부르는) 라이브러리 안 포함되어 있습니다.

data.cs.purdue.edu에서 grub-mkrescue는 설치되어 있는데 xorriso는 빼뒀다고 얘기했었나요? 지금이라도 알았으니 다행이지

만약 NixOS를 사용한다면 다음 한 명령으로 필요한 패키지들이 포함된 환경을 생성할 수 있다는 걸 알고 있었나요>

# 일반 channels 방식을 사용한다면
nix-shell -p grub2 libisoburn

# nix flakes를 사용한다면
nix shell nixpkgs#grub2 nixpkgs#libisoburn

스크립트가 완료되면 compile/ 폴더 안에 xinu.iso 이미지가 생성된 걸 확인할 수 있습니다!

XINU VirtualBox VM 만들기

xinu.iso를 불러오면 VirtualBox가 거의 대부분의 설정을 자동으로 바꿔주고 머신 타입을 기타/알수 없음으로 설정해줍니다. 그냥 기본 메모리 용량을 (Galileo 보드들과 비슷하게) 256 MB로 맞춰 주고 CPU 개수는 1개로 남겨둡니다. “가상 하드 디스크 추가하지 않기”를 선택해서 가상 하드 디스크 생성을 건너뛸 수 있습니다.

VM이 생성되면 직렬 연결을 구성할 차례입니다. XINU의 한 가지 특이한 점은 VM 콘솔 대신 직렬 포트로 입출력한다는 점입니다. 따라서 VM 설정을 열어 “직렬 포트” 섹션으로 이동합니다.

“Port 1” 아래 “직렬 포트 활성화”를 선택한 후, “포트 번호”를 COM1로 남겨둡니다. “포트 모드”는 “TCP”로 설정합니다. 마지막으로 “존재하는 파이프/소켓에 연결”을 해제하고 “경로/주소” 부분에 1024보다 높은, 원하는 포트 번호를 입력합니다.

VirtualBox 직렬 포트 설정값

VM 부팅하기

VM을 시작시키면 grub 부트로더가 반겨줍니다. 일단 XINU를 부팅하려 엔터키를 누르기 전에 해야 할 사항이 한 가지 있습니다!

grub bootloader inside VirtualBox

텔넷 프로그램(예를 들어 윈도우에서 돌아가는 PuTTY)을 사용하여 localhost:port에 연결하는데, 이때 port에 아까 사용한 포트 번호를 넣어줍니다. 연결이 성립되면 이제 VM 윈도우 안에서 엔터키를 눌러 XINU를 부팅시켜줍니다. 그럼 XINU에서 출력하는 값들을 텔넷 세션에서 확인하실 수 있습니다!

XINU가 VirtualBox에서 부팅한 모습입니다!


수정: 여기에서 어떻게 UTM(애플 실리콘 맥용)상에서 XINU를 부팅할 수 있는지 확인하세요!