System Min-imization

cd dev/ cd archive/ cd personal_records/

My Own OS on Raspberry Pi 3B – Lecture 1 (1)

Step #0: Project Motivation

2025 Fall Semester에 서의성 교수님의 Operating System 수업을 들었다. 어렵기로 소문난 수업이며 3학년 과정인데도 2학년 때 땡겨서 들었다. 그래서 걱정이 많은 수업이었다. 하지만 생각보다 성적도 잘 나오고 무엇보다 재미를 많이 느꼈다. 그래서 이번 겨울방학 때 System Programming과 Operating System수업을 통해 배웠던 이론적인 내용들을 직접 적용해보는 프로젝트를 진행해보자-라는 생각을 하였다.

xv6가 적절한 프로젝트였다. 하지만 수업시간 때 부분적인 기능을 여러번 구현하기도 했었고, 조금 덜 복잡하지만 실제 hardware에 적용해보고 싶었으며 실제로 적용되지는 않았지만 수업시간 때 배운 여러 이론적인 자료구조와 알고리즘을 구현해보고 싶었다.

그래서 교육용 제품으로 유명한 Raspberry Pi를 사용하여 간단한 하드웨어에 나만의 OS를 적용해보는 프로젝트를 계획했다. 하지만 막상 시작하려니 막막했다. 부트로드는 어떻게 할것이며, 테스트는 어떤 방식으로 할지 등등 세세한 디테일적인 부분에 대해서 아는 것이 너무 없었다. 그래서 혹시 내가 진행하고자 했던 프로젝트와 유사한 프로젝트를 찾아보았다. 이를 기반으로 내가 좀 더 확장해보면 좋은 시작이 될 것 같았기 때문이었다.

