嵌入式与Linux那些事
码龄11年
关注
提问 私信
  • 博客:1,241,396
    社区:837
    问答:918
    动态:109
    1,243,260
    总访问量
  • 218
    原创
  • 59,025
    排名
  • 53,543
    粉丝
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:浙江省
  • 加入CSDN时间: 2014-06-26
博客简介:

嵌入式与Linux那些事的博客

博客描述:
个人公众号【嵌入式与Linux那些事】,每周分享高质量原创文章!
查看详细资料
  • 原力等级
    当前等级
    9
    当前总分
    7,378
    当月
    43
个人成就
  • 嵌入式领域优质创作者
  • 博客专家认证
  • 获得5,361次点赞
  • 内容获得1,215次评论
  • 获得13,184次收藏
  • 代码片获得14,383次分享
创作历程
  • 18篇
    2024年
  • 35篇
    2023年
  • 25篇
    2022年
  • 55篇
    2021年
  • 112篇
    2020年
  • 40篇
    2019年
成就勋章
TA的专栏
  • 嵌入式软件工程师笔试面试指南
    付费
    21篇
  • 内存管理
    4篇
  • 块设备驱动
    4篇
  • 调试技巧
    20篇
  • #I2C驱动
    5篇
  • SPI驱动
    7篇
  • #UART驱动
    4篇
  • 其他
    8篇
  • 笔试面试经验分享
    8篇
  • 学习路线
    2篇
  • MIT6.S081/6.828
    3篇
  • 付费专栏部分文章
    6篇
  • IMX6ULL 驱动开发实战教程
    6篇
  • 剑指offer刷题
  • 2021届秋招笔试面试
    13篇
  • 深入理解计算机系统
    18篇
  • 计算机基础
    7篇
  • Linux驱动开发
    32篇
  • 网络驱动
    4篇
  • linux3.4.2移植笔记
    4篇
  • 移植UBOOT
    8篇
  • Linux内核
    9篇
  • 数据结构与算法分析
    27篇
  • Leetcode题目
    23篇
  • 生活
    4篇
  • ARM体系结构
    18篇
  • 计算机组成原理
  • Linux知识
    18篇
  • 踩过的坑
    9篇
TA的推广
兴趣领域 设置
  • 硬件开发
    驱动开发
扫码加我私人微信
202204240702043.png

专注于分享
计算机基础、操作系统、笔试面试、Linux驱动

扫码关注

免费领取2000G学习资料

创作活动更多

超级创作者激励计划

万元现金补贴,高额收益分成,专属VIP内容创作者流量扶持,等你加入!

去参加
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

【内存管理】页面分配机制

Linux内核中是如何分配出页面的,如果我们站在CPU的角度去看这个问题,CPU能分配出来的页面是以物理页面为单位的。也就是我们计算机中常讲的分页机制。本文就看下Linux内核是如何管理,释放和分配这些物理页面的。大家都知道,Linux内核的页面分配器的基本算法是基于伙伴系统的,伙伴系统通俗的讲就是以2^order分配内存的。这些内存块我们就称为伙伴。
原创
发布博客 2024.06.23 ·
1113 阅读 ·
20 点赞 ·
0 评论 ·
11 收藏

【内存管理】内存布局

反过来, 通过物理页面找到映射它的所有虚拟页面叫反向映射(reverse-mapping, RMAP),它可以从page数据结构中找到映射这个page的虚拟地址空间,也就是我们讲过的VMA这个东西,ramp系统是为页面回收服务的,如果要回收一个匿名页面或者page cache的时候, 需要把映射这个页面的用户PTE断开映射关系才可以去回收。刚刚我们讲的都是以页为单位分配的内存。这是为了保证进程在真正使用的时候有足够的内存,因为进程在申请内存后并不一定立即使用,当真正使用的时候,可能部分内存已经被回收了。
原创
发布博客 2024.06.10 ·
1320 阅读 ·
19 点赞 ·
0 评论 ·
19 收藏

