TECH 으로 돌아가기
TECH HACKER NEWS 오늘 8분 읽기 23 READS

디바이스 드라이버, 직접 짜보면 OS가 보여요: 테네시대 운영체제 실습 과제 들여다보기

드라이버는 왜 늘 “남이 짜준 것”일까

개발자 대부분은 디바이스 드라이버를 직접 짜본 적이 없어요. 파일을 열고, 네트워크로 데이터를 보내고, 화면에 그림을 그리지만, 그 밑에서 실제로 디스크 컨트롤러나 네트워크 카드에 명령을 내리는 코드는 운영체제 어딘가에 이미 들어 있으니까요. 그래서 드라이버는 “커널 해커들만 하는 어려운 것”이라는 인상이 강하죠.

테네시 대학교 운영체제 수업(COSC562)의 디바이스 드라이버 실습 과제는 이 벽을 낮춰줘요. 이 수업을 맡은 스티븐 마즈 교수는 “RISC-V 운영체제를 Rust로 만들기” 튜토리얼로 이미 잘 알려진 분인데요, 이 실습은 학생들이 직접 만든 작은 운영체제에 실제로 동작하는 드라이버를 붙이는 과제예요. 자료가 웹에 공개돼 있어서 학생이 아니어도 따라갈 수 있어요.

드라이버가 뭐냐면

이게 뭐냐면, 디바이스 드라이버는 “운영체제와 하드웨어 사이의 통역사”예요. 운영체제는 “디스크의 100번 블록 읽어와”라고 추상적으로 말하고 싶은데, 실제 디스크 컨트롤러는 특정 레지스터에 특정 값을 정해진 순서로 써야만 움직이거든요. 이 번거로운 대화를 대신해주는 코드가 드라이버예요. 하드웨어마다 대화법이 다르니까 드라이버도 하드웨어마다 따로 있는 거고요.

그런데 학생들이 진짜 하드웨어 수십 종류의 대화법을 다 배울 순 없잖아요. 그래서 이런 수업에서는 QEMU라는 에뮬레이터(가상의 컴퓨터를 소프트웨어로 흉내 내는 프로그램)와 VirtIO라는 표준을 사용해요.

VirtIO: 가상 머신을 위한 표준 대화법

VirtIO는 가상 머신 안의 운영체제와 바깥의 하이퍼바이저(가상 머신을 돌리는 프로그램)가 효율적으로 대화하려고 만든 공개 표준이에요. 진짜 하드웨어를 그대로 흉내 내면 느리니까, “어차피 가상 환경이니 솔직하게 빠른 방식으로 통신하자”고 약속한 거죠. 블록 장치(디스크), 네트워크, GPU, 키보드와 마우스 같은 입력 장치까지 규격이 있고, 클라우드에서 돌아가는 리눅스 VM 대부분이 실제로 이 VirtIO 드라이버로 디스크와 네트워크를 써요. 장난감이 아니라 실무에서 쓰이는 표준을 배우는 셈이에요.

핵심 개념은 virtqueue예요. 운영체제와 장치가 공유하는 메모리 위의 원형 큐인데, 세 부분으로 나뉘어요. 디스크립터 테이블(어느 메모리 주소에 어떤 데이터가 얼마나 있는지 적은 목록), 가용 링(운영체제가 “이거 처리해줘”라고 넣는 곳), 사용됨 링(장치가 “다 했어”라고 답하는 곳)이에요. 드라이버를 짠다는 건 결국 이 큐를 초기화하고, 요청을 디스크립터로 엮어 넣고, 장치에게 “새 요청 있어”라고 알리고, 완료 인터럽트가 오면 결과를 회수하는 코드를 쓰는 일이에요.

실습에서 실제로 하는 일

