Linux驱动调试中关于ioctl的问题

1、提示:错误: 初始值设定项里有未知的字段‘ioctl’

2.6以后的内核中file_operation结构体已经删除了ioctl函数,取代的是:
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);

 1 struct file_operations {
 2     struct module *owner;
 3     loff_t (*llseek) (struct file *, loff_t, int);
 4     ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
 5     ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
 6     ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
 7     ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
 8     int (*readdir) (struct file *, void *, filldir_t);
 9     unsigned int (*poll) (struct file *, struct poll_table_struct *);
10     long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
11     long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
12     int (*mmap) (struct file *, struct vm_area_struct *);
13     int (*open) (struct inode *, struct file *);
14     int (*flush) (struct file *, fl_owner_t id);
15     int (*release) (struct inode *, struct file *);
16     int (*fsync) (struct file *, loff_t, loff_t, int datasync);
17     int (*aio_fsync) (struct kiocb *, int datasync);
18     int (*fasync) (int, struct file *, int);
19     int (*lock) (struct file *, int, struct file_lock *);
20     ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
21     unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
22     int (*check_flags)(int);
23     int (*flock) (struct file *, int, struct file_lock *);
24     ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
25     ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
26     int (*setlease)(struct file *, long, struct file_lock **);
27     long (*fallocate)(struct file *file, int mode, loff_t offset,
28               loff_t len);
29     int (*show_fdinfo)(struct seq_file *m, struct file *f);
30 };

linux3.10 file_operations

 1 struct file_operations {
 2     struct module *owner;
 3     loff_t (*llseek) (struct file *, loff_t, int);
 4     ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
 5     ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
 6     ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
 7     ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
 8     int (*readdir) (struct file *, void *, filldir_t);
 9     unsigned int (*poll) (struct file *, struct poll_table_struct *);
10     int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
11     long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
12     long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
13     int (*mmap) (struct file *, struct vm_area_struct *);
14     int (*open) (struct inode *, struct file *);
15     int (*flush) (struct file *, fl_owner_t id);
16     int (*release) (struct inode *, struct file *);
17     int (*fsync) (struct file *, struct dentry *, int datasync);
18     int (*aio_fsync) (struct kiocb *, int datasync);
19     int (*fasync) (int, struct file *, int);
20     int (*lock) (struct file *, int, struct file_lock *);
21     ssize_t (*sendfile) (struct file *, loff_t *, size_t, read_actor_t, void *);
22     ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
23     unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
24     int (*check_flags)(int);
25     int (*dir_notify)(struct file *filp, unsigned long arg);
26     int (*flock) (struct file *, int, struct file_lock *);
27     ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
28     ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
29 };

linux2.6.22 file_operation

在file_operation 赋值处修改:
.unlocked_ioctl = xxx_ioctl

此处需注意ioctl与unlocked_ioctl函数原型的差异,否则会造成传入的cmd改变。

2、调试用到的Makefile

 1 #KEVERS = $(shell uname -r)
 2
 3 #kernel path 配置过的
 4 KEVERS := /home/liupf/work/linux-3.10.x
 5 INCS := -I$(KEVERS)
 6 #Kernel modules
 7 obj-m += memdev.o
 8
 9 #EXTRA_CFAGS=-g -O0
10
11 kernel_modules:
12     make -C $(KEVERS) M=$(CURDIR) modules
13
14 test:
15     #arm-linux-gcc -O2 test_can.c -o test_can
16     #Ubuntu kernel is 3.13  $(INCS)
17     arm-none-linux-gnueabi-gcc  app-ioctl.c -o ioctl.out
18 clean:
19     make -C $(KEVERS) M=$(CURDIR) clean

Makefile

3、调试用的脚本

1 #install.sh
2 rm -f /dev/memdev0
3 rmmod memdev.ko
4 insmod memdev.ko
5 mknod /dev/memdev0 c 251 0

install.sh

网上找的版本,待修改,不能直接用

 1 #!/bin/sh
 2 # install_mod.sh
 3 module="memdev"
 4 device="memdev"
 5 mode="664"
 6
 7 # Group: since distributions do it differently, look for wheel or use staff
 8 if grep ‘^staff:‘ /etc/group > /dev/null; then
 9     group="staff"
10 else
11     group="kong"
12 fi
13
14 # remove stale nodes
15 rm -f /dev/${device}?
16
17 # invoke insmod with all arguments we got
18 # and use a pathname, as newer modutils don‘t look in . by default
19 /sbin/insmod -f ./$module.ko $* || exit 1
20
21 major=`cat /proc/devices | awk "\\$2==\"$module\" {print \\$1}"`
22
23 mknod /dev/${device}0 c $major 0
24 mknod /dev/${device}1 c $major 1
25 ln -sf ${device}0  /dev/${device}
26
27 # give appropriate group/permissions
28 chgrp $group /dev/${device}[0-1]
29 chmod $mode  /dev/${device}[0-1]

install_mod.sh

 1 #!/bin/sh
 2 # uninstall_mod.sh
 3 module="memdev"
 4 device="memdev"
 5
 6 # invoke rmmod with all arguments we got
 7 /sbin/rmmod $module $* || exit 1
 8
 9 # Remove stale nodes