【内存管理】内存管理概述

反过来, 通过物理页面找到映射它的所有虚拟页面叫反向映射(reverse-mapping, RMAP),它可以从page数据结构中找到映射这个page的虚拟地址空间,也就是我们讲过的VMA这个东西,ramp系统是为页面回收服务的,如果要回收一个匿名页面或者page cache的时候, 需要把映射这个页面的用户PTE断开映射关系才可以去回收。刚刚我们讲的都是以页为单位分配的内存。这是为了保证进程在真正使用的时候有足够的内存,因为进程在申请内存后并不一定立即使用,当真正使用的时候,可能部分内存已经被回收了。
原创
发布博客 2024.06.10 ·
1178 阅读 ·
17 点赞 ·
0 评论 ·
30 收藏

【内存管理】页表映射

Linux内核中封装了很多宏来处理页表。
原创
发布博客 2024.06.10 ·
1029 阅读 ·
22 点赞 ·
0 评论 ·
30 收藏

【调试】pstore原理和使用方法总结

pstore最初是用于系统发生oops或panic时,自动保存内核log buffer中的日志。不过在当前内核版本中,其已经支持了更多的功能,如保存console日志、ftrace消息和用户空间日志。同时,它还支持将这些消息保存在不同的存储设备中,如内存、块设备或mtd设备。
原创
发布博客 2024.02.07 ·
3209 阅读 ·
19 点赞 ·
1 评论 ·
29 收藏

【驱动】块设备驱动(四)-块设备驱动层

接着,通过调用通用的文件写入函数进行实际的写入操作,并返回写入操作的结果。例如,如果读取出现错误(retval小于0),或者已经读取完所有数据(iov_iter_count(iter)为0),或者已经读取到文件末尾(*ppos >= size),或者文件是DAX文件(IS_DAX(inode)),则跳过剩余的读取操作,并更新文件的访问时间。:调用通用的执行写入操作的函数generic_perform_write,执行标准缓冲区写入操作,并将写入的起始位置保存到pos中,返回写入的状态码。
原创
发布博客 2024.02.05 ·
1357 阅读 ·
17 点赞 ·
0 评论 ·
22 收藏

【驱动】块设备驱(三)-IO调度层

每个块设备驱动程序都维持着自己的请求队列,它包含设备待处理的请求链表。如果磁盘控制器正在处理几个磁盘,那么通常每个物理块设备都有一个请求队列。在每个请求队列上单独执行1/O调度,这样可以提高磁盘的性能。最简单的 I/O调度算法。该算法仅适当合并用户请求,并不排序请求:新的请求通常被插在调度队列的开头或末尾,下一个要处理的请求总是队列中的第一个请求。这种算法是为不需要寻道的块设备设计的,如SSD。除了调度队列外,“最后期限”算法还使用了四个队列。
原创
发布博客 2024.02.05 ·
1423 阅读 ·
21 点赞 ·
0 评论 ·
16 收藏

【驱动】块设备驱动(二)-通用块层

通用块层是一个内核组件,处理来自系统其他组件发出的块设备请求。换句话说,通用块层包含了块设备操作的一些通用函数和数据结构,如通用磁盘结构gendisk,请求队列结构、请求结构request、块设备I/O操作结构bio和块设备操作结构等。
原创
发布博客 2024.02.05 ·
1416 阅读 ·
20 点赞 ·
0 评论 ·
31 收藏

【驱动】块设备驱动(一)-驱动框架

