WythePlus
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Linux休眠唤醒全流程解析
核心代码入口位于 kernel/power/main.c 的 state_store(),随后调用 enter_state()。当外部中断(如电源键、RTC定时器、网卡WoL)触发唤醒源时,硬件电路恢复供电,CPU 重新从复位向量(Reset Vector)处开始执行。系统完全恢复到休眠前的状态,/sys/power/state 的写操作执行完毕并返回。金字塔结构:系统从用户态一步步陷入内核最底层(硬件关闭),然后再原路返回(硬件唤醒)。,即将系统状态保存在内存中,关闭除内存外的大部分硬件电源。原创 2026-06-28 17:58:49 · 59 阅读 · 0 评论 -
自旋锁vs信号量:内核同步机制全解析
Tasklet 的实现是 Linux 内核“延迟执行”机制的一个经典案例。3.需要多核并行处理海量数据(如高性能网络协议栈)信号量 (semaphore) / 互斥锁 (mutex)触发 Cache 一致性流量(MESI 协议)可以很长(涉及磁盘 I/O、人工输入等)4.涉及阻塞操作(磁盘、信号量)这是“原地等待”与“挂起休眠”的区别。进入睡眠(让出 CPU,放入等待队列)极低(仅几次原子操作),但占满 CPU。数据量大,但需要快速响应,且不需要休眠。物理层面(不共享,但可路由)原创 2026-05-27 10:13:28 · 31 阅读 · 0 评论 -
Linux锁机制:从软件到硬件的深度解析
如果你在拿锁(M 状态)后被中断打断,而中断处理程序也想拿这把锁,它会发现 Cache Line 锁死在当前核心的“写缓冲区”里,但它自己又无法执行完成,这就形成了。Cache(缓存)和内存一致性(Memory Consistency)三个维度来分析,你会发现这些“锁”本质上是在不同层级上对电子信号流动的管控。为了性能,CPU 可能先执行“存入数据”指令,后执行“释放锁”指令。这在多核环境下是灾难性的。:触发原子指令(CAS/LL/SC),涉及跨核的“缓存行”争夺。锁的层次决定了你是在跟谁“抢”资源。原创 2026-05-27 09:59:36 · 24 阅读 · 0 评论 -
多核CPU关中断的致命陷阱
的内核中,抢占可以发生在任务运行的任何时刻。的硬件中断信号(如时钟中断、硬盘读写完成、网卡报文到达等)。键盘、网络等数据包会堆积在硬件缓冲区,等待开启中断后处理。闭上眼睛,不管外面发生什么硬件信号,都不要打断我。Linux 内核的调度(进程切换)很大程度上依赖于。关中断后,这些通往调度器的信号全部被切断。CPU 0 关中断,CPU 1 照常运行。当前进程会独占 CPU,直到它主动开中断。(节拍数)停止更新(直到重新开启)。时钟中断(Timer Tick)CPU 1 依然能正常接收中断。当前核心的进程调度。原创 2026-05-26 16:35:18 · 30 阅读 · 0 评论 -
多核环境下的锁机制本质解析
为了在多核(SMP)环境下,保护共享资源不被来自不同时空(跨核、跨进程、跨中断)的访问者同时破坏。本地中断 (Local Interrupt) —— [时间维度/硬件级]本质关系:在中断上下文共享数据时,必须同时使用自旋锁和关中断。们之间不是孤立的,而是一层套一层的“防护罩”。:同一个核上的“自己等自己”,死锁(Deadlock)。彻底封闭当前核,并拦截其他核访问。不具备多核保护能力。[多核锁] + [关中断] + [禁抢占]仅防范其他核访问,允许被当前核的中断打断。仅防范当前核被其他任务换走,允许中断。原创 2026-05-26 16:17:35 · 19 阅读 · 0 评论 -
Linux内核同步机制:从抢占控制到多核锁的深度解析
/ 1. 保存当前 CPU 中断寄存器状态,并执行汇编指令关中断 (cli) raw_local_irq_save(flags);// 3. 尝试原子操作修改锁变量,拿不到就死循环 (Spinning) arch_spin_lock(&lock->raw_lock);spin_lock_irqsave = 保存中断状态 + 关闭本地中断 + 禁止抢占 + 获取多核锁。访问 Per-CPU 数据,且不涉及中断。保存状态 + 关中断 + 获取锁。明确知道当前中断是开着的。注意:这只影响当前核。原创 2026-05-26 16:07:36 · 26 阅读 · 0 评论 -
揭秘Android启动机制:Zygote如何优化内存
如果每个 App 启动都要重新加载 Android 框架(如几千个类、系统图标等),手机内存会迅速爆满。理解 Android 应用的启动和资源共享,本质上是在理解 Linux 的底层机制如何被 Google “魔改”以适应移动端的内存限制。在 Linux 系统中,UID 通常代表一个“用户”;Zygote 进程启动时,会预先加载几千个 Java 类(如。这是 Linux 内核的一项神技。你可以把 Zygote 理解为一个“内存镜像仓库”。Fork 出来的一定是进程。“受精卵(Zygote)”原创 2026-05-26 10:26:11 · 46 阅读 · 0 评论 -
ARM64系统调用全解析:从用户态到内核态的完美切换
当用户态代码(比如 libc 的一个包装函数)准备发起系统调用时,必须严格遵守 ARM64 的函数调用标准(AAPCS64)。随着 PC 指针重新指向用户空间,用户态的代码继续往下执行,就像什么事都没发生过一样,只是此时。以下是 ARM64 体系结构下,系统调用从用户态发起、硬件陷入、到内核栈处理的完整闭环。的操作,CPU 和内核之间就会进行一次极其精妙的上下文切换。内核做的第一件大事,就是把用户态的寄存器全部压入当前进程的。(用户态栈指针)、以及刚才硬件保存的。结构中,每个进程都有专属的内核栈。原创 2026-05-26 09:29:08 · 25 阅读 · 0 评论 -
Linux内核栈切换:用户态与内核态的秘密
在 ARM64(AArch64)架构下,逻辑与 x86 类似,但硬件实现的细节有显著差异。这样的指令,这其实是内核在用户态和内核态切换时,通过特殊的系统寄存器来管理不同特权级下的栈指针。理解 Linux 内核的栈切换,关键在于区分“谁在切换”这是进程调度发生的时刻,此时 CPU 已经在内核态。这是由硬件异步触发的切换(如时钟中断、键盘输入)。内核态寄存器 (Callee-saved)在 ARM64 内核代码中,你会经常看到。内核栈 (Kernel Stack)寄存器在找内核栈时的特殊作用。原创 2026-05-25 09:42:50 · 31 阅读 · 0 评论 -
Android 13/14 的启动流程与传统嵌入式 Linux 启动对比
虽然都基于 Linux 内核,但从 Bootloader 传参、ramdisk 加载到根文件系统切换,每一个环节都经过了谷歌的深度定制,特别是。:传统 Linux 只传 10 个左右参数,安卓传递 30 + 个 androidboot.这四大架构变革,彻底改变了启动逻辑。原创 2026-05-22 16:13:53 · 24 阅读 · 0 评论 -
Linux内核的I2C读写寄存器
在日常I2C设备驱动开发过程,经常要对设备进行一些简单寄存器读写,可以利用以下函数进行封装。原创 2023-09-15 10:42:54 · 1311 阅读 · 0 评论 -
Linux驱动I2C设备驱动
I2C(Inter-Integrated Circuit)是一种串行通信协议,用于连接集成电路(IC)之间进行数据传输。它由两根线组成:时钟线(SCL)和数据线(SDA)。I2C设备则是指使用I2C协议进行通信的各种外部硬件设备。I2C设备可以是各种芯片、传感器、存储器、扩展模块等。这些设备通过I2C总线与主控制器或其他设备进行连接,并通过发送和接收数据来实现通信和交互。每个I2C设备都有一个唯一的7位或10位地址,用于在总线上识别它。原创 2023-08-25 14:14:06 · 348 阅读 · 0 评论 -
Linux内核自旋锁应用
spin_lock、spin_lock_bh、spin_lock_irq和spin_lock_irqsave 都是用于实现自旋锁的函数。它们在不同的上下文环境中使用,具有不同的中断屏蔽级别和上下文切换机制。单核的话,只有发生中断会使任务被抢占,那么可以进入临界区之前先关中断,但是对多核CPU光关中断就不够了,因为对当前CPU关了中断只能使得当前CPU不会运行其它要进入临界区的程序,但其它CPU还是可能执行进入临界区的程序。原创 2023-08-11 10:03:22 · 627 阅读 · 0 评论 -
Linux内核中的UVC(USB Video Class)驱动
V4L2(Video for Linux 2)是Linux内核中的视频设备驱动框架,而UVC(USB Video Class)是一种使用USB接口的摄像头设备通信协议。在Linux内核中,V4L2和UVC之间存在以下关系:1. V4L2支持多种视频设备:V4L2是一个通用的视频设备驱动框架,它旨在支持各种类型的视频设备,包括USB摄像头、摄像头传感器、摄像头接口等。这样,V4L2可以在内核中集成不同类型的摄像头驱动程序。原创 2023-08-02 12:12:08 · 3345 阅读 · 0 评论 -
Linux内核自旋锁使用场景
spin_lock、spin_lock_bh、spin_lock_irq和spin_lock_irqsave都是在内核中用于同步访问共享资源的锁。它们在不同的上下文中使用,并具有一些区别。原创 2023-07-27 15:57:15 · 995 阅读 · 0 评论 -
等待队列原理
使用等待队里,通常我们会以wait_event wait_event_interruptible两个宏来令当前进程阻塞,下面来分析一下他们阻塞过程。主动放弃CPU,选择一个优先级更加高的进程运行,开始阻塞。当需要唤醒等待队列时,内核给我们以下几组宏。把等待队列放入等待队列链表中。原创 2023-07-26 14:08:39 · 171 阅读 · 0 评论 -
内核input子系统分析
Linux内核的输入子系统分为三层,分别为事件处理层、核心层、驱动层通常是输入设备驱动,如触摸屏TP、按键驱动等;接收到底层中断时,主动上报数据,将底层的硬件输入转化为统一事件形式,想输入核心(Input Core)汇报。是由Linux内核发布时已经写好的,它承上启下为驱动层提供输入设备注册与操作接口,如:input_register_device;通知事件处理层对事件进行处理;在/Proc下产生相应的设备信息。原创 2023-07-20 17:16:41 · 243 阅读 · 0 评论 -
工作与工作队列使用
struct work_struct是 Linux 内核中用于表示工作项(work item)的结构体,在 Linux 内核中,工作项是一项需要被异步执行的任务。通过创建一个 struct work_struct 对象,并将其添加到工作队列中,可以使得内核在适当的时机执行该工作项的回调函数。原创 2023-07-19 14:19:43 · 293 阅读 · 0 评论 -
insmod加载模块流程
insmod是Linux系统中用于加载内核模块的工具,Android中谷歌通过编写自己的命令解释器来实现bash,源码的位置在system\core\init\builtins.cpp命令行解释器的映射表,对应的函数是do_insmod函数对insmod 传参进行解释,有时候需要再insmod的时候传递一些参数,open打开ko文件,调用系统调用__NR_finit_module陷入内核。原创 2023-07-19 14:02:33 · 898 阅读 · 0 评论 -
Linux内核VFS的open
open系统调用定义在内核源码目录fs/open.c里面参数:dfd 文件描述符filename 文件具体路径名字flags打开文件标志位,方式mode 权限控制位。原创 2023-07-13 10:26:41 · 321 阅读 · 0 评论 -
linux kernel read write file 读写文件
最后强调一点: 如果能在linux native/app 层读写文件,尽量不要在Kernel 中去做这样的工作。通常我们只会在linux native/app 层 读写文件,但可能有一些非常特别的情况下,我们需要直接。因为这个可能带来安全性的问题,以及可能因为新增代码而影响Kernel稳定性。注意的是您在使用read_file & write_file 之前需要。在read_file & write_file 完成之后,需要。一定要成对的出现,不然将直接导致Kernel Crash.原创 2016-03-28 13:41:37 · 7538 阅读 · 0 评论 -
Linux的执行elf可执行文件流程
execve族系统调用用于运行一个新的进程,并且替换当前进程的内存映像(代码,数据,栈)为新进程的内存映像。这个系统调用会在指定的进程空间内加载一个新的程序,同时将参数和环境变量传递给新程序。execve族的调用可以让用户免于开发自己的shell或者cli程序,用现有的程序交互式地对系统进行操作,甚至可以在shell中启动其他进程。由以上代码可知,execve族系统调用主要是通过elf加载器解释加载到内存,再通过修改arm的pc sp指针,使得该elf可执行文件得以运行。原创 2023-07-05 15:41:10 · 1036 阅读 · 0 评论 -
Linux内核的uevent机制
Linux内核的uevent机制是一种事件通知机制,用于在设备状态发生变化时通知用户空间。uevent代表"用户事件",它允许设备驱动程序和其他内核子系统在设备插入、移除、配置或其他相关事件发生时发送消息给用户空间。当一个设备插入到系统中时,内核会生成一个uevent并发送给用户空间的udev守护进程。udev进程负责接收uevent消息,并根据消息的内容进行设备管理和配置。udev可以根据设备的属性信息,为设备创建设备节点文件、加载驱动程序、设置设备权限等。原创 2023-06-30 10:55:49 · 1955 阅读 · 0 评论 -
Linux内核的proc文件系统
在proc文件系统中,每个进程都会在/proc目录下创建一个以进程ID命名的子目录,该目录中包含了关于该进程的各种信息,比如进程的运行状态、资源占用情况和相关的文件描述符等。此外,/proc目录下还会有其他类似的文件和目录,比如系统的硬件信息、内存使用情况等。可以看到,CPU使用了统一编址的,外设映射在物理地址上,例如System RAM就是物理内存System RAM映射在40370000-4037007f上,其中一组gpio寄存器映射物理地址40370000-4037007f上。原创 2023-06-29 09:32:10 · 338 阅读 · 0 评论 -
Linux内核启动流程
首先看到内核的编译链接lds脚本,以ARM为例,我们可以在kernel里面arch\arm\kernel找到该文件。vmlinux.lds.S是一个文件名,通常指的是 Linux 内核源代码中的链接脚本文件。链接脚本文件(Linker Script)是用于指导链接器(Linker)在链接可执行文件或库时如何排列和组织不同的代码和数据段。vmlinux.lds.S文件在 Linux 内核的构建过程中使用,它定义了链接器所需的内核段布局和链接规则。具体而言,vmlinux.lds.S文件是以汇编语言原创 2023-06-28 13:52:43 · 666 阅读 · 0 评论 -
Linux fork的内核实现
新进程被称为子进程,原始进程被称为父进程。子进程获得父进程的副本,但是它具有自己的进程ID和内存地址空间。在子进程中,fork将返回0,而在父进程中,fork将返回子进程的进程ID。Linux系统没有明确区分线程和进程区别,是通过clone_flags来区分,是否要共享父进程地址空间,全局变量,虚拟内存等;通过copy_process来复制父进程的信息,包括打开文件,信号,内存地址空间,全局变量等;1,该进程为内核进程,内核进程不需要管理用户空间的虚拟地址空间,故为NULL。下面分析系统调用的实现。原创 2023-06-28 09:59:45 · 312 阅读 · 0 评论 -
Linux驱动中断注册流程
当硬件设备有可用的中断时,此函数将调用对应的线程处理程序,以处理中断请求。在处理中断时,可以使用常用的函数如irq_to_desc()、irq_get_irq_data()来获取相关的irq_desc结构体指针。其中,irq是要请求的中断号,handler是传统的中断处理函数,thread_fn是线程化处理函数,irqflags指定中断请求标志,devname是设备名,dev_id是设备ID。注册中断服务函数,中断线程化的线程创建,使能中断,proc目录下面irq的文件创建。中断线程化内核线程的创建。原创 2023-06-27 09:50:55 · 577 阅读 · 0 评论 -
Linux的USB-Serial 代码跟踪
我们在Linux dev目录看到的ttyUSB*一系列的终端,这些读写在Linux底层是如何处理的呢?首先看USB serial 核心层,kernel\drivers\usb\serial\usb-serial.c文件里面实现static void __exit usb_serial_exit(void){usb_serial_console_exit();原创 2016-03-30 14:01:28 · 4470 阅读 · 0 评论 -
Linux内核Input输入子系统浅解
Linux输入设备总类繁杂,常见的包括有按键、键盘、触摸屏、鼠标、摇杆等等,他们本身就是字符设备,而linux内核将这些设备的共同性抽象出来,简化驱动开发建立了一个input子系统。子系统共分为三层,如图1所示。图1 input输入子系统 驱动层和硬件相关,直接捕捉和获取硬件设备的数据信息等(包括触摸屏被按下、按下位置、转载 2016-07-01 16:03:37 · 5717 阅读 · 1 评论
分享