QNX RTOS: 7-1. Hardware I/O
2025. 12. 26. 13:59ㆍ운영체제/QNX
Hardware I/O 개요 정리 (QNX)
1) 기본 개념: 왜 매핑(mapping)이 필요한가?
- 프로세스는 항상 가상 주소 공간(virtual address space) 에서 실행됨
- 하드웨어 장치(device)는 물리 주소(physical address) 를 가짐
- 따라서 물리 주소 → 가상 주소로 매핑 해야 접근 가능
- 이 매핑을 위해 mmap() 사용

2) 디바이스 메모리 접근 (Memory-mapped I/O)
2.1 mmap을 이용한 디바이스 메모리 매핑
예: 비디오 프레임버퍼, 장치 레지스터 등
필요 요소:
- size: 매핑할 메모리 크기
- protection bits:
- PROT_READ
- PROT_WRITE
- cache 설정:
- 캐시 활성/비활성 여부
- flags:
- MAP_PHYS
- MAP_SHARED
- file descriptor:
- NOFD (파일 기반 아님)
- offset:
- 디바이스 물리 메모리 시작 주소
결과:
- mmap() → 가상 주소 포인터 반환
- 이후 해당 포인터로 장치 메모리에 접근
3) DMA (Direct Memory Access)용 메모리
3.1 DMA 메모리 특징
- 물리적으로 연속된(contiguous) 메모리 필요
- 일반적인 가상 메모리는 연속 보장 ❌
3.2 DMA용 mmap 설정
- mmap() 사용
- flags:
- MAP_PHYS
- MAP_ANON (익명 메모리)
- offset: 0
- procnto(process manager)가
→ 물리 연속 메모리 할당
4) 가상 주소 → 물리 주소 변환
mem_offset()
DMA 컨트롤러에 물리 주소 전달 시 필요
- 입력:
- 가상 주소 포인터
- 메모리 길이
- 출력:
- 해당 가상 주소에 대응되는 물리 주소
5) 하드웨어 제어 레지스터 접근
5.1 AArch64 (ARM64) 플랫폼
- 레지스터가 메모리처럼 매핑됨
- 접근 방식:
-
volatile uint32_t *reg; *reg = value;
- volatile 사용 이유
- 컴파일러 최적화 방지
- 실제 하드웨어 접근 보장
6) procnto는 하드웨어 정보를 어떻게 아는가?
- 부팅 시 startup code가 하드웨어 정보 수집
- 해당 정보는 system page에 저장
- procnto는 system page를 통해
- RAM vs Device 메모리 구분
- 캐시 정책
- 접근 권한 설정
7) x86 I/O Port 방식 (레거시 방식)
7.1 x86 I/O Port 특징
- 일부 x86 장치는:
- 메모리 맵 I/O ❌
- I/O Port 주소 공간 사용
- 별도의 주소 라인 + 전용 어셈블리 명령 사용
7.2 QNX의 지원 방식
- QNX는 I/O Port 접근용 wrapper 함수 제공
- 헤더 파일:
-
<hw/inout.h>
8) I/O Port 접근을 위한 권한 설정
ThreadCtl()
- I/O 포트 접근 전 스레드에 I/O 권한 부여 필요
- ThreadCtl() 사용
9) I/O Port 읽기 / 쓰기 함수
읽기 (input)
- in8()
- in16()
- in32()
쓰기 (output)
- out8()
- out16()
- out32()
10) 전체 흐름 요약 (한 줄 정리)
QNX에서 하드웨어 I/O는 mmap을 이용한 물리 메모리 매핑, DMA용 물리 연속 메모리 할당, volatile 기반 레지스터 접근, 그리고 필요 시 I/O Port + ThreadCtl 권한 설정을 통해 수행된다.
'운영체제 > QNX' 카테고리의 다른 글
| QNX RTOS: 7-3. Handling Interrupts (0) | 2025.12.26 |
|---|---|
| QNX RTOS: 7-2. Programming PCI Bus Devices (0) | 2025.12.26 |
| QNX RTOS: 6-2. IPC 선택 기준 (0) | 2025.12.15 |
| QNX RTOS: 6-1. IPC Methods (0) | 2025.12.15 |
| QNX RTOS: 5-10. Shared Memory (0) | 2025.12.15 |