디바이스 드라이버0 - HW제어 개념 그리기

kenGwon·2024년 2월 22일
0

[Embedded Linux] BSP

목록 보기
23/36

커널을 그대로 동작중이고, 우리가 만든 디바이스 드라이버 모듈만 필요에 의해 적재했다가 내렸다가 반복하면서 동적으로 관리하는 것이 모듈 프로그램 기법이다.

그리고 디바이스 드라이버를 통해 하드웨어를 다양하게 제어할 수 있게 되었다.

리눅스 하드웨어 제어 구조


우리가 사용하는 터미널 환경이 즉 user space이다. 운영체제가 제어하는 부분이 kernel space이다. 두 환경에서 돌아가는 CPU의 동작모드 자체가 다르다.(kernel space에서 작업할 때는 supvised mode로 작동)

그래서 그 두 공간 사이에 통로가 필요하다. 그래서 있는 것이 system call이고 그것은 어셈블리 언어에서 SWI로 구현된다.

우리가 mknod를 통해서 만든 /dev 경로에 만든 디바이스 파일이 위 그림에서 장치 파일에 해당한다.
그리고 우리가 insmod통해서 메모리에 적재한 모듈이 위 그림에서 디바이스 드라이버에 해당한다.

"주번호"는 타겟머신의 장치 "종류"를 구분하기 위한 것이고, "부번호"는 타겟머신의 같은 종류의 장치에서 "채널"을 구분하기 위한 것이다.(cf. 하드디스크 파티션의 경우 부번호로 구분된다.)

디바이스 드라이버를 등록할 때, 주번호, 이름, file_operation 구조체 포인터가 필요하다.

디바이스 드라이버를 커널에 포함하는 방법

디바이스파일은 재부팅하면 사라진다.
루트파일시스템에 디바이스 파일을 미리 작성해놓고 제품에 적재하면 매번 mknod를 해주는 수고를 덜 수 있겠다.

그래서 결과적으로 디바이스 드라이버를 커널에 포함하는 방법은 두가지이다. 첫번째는 애초에 커널을 빌드할 때 zImage안에 넣어서 빌드하는 방법이다. 두번째는 지금처럼 모듈형식으로 넣는 방식이다.

임베디드 시스템에서 제품을 출시할 때는 첫번째 방식으로 빌트인하여 디바이스 드라이버를 적재하여 배포하고, 개발할 때는 두번째 방식으로 모듈형식으로 올렸다 내렸다 하면서 개발한다. 이것이 임베디드 시스템에서 디바이스 드라이버를 개발&배포 하는 일반적인 방법이다.

(참고로 디바이스 파일은 일반파일이 아닌 특수파일이기 때문에 ls -l에해서 나오는 사이즈는 큰 의미가 없다.)






profile
스펀지맨

0개의 댓글