![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux 嵌入式
文章平均质量分 87
Feiffer_Hu
Android wifi framework工程师、单片机工程师、嵌入式初级驱动工程师、BSP_Sensor驱动工程师
展开
-
内存管理 内核内存检测KASAN
一、简介: Kasan 是 Kernel Address Sanitizer 的缩写,它是一个动态检测内存错误的工具,主要功能是检查内存越界访问和使用已释放的内存等问题。KASAN可以检测的内存异常包括:slab-out-of-bounds/user-after-free/stack-out-of-bounds/global-out-of-bounds等。 ...转载 2021-05-12 10:45:07 · 825 阅读 · 0 评论 -
Linux内核KASAN内存检测原理
KASAN实现原理 KASAN实现原理1. 前言KASAN是一个动态检测内存错误的工具。KASAN可以检测全局变量、栈、堆分配的内存发生越界访问等问题。功能比SLUB DEBUG齐全并且支持实时检测。越界访问的严重性和危害性通过我之前的文章(SLUB DEBUG技术)应该有所了解。正是由于SLUB DEBUG缺陷,因此我们需要一种更加强大的检测工具。难道你不想吗?KASAN就是其中一种。KASAN的使用真的很简单。但是我是一个追求刨根问底的人。仅仅止步于使用的层面,我是不愿意的,只有更清楚的了解实现转载 2021-05-12 09:51:40 · 1319 阅读 · 0 评论 -
10.14、驱动开发 -- input子系统
input子系统简介1、 Input驱动程序是linux输入设备的驱动程序,分成游戏杆(joystick)、鼠标(mouse和mice)、事件设备(event)。其中事件驱动程序是目前通用的驱动程序,可支持键盘、鼠标、触摸屏等多种输入设备。2、 输入子系统驱动分成三层3、 input驱动程序的主设备号是13、次设备号的分布如下:a) joystick游戏杆:0~16b) mouse鼠标: 32~62c) mice鼠标: 63d) 事件设备: 64~954、 2.6内核中定义的支持的类型#原创 2020-06-13 17:30:59 · 381 阅读 · 0 评论 -
10.13、驱动开发 -- spi总线
SPI英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如AT91RM9200.SP原创 2020-06-13 17:13:46 · 647 阅读 · 0 评论 -
10.12、驱动开发 -- i2c总线
I2C协议2条双向串行线,一条数据线SDA,一条时钟线SCL。SDA传输数据是大端传输,每次传输8bit,即一字节。支持多主控(multimastering),任何时间点只能有一个主控。总线上每个设备都有自己的一个addr,共7个bit,广播地址全0.系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet。I2C位传输数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit;若SDA发生跳变,则用来表示一个会话的开始或结束(后面讲..原创 2020-06-13 17:02:22 · 405 阅读 · 0 评论 -
10.11、驱动开发 -- platform总线与字符设备
总线: 1:n 设备 驱动分离dts 代码如何识别一个属性,属于驱动还是属于设备中断 --设备驱动对象—驱动如果每个硬件都拥有 一个不同的属性,那么该属性属于 硬件/设备硬件专有的东西,放在 私有数据里面 dev_pri , 设备树如果 所有的硬件,都拥有相同的属性, 那么该属性 属于 驱动驱动拥有的东西, 放在全部变量即可.如果你想 将字符设备 融入 总线, 你需要 区分 字符设备中,那些属于驱动,那么属于设备1.设备号主设备号[] 驱动次设备号 设备2.字符设备对象 设备3.cl原创 2020-06-13 16:39:32 · 953 阅读 · 0 评论 -
10.10、驱动开发 -- platform总线
基本概念平台总线三要素:平台总线、平台设备、平台驱动平台总线原则:先分离,后合并分离:将设备信息封装成 platform_device,将驱动信息封装成 platform_driver,并为各自起名称,然后将 platform_device 中的 struct device 和 platform_driver 中的 struct device_driver 分别注册到设备链表和驱动链表中。int platform_device_register(struct platform_device *p原创 2020-06-13 16:33:06 · 454 阅读 · 1 评论 -
10.9、驱动开发 -- 内存
MMU内存管理单元memory manage unit内存 管理 单元内核/用户看到的都是虚拟地址, 物理RAM使用的是 物理地址.内核中空间分配:1、usrvoid *malloc(int size)当系统无法满足你的请求大小的时候, 进程会在 malloc内部睡眠.当资源满足的时候,进程被唤醒.2、kernelvoid *kmalloc(size_t size,gfp_t flags) flags: GFP_KERNEL: 告诉内核,当前环境可以睡眠, 如果你申请的空间...原创 2020-06-09 22:32:37 · 148 阅读 · 0 评论 -
10.8、驱动开发 -- 系统时钟
时间:绝对时间: 2020.6.9 23:59:59相对时间: 时间计量取决于 参考点 相对时间内核是如何计时:int jiffies; 一开机jiffies=0, 每隔一定的时间jiffies++;一秒钟,jiffies累加多少次呢??? 精确度(不高)x86 1000次/s 每次1ms 1msARM9 100次/s 10ms 10msARM-A53 200-500次/s不同的cpu 一秒钟jiffies累加的次数,是不确定的. 为了统一,内核 定义了 HZ这个宏.HZ 表示, 当...原创 2020-06-09 22:24:40 · 313 阅读 · 0 评论 -
10.7、驱动开发 -- 中断
软件和硬件交互方式:轮询: 软件主动反复的去读取硬件寄存器 效率很低,做很多无用功,浪费CPU资源中断: 硬件主动通知软件,发生了事件!!!硬件创建一个按键中断修改设备树文件:vim arch/arm/boot/dts/exynos4412-fs4412.dts1、添加 key2node{ compatible = "key 2"; interrupt-parent = <&gpx1>; //在gpx1 interrupts = <1 2&g.原创 2020-06-06 17:32:22 · 322 阅读 · 0 评论 -
10.6、驱动开发 -- IO模型、阻塞与非阻塞、同步与异步
IO模型: 一种通信的模型IO, input output 其实就是 ###通信####为了解决#通信#过程中,出现的问题.IO模型: 网络编程阻塞一个运行的进程 去访问资源,发现资源不满足,于是进程 ## 主动睡眠## 等待资源满足,被唤醒.当资源(一般伴随中断)到来的时候, (中断)去唤醒等待的进程.##睡眠###,不消耗定义并初始化一个##等待队列###运行的进程发现资源不满足, 主动将自己挂载到等待队列上去. 然后让内核重新调度.某个执行单元将数据送达, 然后唤醒等待.原创 2020-06-05 18:17:16 · 283 阅读 · 0 评论 -
10.5、驱动开发 -- 内核同步
内核的 同步/并发 /竞态/锁竞态: 多个执行单元,同时访问 同一个资源,会造成 竞争状态.生活中的例子:我们使用锁 来解决 同时访问的问题.在访问之前,加锁 锁可以保护 资源一个时刻,只被一个进程访问访问在访问完之后,解锁计算机中,多个执行单元1.SMP 对称多处理器 说白了,就是 一个cpu有多个核.2. 进程的抢占 一个进程会抢占另一个进程的执行. 单核处理一样出问题3. 中断/中断下半部分 抢占进程.内核中的锁:1、原子变量: i++有三条汇编指令构成,如果多个线程同时执行i+原创 2020-06-05 17:54:13 · 139 阅读 · 0 评论 -
10.4、驱动开发 -- 字符设备
一、基本概念linux系统,一切皆文件,字符设备就是实现一切皆文件,用户可以通过访问文件的方式,来访问硬件/内核。驱动:硬件 = 1:n 一个驱动程序,可以管理很多硬件给驱动程序 分配一个主设备号, 给该驱动管理的每个硬件 分配一个次设备号。同一类硬件,使用相同的驱动,所以 拥有相同的主设备号。设备号devno,请求取 主设备major, 次设备号minor:major = devno >> 20;minor = devno<<12>.原创 2020-06-05 17:46:16 · 286 阅读 · 0 评论 -
10.3、驱动开发 -- 内核模块
内核模块如果将驱动程序 融入到内核源码中, 当驱动修改的时候,内核需要重新编译,重新烧写!!!内核模块机制: 允许 驱动程序和操作系统分离. 将驱动程序写入写入模块内部, 模块可以动态的加入内核,或者动态的离开内核. 动态: 操作系统运行的时候. 优点: 大部分功能都喜欢写入模块!!!内核只需要保留最基本的功能,需要某个功能的时候,将他的模块动态的加进来.不需要的删除.模块的编写modules.c文件/*************原创 2020-06-05 17:30:01 · 252 阅读 · 0 评论 -
10.2、驱动开发 -- 一切皆文件
一切皆文件:一切硬件都是文件原创 2020-06-05 17:18:37 · 259 阅读 · 0 评论 -
10.1、驱动开发 -- C语言面向对象设计
面向对象的思想对象:凡是占据一定空间的事物,世界是对象之间的交互而进行的.类:不占空间,是 对象的抽象概念对象: 属性[静态] + 动作/方法/函数[动态]面向对象特性封装: 包装,将对象的 属性和方法 打包在一起,形成一个 类class cat { char name[32]; int weight; ........... void maimeng(void); .......原创 2020-06-05 17:15:14 · 598 阅读 · 0 评论 -
9.4、系统移植 -- 文件系统
文件系统:是一种最原始的界面:最初 用户都是操作文件系统来实现自己的功能,包括 放歌 看电影 娱乐因为在linux世界,一切皆文件. linux把所有的硬件都抽象为 对文件的读写 。内容:命令 配置文件 库文件 普通文件目录结构:bin-存放系统命令sbin-存放命令的etc-存放系统配置文件tmp 临时文件var: variable 可变的, 日志lib :库文件mnt : 系统推荐的挂载点usr: 存放你的 代码 ..原创 2020-06-05 16:55:15 · 266 阅读 · 0 评论 -
9.3、系统移植 -- 操作系统
os operation systemUbuntu 完整版os, 在内核的基础上增加 UI office套件 工具集 …板子os 内核[kernel] 没有图形界面kernel uImage [内核的 安装程序] 1.1M—>3.5M 我们的开发基于kernelUbuntu ISO [是完整版os的镜像,就是安装程序] 3.5G内核的源码如何得到源码: 从芯片原创 2020-06-05 16:44:36 · 213 阅读 · 0 评论 -
9.2、系统移植 -- BootLoader
为什么需要bootloader 实现双系统 刷机 配置CPU 升级操作系统 U盘系统bootloader 目的,加载OS 是一类 软件的统称设备: bootloader os fs你可以把bootloader当成 一个 单任务的 单片机程序启动CPU --> 硬件初始化 --> [交互模式] --> 加载OS过程:汇编[开机启动 -->核心硬件初始化(串口 flash RAM原创 2020-06-05 16:34:53 · 366 阅读 · 0 评论 -
9.1、系统移植 -- 基本概念
系统移植 CPMS 最相近的系统,修修改改 使之能够运行新的板子上驱动开发 开发硬件的驱动,让操作系统能够使用该硬件低端嵌入式 遥控器 温湿度传感器 智能小车 — 单任务 无应用 裸数据存储高端嵌入式 路由器 手机 平板 机器人 行车记录仪 监控摄像头 — 多任务 应用 文件c lib就是对系统调用syscall的封装.usr app ->c lib ->syscall - > os - &原创 2020-06-05 16:17:42 · 668 阅读 · 0 评论 -
8.9、ARM接口编程 -- ADC
模拟电路:模拟量数字电路:数字量模拟-》数字 ADCADC 4 CH 位数10bit/12bit参考电压 1.8量程 0-1.8V电位器 - XadcAIN3电压测量ADC配置:ADCCON[16] = 1 12位ADC[15] 只读标志, 1 表示转换完成 0 正在转换[14] = 1 使能ADC[13:6] = 26 预分频值 F=133M 133M/ 26 5M[2] = 0 使能ADC正常工作模式[1] = 0 不使能..原创 2020-06-05 16:02:04 · 387 阅读 · 0 评论 -
8.8、ARM接口编程 -- PWM
PWM 脉宽调制器:方波:占空比:有效电平占整个周期的比值。周期和频率:使用PWM,输出50HZ 波形蜂鸣器 GPD0_0 PWM0F = 100Mhz1、 配置PWM0TCFG0:[7:0] = 预分频寄存器 0-255 0xffTCFG1:[3:0] = 固定分频 1 2 4 8 16 0x4TCON:[4] = 0 不使能死区[3] = 1 使能自动重载[2] = 1 打开输出使能[1] = 1 手动更新 tcmpb tcntb[..原创 2020-06-05 15:57:31 · 338 阅读 · 0 评论 -
8.7、ARM接口编程 -- 看门狗
看门狗当程序异常(死机),可以自动重启。看门狗定时器WTCON 预分频寄存器[15:8] = 0xff 对总线时钟做除法,降低频率[5] =1 启用wdt[4:3] = 3 固定分频[2] = 1 使能中断[0] = 1 使能复位信号WTDAT 重载寄存器 [15:0]WTCNT [15:0] 减法计数寄存器 = 15259WTCLRINT 中断清除寄存器1、定时5S?系统时钟 100M100M/128 / (255+1)计数15原创 2020-06-05 15:53:24 · 435 阅读 · 0 评论 -
8.6、ARM接口编程 -- 中断GIC
irq 中断异常 中断信号线:irq fiq中断源: 中断信号的来源,芯片内部的控制器,芯片外部,外部中断中断控制器:GIC管理这些中断源,中断扩展管理中断的优先级管理中断源,报告中断ID管理中断的响应,屏蔽某些中断记录中断,中断挂起外部中断K2 GPX1_1 按下 0 弹起 1GIC中断源表: 中断源 与 中断ID 和GIC管脚 一一对应1、配置GPIO : GPX1_1 K2GPX1CON [7:4] = 0xf 配置GPX1..原创 2020-06-05 15:47:33 · 803 阅读 · 0 评论 -
8.5、ARM接口编程 -- UART
串口使用1、会看电路图2、分析电路结构//清楚器件和控制器的工作原理3、查芯片手册,操作寄存器uartrx -》 GPA1_0tx -》 GPA1_1 CH2寄存器配置1、配置GPIO控制器:GPA1CON[3:0] = 0x2[7:4] = 0x2[7:0] = 0x22 设置管脚 A1_0 A1_1 为串口工作模式2、串口控制器:ULCON2 0x13820000[6] = 0 正常模式[5:3]= 000 无校验[2] =原创 2020-06-05 15:40:17 · 300 阅读 · 0 评论 -
8.4、ARM接口编程 -- GPIO
接口编程接口编程的环境 交叉编译环境 arm-gcc软件如何控制和驱动硬件(外部设备和外部控制器)1、会看电路图:(1),根据电路图找硬件(2),根据硬件找电路图2、工程文件start.s 启动文件map.lds 链接控制文件main.c C入口文件Makefile 工程文件管理器配置文件4412.h 头文件寄存器:软件和硬件的接口GPIOGPA0CON — 配置寄存器GPA0DAT — 数据寄存器当您将端口配置为输原创 2020-06-05 15:36:15 · 281 阅读 · 0 评论 -
8.3、ARM汇编
.text @代码段开始 汇编符号,编译时不会生成机器码.data @从此处开始,是数据段,程序有读写权限汇编指令 每条指令对应一条机器码ARM指令集: 精简处理器指令集1、长度固定 arm指令 4字节2、大部分指令为单周期执行3、全部都可以条件执行ARM汇编文件编写:1、汇编符号2、指令3、伪指令字节 8bit char半字 2字节 short字 4字节 int双字 8字节 double.原创 2020-06-05 15:31:27 · 432 阅读 · 0 评论 -
8.2、ARM CPU
ARM处理器分类cortex-M 单片机 低端 低功耗 传感器 stm 32cortex-R 实时性要求高的场合。无人机 汽车 实时性操作系统cortex-A 多媒体应用 图形图像采集,高端应用 带操作系统ARMCPU核心结构1、运算器 运算2、控制器3、寄存器 是硬件与软件的接口 CPU留给用户的接口寄存器1、通用寄存器 r0-r122、特殊功能寄存器r13 sp 栈指针寄存器 C语言运行基本条件r14原创 2020-06-05 15:13:30 · 1102 阅读 · 0 评论 -
8.1、ARM体系结构基础知识
嵌入式受控器件内嵌入芯片,运行嵌入式程序,使其功能上更智能化。单片机:嵌入式系统:片上系统 soc 手机 体积,功耗,性能,可靠性,成本;特定的应用场景,对功耗,体积,可靠性、、一些有严格要求的场合;嵌入式系统: 软件和硬件 专用性:计算机系统的分支。家用PC 通用性:芯片架构上的不同X86: 复杂指令集 发热严重:ARM: 精简指令集 结构简单,嵌入式生态系统arm 做方案芯片厂商嵌入式产品消费者使用嵌入式概念:以计算机技术为基础,嵌入到受控器件内原创 2020-06-05 15:04:47 · 345 阅读 · 0 评论 -
7.4、QT发布软件 ---Windows 动态编译 以简易notepad++为例
简易Notepad QT实现的实例代码:设置界面左上角图标setWindowIcon(QIcon(QStringLiteral(":/XXX.jpg")));设置应用程序名称this->setWindowTitle("XXXXXX");下载安装 qt-installer-framework1、打开QT官方下载 http://download.qt.io/official_releases/qt-installer-framework/2、选择一个合适的版本3、 推荐下载 .exe原创 2020-06-05 15:00:42 · 393 阅读 · 0 评论 -
7.3、应用程序编译 :pro 文件 == Makefile
使用命令行工具跳转到工作路径 跳转盘 盘符:回车 F: (回车键)qmake -project生成工程文件添加使用的QT的库例如:使用到QLabel 添加 QT += core gui widgetsqmake -makefile根据修改后的 .pro 文件,生成Makefile文件指定编译工具+make 编译执行...原创 2020-06-05 14:42:12 · 773 阅读 · 0 评论 -
7.2、事件、信号、槽
事件:事件(event)是由系统或者Qt本身在不同时刻发出的。当用户按下鼠标、敲下键盘,或者其它情况时候都会发出一个相应的事件。一些事件在对用户操作做出相应时发出,如键盘事件等;另外一些则是由系统自动发出,如计时事件等。Qt程序需要在main()函数创建一个QApplication对象,然后调用它的exec()函数。这个函数就是开始Qt的事件循环。在执行exec()函数之后,程序将进入事件循环来监听应用程序的事件,当事件发生时,Qt将创建一个事件对象。Qt中所有事件类都继承自QEvent。在事件对象创..原创 2020-06-05 14:26:50 · 592 阅读 · 0 评论 -
7.1、QT快捷键
编号快捷键功能1Esc切换到代码编辑状态2F1查看帮助(选中某一类或函数,按下F1,出现帮助文档)3F2在光标选中对象的声明和定义之间切换(和Ctrl+鼠标左键一样的效果,选中某一类或函数,按下F2,迅速定位到该类或函数声明的地方或被调用的地方)4F3查找下一个5F4头文件和源文件之间切换6F5开始调试/继续执行7F9设置和取消断点8F10单步跳过9F11单步进入10Shift + F2声明和...原创 2020-06-02 17:48:54 · 144 阅读 · 0 评论 -
6.14、STL 标准模板库 -- 泛型编程
STL 标准模板库 – 功能类 – 泛型编程 模板的升级六部分1 、容器 containers – 保存数据的内存 new2、迭代器 iteratos – 上次的结构,作为下一次的变化的基础 相当于for里面的 i 也是一个类3、空间配置器 allocator –4、配接器 adapters –5、算法 algorithms – 实现某种功能的方式6、仿函数 functors – ..原创 2020-06-02 17:30:15 · 192 阅读 · 0 评论 -
6.13、智能指针
shared_ptr ---- 共享资源的智能指针,直到指向这个地址的所有指针都消亡才释放内存被用来表示共享的拥有权。也就是说,当两段代码都需要访问一些数据,而它们又都没有独占该数据的所有权(从某种意义上来说就是该段代码负责销毁该对象)。shared_ptr是一种计数指针。当引用计数变为0时,shared_ptr所指向 的对象就会被删除。Shared_ptr<类型> p1 = make_shared<类型>(对象创建)Shared_ptr<类型> p..原创 2020-06-02 17:29:13 · 132 阅读 · 0 评论 -
6.12、转换函数
转换函数1、显示转换2、隐式转换3、内置类型 — 基础的类型 int char ;内置运算符 = + -类作为C++中的自定义类型,可以实现类型的转换。当需要由某种类型转换为自定义类型时,只需要在自定义类型类中创建一个要由某种类型转换的构造函数,即:Class A{ A(int x) { }};就可以实现由 int类型的变量转换为A类型的对象explicit关键字在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式..原创 2020-06-02 17:27:20 · 410 阅读 · 0 评论 -
6.11、异常
由于一些外部因数而不是程序本来的错误导致程序不能继续执行— tryC++的异常处理机制有3部分组成:一般的,throw抛出的异常要和catch所捕获的异常类型匹配异常处理的一般格式为:异常类型有:标准异常(c++定义的异常)和自定义异常标准异常类...原创 2020-06-02 17:20:14 · 75 阅读 · 0 评论 -
6.10、联编
动态联编1、是指在程序执行的时候才将函数实现和函数调用关联,因此也叫运行时绑定或者晚绑定。C++中一般情况下联编也是静态联编,但是一旦涉及到多态和虚拟函数就必须要使用动态联编了2、通过一个虚函数表(Virtual Table)的技术实现动态联编,也意味着实现了多态。3、在如果一个类中存在虚函数时,当我们创建这个类对象时就会在开始位置多4个指针地址空间用作存储这个类中多个虚函数的地址表(虚函数表),即意味着通过对象调用虚函数时,会通过这4个字节找到虚函数执行。4、当在基类中有虚函数时,派生类中同样.原创 2020-06-02 17:18:33 · 312 阅读 · 0 评论 -
6.9、重载
成员函数覆盖(override, 也称重写) ---- 是指派生类重新定义基类的虚函数,特征如下:不同的作用域(分别位于派生类与基类)函数名字相同参数相同基类函数必须有virtual关键字, 不能有static返回值相同重写函数的权限访问限定符可以不同成员函数重载(overload)-----是指函数名相同,参数不同(数量、类型、次序),特征如下:相同的范围(在同一个作用域中)函数名字相同参数不同virtual关键字可有可无返回值可以不同成员函数隐藏(也称重.原创 2020-06-02 17:16:56 · 109 阅读 · 0 评论 -
6.8、虚函数
虚函数(virtual function)有时候,希望子类和基类有相同的方法,但是行为却有所不同,这就是多态。这里就引入了虚函数的概念。注意:简单继承,is-a的关系不是多态; 另外函数重载,一般应该是行为类似,使用方法不同,也不是多态。简单地说,用virtual修饰的成员函数,就是虛函数。虚函数的作用就是实现多态性(Polymorphism)。多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异,而采用不同的策略。虚函数的限制如下:非类的成员函.原创 2020-06-02 17:16:08 · 173 阅读 · 0 评论