디바이스 드라이버
디바이스 드라이버를 모듈로 커널에 등록할 수 있다는 것은 매우 편리한 방법입니다. 만일 커널에 고정으로 실행되어야 한다면 프로그램을 수정할 때 마다 시스템을 재 부팅해야 될 것입니다. 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 를 기억해 두시면 좋을 것으로 생각됩니다.
태그: *디바이스드라이버