피드로 돌아가기
Dev.toInfrastructure
원문 읽기
RISC-V 환경의 0x80200000 커널 로드 및 MMIO 기반 UART 드라이버 설계
Making a hello-world program in kernel space
AI 요약
Context
OpenSBI 펌웨어가 0x80000000 주소를 점유하는 RISC-V RV64I 아키텍처의 메모리 제약 사항 분석. C 언어 런타임 환경 부재로 인한 Assembly 기반 스택 설정 및 BSS 섹션 초기화 필요성 대두.
Technical Solution
- OpenSBI 코드 영역과의 충돌 방지를 위해 커널 로드 주소를 0x80200000로 오프셋 설정
- TLB Miss 최소화를 위해 커널 메모리를 2MB 단위의 Large Pages 정렬 구조로 설계
- 16KB 크기의 전용 STACKRAM 영역을 분리 배치하여 데이터 오버플로우 방지 및 Guard Page 효과 확보
- RISC-V의 단순성을 활용한 MMIO 방식의 UART 드라이버를 설계하여 0x10000000 베이스 주소로 직접 하드웨어 제어
- volatile 키워드와 fence 명령어를 통한 메모리 쓰기 순서 보장 및 즉각적인 하드웨어 반영 구조 구현
- Linker Script를 통한 .text, .rodata, .data, .bss 섹션의 명시적 메모리 맵핑 및 ALIGN(16) 적용으로 Misaligned Access Fault 방지
실천 포인트
- 임베디드/커널 환경 설계 시 펌웨어 점유 영역을 확인하여 Load Address 충돌 여부 검토 - 메모리 정렬(Alignment) 단위를 하드웨어 요구사항에 맞춰 설정하여 성능 저하 및 Fault 방지 - 하드웨어 레지스터 접근 시 volatile 선언 및 Memory Barrier(Fence) 적용 여부 확인 - Linker Script를 통한 섹션 분리로 스택과 데이터 영역 간의 간섭 차단 구조 설계