디바이스 드라이버를 모듈로 커널에 등록할 수 있다는 것은 매우 편리한 방법입니다. 만일 커널에 고정으로 실행되어야 한다면 프로그램을 수정할 때 마다 시스템을 재 부팅해야 될 것입니다. MS 윈도즈에서 작업 표시줄에 등록되는 프로그램을 작성해 보았는데 정말 짜증나더군요. 뭐 좀 수정해서 확인하려면 윈도즈에서 등록 정보를 삭제하고 재부팅한 후 다시 등록해서 확인해야 하기 때문이죠.

말씀이 옆 길로 세려고 합니다. 여하튼 디바이스 드라이버를 커널 안에서 실행되는, 마치 부품처럼 모듈만들어 진다는 것은 편하고 다행스러운 일입니다. 또한 디버깅이 어느 정도 끝났고 상품으로서 손색이 없다면 커널 소스에 디바이스 드라이버 소스를 포함해서 새로 컴파일을 해서 커널과 한 몸으로 사용할 수도 있습니다.

모듈관련 명령어

이전 시간에는 디바이스 드라이버를 만들면 insmod 명령어로 커널에 등록해야 된다고 말씀드렸습니다. Insert Module로 기억하시면 쉽게 기억하실 수 있습니다. 이번 시간에는 이외의 모듈 관련 명령어를 알아 보겠습니다.

  • insmod : 커널에 모듈을 등록
  • rmmod : 커널에 등록된 모듈을 제거
  • lsmod : 커널에 등록된 모듈의 목록 출력
  • depmod : 모듈간의 의존성 정보를 생성
  • modprobe : 모듈을 커널에 등록하거나 제거

depmod 와 modprobe는 저도 별로 사용해 보질 못해서 자세히 말씀을 못 드립니다만, 다음 언제고 자세하게 설명을 드리도록 하겠습니다.

디바이스 드라이버 파일 찾기

저는 처음 학습했을 때에는 디바이스 드라이버는 모두 모듈로 제공되는 줄로만 알았습니다. 그래서 lsmod 명령을 이용하면 모든 디바이스 드라이버를 볼 수 있을 줄 알았습니다. 그래서 해 보았죠. 모듈 명령은 모두 root 계정에서 실행할 수 있습니다.

]$ su -
Password: 
[root@jwCentOS ~]# lsmod
Module                  Size  Used by
nfsd                  214529  17 
exportfs               10177  1 nfsd
lockd                  65769  2 nfsd
nfs_acl                 7745  1 nfsd
md5                     8129  1 
ipv6                  242657  14 
parport_pc             28033  1 
lp                     15661  0 
parport                38025  2 parport_pc,lp
autofs4                23109  0 
i2c_dev                14529  0 
i2c_core               26049  1 i2c_dev
sunrpc                144037  12 nfsd,lockd,nfs_acl
dm_mirror              31901  0 
dm_mod                 60741  1 dm_mirror
button                 10705  0 
battery                12997  0 
ac                      8901  0 
tulip                  47073  0 
floppy                 58193  0 
ext3                  119113  3 
jbd                    59609  1 ext3

그런데, 도통 시리얼 포트와 관련된 디바이스 드라이버를 찾을 수 없었습니다. 이번에는 EZ-X5 보드와 연결해서 확인해 보았는데, 임베디드 보드는 더하더군요.

Welcome to FALinux EZ-X5 ( www.falinux.com )
XScale(PXA255) Linux
ez-x5 login: root
[root@ez-x5 /root]$ lsmod
Module                  Size  Used by    Not tainted
[root@ez-x5 /root]$ 

출력되는 것이 하나도 없습니다. 그런데 어떻게 콘솔을 운영하고 시리얼 통신을 하고 네트워크를 구성하는지 이해할 수가 없었습니다. 그러나 이쪽저쪽 다리품을 팔아 보니 디바이스 드라이버를 반드시 모듈로 작성하지 않는다는 것을 알았습니다. 즉, 이미 자주 사용되고 범용성이 있는 디바이스 드라이버나 소스를 공개해도 관계없는 디바이스 드라이버는 커널 소스와 함께 컴파일되서 아예 커널과 한 몸으로 실행된다는 것이죠.

그러므로 커널 부팅 후에 따로 insmod 로 모듈로 등록되지 않으므로 당연히 lsmod 에 출력되지 않는 것입니다.

대신에 /proc 디렉토리의 내용을 확인하시면 정확한 정보를 보실 수 있습니다. 참고로 /proc 디렉토리는 하드디스크와 같은 실제 물리적인 파일 시스템이 아니라 리눅스에서 제공하는 가상의 디렉토리로 시스템을 정보를 파일 형식으로 보여주는 디렉토리입니다.

]# cat /proc/devices
Character devices:
  1 mem
  4 /dev/vc/0
  4 tty
  4 ttyS
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  6 lp
  7 vcs
 10 misc
 13 input
 29 fb
 36 netlink
 89 i2c
128 ptm
136 pts
162 raw
180 usb

Block devices:
  1 ramdisk
  2 fd
  3 ide0
  9 md
 22 ide1
253 device-mapper
254 mdp
[root@jwCentOS ~]#

드디어 제가 찾던 시리얼 포트에 대한 디바이 드라이버 정보를 /proc/devices 내용에서 찾을 수 있었습니다. 디바이스 드라이버 목록과 함께 주 장치 번호도 출력되므로 /proc/devices 를 기억해 두시면 좋을 것으로 생각됩니다.

태그: *디바이스드라이버