10 rm -f /dev/${device}0

uninstall_mod.sh

linux驱动简单实例:

https://blog.csdn.net/yangjin_unique/article/details/8217104

原文地址:https://www.cnblogs.com/mofei004/p/8967662.html

时间: 2024-10-12 06:07:18

Linux驱动调试中关于ioctl的问题的相关文章

浅析Linux驱动模型中的底层数据结构kobject和kset

1.kobject Linux内核用kobject来表示一个内核对象.它和Sysfs文件系统联系密切,在内核中注册到系统中的每个kobject对象在sysfs文件系统中对对应着一个文件目录.kobject数据结构通常的用法是嵌入到其对他的数据结构中(即容器,比如cdev结构),用于实现内核对该类数据结构对象的管理.这些数据结构(容器)通过kobject连接起来,形成了一个树状结构. 它在源码中的定义为: /*<include/linux/kobject.h>*/ struct kobject

linux驱动调试--段错误之oops信息分析

linux驱动调试--段错误之oops信息分析 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29401328&id=4923447 1. 分析coredump打印信息 2. 确定发生错误的函数 看发生错误的地方的函数和pc PC is at segment_test_open+0x14/0x1c [segdrv] 看pc值: pc : [<7f000014>]    lr : [<800d958c>

linux驱动调试技术

 对于驱动程序设计来说,核心问题之一就是如何完成调试.当前常用的驱动调试技术可分为: ? 打印调试(printk) ? 调试器调试(kgdb) ? 查询调试 1.合理使用printk #ifdef PDEBUG #define PLOG(fmt,args...) printk(KERN_DEBUG "scull:"fmt,##args) #else #define PLOG(fmt,args...) /*do nothing */ #endif Makefile作如下修改: DEB

Linux驱动设备中的并发控制

一.基本概念 二.中断屏蔽 三.原子操作 四.自旋锁 五.信号量 六.互斥体 七.自旋锁与信号量的比较 Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态,即使是经验丰富的驱动工程师也常常设计出包含并发问题的bug驱动程序. Linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景. 一.基本概念 并发(concurrency):指的是多个执行单元同时.并行被执行,而并发的执行单元对共享资源(硬件资源和软件资源上的全局变量.静态变量等)的访问则很

linux驱动学习(1)——字符设备驱动开发

(一)驱动程序介绍 (a)Linux驱动程序学习 知识结构: 1. Linux驱动程序设计模式(40%) 2. 内核相关知识(30%) 3. 硬件相关知识(30%) (b)驱动分类: ①字符设备: 字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常实现 open, close,read和 write 系统调用. ②块设备: 在大部分的 Unix 系统, 块设备不能按字节处理数据,只能一次传送一个或多个长度是512字节( 或一个更大的 2 次幂的数 )的整块数据,而Lin

第六章——使用实例来理解Linux驱动开发及心得

在这一章中主要介绍了一个Linux驱动程序,以实战的方式向我们介绍了一个Linux驱动程序的例子. Linux驱动的工作和访问方式是Linux的亮点之一,同时受到了业界的广泛好评. Linux系统 将每一个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都保存在/dev目录中.这种 设计理念使得与Linux驱动进行交互就像与普通文件进行交互一样容易.当然,也比访问LinuxAPI 更容易. 由于大多数Linux驱动都有与其对应的设备文件, 因此与Linux驱动交换数据就变成了与 设备文件交

Linux内核调试的方式以及工具集锦

CSDN GitHub Linux内核调试的方式以及工具集锦 LDD-LinuxDeviceDrivers/study/debug 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作 因本人技术水平和知识面有限, 内容如有纰漏或者需要修正的地方, 欢迎大家指正, 也欢迎大家提供一些其他好的调试工具以供收录, 鄙人在此谢谢啦 "调试难度本来就是写代码的两倍. 因此, 如果你写代码的时候聪明用尽, 根据定义, 你就没有能耐去调试它了.&qu

【转】 i2c驱动调试经验

原文网址:http://blog.csdn.net/cmm20071020/article/details/7179958 把一个i2c驱动从2.6.21升级到2.6.39 上网查到一篇帖子,讲了驱动分为i2c总线,i2c设备,总线驱动做实际的总线读写操作,设备驱动实现针对不同设备操作.先找一篇帖子看看整体架构,再看代码,理解效果不错,这招是跟老猫学的. 又查到一篇帖子,讲了从老版本i2c驱动,升级到新版本,需要做哪些变更,是翻译的内核文档. 照做,但是i2c设备驱动的probe函数调不起来,这

嵌入式Linux驱动案例之一

前几天解决一个嵌入式Linux驱动问题,做为一个案例进行记录. 本案例是一个CPU通过LocalBus总线访问外围一个设备,具体设备是一个DSP器件,在实际应用中,性能要求很高,对数据访问速度提出比较高的要求.既然是通过LocalBus总线来访问,实际上也就是在CPU的IO寻址空间.原来的做法是通过ioremap的方式将这个空间进行重映射,然后CPU对其进行读写访问.读取DSP的一个数据需要经过写地址,读数据两个步骤. 现象描述: 发现无论如何,在写完地址之后一定要等待一段时间,或者一定要先读取