自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 收藏
  • 关注

原创 linux命令dd单刷镜像文件

命令单刷镜像文件(即把镜像文件写入存储设备,如 USB 闪存盘、SD 卡等)的核心是将镜像文件(如。)直接写入目标设备,而非写入设备的分区。在 Linux 中,使用。

2025-09-25 23:00:00 205

原创 linux设备驱动之字符设备驱动

注意:

2025-08-16 23:00:00 365

原创 linux I2C核心、总线与设备驱动

linux的i2c驱动体系相当复杂,它主要由3部分组成,即i2c核心、i2c总线驱动和i2c设备驱动。I2c核心是i2c总线驱动和i2c设备驱动的中间枢纽,它以通用的、与平台的无关的接口是实现了i2c中设备与适配器的沟通。i2c总线驱动填充i2c_adapter和i2c_algorithm结构体,i2c设备驱动填充i2c_driver结构体并实现其本身所对应设备类型的驱动。

2025-08-16 23:00:00 1923

原创 linux设备驱动之字符设备驱动(二)

字符设备是3大类设备(字符设备、块设备和网络设备)中的一类,其驱动程序完成的主要工作是初始化,添加和删除cdev结构体,申请和释放设备号,以及填充file_operations结构体中的操作函数,实现file_operations结构体中的read()、wirte()、和ioctl()等函数是驱动设计的主体工作。

2025-08-15 23:00:00 882

原创 linux 设备驱动的分层思想

像这样的分层设计在linux的input、RTC、MTD、I2c、SPI、tty、USB等诸多类型设备驱动中屡见不鲜,下面对这些驱动进行详细的分析。

2025-08-15 23:00:00 1656

原创 linux 主机驱动(SPI)与外设驱动分离的设计思想

Linux中的SPI、I2c、USB等子系统都利用了典型的把主机驱动和外设驱动分离的想法,让主机端负责产生总线上的传输波形,而外设端只是通过标准的API来让主机端以适当的波形访问自身。因此这里涉及了4个软件模块:1)主机端的驱动。根据具体的I2c、SPI、USB等控制器的硬件的手册,操作具体的i2c、SPI、USB等控制器,产生总线的各种波形。2)连接主机和外设的纽带。外设不直接调用主机端的驱动来产生波形,而是调一个标准的API。由这个标准的API把这个波形的传输请求间接“转发”给具体的主机端驱动。

2025-08-14 23:00:00 867

原创 linux设备驱动之USB驱动-USB主机、设备与Gadget驱动

USB采用树形拓扑结构,主机侧和设备侧的USB控制器分别称为主机控制器(Host Controller)和USB设备控制器(UDC),每条总线上只用一个主机控制器,负责协调主机和设备之间的通信,而设备不能主动向主机发送任何消息。在linux系统中,USB主机控制器硬件,在其上运行的是USB主机控制器驱动,在主机控制器上的为USB核心层,再上层为USB设备驱动层(插入主机上的U盘、鼠标、USB转串口等设备驱动)。

2025-08-14 23:00:00 1064

原创 I2c、SPI、USB驱动架构类比

‌:‌‌:I2C/SPI需预先定义设备连接(设备树或板级代码),而USB通过协议栈动态识别设备。‌‌:I2C支持多主多从(需仲裁),SPI为单主多从(硬件片选),USB为主从星型拓扑。‌‌:USB协议栈最复杂(包含设备描述符、配置描述符等),I2C/SPI协议更轻量。

2025-08-13 23:00:00 1764

原创 Linux ARM64 内核解读之内核引导和初始化

处理器上电以后,首先执行引导程序,引导程序把内核加载到内存,然后执行内核,内核初始化完成以后,启动用户的第一个进程。 处理器到哪里读取引导程序的指令?处理器在上电时自动把程序计数器设置为处理器常识设计的某个固定值,对于ARM64处理器,这个固定值是0。处理器的内存管理单元(MMU)负责把虚拟地址转换为物理地址,ARM64处理器刚上电的时候没有开启内存管理单元,物理地址和虚拟地址相同,所以AMR64处理器到物理地址0取第一条指令。 嵌入式设备通常使用NOR闪存作为只读存储器来存放引

