Linux ioctl, 디바이스를 제어하는 전용 채널
·
Dev/Linux
`read()`/`write()`로는 데이터를 주고받을 수 있지만, "이 센서의 샘플링 레이트를 변경해줘" 같은 제어 명령은 어떻게 전달할까요?그 답이 `ioctl`입니다.1. ioctl이 왜 필요한가?Linux에서 디바이스와 통신하는 기본 방법은 `read()`와 `write()`입니다.그런데 이 두 가지로 표현하기 어려운 명령들이 있습니다."샘플링 레이트를 1000Hz로 설정해줘""현재 온도를 읽어줘""버퍼를 초기화해줘""카운터 값을 99로 교환하고 기존 값을 돌려줘"이런 디바이스 고유의 제어 명령을 전달하는 시스템 콜이 `ioctl`(Input/Output Control)입니다./* 유저스페이스에서 호출하는 방식 */int ioctl(int fd, unsigned long request, void ..
Linux/proc 파일시스템, 커널과 대화하기
·
Dev/Linux
`cat /proc/cpuinfo`,`cat /proc/meminfo` - 써본 적 있으신가요?이 파일들은 디스크에 없습니다. 커널이 즉석에서 만들어냅니다. 오늘은 그 원리를 직접 구현해 봅니다. 1. /proc 파일시스템이란?터미널에서 이런 명령을 써본 적 있을 겁니다.$ cat /proc/cpuinfo # CPU 정보$ cat /proc/meminfo # 메모리 사용량$ cat /proc/uptime # 부팅 후 경과 시간 이 파일들은 실제로 디스크에 존재하지 않습니다. `/proc`은 가상 파일 시스템(virtual File System)입니다.커널이 메모리 위에 만들어 놓은 인터페이스로, `cat`으로 읽으면 커널 함수가 호출되어 데이터를 즉석에서 생성합니다. 디스크..
Linux Kernel Module Parameters
·
Dev/Linux
1. Module Parameter가 왜 필요한가요?이전 글에서 만든 Hello 모듈은 동작이 고정되어 있었습니다.인사 횟수를 바꾸거나 이름을 바꾸려면 코드를 수정하고 다시 빌드해야 했죠. 실제 드라이버에서는 이런 상황이 자주 생깁니다.GPIO 핀 번호를 하드코딩하지 않고 로드 시 지정하고 싶다.디버그 로그를 켜고 끄고 싶다디바이스 개수나 버퍼 크기를 유연하게 조정하고 싶다이럴 때 Module Parameter를 씁니다.# 파라미터 없이 로드 - 기본값 사용sudo insmode params.ko# 파라미터 지정해서 로드sudo insmode params.ko count=3 name="Hoon" debug=1코드 수정 없이 동작을 바꿀 수 있습니다.2. module_param() 기본 문법module_p..
Linux Kernel Module 개발 입문 - Hello World 부터 시작하기
·
Dev/Linux
1. 커널 모듈이란?Linux 커널은 하나의 거대한 프로그램입니다. 그런데 모든 드라이버를 커널에 정적으로 포함시키면 커널 크기가 엄청나게 커지고, 새 드라이버를 추가할 때마다 커널을 다시 컴파일해야 합니다.이 문제를 해결하는 것이 Kernel Module(커널 모듈) 입니다.커널 모듈 = 실행 중인 커널에 동적으로 추가하거나 제거할 수 있는 코드 조각USB를 꽂으면 드라이버가 자동으로 로드되고, 뽑으면 언로드되는 것이 바로 커널 모듈 덕분입니다.Linux 커널 (실행 중)┌─────────────────────────────────────┐│ Core Kernel ││ ┌──────────┐ ┌──────────┐ ││ │ Module A │ │..