장치 등록 시 장치 파일이 생성되지 않는 이유는 무엇입니까?

장치 등록 시 장치 파일이 생성되지 않는 이유는 무엇입니까?

저는 현재 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;
}

관련 정보