2025-08-13 23:00:00 1861

原创 Linux驱动开发probe字符设备的完整创建流程

通过register_chrdev_region预先指定设备号(需要确保未被占用) 通过alloc_chrdev_region由内核自动分配主设备号,一般都是动态分配以避免冲突。二、 初始化cdev结构体 通过cdev_init绑定file_operations操作集(需实现open、read、write等函数) 示例:三、 注册字符设备 通

2025-08-12 23:00:00 435

原创 linux Phy驱动开发之mido总线介绍

在__mdiobus_register中会调用mdiobus_scan_bus_c22的get_phy_device扫描mdio总线的上phy设备并获取的phy设备的id,id与phy设备driver的id匹配上就执行probe。

2025-08-12 23:00:00 673

原创 Linux ethernet驱动移植之常见问题

以太网驱动移植过程中,常见问题主要集中在‌‌等方面。

2025-08-11 23:00:00 1058

原创 reboot failed的分析结果和解决方案

当rx持续接收大量数据时,串口驱动的中断处理会频繁触发。注释掉‌的临界区资源的代码进行测试,会出现wirte error,此时reboot进程正常进行。

2025-08-11 23:00:00 191

原创 Linux内存泄露排查方案

proc。

2025-06-28 22:30:00 379

原创 linux ARM64架构下进程切换核心代码分析

struct rqttbr0_el1pgd_tactive_mmsp_el0sp_el1mm_structmmdrop()ARM64架构下通用代码部分与64位x86架构完全相同,比如context_switch函数就是通用代码,参见文件。从中可以看到进程地址空间mm的切换和进程关键上下文的切换switch_to.这里将重点放在switch_to在ARM64架构下的具体实现代码的分析上。在ARM64架构下使用的switch_to仍然是通用代码,在。

2025-06-28 22:00:00 1013

原创 ARM64 linux系统的一般执行过程

4. 异常处理过程中,异常返回前有机会调用schedule函数,其中switch_mm切换进程空间,switch_to切换进程cpu的上下文,将当前进程的X的内核堆栈切换到进程调度算法选出来的next进程(本例定位进程Y)的内核堆栈,并完成了进程CPU上下文寄存器的状态切换。注意,这里是在进程Y的异常过程中,而3中保存现场是在进程X的异常处理过程中,因为内核堆栈从进程X的内核堆栈切换到进程Y的内核堆栈了。7.异常返回指令eret,与2中CPU完成的工作相反,此时完成了从中断上下文切换到用户进程上下文,即。

2025-06-27 22:30:00 345

原创 linux系统执行过程中的5种特殊情况

1. 中断和中断返回有中断上下文的切换,也就是保存现场和恢复现场,cpu和内核代码中断处理程序入口的汇编语言代码结合起来完成中断上下文的切换2.进程调度过程中有进程上下文的切换,而此切换完全由内核完成,具体包括:从一个进程的地址空间切换到另一个进程的地址空间;从一个进程的内核堆栈切换到另一个进程的内核堆栈;还有进程的cpu上下文关键上下文切换。

2025-06-27 20:00:00 935

原创 linux内核奔溃转储之kexec、kdump

kdump 是一种先进的基于 kexec 的内核崩溃转储机制,用于在 Linux 系统崩溃、死锁或死机时捕获内存中的数据,并生成崩溃转储文件,以便分析和诊断系统问题。kexec 是 Linux 内核提供的一种关键技术,允许系统‌。在.config中配置如下的宏。二、怎么打开kexec?一、kexec是什么?二、怎么打开kdump。一、什么是kdump。

2025-06-25 22:00:00 463

原创 linux可执行程序工作原理(ELF目标文件)

