自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

子木

专注

  • 博客(33)
  • 收藏
  • 关注

原创 linux内核内存管理slab

linux内存管理核心是伙伴系统,slab,slub,slob是基于伙伴系统之上提供api,用于内核内存分配释放管理,适用于小内存(小于1页)分配与释放,当然大于1页,也是可以的.小于一页的,我们也可以直接用伙伴系统api申请内存和释放,但伙伴系统最小单位是页,如果我们只需要100byte,伙伴系统申请内存最小1页(一般情况1页是4k, 具体看系统PAGE_SHIFT定义),显然就很浪费。

2023-05-30 21:05:13 1494

原创 linux内核内存管理slub

linux内存管理核心是伙伴系统,slab,slub,slob是基于伙伴系统之上提供api,用于内核内存分配释放管理,适用于小内存(小于1页)分配与释放,当然大于1页,也是可以的.小于一页的,我们也可以直接用伙伴系统api申请内存和释放,但伙伴系统最小单位是页,如果我们只需要100byte,伙伴系统申请内存最小1页(一般情况1页是4k, 具体看系统PAGE_SHIFT定义),显然就很浪费.。

2023-02-06 00:40:07 739 2

原创 Linux驱动之platform_bus、platform_device、platform_driver

概述:在Linux驱动里面platform通常叫做platform bus,直译过来就是平台总线,实际上,是软件里面虚拟出来的总线,俗称虚拟总线。虚拟总线有什么作用呢?以及怎么用linux虚拟总线子框架?这就是本文要阐述的两个问题。Platform Bus的作用简单来说,有以下三个作用:加载平台资源信息,即将reg(控制器,寄存器地址,memery地址)、interrupts(中断)信...

2019-01-20 17:27:02 2057

原创 linux驱动调用(运行/执行)应用程序

概述:linux驱动程序调用(运行/执行)应用程序,即驱动调用用户空间的应用程序。本文主要是从系统API的使用角度讲述。API声明的位置:声明在include/linux/kmod.h里面,相应函数实现在kernel/kmod.c里面。函数call_usermodehelper()使用:函数call_usermodehelper()声明如下:extern int

2018-01-24 23:29:32 6927

原创 linux kthread_worker与kthread_work

简述kthread_worker就像是一个工作者(员工,工人),kthread_work就像是需要工作者去完成的工作。将需要完成的工作打包成kthread_work,然后交给kthread_worker去完成。1、kthread_worker,kthread_work结构体类型,以及后面出现的API,都声明在include/linux/kthread.h中,如下:struct

2018-01-17 23:35:09 1988

原创 Linux driver之input framework

摘要:input frameworkinput_dev与handler匹配input_dev注册handler之evdev总结input frameworkframework一般有两个目的:一方面向开发者提供统一的接口(API);另一方面是向实现功能的模块提供接口,将功能挂接框架里。最终实现通过API来使用系统功能。linux input驱动框架原理:input以input_dev

2017-08-19 10:53:09 631

原创 ubuntu下看设备温度

第一步:安装 apt-get install lm-sensors hddtemp第二步:运行命令sensors-detect配置lm-sensors sensors-detect 一直回车或输入YES,直到结束第三步:运行sensors命令,就可以看到CPU温度了第四步:运行如下命令可以看到硬盘温度 hddtemp /dev/sda hddtemp /dev/sdb第五步:创建脚本,内

2017-07-30 11:12:02 2999

原创 linux驱动-线程

简述linux驱动模块中可以用kernel_thread(),kthread_create()/kthread_run()两种方式创建内核线程,另外还可以用第三方库(如pthread,除此之外还有其他的第三方库),在驱动模块中创建线程(pthread也可以用在用户空间)一、kernel_thread kernel_thread()声明在include/linux/sched.h里面:

2017-03-05 14:32:30 4532 2

原创 linux驱动-I2C

