저는 현재 Linux 장치 드라이버에 대해 배우고 있는데 Linux에서 장치가 인스턴스화되는 방식에 대해 근본적인 오해를 갖고 있는 것 같습니다.
Linux 모듈에서는 alloc_chrdev_region()
커널에 장치 등록을 호출할 수 있습니다. 구체적으로 이 기능은
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor,
unsigned int count, char *name);
장치 번호(주/부)를 생성하고 장치 이름을 허용합니다.
성공적으로 실행되면 /proc/devices
주요 장치 번호와 장치 유형 이름이 포함된 항목이 생성됩니다. 하지만 대신 장치 파일을 생성하려면 /dev
호출해야 합니다 .mknod
그래서 내 질문은: 왜?
커널에 등록할 장치 유형 이름과 장치 수를 이미 지정했기 때문에 이는 불필요한 것 같습니다. 장치 파일이 자동으로 생성되지 않는 이유는 무엇입니까?
답변1
alloc_chrdev_region()
장치 노드/파일이 생성되지 않습니다. alloc_chrdev_region()
일련의 문자 장치 번호를 커널에 요청하면 커널은 사용 가능한 메이저 번호를 동적으로 선택하여 첫 번째 마이너 번호와 함께 반환합니다.
장치 파일을 자동으로 생성하려면 를 사용해야 합니다 device_create()
. 장치 노드는 일반적으로 클래스와 연결되므로 device_create()
장치 클래스를 생성해야 합니다 .class_create()
보고 있다시로칸 고양이커널 소스 트리의 드라이버는 alloc_chrdev_region()
동일한 드라이버 내에서 사용되고 사용됩니다.device_create()
이것도 간단한 예입니다. 이 코드는 완전한 코드가 아닙니다.
#define DRIVER_NAME "mydriver"
#define DRIVER_CLASS "mydriverclass"
static struct cdev my_device;
static struct file_operations fops = {
.owner = THIS_MODULE,
.open = driver_open,
.release = driver_close,
.read = driver_read,
.write = driver_write
};
static int __init ModuleInit(void) {
/* Allocate a device number */
alloc_chrdev_region(&my_device_nr, 0, 1, DRIVER_NAME)
/* Create device class */
my_class = class_create(THIS_MODULE, DRIVER_CLASS))
/* create device file */
device_create(my_class, NULL, my_device_nr, NULL, DRIVER_NAME)
/* Initialize device file */
cdev_init(&my_device, &fops);
/* Regisering device to kernel */
dev_add(&my_device, my_device_nr, 1)
return 0;
}