o.alda.outexec.solibc.soELF的作用:ELF文件参与程序的链接(构建一个可执行程序)和程序的执行(加载可执行程序),所以可以从不同的角度来看待ELF文件。如果用于编译和链接,则编译器和链接器将把ELF文件看作节的集合,所有节由节头表描述,程序头表可选。如果用于加载、执行可执行程序,则加载器将把ELF文件看作程序头表描述的段的集合,一个段可以包含多个可选的节和节头表。如果是动态链接库文件,则两者都有。

2025-06-25 22:00:00 1638

原创 Linux 设备驱动之网络设备驱动

netif_rx()net_devicenet_devicenet_devicenameeth0mtuopsnet_devicenet_devicenetif_rx()lodocker0tun在设计具体的网络设备驱动程序时,我们需要完成的主要工作是编写设备驱动功 能层的相关函数以填充 net_device 数据结构的内容并将 net_device 注册入内核1.1 网络协议接口层网络协议接口层最主要的功能是给上层协议提供透明的数据包发送和接收接口。

2025-06-24 23:00:00 1021

原创 linux操作系统的软件架构分析

1)进程管理2)内存管理3)文件系统4)进程间通信、I/O系统、网络通信协议等。

2025-06-24 22:00:00 547

原创 深入理解ARM64 linux系统调用

在start_kernel函数开始执行之前是用汇编语言代码初始化CPU,其中非常主要的就是将异常向量表的基地址配置到VBAR_EL1寄存器中,从arch/arm64/kernel/head.S中可以找到如下代码:这段代码不仅配置了异常向量表,还配置了0号进程的内核堆栈和进程描述符。),即将init_task地址保存在x4中,进入init_cpu_task中,将init_task偏移TSK_STACK(stack指针)加载到x5,将x5+THREAD_SIZE作为内核堆栈的栈底,

2025-06-23 22:00:00 813

原创 Linux 内核配置核心文件config与流程

Kconfig是 “规则”,定义所有可配置项;deconfig是 “模板”,提供快速初始化配置;.config是 “结果”,包含最终编译所需的完整配置;配置工具是 “桥梁”,连接规则与结果,确保依赖关系正确。通过这一套体系,Linux 内核实现了高度可定制化,支持从嵌入式设备到服务器的广泛场景。

2025-06-22 21:00:00 1377

原创 Linux内核在启动过程中挂载根文件系统rootfs的过程

‌阶段‌‌主要任务‌‌依赖项‌虚拟根文件系统挂载提供基础环境,加载必要驱动内核内置或initramfs镜像真实根文件系统挂载通过驱动加载完成设备识别,挂载实际存储设备Bootloader参数或initramfs脚本此过程确保了内核从仅依赖内存的临时环境过渡到持久化存储的完整文件系统,从而支持后续用户空间服务的正常运行。

2025-06-21 21:00:00 753

原创 linux ARM64架构用户空间和内核空间的区分

看最高位:前 16 位是否为(内核空间)或0b00...(用户空间)。查访问权限:用户态程序能否直接访问(能→用户空间,否则→内核空间)。看上下文:代码是否运行在内核态(如中断处理、系统调用),若是则为内核空间地址。通过这种「地址范围 + 硬件权限 + 执行环境」的三重判断,就能准确区分 ARM64 架构下的用户空间与内核空间地址。

2025-06-20 21:00:00 941

原创 linux启动速度优化之do_initcalls()

优化kernel的do_initcalls,即删除cms非必要的initcall调用。

2025-06-19 21:15:00 489

原创 linux kernel优化之rootfs

因项目需求需要优化kernel的启动速度,在浏览启动日志的时候看到解压根文件系统时候花了468ms左右。

2025-06-18 21:00:00 500

原创 CMS摄像头驱动-基础

高帧率(≥60 FPS)可减少动态模糊,提升实时性;但会增加带宽和计算负载。

2025-04-01 08:40:59 1014

原创 kernel优化之嵌入式 Linux 中 BusyBox init 与 systemd 的核心区别

‌‌:嵌入式领域事实标准,适合资源受限、服务逻辑简单的场景,教学重点为 Shell 脚本控制与裁剪优化‌26。‌systemd‌:功能强大但资源消耗高,嵌入式应用受限,仅在高性能设备中作为补充方案‌。

