내 질문은 절망적으로 아마추어처럼 보일 것이라고 생각합니다. 그러나 나는 최근에야 Linux를 진지하게 사용하기 시작했으며 이 매우 간단한 질문에 대한 명확한 답을 찾을 수 없습니다. 이 게시물 하단에 몇 가지 추가 질문이 있습니다.
사용자 공간 프로그램에서 (적절한 시스템 호출을 사용하여) 드라이버별 기능 구현을 호출하는 방법을 알고 싶습니다. 올바른 코드 줄을 찾고 있습니다. 드라이버에 할당된 주 장치 번호와 부 장치 번호가 있고 /dev 및 기타 디렉터리에 적절한 파일이 있다고 가정할 수 있습니다. 필요한 코드는 다음과 같습니다.
system_call(major number, minor number, function ID, parameters, more parameters);
참고로 다음은 Madieu의 책(LDD3)에서 그대로 복사한 내 드라이버 init() 코드입니다.
static int __init my_init(void)
{
int i;
dev_t curr_dev;
/*Kernel EEP_NBANK devices*/
alloc_chrdev_region(&dev_num, 0, number_of_lanes, DEVICE_NAME);
/*Create device class*/
driver_class = class_create(THIS_MODULE, DEVICE_CLASS);
/*this loop is sort of overkill, but you could change NUMBER_OF_DEVICES
so I'll use the loop just in case someone meddles with my source*/
for(i=0;i<number_of_lanes;i++){
cdev_init(&driver_cdev[i], &driver_fops);
driver_cdev[i].owner = THIS_MODULE;
curr_dev = MKDEV(MAJOR(dev_num), MINOR(dev_num)+i);
cdev_add(&driver_cdev[i], curr_dev, 1);
device_create( driver_class,
NULL,
curr_dev,
NULL,
DEVICE_NAME "%d",i);
}
return 0;
}
보시다시피, 저는 최소한 해당 책에 따라 프로그램에 액세스하는 데 필요한 4단계를 완료했습니다. 내가 file_Operations 구조, cdev 구조 등을 올바르게 구현했다고 가정할 수 있습니다. 또한 프로토타입이 있는 양식의 읽기 또는 쓰기 기능을 구현했다고 가정할 수도 있습니다.
ssize_t (*write)(struct file *filp, const char __user *buf, size_t count, loff_t *pos)
읽기도 동일하지만 (*쓰기) 대신 (*읽기)를 사용합니다. 그렇다면 *filp(암시적이며 커널이 나에게 적합함), *buf(사용자 공간에서 전달된다고 가정), count(사용자 공간에서 전달된다고 가정) 및 *에 대한 올바른 값을 어떻게 얻을 수 있습니까? *pos(다시 사용자 공간에서 전달한다고 가정합니다), 특정 드라이버에 대해 사용자 공간에서 이러한 함수를 어떻게 호출할 수 있습니까?
질문이 충분히 명확하길 바라지만, 설명이 필요하다면 앞으로 며칠 동안 전염병에 시달릴 것입니다. 감사해요.