第一章2.驱动程序加载及重要的数据结构
驱动开发
连接一个模块到内核
驱动开发
动态加载驱动程序 模块在内核空间运行, 而应用程序在用户空 间运行. 这个概念是操作系统理论的基础. 模块初始化函数的任务是为以后调用模块 的函数做准备. 模块的退出函数( 例子里是 hello_exit )就在 模块被卸载时调用.
驱动开发
在内核中加入驱动程序 把hello.c拷入内核源码的“drivers/char/”目录下. 修改同目录下的“Kconfig”文件,在7 行添加如 下内容:(红色部分所示)menu "Character devices“ config Neusoft_HELLO tristate “Neusoft2410 Hello Driver" depends on ARCH_S3C2410 help Neusoft Neu2410 Hello.
驱动开发
在内核中加入驱动程序 修改同目录下的“Makefile”文件,在12 行添加如下内容:obj-y += mem.o random.o tty_io.o n_tty.o tty_ioctl.o – obj-$(CONFIG_ Neusoft_HELLO) += hello.o – obj-$(CONFIG_LEGACY_PTYS) += pty.o
在linux代码树顶端键入:#make menuconfigDevice Drivers --->Character devices ---> <M> Neusoft2410 Hello Driver
#make SUBDIR=drivers/char/modules
驱动开发
一些重要数据结构 file_operations . file . inode .
驱动开发
文件操作 :file_operation 结构 struct module *owner– 第一个 file_operations 成员根本不是一个操作; 它是一个指向拥有这个结构的模块的指针. 这 个成员用来在它的操作还在被使用时阻止模块 被卸载. 几乎所有时间中, 它被简单初始化为 THIS_MODULE, 一个在 <linux/module.h> 中 定义的宏.
驱动开发
文件操作 :file_operation 结构 loff_t (*llseek) (struct file *, loff_t, int);– llseek 方法用作改变文件中的当前读/写位置, 并且新位置作为(正的)返回值. loff_t 参数是一 个"long offset", 并且就算在 32位平台上也至少 64 位宽. 错误由一个负返回值指示. 如果这个函 数指针是 NULL, seek 调用会以潜在地无法预 知的方式修改 file 结构中的位置计数器( 在"file 结构" 一节中描述).
驱动开发
文件操作 :file_operation 结构 ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);– 用来从设备中获取数据. 在这个位置的一个空 指针导致 read 系统调用以 -EINVAL("Invalid argument") 失败. 一个非负返回值代表了成功 读取的字节数( 返回值是一个 "signed size" 类 型, 常常是目标平台本地的整数类型).
驱动开发
文件操作 :file_operation 结构 ssize_t (*aio_read)(struct kiocb *, char __user *, size_t, loff_t);– 初始化一个异步读 -- 可能在函数返回前不结束 的读操作. 如果这个方法是 NULL, 所有的操作 会由 read 代替进行(同步地).
驱动开发
文件操作 :file_operation 结构 ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);– 发送数据给设备. 如果 NULL, -EINVAL 返回给 调用 write 系统调用的程序. 如果非负, 返回值 代表成功写的字节数.
驱动开发
文件操作 :file_operation 结构 ssize_t (*aio_write)(struct kioc
b *, const char __user *, size_t, loff_t *);– 初始化设备上的一个异步写.
驱动开发
文件操作 :file_operation 结构 unsigned int (*poll) (struct file *, struct poll_table_struct *);– poll 方法是 3 个系统调用的后端: poll, epoll, 和 select, 都用作查询对一个或多个文件描述符的读或写是否会 阻塞. poll 方法应当返回一个位掩码指示是否非阻塞的 读或写是可能的, 并且, 可能地, 提供给内核信息用来使 调用进程睡眠直到 I/O 变为可能. 如果一个驱动的 poll 方法为 NULL, 设备假定为不阻塞地可读可写.
驱动开发
文件操作 :file_operation 结构 int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);– ioctl 系统调用提供了发出设备特定命令的方法 (例如格式化软盘的一个磁道, 这不是读也不是 写). 另外, 几个 ioctl 命令被内核识别而不必引 用 fops 表. 如果设备不提供 ioctl 方法, 对于任 何未事先定义的请求(-ENOTTY, "设备无这样 的 ioctl"), 系统调用返回一个错误.
驱动开发
文件操作 :file_operation 结构 int (*mmap) (struct file *, struct vm_area_struct *);– mmap 用来请求将设备内存映射到进程的地址 空间. 如果这个方法是 NULL, mmap 系统调用 返回 -ENODEV.
驱动开发
文件操作 :file_operation 结构 int (*open) (struct inode *, struct file *);– 尽管这常常是对设备文件进行的第一个操作, 不要求驱动声明一个对应的方法. 如果这个项 是 NULL, 设备打开一直成功, 但是你的驱动不 会得到通知.
驱动开发
文件操作 :file_operation 结构 int (*release) (struct inode *, struct file *);– 在文件结构被释放时引用这个操作. 如同 open, release 可以为 NULL.
…… 此处隐藏:1037字,全部文档内容请下载后查看。喜欢就下载吧 ……相关推荐:
- [外语考试]管理学 第13章 沟通
- [外语考试]07、中高端客户销售流程--分类、筛选讲
- [外语考试]2015-2020年中国高筋饺子粉市场发展现
- [外语考试]“十三五”重点项目-汽车燃油表生产建
- [外语考试]雅培奶粉培乐系列适用年龄及特点
- [外语考试]九三学社入社申请人调查问卷
- [外语考试]等级薪酬体系职等职级表
- [外语考试]货物买卖合同纠纷起诉状(范本一)
- [外语考试]青海省实施消防法办法
- [外语考试]公交车语音自动报站系统的设计第3稿11
- [外语考试]logistic回归模型在ROC分析中的应用
- [外语考试]2017-2021年中国隔膜泵行业发展研究与
- [外语考试]神经内科下半年专科考试及答案
- [外语考试]园林景观设计规范标准
- [外语考试]2018八年级语文下册第一单元4合欢树习
- [外语考试]分布式发电及微网运行控制技术应用
- [外语考试]三人行历史学笔记:中世纪人文主义思想
- [外语考试]2010届高考复习5年高考3年联考精品历史
- [外语考试]挖掘机驾驶员安全生产责任书
- [外语考试]某211高校MBA硕士毕业论文开题报告(范
- 用三层交换机实现大中型企业VLAN方案
- 斯格配套系种猪饲养管理
- 涂层测厚仪厂家直销
- 研究生学校排行榜
- 鄱阳湖湿地景观格局变化及其驱动力分析
- 医学基础知识试题库
- 2010山西省高考历年语文试卷精选考试技
- 脉冲宽度法测量电容
- 谈高职院校ESP教师的角色调整问题
- 低压配电网电力线载波通信相关技术研究
- 余额宝和城市商业银行的转型研究
- 篮球行进间运球教案
- 气候突变的定义和检测方法
- 财经大学基坑开挖应急预案
- 高大支模架培训演示
- 一种改进的稳健自适应波束形成算法
- 2-3-鼎视通核心人员薪酬股权激励管理手
- 我国电阻焊设备和工艺的应用现状与发展
- MTK手机基本功能覆盖测试案例
- 七年级地理教学课件上册第四章第一节




