티스토리 뷰

Study/Linux

[Linux] Device node

생각많은 소심남 2016. 5. 3. 00:10


Windows에서는 Device Driver를 일종의 Installer를 통해서 설치하고 등록하는데, Linux에서는 보통 udev(user device) 라는 툴을 사용한다. 이걸 사용하면 Device node가 자동으로 생성되어 application이나 OS 등과 데이터를 주고 받을 수 있게 된다.

 우선 Device Node라는 것은 일종의 contact point? 접점과 같은 것이다.


여기서 노란색으로 표현된게 Character device와 block device인데, 이건 system call이라고 불리는 일종의 Virtual file system 상을 통해 User level의 application과 데이터를 주고 받는데, 참고로 network device는 이런 file system을 거쳐서 나가는게 아니라 packet이라고 하는 일종의 규격을 갖춘 데이터들이 왔다갔다 한다. 

 아무튼 여기서 node라고 표현되어 있는게 다 그 접점을 이야기하는 것이다. 유념할 것은 Node가 kernel level의 device를 추상화한 것이고 그 접점을 표현한 것이지, 이거 자체가 device의 기능을 제어하는게 아니다. 보통 I/O operation 같은 경우는 device driver 내에서 write(), read() 같은 함수들을 구현해놓고 이런 node에 등록해놓는 형식이 되는데, 만약 어떤 프로그램이 해당 노드를 통해서 data를 쓰겠다 싶으면 그때 device driver의 write() 함수가 호출되는 형태를 띈다. 이런식으로 노드는 단순한 접점일 뿐이고, 사용자도 쉽게 이걸 만들수 있다. node를 만들어주는 binary가 mknod라는 것인데 다음 명령어를 치면 node를 만들 수 있다.



이렇게 만들면 되는데 인자를 설명해보면 -m 다음의 인자는 해당 file의 permission을 지정하는 것이고, 생성 위치, 그리고 어떤 형식의 파일을 생성할 것인지를 지정해준다. 보통 형식은 앞에서 잠깐 소개했던 character(c) 혹은 block(b)를 지정해준다. 사실 중요한 내용은 이 다음으로 설명할 뒤의 인자 두개인데 이 인자는 각각 device의 major number와 minor number를 의미한다. 즉 내 명령어를 분석해보면 node를 하나 생성했는데 권한은 666, 즉 rw-rw-rw 를 가지고 /dev/mydev로 생성했고, 이는 character node로 생성했는데, 이는 major number 254에 minor number 1을 가진다고 보면 된다. 이 내용을 살펴보려면 ls -al을 사용해서 해당 파일을 살펴보면 된다.



 그럼 major number와 minor number에서 살펴봐야 되는데, 이 번호의 목적은 딱 하나다. device를 구분하고자 하는 목적이다. 세상에는 수많은 device들이 있고, Linux내에서 이걸 효율적으로 구분하기 위한 목적으로 device 종류마다 특별한 id를 부여했다. 이게 major number인데, 아까 위에서 취했던 명령어들을 다시 전체 directory로 해서 살펴보면  어떤 형식인지 알 수 있다.


우선 ls -al의 결과로 나온 숫자중 첫번째 숫자가 major, 두번째가 minor인데, 보면 각기 다른 번호를 갖고 있기도 한데, 밑에 표시한 loop라고 이름 붙여진 block device는 major number가 7로 잡혀있다. 그런데 생각해보면 이런 device도 여러개 붙어 있을 수 있다. 가령 하드디스크도 두세개 연결해놓은 사람이라면 그 같은 major number내에서도 구분지을 뭔가가 필요할텐데 그게 minor number이다. 즉, 같은 major number 를 가진 device 끼리도 구분짓기 위한 번호라고 보면 되겠다. 이게 같은 종류일수도 있고, 혹은 같은 mode(character 인지, block인지)를 가진 device내에서도 각각을 구분하기 위한 번호인 것이다.

 참고로 앞에서 잠깐 소개했던 mknod()( 사실 이건 system call의 일부다) stat() 같은 함수도 manual을 살펴보면 반환값이 major와 minor number에 대한 정보를 반환하고 있음을 알수 있다.

'Study > Linux' 카테고리의 다른 글

[Linux] ARM gcc-4.7 cross compiler 설치  (0) 2016.05.18
[Linux] Partitioning  (0) 2016.05.17
[Linux] udev (user device)  (0) 2016.05.03
[Linux] Kernel Modules  (0) 2016.04.29
[Linux] FHS를 이루는 폴더들 (2)  (0) 2016.04.27
[Linux] FHS를 이루는 폴더들 (1)  (0) 2016.04.27
[Linux] Filesystem Hierarachy Standard(FHS)  (0) 2016.04.25
댓글