2025-03-31 08:52:14 1299

原创 Xen panic: Unable to copy the kernel in the hwdom memory

将Xen中的dom0的内存提升到 6G时,Xen会出现Unable to copy the kernel in the hwdom memory的报错,依据这条报错日志追踪问题。

2025-03-30 21:00:00 364

原创 CMS: linux kernel 提高loglevel和PRINTK TIME

在进行启动优化之前,我需要提高kernel的日志水平,并且在打印的日志中有时间体现,看看在优化之前kernel用了多少秒。

2025-03-30 21:00:00 311

原创 dom0运行android_kernel: do_serror of panic----failed to stop secondary CPUs 0

最终问题得到解决,发现是前期在调试汇编阶段代码时,增加了汇编打印的指令,注释掉这些指令,问题得到解决。至少为什么导致这个现象,还未分析出来,通过日志,结合内核的源码有一个猜测,在。在汇编阶段写入的地址产生了中断了,但是此时中断并未打开,被屏蔽了,中断并未相应,后续内核执行到内核的c阶段把中断又打开了 ,这时候就开始响应中断。,所以在c阶段引发kernel的panic了,而不是在汇编阶段就crash。setup_arch中的local_daif_restore。的函数功能中有打开某个中断的动作,有可能是。

2025-03-29 21:00:00 407

原创 Display Serializer、Camera Deserializer(Camera Des)和SerDes‌ 加解串应用

‌ 为例,三者的协作流程如下。

2025-03-29 21:00:00 727

原创 dom0-kernel: /thermal-zones/soc_max/cooling-maps/map0: could not find phandle 2

这是因为在Xen解析相关节点时,soc_max下的某个节点被跳过了,注释掉相关的cpu节点处理dom0就可以找到soc_max的节点了。由于soc_max下某个节点找不到,到时dom0-kernel后面有很多有关thermal热管理之类报错。soc_max相关的thermal的热管理报错就解决了。

2025-03-28 21:00:00 409

原创 嵌入式开发场景中Shell脚本执行方式的对比

‌,否则变量仅在子Shell生效,编译时会提示找不到工具链。

2025-03-28 21:00:00 1831

原创 Xen-cpu@100->cpu@1:Failed to bring up CPU 1 (error -2)

例如cpu@100的编号是256,这个只能用于物理cpu,虚拟cpu的编号应该是1,根据这个结论去灵活修改Xen的源码(如果修改dom0的kernel可能无效,这边尝试从dts读出来的256右移8位,crash依然存在)结合日志和Xen的源码追踪,Xen启动cpu的条件依赖于设备树中的reg参数,可以理解为cpu编号,找到Xen通过dts获取cpu编号的接口,并在关键数组赋值将其左移8位即可(dts原生态的cpu编号:cpu@100/reg=0x100)在使用mtk2715平台的原生态的。

2025-03-27 21:00:00 451

原创 嵌入式系统中各类存储方式的区别及接口协议详解

在kernel优化时,也可以考虑硬件层面用的协议是否已经是最优解。在嵌入式系统中,存储设备的选择直接影响系统性能、成本和设计复杂度。

2025-03-27 21:00:00 1462

原创 ‌关于(sigmstar) echo 32 > /sys/class/mstar/msys/booting_time 命令的解析

在嵌入式 Linux 系统中,向写入数值(如echo 32)的操作本质是通过 ‌‌。

2025-03-26 20:00:00 381

原创 ‌Linux 内核镜像编译与自解压机制总结(表格形式)

2025-03-26 20:00:00 785

原创 ‌Linux 4.9.227 内核启动流程解析:kernel_init函数详解

是 Linux 内核启动过程中从内核空间切换到用户空间的核心函数,负责完成内核初始化并启动用户空间的第一个进程(如/sbin/init以下针对 ‌‌ 版本,详细梳理其流程及实现逻辑。

2025-03-25 20:00:00 1558

空空如也

空空如也

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

TA关注的人

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