- 博客(208)
- 收藏
- 关注
原创 两个死锁案例分析
在实现一时,我设计了。由于参数,代码中使用了()保护寄存器操作。但在调试时发现以下死锁链:线程A调用ioctl获取锁A → 进入校验函数 → 校验函数内部再次调用ioctl尝试获取锁A。自旋锁递归导致(spinlock未释放时重复获取)。锁策略重构:将校验逻辑拆分为非锁区域(参数检查)和锁区域(寄存器操作)。改用()替代(因校验逻辑可能存在阻塞)。防御性编程。
2025-04-11 00:28:05
663
原创 SDIO - DWC MSHC 电压切换和频率切换
我们的sdio访问sd card过去一直跑在低频上,HS50M。前段时间给eMMc添加了HS200模式,eMMc的总线模式定义是这样的:可以看到1.8V的IO 电压可以支持所有模式,我们过去的芯片,由硬件部门放到evb上,其IO 电压要不就是定死的,要不就是用跳帽来选择电压是3V3或者1V8,不支持电压切换,这对eMMc来说还尚可接受,因为我们可以将它定到1V8上,反正eMMc在这个电压上可以切换到各个速度,emmc的hs200也就在这个条件下跑起来了。
2024-10-17 21:38:29
1345
原创 QEMU与KVM架构
QEMU与KVM架构总体上分为3部分。VMX root模式的应用层(左上)VMX root模式的内核层(左下)虚拟机的运行(右上)VMX root相对于VMX non-root模式,CPU引入了硬件虚拟化指令后有了这些概念,VMX root可以理解为宿主机模式,VMX non-root可以理解为虚拟机模式虚拟机运行在VMX non-root模式下VMX root模式与未引入VT-x之前是一样的,CPU在运行包括QEMU在内的普通进程和宿主机的操作系统内核时,CPU处于该模式。
2024-10-12 22:57:16
1344
原创 读书笔记 - 虚拟化技术 - 0 QEMU/KVM概述与历史
David Wheeler:计算机科学中任何问题都可以通过增加一个中间层来解决。虚拟化思想存在与计算机科学的各个领域。主要思想:通过分层将底层的复杂,难用的资源虚拟抽象为简单用于的资源,提供给上层使用。(comment:驱动软件也是对设备的一种虚拟化?进程是对CPU的一种虚拟化?机器码,汇编,到C语言,再到高级语言,本质也是一个不断虚拟化的过程,将底层复杂的接口转变为上层容易使用的接口虚拟机,Virtual Machine,VM。
2024-10-12 22:29:47
954
原创 UART在Linux内核启动时突然不打印的问题
说实在的,我还没看过裸驱里怎么配置的GIC,那就跟一下它的代码,我发现它是通过汇编配置的,虽然代码里用宏定义配置了它的基地址,但是没人引用这个宏,且它的基地址是从CP15协处理器读出来的!为了证明串口是错误的,我开始修改串口驱动,中断模式改为poll模式,再启动,发现FPGA上也可以跑的更远了,这次跑到了inittab里(排除了init进程调用失败),停在了配置getty与console绑定的这一行(也是通过在rcS里加打印)来确认了。还是停住了,依然没进login,很苦恼,临门一脚了。
2024-10-11 03:55:48
964
原创 内核启动时减少log的方式
内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。
2024-09-09 14:56:51
1065
原创 计算机组成与设计 - 1.7 功耗墙 - 1.8 单处理器向多处理器的转变 - 1.9 基准
25 年间 1ntel x86 八代微处理器的时钟频率和功耗。奔腾 4 处理器时钟频率和功耗提高很大 ,但是性能提升不大。Prescott 发热问题导致奔腾 4 处理器的生产线被放弃。Core 2 生产线恢复使用低时钟频率的简单流水线和片上多处理器。Core i5 采用同样的流水线功耗提供了能够冷却的极限,在后PC时代,能量是真正关键的资源,对于个人移动设备来说,电池寿命比性能更关键。设计者要尽量降低功耗。评价功耗时,使用能耗,比使用功耗,更加科学。能耗的单位是。
2024-08-26 18:38:22
1173
原创 计算机组成与设计 - 1.6 性能
一般来说,关于性能,我们主要考虑两个方面:1. 响应时间: 也叫执行时间,从开始一个任务到该任务完成的时间2. 吞吐率:也叫带宽,单位时间内完成的任务数量个人计算机更加关注响应时间,数据中心一般关注吞吐率多一些。将计算机中的处理器更换为更高频率的型号,既能减少其响应时间,也能增大其吞吐率。增加多个处理器分别处理任务,如搜索web,可以增大其吞吐率。当需要处理更多任务时,系统软件可以让后续的请求排队,多个任务可以同时在多个处理器上执行,增加了吞吐率的同时也减少了响应时间。
2024-08-26 16:50:36
1039
原创 eMMC规范 - 寻址/信息寄存器/总线协议/时序图/速度模式
e•MMC 规范的早期实现(至 v4.1 的版本)是采用 32-bit 域实现字节寻址的。这种寻址机制允许最大 2 GB 的 e•MMC 容量。为了支持更大的容量,寻址机制升级到支持扇区寻址( 512B 扇区)。对所有容量大于2 GB 的设备应使用扇区地址。要确定所用的寻址模式,主机应读取 OCR 寄存器的 bit [30:29]
2024-07-12 20:55:38
1371
原创 arm64 - 系统调用
群里做网络的小伙伴问了一个问题,他在wifi驱动的某个函数里加了dump stack,然后插入驱动,发现调用栈是这样的,为什么呢?
2024-04-08 16:19:58
816
1
原创 uboot - pinctrl - FPGA回片前测试阶段 - 设置GPIO引脚复用失败
pinctrl设置引脚复用失败,没有调用到controller中的set_groups_function函数。
2024-03-20 15:38:07
1278
原创 linux -- I2C设备驱动 -- MS32006(低压5V多通道电机驱动器)
MS32006 是一款多通道电机驱动芯片, 其中包含两路步进电机驱动, 一路直流电机驱动;每个通道的电流最高电流1.0A;支持两相四线与四相五线步进电机。芯片采用 I2C 的通信接口控制模式, 兼容 3.3V/5V 的标准工业接口。MS32006 总共集成了两路步进电机驱动器与一路直流电机驱动器, 通过 I2C 总线去控制电机的转动。步进电机控制器可以选择全步进或者 1/2 的步进模式, 系统上一般用来做为小云台 X,Y 轴的运动控制。
2024-03-19 14:45:49
1638
原创 linux -- 并发 -- 并发来源与简单的解决并发的手段
当多个执行路径并发执行时,确保对共享资源的访问安全是驱动程序员不得不面对的问题互斥:对资源的排他性访问同步:对进程执行的先后顺序做出妥善的安排一些概念:临界区:对共享的资源进行访问的代码片段称为临界区并发源:导致出现多个执行路径的因素称为并发源。
2024-02-01 13:34:07
1053
原创 链接 - 重定位
链接脚本的输出段格式描述:链接脚本输出段格式一个输出段有两个地址:VA和LMA,分别是虚拟地址和加载器地址虚拟存储地址,是运行时段所在的地址,可以理解为运行地址。加载存储器地址是加载时段所在的地址,可以理解为加载地址。如果没有用AT显式指定LMA,那么LMA=VA,加载地址等于虚拟地址。
2024-01-31 10:23:03
1166
原创 linux -- per-CPU变量
per-CPU变量是一种存在与每个CPU本地的变量,对于每一种per-CPU变量,每个CPU在本地都有一份它的副本。
2024-01-30 23:11:56
770
原创 linux --中断管理 -- irq的自动探测机制
如果一个设备的驱动程序无法确定它说管理的设备的软件中断号irq,此时设备驱动程序可以使用irq的来获取其正在使用的irq。使用自动探测机制的条件探测前,驱动的设备关联到了某个irq,但是因为设备驱动程序还不清楚是哪个irq,因此无法调用request_irq来向该irq安装中断处理例程,所以对应irq的action为空,下面是一个设备驱动程序的使用示例:probe_irq_on和probe_irq_off是内核为驱动程序员设计的两个自动探测的接口函数。
2024-01-30 19:11:06
606
原创 linux -- 内存管理 -- 页面分配器
分配并使用内存,是内核程序与驱动程序中非常重要的一环。内存分配函数都依赖于内核中一个非常复杂而重要的组件 - 内存管理。linux驱动程序不可避免要与内核中的内存管理模块打交道。linux内存管理可以总体上分为两大块:一是对物理内存的管理,二是对虚拟内存的管理。
2024-01-26 15:27:10
862
原创 Hylicos - MINI2440 - 中断控制
中断是一种异步异常,CPU需要处理很多来自设备的中断请求,而CPU引出的line只有IRQ线和FIQ线,所以就得引入中断控制器帮助CPU搞清楚是中断的来源。MINI2440的中断控制器,可以接受来自60个中断源的请求。提供这些中断源的是内部外设,如DMA 控制器、 UART、IIC 等等。在这些中断源中,UARTn、AC97 和EINTn 中断对于中断控制器而言是“或”关系。当从内部外设和外部中断请求引脚收到多个中断请求时,中断控制器在仲裁步骤后请求ARM920T 内核的FIQ 或IRQ。
2024-01-22 19:59:32
944
原创 linux内核压缩生成过程
在客户使用我司芯片,选择内核自解压算法为XZ和LZMA后,发现解压时长变得非常慢,约40S。我们拿到了一块rk3288 fire-fly的板子,也将其内核配置为XZ压缩,经过测试,RK的板子做XZ的解压只需要2s,对比我司的表现,RK速度非常之快。
2024-01-22 11:12:49
1152
原创 vscode使用remote ssh到server上 - Node进程吃满CPU
我发现每次使用vscode的remote插件登陆到server后,就会出现node进程,不太清楚干什么用的,但是绝对和它有关。
2023-12-18 13:22:48
8423
4
原创 neovim -- 使用clangd以及coc.nvim阅读代码
Coc.nvim 是一个基于NodeJS 的适用于Vim8, Neovim 的Vim 智能补全插件。拥有完整的LSP 支持。配置、使用方式及插件系统的整体风格类似 VSCode。
2023-11-29 15:09:38
1994
原创 TrustZone以及ARMv8相关知识链接汇总
介绍TrustZone相关知识:https://blog.csdn.net/guyongqiangx/article/details/78020257ATF相关的 代码解析:https://blog.csdn.net/puyoupuyou/article/details/85046544Firmware Design: https://trustedfirmware-a.readthedocs.io/en/latest/design/firmware-design.html公司wiki:http:/
2023-10-18 17:26:25
174
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人