linux I2C的架构linux I2C是bus里面的一种总线,I2C总线,也可以说是I2C子系统。它的架构图(个人理解,从代码的角度看组织结构图,即架构),示意图如下: 从图中,可以看出linux i2c subsystem主要以三个结构体i2c_adpater,i2c_client,i2c_driver为核心,其中i2c_adpater与cpu i2c控制器关联起来,i2c_dri

2017-02-23 11:10:27 1324

原创 MIPI-DSI

概述:MIPI包含很多通信协议,本章只讲述mipi用于显示接口的dsi(显示串行接口)。MIPI-DSI协议分层:MIPI-DSI分四层:应用层,协议层,通道管理层,物理层。如下图: MIPI-DSI物理层(D-PHY):1、物理层功能将通道管理层并行数据转换成串行数据发送,将接收到的串行数据转换成并行数据,传输给通道管理层。2、物理信号信号两种工作状态,高速模式状态(LP)和低速模式状态(HS

2017-02-21 12:33:13 12589 2

原创 UART

掌握uart协议重点是对下面几点的理解:1、uart是异步串行通信。2、一般有4根线VDD,GND,TXD,RXD。3、电气特性有两种 (1)RS-232电平标准,逻辑电平规定,3V到15V范围表示0,-3V到-15V表示1(2)TTL电平标准,逻辑电平规定,大于2.4V的表示1,小于0.4V的为0。(TTL电平)4、空闲位:处于逻辑“1”状态,表示当前线路上没有数据传送。(空闲为高电平

2017-02-19 11:25:22 572

原创 SPI

对SPI协议的掌握,重点有下面几点: 1、SPI是同步通信的理解 2、SPI的4线全双工通信理解。4线分别是:(1)SDI – 主设备数据输入,从设备数据输出;(2)SDO – 主设备数据输出,从设备数据输入;(3)SCLK – 时钟信号,由主设备产生;(4)CS – 从设备使能信号,由主设备控制。另外还有种表示SDI和SDO的: M:代表主机;S代表从设备;O代表输出;I代表输入

2017-02-18 12:18:56 1872

原创 I2C

对I2C协议的掌握最重要的是理解: 起始条件; 停止条件; 数据有效性; ACK(应答响应); 字节格式(字节位单位传输,并且先高位后低位传输); 寻找。另外,需要了解的是: 标准模式速率:0~100kbit/s 快速(F/S )模式速率:最大可达到400kbit/s 高速模式(Hs):最大可达到3.4Mbit/sI2C网上资料很多,参考下面资料完整可以理解: I2C总线 I2

2017-02-17 13:41:23 2686

原创 linux驱动-内核中的数据类型

本文将按照以下几点描述:基本数据类型 字节序数据对齐指针检查链表基本数类型: 先看下面基本数据类型占用空间情况: 可以看出各体系CPU有差异,而使用u8,u16,u32,u64没有差异。 因此,我们在定义基本数据类型时,要比较清楚一个类型站有几个字节,尽量养成用内核定义的,类似u32这种符号。当然,sizeof()给定一个变量,就可以返回占用空间字节数。在使用类似u32…的只需要保

2017-02-15 10:43:26 5940

原创 linux驱动-时间

简述:linux驱动模块,一般用jiffies、延时、时钟周期、定时器来控制时间。本文将按照以下几点来描述:HZjiffies短延时低分辨率内核定时器高精度内核定时器HZHZ是宏,定义在include/asm-generic/param.h中:# define HZ CONFIG_HZ /* Internal kernel timer frequency */CONFIG_H

2017-02-14 10:24:36 1003

原创 linux驱动-中断

Linux中断简述:实现一个linux中断,需要经过申请注册中断处理函数(安装中断),然后分别实现linux中断的前半部分和后半部分。前半部分,就是申请注册的中断处理函数(中断服务程序);中断后半部分,就是中断服务函数结束后,接着处理中断还没处理完的部分。前半部分是必须的,后部分不是必须的。前半部分,处理的任务要快时间短,后半部分是处理更多数据更多耗时的任务。纲要:本文将按照下面几...

2017-02-13 13:10:02 2411

原创 linux驱动-映射进程空间

简述:内核映射进程空,就是由进程分配好空间(属于进程独占资源)后,将用户空间虚拟地址,传递到内核,然后内核映射成内核虚拟地址直接访问,此时内核访问的物理空间是位于用户空间。这样的好处是,不再是内核将处理好的数据放在内核空间,然后再copy到用户空间。接口:接口要包含的头文件:#include <linux/mm.h>函数接口:long get_user_pages(struct task_s

2017-02-12 10:11:44 2273

原创 linux驱动-I/O

简述:I/O是CPU和外部设备通信一种方式。linux将I/O分成两种,一种是I/O端口,另一种是I/O内存。I/O端口:I/O端口,是指对外部设备的访问,不能通过寻址方式访问,是一种特殊的,依赖CPU体系结构,操作I/O端口,是需要用CPU体系实现的接口。 linux对I/O的端口,一般是要经过分配,然后操作端口(即读写端口):1、I/O端口分配(1)包含头文件#include <linu

2017-02-11 20:31:35 745

原创 linux驱动-DMA

DMA概述:DMA就是与高速总线直接通信。一般外设,都是通过低速总线与CPU通信。DMA映射,就是通过一些设置后,外设部设备可以通过高速总线与CPU通信。具体来说,RAM是通过高速总线与CPU通信,只要建立起外部设备能够存取RAM空间,CPU是能直接存取RAM,这样就外部设备和CPU之间通过RAM建立了通信,这就是映射过程。DMA数据传输概况:DMA数据传输两种情况:软件请

2017-02-09 22:51:47 4016

原创 linux驱动-内存分配

linux地址类型:先看图解: linux地址空间主要分两类:虚拟地址和物理地址。 图中假设虚拟地址和物理地址都是从0x00000000到0xFFFFFFFF(这里只是为了好理解,实际要根据具体情况配置)。当然物理地址要根据实际硬件,但虚拟地址不变,32位处理器4G寻址空间,0xC0000000(宏CONFIG_PAGE_OFFSET定义,)是内核空间和用户空间分界点。内核空间和用户空间占比

2017-02-08 16:00:44 1761

原创 linux驱动模块访问权限的控制

简述: 在驱动模块,可以对没有权限的进程和应用程序拒绝访问,有权限的才允许访问。权限控制接口:bool capable(int cap);定义头文件:#include <linux/capability.h>用法例子:if (! capable (CAP_SYS_ADMIN)) return -EPERM;capable()没有权限时返回0,有权限时返回1。 在file_opertion

2017-02-08 11:28:11 3348

原创 linux驱动访问文件

简述: 使用filp_open()和struct file可以在驱动模块中访问其他文件。定义的头文件:#include <linux/fs.h>例子:#include <linux/fs.h>#include <asm/uaccess.h>static char buf[100];static int __init dopen(){ mm_segment_t old_fs;

2017-02-08 11:06:07 1865

原创 linux驱动-file_operations之mmap

简述: linux内存空间分为用户空间和内核空间,应用程序是不能直接访问内核空间的数据。 mmap就是建立内核空间映射到用户空间虚拟地址上,之后,应用程序直接访问映射后虚拟地址,实际是在访问内核空间。应用程序mmap的系统调用: mmap声明的头文件:#include <sys/mman.h>如是ubuntu系统,可以在/usr/include/sys目录下查看 应用程序mmap声明:voi

2017-02-07 15:06:07 4123

原创 linux驱动-file_operations之ioctl

简述: ioctl是linux应用程序用来向设备发送特殊命令。如果,设备要响应应用程序的ioctl调用,那么设备驱动必须编写响应ioctl的接口,这个接口就是file_operations的unlocked_ioctl。应用程序ioctl接口:声明头文件:#include <sys/ioctl.h>如是ubuntu系统,可以在/usr/include/sys/下面查看。 定义ioctl命令需要包

2017-02-07 11:10:21 3308

原创 linux驱动---file_operations之poll

简述: file_operations的poll是驱动提供给应用程序探测设备文件是否有数据可读接口。应用程序探测文件的接口: select,poll,epoll三个接口都是应用程序探测设备文件是否有数据可读的接口,没有数据进程阻塞,有数据时唤醒。select和poll差不多,epoll是select、poll的增强版,性能上会更好。select头文件:#include <sys/select.h

2017-02-06 20:37:59 5617

原创 linux驱动---file_operations异步读写aio_read、aio_write

简述: file_operations中read,write是同步读写,异步读写用接口是aio_read、aio_wirte(在4.5版本中发现已经把名字改成read_iter、write_iter)。异步读写对应的系统调用API:int aio_read(struct aiocb *__aiocbp);int aio_write(struct aiocb *__aiocbp);定义在头文件中(

2017-02-06 13:49:42 10884 1

原创 linux驱动---file_operations之llseek

简述: file_operations中llseek是用于定位设备文件位置。 lseek,sys_lseek(在include/unistd.h,如果是在宿主机上,ubuntu所在路径/usr/include/unistd.h)这两个系统调用会,会调用到file_operations中的llseek.file_operations结构体定义:这是Linux内核3.10版本 定义

2017-02-06 10:41:24 2149

原创 linux驱动---等待队列、工作队列、Tasklets

概述: 等待队列、工作队列、Tasklet都是linux驱动很重要的API,下面主要从用法上来讲述如何使用API.应用场景:等待队列(waitqueue) linux驱动中,阻塞一般就是用等待队列来实现,将进程停止在此处并睡眠下,直到条件满足时,才可通过此处,继续运行。当然在睡眠等待期间,是不定期来检查条件。工作队列(workqueue) 工作队列,将一个work提交

2017-02-03 23:30:43 4130 1

原创 Linux驱动--并发和竞争

概述: 并发和竞争,对于驱动来说,就是对临界区资源的保护。在面对多核CPU,很多进程同时运行,同时访问公共设备和数据,要保证这么多进程有序进行访问。以下,将主要从用法上归纳总结linux驱动对并发和竞争处理提供的接口。接口类别:旗标(semaphore 也可以说信号量)Completions机制自旋锁(spinlock)顺序锁(seqlock)原子变量(atomic)原子位操作(

2017-02-02 12:32:04 1335

原创 uboot启动流程和架构

概述: 本文将从两个方面来阐述uboot: 1、启动流程 2、架构一、uboot流程图: 从上图中看到红色1,2,3,4,5,7,8,9的标号,下面分别说明每个过程: 1、启动入口:(1)确定链接脚本文件:在根目录下Makefile下LDSCRIPT宏值,就是指定链接脚本(如:arch/arm/cpu/u-boot.lsds)路径的(2)从脚本文件找入口

2017-02-01 15:52:04 6598

原创 linux驱动之字符设备

本文以归纳总结性来概述linux字符设备一、编写字符设备驱动涉及的头文件: #include <linux/types.h> #include <linux/kdev_t.h> #include <linux/cdev.h> #include <linux/fs.h>另外也算是扩展:#include <linux/kernel.h>#include <asm/uaccess.h>#in

2017-01-15 16:04:11 867

原创 Linux之pinctrl subsystem

概述:在各个平台(cpu厂商)上,都会用很多pin用于和外设通讯,同一个pin也会有多种功能,如同一个pin具有gpio,spi,uart,I2C等功能,这些功能会根据需求切换,以及在不同功能下都会上下拉,驱动能力,电压域的配置。linux为管理这些pin,就设计出了pinctrl subsystem来解决这类问题。当然,也可以不用pinctrl来管理,平台厂商如果不用,就会自己设计接口来管理,这种

2016-11-20 23:11:26 1870

原创 linux之early_param()和__setup

原理:在linux启动时,调用在init/main.c里面的start_kernel()时,执行到parse_early_param()时,uboot传递的cmdline里面有相应的命令,就会调用early_param()和__setup注册的函数。可以在驱动模块的任何c文件里面用early_param(),__setup()注册,只需要包含include/linux/init.h头文件

2016-08-27 11:14:33 4275

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除