만들기
Raspberry Pi 5에서 실행하기
무엇을 사야 하는지, SD 카드를 빌드하고 기록하는 방법, 보드의 시리얼 로그를 읽고 검사하는 방법, 그리고 Pi 5에서 무인으로 시스템을 실행하거나 HDMI 화면으로 사용자 인터페이스를 지켜보는 방법.
Raspberry Pi 5는 NoWayOS의 레퍼런스 보드입니다. 저렴하고 구하기 쉬우며, NoWayOS의 첫 하드웨어 테스트가 실행되는 보드입니다. QEMU에서 통과한 시스템은 Pi에서도 보드의 시리얼 로그를 통해 같은 기대 출력 파일과 대조해 검사합니다.
보드에 관한 두 가지 규칙. Pi의 UART에 5 V 시리얼 어댑터를 절대 연결하지 마십시오. 3.3 V 포트입니다. 그리고 개발 보드에서는 Pi의 일회성 프로그래밍(OTP) 메모리를 프로그래밍하거나 보안 부팅을 켜지 마십시오. 둘 다 되돌릴 수 없습니다.
make sdcard는 그중 하나라도 하거나 보드의 전압을 바꾸는config.txt를 거부합니다.
필요한 것
| 품목 | 참고 |
|---|---|
| Raspberry Pi 5 | 16 GB 보드에서 개발하고 테스트했습니다. 모든 명령은 보드를 rpi5b_2gb로 지정합니다. 메모리의 처음 2 GB를 쓰는 Pi 5용 seL4 구성이며, 빌드는 그중 1 GB가 조금 안 되는 양을 seL4에 줍니다. 따라서 2, 4, 8 GB 보드도 따로 필요한 것은 없을 것으로 보이지만, 아직 시험해 보지 않았습니다 |
| 전원 공급 장치 | 공식 5 V, 5 A USB-C 전원 공급 장치 또는 그와 동등한 제품. 전력이 부족한 Pi 5는 소프트웨어 버그처럼 오작동합니다 |
| microSD 카드 | make sdcard가 만드는 부트 파티션용 |
| Raspberry Pi Debug Probe | UART 케이블이 Pi 5의 3핀 디버그 커넥터에 맞습니다. 알맞은 케이블이 있는 3.3 V USB-시리얼 어댑터라면 무엇이든 됩니다 |
| HDMI 모니터, USB 키보드와 마우스 | 사용자 인터페이스용. 전원을 켜기 전에 모니터를 연결하십시오. 펌웨어는 부팅할 때만 화면을 설정합니다. USB 부트 프로토콜 키보드와 마우스는 동작하지만, 허브는 아직 동작하지 않습니다 |
SD 카드 빌드하기
make sdcard BOARD=rpi5b_2gb SYSTEM=hello
이 명령은 카드의 부트 파티션을 build/rpi5b_2gb/hello/sdcard/에 기록합니다. U-Boot, 디바이스 트리와 오버레이, config.txt, seL4 이미지 loader.img, 라이선스 파일, 그리고 나중에 카드를 검사할 SHA256SUMS가 들어갑니다. U-Boot는 컨테이너 안에서 소스로부터 재현 가능하게 빌드됩니다.
카드 기록하기
macOS에서
diskutil list로 카드를 찾으십시오. external, physical로 표시되고 크기가 카드와 같은 디스크입니다. 다음 단계에서 그 디스크 전체가 지워지므로, 번호를 두 번 확인하십시오.PIBOOT라는 레이블로 포맷하십시오.
diskutil eraseDisk FAT32 PIBOOT MBRFormat /dev/diskN
- 파일을 복사하고, 모든 파일이 온전히 복사되었는지 확인하십시오(모두 일치하면 아무것도 출력하지 않습니다).
cp -RX build/rpi5b_2gb/hello/sdcard/ /Volumes/PIBOOT/
dot_clean -m /Volumes/PIBOOT
(cd /Volumes/PIBOOT && shasum -a 256 -c SHA256SUMS | grep -v ': OK$')
diskutil eject /dev/diskN으로 꺼낸 뒤 Pi에 꽂으십시오.
Linux에서
Linux 도구로 하는 같은 단계입니다(프로젝트 자체의 카드는 macOS에서 만듭니다).
lsblk -p로 카드를 찾으십시오./dev/sdX나/dev/mmcblk0처럼 크기가 카드와 같은 디스크입니다. 다음 단계에서 그 디스크 전체가 지워지므로, 이름을 두 번 확인하고 마운트된 파티션이 있으면 모두 마운트 해제하십시오.PIBOOT라는 레이블의 FAT32 파티션 하나를 만드십시오(dosfstools와parted가 설치되어 있어야 합니다).
sudo parted --script /dev/sdX mklabel msdos mkpart primary fat32 1MiB 100% set 1 lba on
sudo mkfs.vfat -F 32 -n PIBOOT /dev/sdX1
- 파일을 복사하고, 모든 파일이 온전히 복사되었는지 확인하십시오(모두 일치하면 아무것도 출력하지 않습니다).
sudo mount /dev/sdX1 /mnt
sudo cp -r build/rpi5b_2gb/hello/sdcard/. /mnt/
(cd /mnt && sha256sum -c SHA256SUMS | grep -v ': OK$')
sudo umount /mnt
- Pi에 꽂으십시오.
시리얼 콘솔 연결하기
Debug Probe를 GPIO 핀이 아니라, HDMI 포트 사이에 있는 Pi 5의 전용 3핀 디버그 커넥터에 꽂으십시오. 속도는 115200 baud, 8N1입니다. 프로브는 Mac에서는 /dev/cu.usbmodem…으로, Linux에서는 /dev/ttyACM0 같은 이름으로 나타납니다(사용자가 dialout 그룹에 속해 있어야 합니다).
Pi의 전원을 켜기 전에 캡처를 시작하십시오. 로그 하나에 부팅 한 번입니다.
mkdir -p build/rpi5b_2gb/hello
(stty 115200 raw -echo; cat) < /dev/cu.usbmodemXXXX | tee build/rpi5b_2gb/hello/serial.log
여기처럼 설정과 읽기를 한 명령 안에 두십시오. macOS에서는 포트를 두 번째로 열면 9600 baud로 되돌아갑니다. Linux에서는 stty -F /dev/ttyACM0 115200 raw -echo로 포트를 설정하고 cat /dev/ttyACM0으로 읽습니다. 기대하는 마지막 줄이 나온 뒤 Ctrl-C로 멈추십시오.
전원을 켜면 U-Boot가 3초를 센 다음 카드의 loader.img를 부팅합니다. 대신 U-Boot 프롬프트에서 멈추려면 카운트다운 중에 stopboot를 입력하십시오. (이 단어로만 멈추므로, 연결되지 않은 시리얼 선이 받아들이는 잡음 때문에 장치가 U-Boot에 멈춰 서는 일은 없습니다.)
로그 검사하기
QEMU의 출력을 검사하는 것과 같은 규칙으로, 보드의 로그를 시스템의 기대 출력 파일과 대조해 검사하십시오.
make check-serial SYSTEM=hello LOG=build/rpi5b_2gb/hello/serial.log
Pi 전용 기대 출력 파일이 따로 있는 시스템이라면 BOARD=rpi5b_2gb를 덧붙이십시오.
무인으로 시스템 실행하기
프로브를 연결해 두면 make pi-run이 카드를 옮겨 꽂지 않고, 보드 앞에 아무도 없어도 여러 시스템을 차례로 보드에서 실행합니다. 컨테이너가 아니라 여러분의 컴퓨터에서 직접 실행하십시오(Mac에서는 Podman 가상 머신이 USB 시리얼 장치를 볼 수 없습니다). 컴퓨터에 Python 3.11 이상이 필요하며, 표준 라이브러리만 씁니다.
make pi-run PI_DEVICE=/dev/cu.usbmodemXXXX PI_SYSTEMS="hello ipc-demo isolation-test"
시스템마다 컨테이너에서 이미지를 빌드하고, 보드를 재설정하고, 이미지를 시리얼 선으로 보내 온전히 도착했는지 확인하고, 보드의 워치독을 활성화한 뒤 이미지를 시작합니다. 각 로그는 도착하는 대로 검사되며, 워치독이 다음 시스템을 위해 보드를 재설정합니다. 입력하는 모든 명령은 되돌아오는 에코를 확인한 뒤에야 실행됩니다. 로그는 build/rpi5b_2gb/pi-run/에 보관됩니다.
사용자 인터페이스 지켜보기
전원을 켜기 전에 모니터를 연결한 상태에서 다음을 실행합니다.
make pi-run PI_DEVICE=/dev/cu.usbmodemXXXX PI_SYSTEMS=ui-demo PI_WATCHDOG=15
이 명령은 사용자 인터페이스의 스크립트 세션을 HDMI 화면에서 실행하고 모든 프레임의 해시를 검사합니다. 사람이 지켜볼 수 있도록 워치독 없이 시스템을 계속 실행해 두려면 make pi-show PI_DEVICE=… SYSTEM=ui-demo를 쓰십시오. 보드의 전원을 껐다 켤 때까지 실행됩니다.
무언가 실패할 때
한 번에 여러 가지를 바꾸기 전에, 마지막으로 동작했던 이미지로 돌아가 시리얼 선과 부트 체인을 다시 확인하십시오. U-Boot 전에 아무것도 나타나지 않는다면, 프로브나 배선을 의심하기 전에 부트로더의 BOOT_UART 설정과 카드 config.txt의 enable_uart=1을 확인하십시오.