块设备是针对存储设备的,比如 SD 卡、EMMC、NAND Flash、Nor Flash、SPI Flash、机械硬盘、固态硬盘等。块设备可以从数据的任何位置进行访问块数据总是以固定长度进行传输,即便请求的这是一个字节对块设备的访问有大量的缓存。当进行读时,如果已经缓存了,就直接使用缓存中的数据,而不再读设备,对于写也通过缓存来进行延迟处理。块设备读写是按块(所以叫块设备)进行的,使用缓冲区来存放暂时的数据,待条件成熟后,从缓存一次性写入设备或者从设备一次性读到缓冲区。
原创
发布博客 2024.02.05 ·
1359 阅读 ·
18 点赞 ·
0 评论 ·
26 收藏

【C语言】内联函数总结

inline关键字是C99标准的型关键字,其作用是将函数展开,把函数的代码复制到每一个调用处。这样调用函数的过程就可以直接执行函数代码,而不发生跳转、压栈等一般性函数操作。可以节省时间,也会提高程序的执行速度。内联函数相比宏函数,会进行语法检查。宏函数是在预处理阶段生效,内联函数是在编译阶段进行语法检查然后替换。内联函数相比普通函数,少了上下文切换的步骤所以执行会更快一些。内联函数被多次调用,会使固件大小膨胀,内联函数的高速是以空间来换时间。内联函数不可递归。
原创
发布博客 2024.02.03 ·
2001 阅读 ·
24 点赞 ·
0 评论 ·
45 收藏

Linux新增/proc文件目录

Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。有时候基于调试方便,可能要新增一个/proc/ 调试接口。这里我随手写一个demo记录下。结构体,填充了open,read,write的回调函数。用户空间使用echo命令时会调用到。如果使用cat节点会调用。
原创
发布博客 2024.01.21 ·
939 阅读 ·
12 点赞 ·
0 评论 ·
8 收藏

【驱动】I2C驱动分析(六)-I2C驱动模板

Linux I2C驱动是嵌入式Linux驱动开发人员经常需要编写的一种驱动,因为凡是系统中使用到的I2C设备,几乎都需要编写相应的I2C驱动去配置和控制它,例如 RTC实时时钟芯片、音视频采集芯片、音视频输出芯片、EEROM芯片、AD/DA转换芯片等等。下面我们看下如何写一个基本的I2C驱动。
原创
发布博客 2024.01.18 ·
1507 阅读 ·
23 点赞 ·
0 评论 ·
25 收藏

【驱动】I2C驱动分析(五)-模拟I2C驱动

在drivers/i2c/busses下包含各种I2C总线驱动,使用GPIO模拟I2C总线的驱动i2c-gpio.c,这里只分析i2c-gpio.c。i2c-gpio.c它是gpio模拟I2C总线的驱动,总线也是个设备,在这里将总线当作平台设备处理,那驱动当然是平台设备驱动,看它的驱动注册和注销函数。
原创
发布博客 2024.01.18 ·
1322 阅读 ·
16 点赞 ·
0 评论 ·
21 收藏

【驱动】I2C驱动分析(四)-关键API解析

在Linux内核源代码中的driver目录下包含一个i2c目录i2c-core.c这个文件实现了I2C核心的功能以及/proc/bus/i2c*接口。i2c-dev.c实现了I2C适配器设备文件的功能,每一个I2C适配器都被分配一个设备。通过适配器访设备时的主设备号都为89,次设备号为0-255。
原创
发布博客 2024.01.18 ·
1372 阅读 ·
23 点赞 ·
0 评论 ·
18 收藏

【驱动】I2C驱动分析(三)-关键数据类型

i2c_adapter对应与物理上的一个适配器,而i2c_algorithm对应一套通信方法,一个i2c适配器需要i2c_algorithm中提供的(i2c_algorithm中的又是更下层与硬件相关的代码提供)通信函数来控制适配器上产生特定的访问周期。i2c_adapter和i2c_client的关系与i2c硬件体系中适配器和设备的关系一致,即i2c_client依附于i2c_adapter,由于一个适配器上可以连接多个i2c设备,所以i2c_adapter中包含依附于它的i2c_client的链表。
原创
发布博客 2024.01.18 ·
881 阅读 ·
12 点赞 ·
0 评论 ·
11 收藏