먼저 장치 찾기예요. QEMU의 RISC-V 가상 머신에서 장치는 PCI 버스나 MMIO(장치 레지스터를 메모리 주소처럼 읽고 쓰는 방식)로 연결돼 있어요. PCI라면 버스를 순회하면서 각 슬롯의 벤더 ID와 디바이스 ID를 읽어 “이건 VirtIO 블록 장치, 이건 VirtIO GPU”를 구분하죠.

다음은 초기화 핸드셰이크예요. 장치를 리셋하고, “너를 인식했어”라는 비트를 세우고, 드라이버가 지원하는 기능 목록을 장치와 협상하고, virtqueue의 메모리 주소를 알려주고, 마지막에 “준비 완료” 비트를 세우면 장치가 살아나요. 이 순서를 하나라도 틀리면 장치가 아무 반응도 안 해서, 학생들이 가장 많이 헤매는 부분이에요.

그다음이 실제 요청이에요. 블록 장치라면 “섹터 N부터 읽어줘”라는 요청 헤더, 데이터를 받을 버퍼, 상태를 돌려받을 1바이트를 디스크립터 세 개로 엮어서 큐에 넣어요. GPU라면 프레임버퍼 메모리를 장치에 연결하고 “이 영역 갱신해줘”라고 명령하는 식이고, 입력 장치라면 키 눌림 이벤트가 큐에 쌓이는 걸 읽어내죠. 이 과정에서 인터럽트 처리, 물리 주소와 가상 주소 변환(장치는 물리 주소만 알아요), 메모리 배리어 같은 운영체제 핵심 개념을 실전으로 익히게 돼요.

업계 맥락: RISC-V와 Rust가 교육 현장에 온 이유

이 수업이 RISC-V를 쓴다는 점도 눈여겨볼 만해요. RISC-V는 누구나 쓸 수 있는 공개 명령어 집합인데, x86이나 ARM보다 구조가 단순해서 운영체제 교육에 딱 맞아요. MIT의 xv6도 RISC-V로 옮겨갔고, 여러 대학이 OS 수업을 RISC-V 기반으로 바꾸고 있어요. 산업 쪽에서도 RISC-V 칩이 IoT나 AI 가속기 컨트롤러로 실제 제품에 들어가기 시작했고요. 여기에 Rust로 OS를 짜는 흐름까지 겹치면, 리눅스 커널이 Rust를 받아들이고 구글이 안드로이드 저수준 코드를 Rust로 옮기는 업계 변화와 정확히 같은 방향이에요.

한국 개발자에게 주는 시사점

당장 드라이버를 짤 일이 없어도, 이 실습을 한 번 따라 해보면 얻는 게 커요. 첫째, 성능 튜닝할 때 “왜 I/O가 느린지”를 밑바닥부터 이해하게 돼요. 배치 처리, 인터럽트 병합, 제로카피 같은 개념이 virtqueue를 만져보면 그냥 눈에 보이거든요. 둘째, 반도체나 자동차 전장 쪽 취업을 생각하는 분에겐 이력서에 쓸 만한 실질적 경험이 돼요. 셋째, 웹이나 앱 개발자도 “추상화 계층이 어떻게 쌓이는가”를 체감하면 설계 감각이 좋아져요.

시작하려면 QEMU를 설치하고, 마즈 교수의 RISC-V OS 튜토리얼을 따라가다가 이 드라이버 실습 페이지로 넘어오면 돼요. 주말 며칠이면 블록 장치 읽기까지는 충분히 갈 수 있어요.

마무리

한 줄로 정리하면, “드라이버는 마법이 아니라 정해진 순서대로 레지스터와 공유 메모리를 다루는 일이고, 그걸 직접 해보면 OS 전체가 보인다”는 거예요.

여러분은 하드웨어 바로 위의 코드를 만져본 경험이 있으신가요? 웹이나 앱 개발자도 이런 저수준 실습을 해볼 가치가 있다고 보시나요?


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://web.eecs.utk.edu/~smarz1/courses/cosc562/drivers.htm...
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기
처리 중...