`
bcyy
  • 浏览: 1816608 次
文章分类
社区版块
存档分类
最新评论

【内核&驱动】字符设备驱动程序【3】

 
阅读更多
open和release
open方法
提供给驱动程序以初始化的能力,open方法应完成以下工作
检查设备特定的错误
如果设备是首次打开,则对其进行初始化工作
如有必要,更新f_op组件
分配并填写置于filp->private_data里的数据结构


  1. int (*open)(struct inode *inode, struct file *filep);


inode: 在其i_cdev字段中包含了我们想要的信息
file: 文件指针

我们指向得到包含某cdev结构体的scull_dev结构体,可以通过以下方法

  1. int (*open)(struct inode *inode, struct file *filep);


  1. struct scull_dev *dev;
  2. dev = container_of(inode->i_cdev, struct scull_dev, cdev);
  3. filp ->private_data = dev;


经过简化的scuall_open

  1. int scuall_open(struct inode *inode, struct file* filp)
  2. {
  3. struct scull_dev *dev;

  4. dev = container_of(inode->i_cdev, struct scull_dev, cdev);
  5. filp->private_data = dev;

  6. if ((filp->f_flags & O_ACCMODE) == O_WRONLY) {
  7. scull_trim(dev);
  8. }
  9. return 0;
  10. }



release方法
任务:
释放由open分配的,保存在file->private_data中的所有内容
在最后一次关闭操作时关闭设备

  1. int scull_release(struct inode *inode, struct file* filp);



scull内存使用

  1. void *kmalloc(size_t size, int flags);

试图分配size个字节大小的内存,其返回值指向该内存的指针,分配失败的时候返回NULL
flags参数用来描述内存的分配方法

  1. void kfree(void *ptr);

释放kmalloc分配的空间

read和write

  1. ssize_t read(struct file *filp, char __user *buff,
  2. size_t count, loff_t *offp);
  3. /*拷贝数据到应用程序空间*/
  4. ssize_t write(struct file *filp, char __user *buff,
  5. size_t count, loff_t *offp);
  6. /*从应用程序空间拷贝数据*/


filp 是文件指针
count 是请求传输数据的长度
buff 是指向用户空间的缓冲区
offp 指明用户在文件中进行存取操作的位置(long offset type)

内核代码不能直接引用buff中的内容:
用户空间的地址可能是无效的;
内存可能不再ram中,造成oops错误
遭到恶意程序打开后门

用户地址空间和内核地址空间数据的交换

  1. unsigned long copy_to_user(void __user *to,
  2. const void *from,
  3. unosigned long count);
  4. /*将数据拷贝到用户空间*/
  5. unsigned long copy_from_user(void *to,
  6. const void __user *from,
  7. unsigned long count);
  8. /*从用户空间将数据考到内核空间*/



read和write发生错误的时候将返回一个负值
如果返回一个大于等于0的值则表示成功和操作的数据的字节数

read方法
调用程序对read的返回值的解释如下
返回值等于count,表示所请求的字节数成功并完全传输
返回值小于count,表示部分数据传输成功,传输的字节数小于请求的字节数
返回值等于0,表示传输达到了文件尾部
返回值小于0,表示发生了错误,错误码在<linux/errno.h>
-EINTR 系统调用被中断
-EFAULT 无效地址
或者现在还没有数据,但以后可能会有,read系统调用会被阻塞
write方法
调用程序对write的返回值的解释如下
返回值等于count,表示所请求的字节数成功并完全传输
返回值小于count,表示部分数据传输成功,传输的字节数小于请求的字节数
返回值等于0,表示什么也没有写入
返回值小于0,表示发生了错误,错误码在<linux/errno.h>
-EINTR 系统调用被中断
-EFAULT 无效地址

readv和writev
处理向量的函数

  1. ssize_t (*readv) (struct file *filp, const struct iovec *lov,
  2. unsigned long count, loof_t *ppos);
  3. /* 将指定数量的数据依次读入每个缓冲区*/
  4. ssize_t (*writev) (struct file *filp, const struct iovec *lov,
  5. unsigned long count, loof_t *ppos);


/* 把各个缓冲区的内容收集起来, 并将它们在第一次写入操作中进行输出 */


  1. struct iovec {
  2. void __user *iov_base;
  3. __kernel_size_t iov_len;
  4. };

分享到:
评论

相关推荐

    深入linux设备驱动程序内核机制

    深入linux设备驱动程序内核机制 pdf深入linux设备驱动程序内核机制深入linux设备驱动程序内核机制深入linux设备驱动程序内核机制深入linux设备驱动程序内核机制深入linux设备驱动程序内核机制深入linux设备驱动程序...

    linux字符设备驱动程序

    “mydriver”的简单字符设备驱动程序,该驱动程序以可加载的模块方式进行编译,这样可以免去重新编译内核的工作。

    深入Linux设备驱动程序内核机制.pdf

    本文深入探讨了Linux设备驱动程序的内核机制,并提供了一个简单的字符设备驱动程序示例。通过源码示例,详细讲解了驱动程序注册与注销、文件操作函数的实现、设备号分配等关键概念和操作方法。 通过学习本文,您将...

    基于Linux字符设备驱动程序的设计与实现

    Linux 设备驱动程序是为特定的硬件提供给用户程序的 一组标准化接口,它隐藏了设备工作的细节。Linux 系统下 驱动程序是运行在内核态的,是和内核连接在一起的程序。 如果运行在用户态的应用程序想控制硬件设备,...

    Linux内核和设备驱动程序实验报告

    Linux内核和设备驱动程序实验报告

    linux字符设备驱动实例

    本例子是一个linux字符设备驱动的最简单的例子,有详细的说明,适合初次接触者。

    Linux内核与设备驱动程序学习资料笔记+源码.zip

    Linux内核与设备驱动程序学习资料笔记+源码.zipLinux内核与设备驱动程序学习资料笔记+源码.zipLinux内核与设备驱动程序学习资料笔记+源码.zipLinux内核与设备驱动程序学习资料笔记+源码.zipLinux内核与设备驱动程序...

    linux字符设备驱动程序学习笔记

    详细介绍了linux字符设备驱动程序,对各个名词做了自己的理解,在学习中的笔记,有错误还请海涵

    linux 字符设备驱动程序 示例代码

    linux字符设备驱动程序,示例代码。 共8个文件。包括内核态的驱动程序和用户态的测试例程。

    字符设备驱动.doc

    字符设备驱动程序开发流程 设备号 字符设备驱动的重要数据结构介绍 字符设备的注册流程 字符设备相关操作 创建设备文件 编写驱动程序程序 主设备号 –前12位 表示与设备文件相关联的驱动程序 确定设备类型 ...

    Linux简单的字符设备驱动程序

    基于linux2.4内核版本的字符设备驱动,适合作为操作系统课程设计。其中包含了测试文件与makefile文件。

    Linux 内核分析与驱动编程

    进程管理与调度 Lecture3:中断处理、系统调用 Lecture4:内核同步 Lecture5:内存管理(1) Lecture6:内存管理(2) Lecture7 :文件系统 Lecture8:内核设备模型、时钟管理、设备I/O、PCI设备驱动程序 ...

    Linux设备驱动程序开发基础(PPT)

    Linux设备驱动程序开发简介 Linux设备驱动程序结构 Linux设备驱动程序加载方式 实验:编写一个字符设备驱动程序(LED或蜂鸣器) 分别用静态编译,模块动态加载方法实现加入内核

    基于linux2.6内核的字符设备驱动程序设计.pdf

    基于linux2.6内核的字符设备驱动程序设计.pdf

    深入Linux设备驱动程序内核机制

    深入Linux设备驱动程序内核机制 知道好的下吧

    linux字符设备驱动

    1)编写一个简单的字符设备驱动程序,该字符设备包括打开、读、写、I/O控制与释放五个基本操作。 2)编写一个测试程序,测试字符设备驱动程序的正确性。 3)要求在实验报告中列出Linux内核的版本与内核加载的过程

    Linux内核与设备驱动程序学习笔记及源码.zip

    Linux内核与设备驱动程序学习笔记及源码.zip Linux内核与设备驱动程序学习笔记及源码.zip Linux内核与设备驱动程序学习笔记及源码.zip Linux内核与设备驱动程序学习笔记及源码.zip Linux内核与设备驱动程序学习笔记...

    精通LINUX设备驱动程序开发

     第5章 字符设备驱动程序   第6章 串行设备驱动程序   第7章 输入设备驱动程序   第8章 I2C协议  第9章 PCMCIA和CF   第10章 PCI   第11章 USB  第12章 视频驱动程序   第13章 音频驱动程序...

    精通Linux设备驱动程序开发

    第5章 字符设备驱动程序 第6章 串行设备驱动程序 第7章 输入设备驱动程序 第8章 I2C协议 第9章 PCMCIA和CF 第10章 PCI 第11章 USB 第12章 视频驱动程序 第13章 音频驱动程序 第14章 块设备驱动程序 第15章...

Global site tag (gtag.js) - Google Analytics