저는 드라이버 개발을 처음 접했고 사용자 프로세스가 char 드라이버가 마지막으로 읽은 시간 (timespec)을 얻을 수있는 ioctl을 가진 간단한 char 드라이버를 작성하려고합니다. 쓰다. - Linux Char 드라이버 : ioctl 호출을 차단합니다.
long charmem_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) {
struct charmem_dev *dev = filp->private_data;
if (down_interruptible(&dev->sem)) {
printk(KERN_WARNING "I got booted!!\n");
return -ERESTARTSYS;
}
printk(KERN_WARNING "charmem: in ioctl; cmd = %d, arg = %d\n", (int)cmd, (int)arg);
switch(cmd) {
case IOCTL_GET_LAST_READ_TIME:
printk("charmem_ioctl: returning last read time delta, exiting...\n");
up(&dev->sem);
return dev->last_read_delta.tv_nsec;
break;
case IOCTL_GET_LAST_WRITE_TIME:
printk("charmem_ioctl: returning last write time delta, exiting...\n");
up(&dev->sem);
return dev->last_write_delta.tv_nsec;
break;
case IOCTL_RESET_READ: /*return read-pointer to the start of buffer*/
dev->rp = dev->buffer;
break;
case IOCTL_RESET_WRITE: /*return write-pointer to the start of buffer*/
dev->wp = dev->buffer;
break;
case IOCTL_LOAD_BUFFER_TO_CACHE:
load_buffer_to_cache(dev->buffer, dev->buffer_size);
break;
default:
printk("charmem_ioctl: invalid ioctl command, exiting...\n");
up(&dev->sem);
return -EFAULT;
}
up(&dev->sem);
return 0;
}
struct file_operations charmem_fops = {
.owner = THIS_MODULE,
.llseek = no_llseek,
.read = charmem_read,
.write = charmem_write,
.unlocked_ioctl = charmem_ioctl,
.open = charmem_open,
.release = charmem_release,
};
main.c
내 문자 장치 테스트 사용자 프로그램 :
int fd = 0, ret = 0;
fd = open("/dev/charmem0", O_RDWR);
if (fd < 0) {
printf("/dev/charmem0 unable to access (fd = %d)... EXITING\n", fd);
return -1;
}
ret = write(fd,msg1,10);
ret = read(fd,user_buffer,10);
read_delta = ioctl(fd, IOCTL_GET_LAST_READ_TIME);
printf("read_delta : %d\n ", read_delta);
write_delta = ioctl(fd, IOCTL_GET_LAST_WRITE_TIME);
printf("write_delta : %d\n ", write_delta);
main.c
내 문자 장치를 테스트하는 프로그램입니다; 프로그램은 read_delta
값을 출력 한 후 차단하고, 나는 ioctl을 차단한다고 가정하고있다. 내 코드에서 내가 뭘 잘못하고 있니?
무엇을 (당신이 뭔가 잘못 생각 NB합니다 :.? 당신은 EFAULT를 반환하지해야하지만 ENOTTY에서 –
프로그램을 실행할 때 커널 로그에 무엇이 나타 납니까? 사용자 공간 프로그램이 차단되면/proc//stack이 표시됩니다 (여기서 ""는 차단 된 프로그램의 PID 번호로 바뀝니다). 당신의 ioctl을 사용하는 프로세스)? –
Roland
dmesg에서 무엇을 보았습니까? 블록 할 때 Ctrl-C로 프로그램을 죽일 수 있습니까? – utopiabound