【驱动】I2C驱动分析(二)-驱动框架

I2C 驱动属于总线-设备-驱动模型的,与I2C总线设备驱动模型相比,大体框架是一样,系统的整体框架如下所示。最上层是应用层,在应用层用户可以直接用open read write对设备进行操作,往下是设备驱动层,这个就是外围的比如一些用I2C总线连接到SOC的传感器或者EEPROM的驱动程序,这个一般由普通驱动工程师负责,再往下的I2C-Core是核心层,这个是Linux内核源码里面本来就有的,这里面主要是一些驱动和设备的注册函数以及i2c_transfer函数,
原创
发布博客 2024.01.18 ·
1515 阅读 ·
17 点赞 ·
0 评论 ·
24 收藏

【驱动】I2C驱动分析(一)-I2C驱协议简介

I²C 叫集成电路总线它是一种串行通信接口,具有双向两线同步串行总线,通常由两根线组成——SDA(串行数据线)和SCL(串行时钟线)和上拉电阻。它们用于需要许多不同部件(例如传感器、引脚、扩展和驱动程序)协同工作的项目,因为它们可以将多达 128 个设备连接到主板,同时保持清晰的通信路径!它用于将各种低速设备连接在一起,如微控制器、EEPROM、A/D 和 D/A 转换器等。与 UART 或 SPI 不同,I2C 总线驱动器是漏极开路的,可防止总线争用并消除驱动器损坏的机会。
转载
发布博客 2024.01.18 ·
678 阅读 ·
0 点赞 ·
0 评论 ·
3 收藏

Linux 485驱动通信异常

严谨细致。在问题发生时,我也去量过主控和和MCU 485控制管脚的电平,只看到了两者是反向的,但是并没有放大去看最后一段电平的细节。导致遗漏了解决问题的线索。一切问题发生都是有原因的。偶现问题并不好排查,但是我们可以尝试制作偶现问题发生的条件,看有没有可能成为必现问题。如果不能必现,可尝试通过脚本去不断运行在问题发生的场景,使其出现的概率提升。
原创
发布博客 2024.01.03 ·
1527 阅读 ·
17 点赞 ·
1 评论 ·
25 收藏

【驱动】SPI驱动分析(七)-SPI驱动常用调试方法

使用spi_test可以发送和接收SPI数据,以验证spidev驱动的功能和性能。总结起来,spidev驱动提供了一种简单而灵活的方式来与SPI设备进行通信,使得用户可以轻松地在Linux系统上开发和控制SPI设备。根据传入的参数和全局变量的设置,配置SPI传输的参数,并将发送和接收的数据进行打印。这段代码通过解析命令行选项,并根据选项的值设置相应的变量,实现了对命令行参数的解析和处理。通用设备驱动以及对应的ioctl命令实现,可以方便的用来对spi的通用型驱动来进行测试。函数,作为内核模块的初始化函数。
原创
发布博客 2023.11.30 ·
3775 阅读 ·
27 点赞 ·
0 评论 ·
42 收藏

【驱动】SPI驱动分析(六)-RK SPI驱动分析

Linux的spi接口驱动实现目录在下。这个目录和一些层次比较明显的驱动目录布局不同,全放在这个文件夹下,因此还是只好通过看Kconfig 和 Makefile来找找思路//这个是针对有spi控制器的soc选项,一般的soc都有spi控制器吧。//下面的这些就是针对不同soc上的spi控制器的驱动了,我们可以通过make menuconfig的时候选上自己对应平台的drivers下面这些就是针对于主机作为spi从设备的时候用的,暂时貌似没支持,毕竟现实中几乎没有用过,而是作为master端出现。
原创
发布博客 2023.11.30 ·
2060 阅读 ·
17 点赞 ·
0 评论 ·
22 收藏
加载更多