커널 공간과 사용자 공간
- 사용자 공간: 우리가 프로그래밍하고, 사용하는 공간
- 응용 프로그램: 사용자가 실행하는 소프트웨어입니다.
- 저수준 파일 입출력 함수: 응용 프로그램에서 파일 입출력 작업을 수행하기 위해 사용하는 함수.
- 장치 파일: 장치 드라이버와 상호작용하기 위해 운영체제에서 제공하는 특수 파일.
- 커널 공간:
- 디바이스 드라이버: 하드웨어 장치를 제어하고 응용 프로그램의 요청을 하드웨어 명령으로 변환하는 소프트웨어
- 하드웨어 제어 함수: 디바이스 드라이버가 하드웨어를 직접 제어하기 위해 사용하는 함수.
- 하드웨어: 컴퓨터 시스템의 물리적 장치.
장치파일
하드웨어를 사용하기 위한 디바이스 드라이버와 디바이스 드라이버와 연결하여, 장치를 제어할 장치파일이 존재한다.
/dev 디렉토리 내부에 장치파일이 존재한다.
리눅스에서는 모든 것을 파일로 관리한다. 주변하드웨어 장치를 연결, 제어하는 것도 파일로써 관리한다.
위는 라즈베리파이의 장치파일인데, 보이는 것처럼 /dev 내부에 여러가지 장치파일이 존재하며 몇가지를 설명하면
- ram0, ram1, etc.: 이 파일들은 RAM 디스크 장치를 나타낸다. RAM 디스크는 메모리(RAM)를 이용해 가상의 디스크를 생성하는 장치파일이다.
- tty, tty0, tty1, etc.: 이 파일들은 터미널 인터페이스를 나타낸다. 각각의 tty 장치는 터미널 또는 콘솔 인터페이스와 연결된다.
- stdin, stdout, stderr: 표준 입력, 표준 출력, 표준 오류 출력을 나타내는 장치 파일이다. 예를 들어, stdout은 프로그램의 기본 출력이 나오는 곳이다.
mknod 명령어를 통해 장치파일을 생성할 수 있으며 사용법은 아래와같다.
mknod ([옵션]) [장치명] [타입] ([주번호 부번호])
[타입]에는 "b", "c" 또는 "u"가 설정되며, 블록장치파일 또는 문자장치파일을 생성할때 반드시 주번호와 부번호를 지정하여야한다.
b: 블록 장치
c: 문자 장치
- 주번호 (Major number): 장치 드라이버를 식별하는 번호입니다. 이 번호는 커널이 어떤 장치 드라이버를 사용할지 결정하는 데 사용된다.
- 마이너번호 (Minor number): 동일한 드라이버를 사용하는 여러 장치 중 특정 장치를 식별하는 데 사용된다.
dev/ 맨앞을 보면 각 파일의 종류를 확인가능하다.
- - : 일반 파일
- d : 디렉토리
- b : 블록 장치 파일 (예: 하드 드라이브)
- c : 문자 장치 파일 (예: 터미널, 프린터)
- l : 심볼릭 링크
정리하자면 장치 파일은 사용자나 응용 프로그램이 하드웨어와 상호작용할 수 있는 인터페이스를 제공한다. 이를 통해 사용자는 마치 파일 시스템의 파일을 다루듯이 하드웨어 장치에 접근할 수 있다.
한가지 더 알아둘만한건 udev라는 장치파일관리자이다.
부팅후 모든 장치파일들을 /dev에 mount해준다.
디바이스 드라이버와 모듈
디바이스 드라이버를 커널에 포함시키는 방법은 두가지가있다. 먼저 커널이미지에 이미 적재시켜 부팅시 기본적으로 사용되게 하는방법, 두번째는 모듈로써 만들어서, ismod를 이용해 커널에 적재시키는 방법이다.
모듈로서 사용하면, 개발시에는 디바이스 드라이버를 모듈로서 저장하고, 필요시에 커널에 로드, 언로드 하며 쉽게 쉽게 디버깅할 수 있다.
이게 없으면 전체 커널을 다시 빌드하여 이미지를 만들어서 사용하는 말도 안되는 번거로움이 있을 것이다.
모듈 명령어
insmod [모듈명].ko : 모듈의 커널 적재
rmmod [모듈명] : 커널에 적재된 모듈 제거
lsmod [모듈명] : 커널에 적재된 모듈 확인
ko파일?
모듈 파일은 ko파일로 존재하며, .ko 파일은 리눅스 커널 모듈 파일(Linux Kernel Module File)을 의미한다.
.ko 파일은 C 언어로 작성된 디바이스 드라이버나 커널 모듈 소스 코드를 컴파일한 결과물이다. 이 파일은 바이너리 형식으로, 커널에 직접 로드될 준비가 되어 있다.
ko 파일이 만들어지는 구체적인 과정이 좀 궁금했는데, 먼저 보통 Makefile은
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
위 형식을따른다. 이 의미를 보면
/lib/modules/$(shell uname -r)/build는 현재 커널 버전의 빌드 디렉토리이다. 이 디렉토리에는 커널 소스 코드와 함께 커널 모듈을 빌드하기 위한 설정 파일들이 포함되어 있다.
M=$(PWD):
- M은 커널 모듈을 빌드할 때 사용하는 변수로, 모듈 소스 파일이 위치한 디렉토리를 지정한다.
- 여기선 현재폴더를 지정한다.
modules는 커널 빌드 시스템에서 사용하는 특별한 타겟(target)이다. 이 타겟은 obj-m 변수로 지정된 모든 오브젝트 파일을 모듈로 컴파일한다.
이런과정을 통해 ko파일로 컴파일된다.
이 ko 파일을 모듈로 커널에 insmod 명령어로 적재가 가능하다.
이정도만 일단 정리하겠다.
모듈 작성법이나 디바이스 드라이버 실습은 계속해나갈 예정이다.
'리눅스 > 디바이스 드라이버' 카테고리의 다른 글
[디바이스 드라이버] 5.GPIO 디바이스 드라이버 (0) | 2024.09.23 |
---|---|
[디바이스 드라이버] 4. 장치파일과 디바이스 드라이버 연결하기 (2) | 2024.09.02 |
[디바이스 드라이버] 3. 디바이스 드라이버, 장치 파일의 종류 (1) | 2024.09.02 |
[디바이스 드라이버] 2. 모듈 프로그래밍 (1) | 2024.09.01 |