본문 바로가기

Programming/Linux_Kernel

mknod 의 의미


원문 : http://blog.naver.com/venezia99?Redirect=Log&logNo=30010552572


이 명령어는 insmod에서 등록한 디바이스 드라이버는 커널에 등록하는 명령어입니다.

일단 응용 프로그램은 이러한 드라이버를 인식할 수 없습니다. 응용 프로그램은 파일이라는 개념으로 접근하기 때문에 응용 프로그램이 인식할 수 있는 장치 파일로 만들어 주어야 됩니다.  본 명령어가 장치 파일로 만들어 주는 명령어 입니다.

 

 

글쓴이 : 박철 (2003년 01월 12일 오후 02:49) 읽은수: 8,084 [ 임베디드강좌/박철 인쇄용 페이지 ]
지금까지 진행해온 과정은 insmod를 하였을 때 수행되는 과정까지를 정리하였다.

디바이스 드라이버는 결국 사용자에게는 파일로 인식되어야 한다.

이를 위한 전단계 과정이 바로 파일 시스템안에 있는 목적화일(gpio.o)을 메모리에 적재하는 쉘명령어인 insmod gpio.o이며, 또한 insmod gpio.o에 의해서 실행되는 gpio.o안에 있는 init_module()함수 내에서 실행되는 register_chrdev()에 의해서 커널내에 문자장치로 등록이 되는 것이다.

위에서 언급했듯이 위의 과정까지하면 사용자가 접근을 할 수 있는 상태가 되지 않는다. 즉 현재 등록된 문자장치를 위한 파일 하나를 만들어야 한다.
이러한 작업을 하는 것이 바로 mknod라는 쉘명령어이다. mknod를 통해서 파일이 하나 만들어지는데, 이파일의 속성은 장치파일이 되는 것이다.

mknod /dev/GPIO c major minor

위와 같이 쉘에서 명령어를 실행하면 이는 시스템콜에 전달이 되어 커널내에서 mknod와 관련된 함수 즉 sys_mknod를 실행한다.

http://lxr.hybus.net/source/fs/namei.c?a=arm#L1203

kernel내에서 모든 파일과 디렉토리는 dentry라는 구조체를 통해서 관리가 된다.
kernel내는 파일시스템을 인식하기 위한 root directory가 존재한다. 이 루트 디렉토리에 모든 파일과 디렉토리가 설정되어 있어야 커널내에서 데이터에 접근할 수 있는 것이다. 그러므로 파일시스템 또한 루트 디렉토리 밑에 dev라는 디렉토리에 마운트가 되어있기 때문에 dev 디렉토리 밑에 GPIO라는 이름의 파일을 생성해 놓은 것이다.
생성된 파일의 경로는 쉘에서 전달되는 첫번째 인자인 /dev/GPIO에 의해서 결정된다. 즉 루트(/) 밑에 dev 밑에 GPIO라는 파일을 생성하라는 것이다.

또한 커널에서는 GPIO를 위한 dentry밑에 inode구조체를 생성하고 dentry의 d_inode에 연결한다. 그리고 inode의 멤버에 쉘에서 전달받은 인자의 값을 기록한다.

그 중에 첫번째가 i_mode에 장치파일의 값을 기록하며, i_rdev에 쉘의 인자인 major와 minor값을 기록하게 된다. 그리고 장치파일을 운영하기 위핵서 file_operation을 record로 할당하고 open메쏘드를 chrdev로 설정한다.
여기 까지가 mknod의 일반적인 과정이다. 여기까지 정상적으로 실행이 되었을 경우는 사용자는 디바이스 드라이버를 파일로 인식할 수 있기 때문에 어플리케이션 프로그램에서는 파일처럼 취급할 수가 있는 것이다.

다음의 강좌는 파일로 인식되는 디바이스 드라이버를 사용하는 어플리케션에 대한 강좌를 하겠다.
여기서는 쉘에서 어플리케이션을 실행하였을 경우 커널내부에서 어떠한 일들이 일어나는가를 설명할 예정이다.

 

 

[출처] mknod|작성자 타디스