<<linux device driver,third edition>> Chapter 3:Char Drivers
The Internal Representation of Device Numbers
Within the kernel,the dev_t type(defined in linux/types.h ) is used to hold device numbers---both the major and minor parts.
it should,instead,make use of a set of macros found in linux/kdev_t.h.To obtain the major or minor parts of a dev_t,use:
MAJOR(dev_t dev);
MINOR(dev_t dev);
If,instead,you have the major and minor numbers and need to turn them into a dev_t,use:
MKDEV(int major,int minor);
Allocating and Freeing Device Numbers
one of the first things your driver will need to do when setting up a char device is to obtain one or more device numbers to work with.
declared in linux/fs.h:
//static alloc device number
int register_chrdev_region(dev_t first,unsigned int count,char *name);
//dynamic alloc
int alloc_chrdev_region(dev_t *dev,unsigned int firstminor,unsigned int count,char *name);
//free device number
void unregister_chrdev_region(dev_t first,unsigned int count);
Some Important Data Structures
File Operations
Each open file(represented internally by a file structrue)is associated with its own set of functions(by including a field called f_op that points to a file_operations structure)
We can consider the file to be an "object" and the functions operating on it to be its "method"(object-oriented programming)
The file Structure
The file structure represents an open file.
The inode Structure
The inode structure is used by the kernel internally to represent files.
There can be numerous file structures representing multiple open descriptors on a single file,but all point to a single inode structure.
Char Device Registration
Before the kernel invokes your device's operations,you must allocate and register one or more of type struct cdev(linux/cdev.h).
There are two ways of allocating and initializing one of these structures.
struct cdev *my_cdev = cdev_alloc();
my_cdev->ops = &my_fops;
//or
void cdev_init(struct cdev *cdev,struct file_operations *fops);
int cdev_add(struct cdev *dev,dev_t num,unsigned int count);
void cdev_del(struct cdev *dev);
The open Method
int (*open)(struct inode * inode,struct file *filp);
The release Method
int (*release)(struct inode * inode,struct file *filp);
read and write
prototype:
ssize_t read(struct file *filp,char __user *buf,size_t count,loff_t *offp);
ssize_t write(struct file *filp,const char __user *buf,size_t count,loff_t *offp);
copy a whole segment of data to or from the user address space.(linux/uaccess.h)
unsigned long copy_to_user(void __user *to,const void *from,unsigned long count);
unsigned long copy_from_user(void *to,const void __user * from,unsigend long count);
<<linux device driver,third edition>> Chapter 3:Char Drivers的更多相关文章
- <<linux device driver,third edition>> Chapter 4:Debugging Techniques
Debugging by Printing printk lets you classify messages accoring to their severity by associating di ...
- <<linux device driver,third edition>> Chapter 2: Building and Running Modules
Kernel Modules Versus Applications Kernel modules programming is similar to event driven programming ...
- linux device driver —— 环形缓冲区的实现
还是没有接触到怎么控制硬件,但是在书里看到了一个挺巧妙的环形缓冲区实现. 此环形缓冲区实际为一个大小为bufsize的一维数组,有一个rp的读指针,一个wp的写指针. 在数据满时写进程会等待读进程读取 ...
- Linux Device Driver 学习(1)
Linux Device Driver 学习(1) 一.搭建虚拟机开发环境 1.选择虚拟机VirtualBox,官网下载.deb包安装: VirtualBox Linux 5.1.6 下载fedora ...
- how to write your first linux device driver
how to write your first linux device driver 0. environment-ubuntu 1804 64bit 1. apt-get install linu ...
- Linux Device Driver && Device File
catalog . 设备驱动程序简介 . I/O体系结构 . 访问设备 . 与文件系统关联 . 字符设备操作 . 块设备操作 . 资源分配 . 总线系统 1. 设备驱动程序简介 设备驱动程序是内核的关 ...
- How to learn linux device driver
To learn device driver development, like any other new knowledge, the bestapproach for me is to lear ...
- Linux Device Driver 3th 中的一些坑
linux设备驱动第三版由于年代比较久远,有很多东西已过时.开一贴记录自己发现的一些问题. 4.3.1.4. seq_file接口 此节最后提到用 struct proc_dir_entry* cre ...
- linux device driver —— 字符设备
现在对linux设备驱动还没有什么认识,跟着书上敲了一个字符驱动,这里把代码贴一下. 测试环境是 Ubuntu 16.04 64bit 驱动程序: #include <linux/fs.h> ...
随机推荐
- mysql远程连接 Host * is not allowed to connect to this MySQL server(第一次配置好lnmp环境)
1.第一次在linux上搭建好mysql,本机windows远程链接报错Host * is not allowed to connect to this MySQL server 2.原因:mysql ...
- Archlinux/Manjaro使用笔记-使用makepkg安装软件 报错:未找到strip分割所需的二进制文件 的解决方法
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 使用archlinux或manjaro安装aurman时遇到如下报错 错误:未找到strip分割所需的二进制文件 原因:未安装g ...
- 【读书笔记】iOS-设置应用的硬件需求
如果你的应用需要一些特定的硬件设备才能运行,你可以在应用的Info.plist文件中添加应用运行所需的硬件列表.如果设备上没有这些硬件的话,你的应用将不会启动. 如图,找到Info.Plist---& ...
- WebGIS中利用AGS JS+eCharts实现一些数据展示的探索
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 eCharts提供了迁徙图.热点图.夜视图等跟地图能够很好的 ...
- OSPF协议总结
总结: 1.ospf协议报文不会泛洪扩散,而是逐级路由器处理后,再从所有ospf启用端口发送出去,也就是说,只能从邻居接收到ospf报文,报文的源ip是邻居的ip地址,目的ip是组播ip. 2.开启o ...
- PullToRefreshGridView上拉刷新,下拉加载
PullToRefreshGridView上拉刷新,下拉加载 布局: <?xml version="1.0" encoding="utf-8"?> ...
- 使用spark DStream的foreachRDD时要注意哪些坑?
答案: 两个坑, 性能坑和线程坑 DStream是抽象类,它把连续的数据流拆成很多的小RDD数据块, 这叫做“微批次”, spark的流式处理, 都是“微批次处理”. DStream内部实现上有批次处 ...
- excel中如何隐藏列和取消隐藏列
https://jingyan.baidu.com/article/148a192191dc9a4d71c3b11c.html excel如何隐藏列 1 先看下原表格是怎么样的. 2 隐藏列方法一:首 ...
- redhat5 安装mysql 5.6
在官网找到下载链接 http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-5.6.19-1.rhel5.x86_64.rpm-bundle.tar wg ...
- docker修改容器gogs时区时间
问题描述: 公司内部搭建了一个gogs-git,是用docker部署的,但是发现提交的代码什么的时间跟服务器时间不一致 提交上去的世界是UTC时间不是中国的时间CST,相当于慢了8个小时 1.dock ...