구글 검색을 하던 중 나처럼 Raspberry Pi에 운영체제를 만들어 적용시키는 교육용 프로젝트를 진행했던 사람이 있었다 (https://github.com/s-matyukevich/raspberry-pi-os). 이 프로젝트는 오픈 소프트웨어 형식으로 모든 사람이 배우고 내용을 추가할 수 있었다. 시작부터 결과물까지 나의 목표의 부합했기에 나는 이 프로젝트를 기반으로 나만의 프로젝트를 만들어보기로 결심했다.

기존 프로젝트는 운영체제의 fundamental goal을 다음으로 정의한다.

  1. Run user processes in isolation
  2. Provide each user process with a unified view of the machine hardware

그리고 구현하고자 하는 핵심 기능은 다음과 같으며

  1. 스케줄러 및 타이머 인터럽트
  2. 최소한의 디바이스 드라이버
    • 화면 출력
    • 키보드 입력
  3. 시스템 콜
  4. 사용자 프로그램 로딩 및 실행
    • 파일 시스템
    • 실행 파일 포맷 지원
  5. 네트워킹(Optional)

제외하고자 하는 요소는 다음과 같다.

  1. 성능 최적화
    • 캐시 및 복잡한 알고리즘 사용 안 함
  2. 보안
    • 가상 메모리만 최소한으로 사용
  3. 멀티코어 및 동기화
    • 단일 코어만 사용하여 복잡성 제거
  4. 다중 아키텍처/디바이스 지원
  5. 상용 OS에 필요한 수많은 부가 기능

따라서 나는 여기서 제공하는 코드를 따라하여 기능을 구현하면서 지식을 습득하고 최종적으로는 나의 목적의 맞게 커스텀한 결과물을 내놓고자 한다.

과제에서 사용하는 Raspberry Pi 3B의 스펙은 다음과 같다.

  • Quad Core 1.2GHz Broadcom BCM2837 64bit CPU
  • 1GB RAM
  • BCM43438 wireless LAN and Bluetooth Low Energy (BLE) on board
  • 100 Base Ethernet
  • 40-pin extended GPIO
  • 4 USB 2 ports
  • 4 Pole stereo output and composite video port
  • Full size HDMI®
  • CSI camera port for connecting a Raspberry Pi camera
  • DSI display port for connecting a Raspberry Pi touchscreen display
  • Micro SD port for loading your operating system and storing data
  • Upgraded switched Micro USB power source up to 2.5A

Step #1: Project Progress – 1

1.1 Developing small, bare-metal “Hello, World” application

우선 하드웨어의 준비가 필요하다. (Guide를 따라 진행하면 쉽게 완료할 수 있다) Raspberri Pi 3B와 USB to TTL Cable이 준비되었다면, 이들이 정상적으로 작동하는지 확인해야한다. 따라서 아래 task를 순서대로 진행했다.

  1. SD Card에 Raspberry Pi 공식 웹사이트에서 제공하는 OS를 저장.
  2. USB to TTL Cable의 연결을 확인

먼저 SD Card에 Raspberry Pi 공식 웹사이트에서 제공하는 OS를 저장. Rapberry Pi 3b는 64bit CPU를 탑재하고 있으니 이에 맞추어 올바른 옵션을 선택. 이후 OS 커스터마이징 설정을 하여 Raspberry Pi에 키보드, 마우스, 모니터를 연결하지 않더라도 원격으로 접속할 수 있도록 설정한다. 여기서 주의할 것이 로케일 설정에서 무선랜 국가는 KR(대한민국)이 아닌 US(미국)나 GB(영국)으로 설정해야 하고 시간대와 키보드 레이아웃은 각각 Asia/Seoul과 US로 설정한다. 이는 국가마다 문선랜 주파수가 다르게 설정되는데 국내 무선랜 환경에 맞춰 Rasberry Pi가 동작하도록 설정되지 않은 것으로 추정된다. 이 과정에서 한 번 설정을 잘 못 해서 포멧하고 다시 설치를 진행했다. 근데 File Explorer, devices and drives 목록에서 SD Card가 보이지 않았다. 근데 신기하게도 Disk Management와 Device Manager에서는 정상적으로 인식되었다. 원인을 파악해보니 포멧 과정에서 파티션 테이블(메타데이터)의 손상이 일어난 것으로 보였다. 그래서 cmd에서 diskpart를 실행하고 아래 명령어를 순서대로 입력해주었다.

diskpart
list disk
select disk # ← SD 카드 번호 선택 (용량 보고 구분)
clean
create partition primary
format fs=fat32 quick
assign
exit

그랬더니 정상적으로 SD 카드가 File Explorer, devices and drives 목록에서 보였다. 신기한게 disk management에서 포멧했을 땐 계속 같은 오류가 발생했는데, diskpart를 통한 포멧으로는 고쳐졌다. 이러한 현상의 원인에 대해서 ChatGPT에게 물어보았더니 두 방식의 동작 방식과 권한 수준이 다르기 때문이라고 하였다. Disk Management는 GUI 기반으로, Windows가 인식 가능한 파티션과 파일 시스템만 다룬다. 즉, NTFS, FAT32, exFAT 같은 Windows 호환 파티션에 대해서만 정상적으로 동작한다. 반면 DiskPart는 명령줄 기반의 저수준(low-level) 도구로, 파티션 테이블 자체(MBR/GPT)를 직접 제어할 수 있다. Windows가 인식하지 못하는 ext4, raw 파티션도 강제로 삭제(clean) 가능하다. 따라서 라즈베리파이 OS 설치 중 오류로 SD 카드에 ext4 파티션이나 손상된 파티션 테이블이 남아 있었는데, Disk Management는 이를 인식하지 못하고 “지원되지 않음” 오류를 냈다. 하지만 DiskPart는 파티션 테이블 자체를 날려버릴 수 있어서, 강제로 초기화(clean) → 새 파티션 생성 → 포맷까지 진행할 수 있었던 것이다.


Step #1: Project Progress – 2

SD카드에 OS 설치를 하기 전, 설치할 필요 없이 USB to TTL 케이블 칩셋에 맞는 드라이버를 설치하면 Terminal Program(PuTTy를 사용함)를 통해서 연결을 테스트 할 수 있다는 사실을 알게 되었다. 따라서 일단 OS 설치는 하지 않고, 드라이버 설치를 진행하였다.

본격적으로 USB to TTL 케이블을 연결하기 전 중요한 사실을 알게 되었다. 바로 케이블의 UART의 Voltage Level이 중요하다는 것이다. Raspberry Pi의 UART는 3.3V 레벨. 하지만 내가 구매한 USB to TTL 케이블은 5V. 무턱대고 연결했다가는 칩이 손상할 수 있다. 구매 페이지를 다시 한 번 확인해보니 Raspberry 호환. 다만 4개의 핀 중 빨간색은 사용하면 안 된다. 아래처럼 연결하면 안전하다.

  • Pi GND ↔ 케이블 GND (검은색)
  • Pi TX ↔ 케이블 RX (흰색)
  • Pi RX ↔ 케이블 TX (초록색)
  • VCC(빨간색)는 연결하지 않음

다음으로 Raspberry Pi 3B의 구조를 살짝 공부해보자.

  1. GPIO (General Purpose Input/Output): 범용 입출력 핀. Input에는 버튼, 센서 등의 외부 장치 신호를 읽음. Output에는 LED & 모터 제어 등 외부 장치에 신호를 보낸다. Raspberry Pi 3B는 40개의 GPIO 핀이 있다. 각 핀은 전원(3.3V, 5V), GND, 또는 특정 기능(UART, 12C, SPI 등)으로 할당됨. 프로그래밍(Python, C 등)으로 제어 가능하다.
  2. UART (Universal Asynchronous Receiver/Transmitter): 직렬 통신 방식 중 하나. 두 장치가 TX(송신), RX(수신) 선을 통해 데이터를 교환한다. 여기서 asynchronous의 의미는 클럭 신호 없이, 약속된 속도로 데이터를 주고받음. GPIO14(TXD), GPIO15(RXD)에 연결되어 있음. 주로 PC ↔ 라즈베리파이 연결 (USB to TTL 케이블 사용), 디버깅 콘솔 확인 (부팅 메시지, 로그인 프롬프트), 다른 MCU(예: Arduino, ESP32)와 데이터 교환 용도로 사용한다.

그렇다면 Raspberry 3B의 GPIO 핀 배열과 그 중 UART 연결에 필요한 핀 위치를 전체적으로 정리해보자. 세세하게 알아보는 것이 아니라 이 핀은 ~용도로 사용한다고 알면 좋을듯.

  1. 물리적 구성 개요
    • 핀 수: 40 (2열 × 20행)
    • 번호 체계
      • 물리적 번호: USB와 LAN 포트를 자기 자신쪽으로 두었을 때 왼쪽 -> 오른쪽 순으로 주어지는 번호. 핀 수에 맞게 1 – 40 까지의 번호를 사용함.
      • BCM GPIO 번호: SoC 내부 GPIO 식별자. 즉, 시스템적으로 식별하는 핀별 ID (GPIO2, GPIO17 등). 실무에서는 이게 표준.
  2. 전원(Power) 핀
    • 왼쪽 상단 포트: Micro USB를 통한 전력 공급 가능
    • 1, 17 핀: 3.3 V 전력 공급
    • 2, 4 핀: 5 V 전력 공급
    • 6, 9, 14, 20, 25, 30, 34, 39 핀: GND, 공통 접
  3. 일반 GPIO 핀 (나머지)
    • 대부분: 입력/출력 용도
  4. 주요 기능별 핀 그룹
    • I²C (Inter-Integrated Circuit) – 센서, OLED, RTC 등에 표준적으로 사용
      • 3 핀 / GPIO2
        • SDA
      • 5 핀 / GPIO3
        • SCL
    • UART (Serial) – 콘솔, MCU 통신, 디버깅에 사용
      • 8 핀 / GPIO 14
        • TXD
      • 10 핀 / GPIO 15
        • RXD
    • SPI (Serial Peripheral Interface) – 고속 통신 (ADC, DAC, 디스플레이 등)
      • 19 핀 / GPIO 10
        • MOSI
      • 21 핀 / GPIO 9
        • MISO
      • 23 핀 / GPIO 11
        • SCLK
      • 24 핀 / GPIO 8
        • CE0
      • 16 핀 / GPIO 7
        • CE1
    • PMW (Hardware) – 모터 제어, LED 밝기 조절
      • 32 핀 / GPIO 12
        • PWM0
      • 33 핀 / GPIO 13
        • PWM1
      • 12 핀 / GPIO 18
        • PWM0
      • 35 핀 / GPIO 19
        • PWM1
    • PCM / I²S (Audio) – 디지털 오디오 입력/출력
      • 12 핀 / GPIO 18
        • PCM_CLK
      • 35 핀 / GPIO 19
        • PCM_FS
      • 38 핀 / GPIO 20
        • PCM_DIN
      • 40 핀 / GPIO 21
        • PCM_DOUT

Posted in:

Leave a Reply

Your email address will not be published. Required fields are marked *