2011-11-24 3 views
9

register_chrdev_region(dev_t from, unsigned count, const char * name);을 사용하는 커널 모듈 등록에 대해 배우고 있습니다.리눅스 디바이스 드라이버의 register_chrdev_region()에 관한 질문들

이 기능의 유무에 관계없이 커널 모듈이 예상대로 작동한다는 것을 알았습니다. 나는 시험에 사용되는 코드 :

first = MKDEV(MAJOR_NUM, MINOR_NUM); 
register_chrdev_region(first, count, DEVICE_NAME);//<---with and without 

mycdev=cdev_alloc(); 
mycdev->ops= &fops; 
mycdev->owner = THIS_MODULE; 

if (cdev_add(mycdev,first, count) == 0) 
{printk(KERN_ALERT "driver loaded\n");} 

I 라인 register_chrdev_region(first, count, DEVICE_NAME);에서 주석하고 printk 메시지가 여전히 나타났다. 나는 사용자 공간에서 이것의 유무에 관계없이 드라이버와 의사 소통을 시도했고, 둘 다 성공했다.

제 질문은,이 기능은 register_chrdev_region()입니다. 다른 사람에게 "주요 번호를 사용하고 있습니다. 사용하지 마세요"라고 말하면서 좋은 드라이버를 만들 수 있습니다.

커널 소스 char_dev.c에서이 기능을 이해하려고했으나 익숙하지 않은 사람이 누구인지 이해하기가 어렵습니다.

감사합니다.

답변

8

실제로는 이 아니기 때문에 작동합니다. 기기 번호를 앞에 할당해야합니다. 실제로 많은 커널 개발자가 동적 (즉석에서 필요에 따라) 할당 기능 alloc_chrdev_region을 사용하는 것이 좋습니다.

정면 또는 동적으로 필요에 따라 입니다. 규칙에 따라 재생했을 수도있는 다른 장치 드라이버와의 충돌을 피하기 위해 수행해야하는 번호가 할당되어 있습니다. 비록 당신의 운전자가 그것 없이도 완벽하게 작동한다고 할지라도 그것은 모든 기계에서나 미래의 어느 시점에서나 반드시 사실 일 수는 없습니다.

규칙은 이유가 있으며, 특히 저급 항목의 경우 규칙을 준수해야합니다.

설정 과정에 대한 자세한 내용은 here을 참조하십시오.

1

장치의 주 번호가 이미 사용중인 다른 장치와 충돌하면 드라이버에 할당이 완료되지 않습니다.

이미 사용 가능한 메이저 번호를 테스트하여 사용했다면 일반적으로 오류가 발생하지 않으며 드라이버를로드 할 때 아무런 문제가 없습니다.

그러나 다양한 시스템에서 실행되고 주요 시스템 번호가 이미 캡처되어 다른 시스템에서 사용되고있는 경우 드라이버로드가 실패 할 수 있습니다.

항상 동적 할당을 사용하는 것이 더 좋습니다!

관련 문제