linxu驱动基础
文章平均质量分 50
奔跑的小刺猬
欲速则不达
展开
-
copy_to_user和copy_form_user函数分析
学习驱动比较常用的两个函数,copy_to_user和copy_form_user。 因为传参都是传的地址,单因为内核空间不能直接访问用户空间的内存,所以内核空间要使用用户空间参数。必须进行地址转换。而这连个函数就是负责把对应用空间进程的内存和内核空间的内存地址转换。 首先我们先分析copy_to_usercopy_to_user函数的作用是把内核空间的参数拷贝拷贝到用户空间,...原创 2018-07-21 14:46:19 · 2930 阅读 · 0 评论 -
内核的likely和unlikely
1. 概念指令周期是指执行一条指令所需要的时间,一般由若干个机器周期组成,是从取指令、分析指令到指令执行完所需的全部。预取指令具体方法就是在不命中时,当数据从主存储器中取出送往CPU的同时,把主存储器相邻几个单元中的数据(称为一个数据块)都取出来送入Cache中。预取指令可以更好的利用 cpu资源。简单说就是从内存取指令很慢, cpu要等待这个过程。如果能提前预测可能执行的指令,就提前从内...原创 2018-09-30 23:45:39 · 1363 阅读 · 0 评论 -
ioremap函数分析
开始之前,先说一下ioremap的作用,ioremap主要是把寄存器做映射。为什么要映射?内核空间只能访问虚拟地址的3~4G的地址空间,通常3~4G的空间一部分是映射物理内存,通常默认不会映射寄存器,如果想要访问某个寄存器,则需要把这个寄存的虚拟地址映射到高端内存上。这样内核空间才能直接访问。 下面这篇文章,对3~4G的内核空间和io映射分析的比较好,值得好好看一下。ht...原创 2018-09-03 21:30:03 · 7709 阅读 · 0 评论 -
linux驱动注册之倒影式错误处理机制
C语言没有错误处理机制,所以一旦程序某个部分出错,需要退出的时候,就需要先把之前分配的资源先释放掉再退出。而释放的过程是很有讲究的。一般我们遵循先申请的资源后释放,后申请的资源先释放的原则。和栈比较像。举个例子struct _c_tag{ int *c;};struct _b_tag{ int b; struct _c_tag *c;};struct ...原创 2018-06-30 18:44:45 · 751 阅读 · 0 评论 -
浅析Linux内核同步机制(转)
原文地址:https://blog.csdn.net/fzubbsc/article/details/37736683?utm_source=tuicool&utm_medium=referral 很早之前就接触过同步这个概念了,但是一直都很模糊,没有深入地学习了解过,近期有时间了,就花时间研习了一下《linux内核标准教程》和《深入linux设备驱动程序内核机制》这两本书的相关章节。...转载 2018-07-30 23:50:19 · 3130 阅读 · 0 评论 -
内核同步机制-信号量(semaphore)
Linux的信号量是一种睡眠锁,这个不同于自旋锁.如果有一个任务试图获得一个已经被占用的信号量时,信号量会将其推进一个等待队列,然后让其睡眠,此时处理器能重获自由,而去执行其他代码.当持有信号量的进程将信号量释放后,处于等待队列中的那个进程会被唤醒,并获得该信号量. 信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;只能在进程上下文中使用,因为中断上下文中是不能被调度的;另外当...原创 2018-07-01 23:16:28 · 831 阅读 · 0 评论 -
srtruct input_event学习
srtruct input_event结构体是linux输入子系统的向应用层传递的接口。在一个输入设备中,每发生一次输入事件,srtruct input_event就会被填充。/* * The event structure itself */struct input_event { struct timeval time; /* 表示输入时的时间 */ __u16 ty...原创 2018-07-22 19:49:17 · 2357 阅读 · 0 评论 -
平台总线之platform_get_drvdata(_dev)宏分析
#define platform_get_drvdata(_dev) dev_get_drvdata(&(_dev)->dev)void *dev_get_drvdata(const struct device *dev){ if (dev && dev->p) return dev->p->driver_data; return N...原创 2018-06-27 21:59:14 · 2820 阅读 · 0 评论 -
字符设备驱动学习之cdev_init和cdev_alloc
刚开始学习字符设备驱动,看到内核中有的代码使用cdev_alloc函数申请了内存后使用了cdev_init函数初始化,有的则是直接对结构体变量ops赋值。分别人如下////////////////////////////////////////////我是分割线//////////////////////////////////////////////为了了解为什么可以不使用cde...原创 2018-06-17 22:29:37 · 3002 阅读 · 0 评论 -
字符设备驱动学习之老接口和新街口
老接口是直接使用register_chrdev函数来进行字符设备号的申请和驱动注册。新的接口则要先使用register_chrdev_region/alloc_chrdev_region分配设备号再使用cdev_alloc申请内存存放字符设备信息最后通过cdev_add把申请到的存放字符设备信息的指针放到全局存放所有字符设备信息的一个表中注:使用cdev_init和使用cd...原创 2018-06-18 14:22:04 · 1024 阅读 · 0 评论 -
Linux 的timer学习和使用
在linux中如果想周期性的干一些事情,或在固定某个时间干一件事情,可以使用内核定时器来完成。比如:按键扫描等 。 下面先看内核定时器的数据组成。struct timer_list { /* * All fields that change during normal runtime grouped to the * same cacheline */ struc...原创 2018-07-25 20:55:04 · 11874 阅读 · 0 评论 -
device_create和device_add区别
在学习linux驱动的时候经常遇到device_create和device_add两个函数,因为这两个函数都是属于驱动底层的,所以平时很少关注。但最近准备写一个简单驱动框架练手,所以到底用那个来创建出相应的设备,所以准备学习一下这两个的区别,并做好记录。 1.首先看一下device_create函数,注释写的很清楚,创建一个设备,并注册它到sysfs中。提供了强大的格式化注册接口。...原创 2018-07-28 12:04:34 · 8140 阅读 · 0 评论 -
设备树学习(二十五、番外篇-中断子系统之workqueue[1])
本文参考蜗窝大神的中断系列教程http://www.wowotech.net/irq_subsystem/workqueue.html一、前言在许多情况下,需要异步流程执行上下文,而workqueue(wq)API是此类情况最常用的机制。当需要这样的异步执行上下文时,描述要执行哪个函数的工作项放在队列中。 独立线程用作异步执行上下文。 该队列称为workqueue,该线程称为work...原创 2019-03-11 19:57:05 · 709 阅读 · 0 评论