- 博客(32)
- 资源 (5)
- 收藏
- 关注
原创 Linux物理内存管理-引导内存分配器
本文深入分析了Linux早期物理内存管理框架memblock的原理与实现。memblock作为引导内存分配器,在伙伴系统初始化前负责物理内存管理,通过memory数组记录总物理内存,reserved数组记录预留内存。文章详细解读了memblock的数据结构、初始化流程、关键接口(memblock_add/reserve/alloc/free等)实现,以及最终将内存释放到伙伴系统的过程。通过设备树解析获取物理内存范围,并对内核代码段、预留内存等特殊区域进行处理,memblock为内核启动阶段提供了可靠的内存管
2025-12-05 10:57:42
554
原创 Linux mmap原理与源码分析
本文深入解析了Linux中mmap系统调用的原理与实现。mmap允许将内核内存或文件映射到用户空间,支持私有/共享两种映射方式。文章首先介绍了mmap的基本使用示例,包括文件共享/私有映射和匿名共享/私有映射。随后详细分析了mmap的实现原理:1) 内核仅为用户分配虚拟内存区域(VMA),物理内存延迟到缺页异常时分配;2) 文件映射通过pagecache机制实现文件内容缓存;3) 私有映射采用写时复制,共享映射直接操作pagecache。最后,文章剖析了内核源码中虚拟内存分配的完整流程,包括内存布局、地址空
2025-12-04 20:57:33
739
原创 Linux缺页异常分析
本文分析了Linux内核在arm64架构下处理缺页异常的流程。缺页异常主要由MMU访问页表时出现异常触发,分为三种情况:页表映射空缺、物理内存被交换到磁盘、权限不足导致的写时复制(COW)。内核通过do_page_fault函数作为入口,检查异常状态并调用__do_page_fault处理核心逻辑。 处理流程包括检查页表层级(PGD/PUD/PMD)是否存在空缺并进行补充,最终调用handle_pte_fault进行PTE级处理。根据缺页类型分为匿名页处理(do_anonymous_page)、文件页处理(
2025-12-04 20:54:53
787
原创 Linux虚拟内存固定映射区-fixmap
本文分析了Linux内核中fixmap机制的概念与实现。fixmap是内核启动阶段用于建立固定虚拟地址映射的空间,其虚拟地址在编译时确定。文章首先介绍了fixmap的作用:在内核启动初期,内存管理子系统尚未初始化时,通过fixmap实现物理地址到虚拟地址的临时映射,用于访问设备树(dtb)等关键数据。随后详细解析了fixmap的初始化流程,包括页表填充过程(从PGD到PTE各级页表的建立),以及fixmap_remap_fdt()函数对设备树的映射处理。最后分析了early_ioremap_init()如何
2025-12-04 20:51:57
953
原创 linux 虚拟内存映射原理与启动初始化过程
如下图,处理在访问储存器时,将虚拟地址转由MMU处理,MMU先从TLB缓存中查找是否有对应的物理地址,命中情况下直接使用该物理地址访问高速缓存(C(高速缓存)和 B(缓冲)位被用来控制高速缓存和写缓冲,并决定是否高速缓存),未命中情况下,MMU将启用转换遍历硬件,即TWU从储存器(DDR)中的页表中获取转换,并将转换得到的信息缓存到TLB中以便下次使用。大小INIT_DIR_SIZE为一个页大小4K,即临时页表内存大小为4K,PTE每一项8字节,这个该临时页表能表示的项目为512项(512*4K)。
2025-12-04 20:51:13
556
原创 Linux内核CMA(连续内存分配器)原理
本文从内核源码角度分析了CMA(连续内存分配器)的工作原理。CMA是为解决伙伴系统难以分配大块连续内存而设计的方案,支持声明为系统空闲时可复用的内存或独立预留的内存块。文章详细介绍了CMA的初始化流程,包括早期内存管理器memblock对预留内存的处理,以及后期将CMA内存释放到伙伴系统的过程。对于两种不同类型的CMA内存(no-map独立预留和reusable系统复用),分别分析了其申请机制:独立预留内存直接分配,而系统复用内存需要通过复杂的迁移过程回收已用页面。最后简要说明了CMA内存的释放流程。文章结
2025-11-20 20:55:10
886
原创 Linux下IIO子系统的使用与源码分析
本文主要介绍Linux下的IIO子系统使用,包括应用层访问,驱动层使用IIO子系统开发对应的驱动,同时对IIO子系统的配置含义以及IIO子系统源码框架进行分析。
2025-04-24 11:13:24
1048
原创 Linux 下kref、idr、notifier使用与原理
本文介绍kref、idr和notifier的使用,三者互不联系可跳到对应章节阅读,没有对三者的源码深入分析。
2025-04-17 09:40:14
1153
原创 Linux dma的使用与理解
本文描述Linux下的dma子系统,包括上层驱动调用方式(consumer),硬件驱动接入(provider)和dma子系统框架。如下框架大致描述了Linux下的dma子系统软件层次关系,Linux内核提供了dma子系统,向上驱动层提供DMA consumer,驱动开发者只需调用从summer的接口传入对应的dma通道需求信息;向下硬件层提供DMA Provider,该层主要由芯片厂商实现,向dma子系统注册一个chan_device;DMA核心层包括dmaengine、virt-dma和of-dma。启用
2025-03-26 14:43:59
1216
原创 Linux cma预留内存使用与理解
本节主要介绍驱动如何使用Linux的cam来预留内存方法,分别有预留内存给专门的设备驱动、通过DMA的API来预留内存、使用CAM内存池预留内存。CMA内存声明预留内存大小和基地址,都要进行页内存对齐,否则将预留失败,一般页大小为4K,也有4M的页大小,根据具体平台而定,VP平台是4M空间,所以如果配置的内存没有4M对齐会失败。通过启动参数也可以为CMA预留内存,该方式预留的内存,将和系统公用,即在预留内存空闲时,将被系统使用,与上一节“使用CMA内存池”效果一样。最终都调用了cam_alloc接口。
2025-03-26 14:23:15
1112
原创 使用qemu搭建armv7嵌入式开发环境
本文介绍如何使用qemu搭建一个嵌入式开发环境,从uboot依次启动kernel和文件系统,使用Vexpress系列开发板的Express A9x4板子。
2024-12-18 15:55:53
2357
原创 Linux USB开发整理和随笔
本文主要介绍USB一些基础硬件理论原理和Linux下软件框架分析。其中硬件理论部分的介绍大多摘自网络(笔者是个整理者),主要针对影响理解源码和基本的流程而介绍。软件源码介绍部分是笔者分析源码而来。
2024-12-13 09:28:22
1562
原创 linux下的spi开发与框架源码分析
本书主要描述spi的框架,应用层使用、驱动层对spi子系统的使用、spi子系统框架和增加spi硬件适配驱动的方法以及源码分析,建立在读者具有理解spi基本工作原理和一定的Linux基础。
2024-11-22 17:22:03
964
原创 Linux下pwm开发与框架源码分析
需要注意的是,如果硬件驱动层将每个pwm(最后解析成一个pwm_device)分开,向pwm子系统添加的一个pwm_chip时只用一个pwm(最后解析成一个pwm_device),则of_xlate一般交给pwm子系统实现,该回调处理了pwm在chip的维护顺序,默认偏移值是0。如果将多个pwm(最后解析成一个pwm_device)一起维护成一个pwm_chip,这里的回调用户可以选择实现来维护pwm_device在pwm_chip中的关系。设备树配置的pwm节点。在驱动中,使用pwm子系统提供的接口。
2024-11-22 17:09:42
1189
原创 linux下i2c开发与框架源码分析
从分层角度上看,i2c子系统大致分为设备驱动层client、i2c核心层和i2c适配器层,如下图大致描述了整个i2c应用和内核框架的关系逻辑,从上到下,用户可通过底层提供的总线设备或者外设设备来访问挂载在总线上的i2c设备。以上便是一个i2c adapter的注册过程,比较简单,需要注意的是,在设备树定义了多个i2c节点是,这个driver将被调用多次,即将申请多个adapter,这里一个硬件i2c就申请一个adapter。来看此时i2c子系统是如何解析这个层级关系,以及client如何生成。
2024-11-22 17:01:37
1074
原创 Linux下mmc开发与子系统源码分析
sdio_bus_type不仅针对mmc,还支持其他种类设备例如网卡等,不在本文分析范围内,mmc_rpmb_bus_type为emmc里的一个rpmb分区注册所需,rpmb生成时将注册到该总线。本文目的是从软件角度,帮助读者理解mmc分区的建立以及使用、mmc的bsp开发流程和帮助读者理解mmc的基础概念,对于mmc深入的硬件知识,以及bsp硬件驱动没有深入,mmc涉及的知识较多,希望本文能带读者理解Linux mmc子系统的使用,为有意深入研究和开发emmc的读者建立初步的认识。
2024-11-18 17:21:47
1208
原创 Linux下的gpio使用与pinctrl/gpio子系统源码分析
该文档描述Linux下,对新平台芯片适配gpio框架即bsp层,驱动层的使用方式以及应用层如何访问gpio;其中bsp分为gpio子系统和pinctrl子系统两方面介绍。
2024-11-15 09:15:30
1394
原创 Linux下的mtd子系统与源码分析
本文主要介绍mtd子系统,包括mtd子系统框架、spi flash、nor flash和nand flash注册流程,mtd子系统注册设备过程、分区建立过程以及应用试过程等。本文不对flash本身的硬件和上层文件系统做深入介绍描述,读者须有一定的flash硬件认识和文件系统知识。
2024-11-13 14:49:15
1692
1
原创 Linux下uart开发与core框架源码分析
主要介绍了uart在kernel中相关的代码和使用,包括uart8250 IP硬件驱动框架,serial 串口驱动框架、line desc行规则内核代码逻辑和tty内核软件框架,同时简单介绍了控制台的注册与使用过程,没有深入到console框架。
2024-11-08 14:11:08
1045
原创 uboot启动kernel使用命令过程分析
为了让读者知道本文介绍的知识点在uboot所在位置,在介绍之前,先简单回顾下uboot的启动流程。.......SECTIONS#endif.text :*(.text*)........_start:/**/#elseb reset#endif分析该文件,做了一些列初始化,包括为C环境做的准备等,主要跳转了两个函数:board_init_f 和 board_init_r。
2024-03-11 20:03:13
2860
原创 Android多线程编程
Android多线程编程在进行Android界面操作时经常会遇到ANR等直接在子线程更新界面的错误,需要在ui线程中更新或者将耗时的逻辑放到子线程中更新,执行完返回结果即可。 在Android中,从Ui角度,可分为Ui线程和非Ui线程,Android一启动便创建了一个主线程,该线程即Ui线程,用于更新界面,这意味着所有耗时的动作如果在这个Ui线程中执行将造成界面卡顿现象,不时Android将退出程
2017-07-27 16:20:56
488
原创 Android数据存储之数据库(SQLite和litepal)
Android数据存储之数据库(SQlite和litepal)1、SQLite: Android提供了SQLiteOpenHelper来连接数据库,通过SQLiteDatabase来操作数据库,SQLiteDatabase类下由许多操作数据库的方法,最常见的有添加、删除和查询等操作。 SQLite提供了两种操作数据库的方法: 方法一:使用原生的数据库语句,关于数据库语句可以复习Java的SQL
2017-07-18 23:51:06
1602
原创 Android的EventBus和butterknife基本使用
Android的EventBus和butterknife基本使用使用AndroidEventBus和butterknife能够提高项目的解耦性和执行性能,是比较常用的工具。 1、Android 的EventBus基本使用 配置环境: 1、在module的配置文件加入:compile ‘org.greenrobot:eventbus:3.0.0’ 同步即可使用eventbus。 2、或者到ht
2017-07-17 15:03:38
683
原创 Android的数据存储之SharedPreference与文件File
Android的数据存储之SharedPreference与文件File的基本使用Android的数据存储方式大概分为5种:文件File、网络、SharedPreference、SQLite(数据库)和内容提供者。本节介绍SharedPreference与文件File的基本使用。 1、SharedPreference的基本使用: sharedPreference是一种轻量级的数据储存方式,使用比
2017-07-16 14:57:57
1032
原创 Android三种动画(属性、视图、帧动画)介绍基本使用
Android三种动画介绍与属性动画的基本使用Android动画基本可以分为三类: View Animation(视图动画)、Property Animation:(属性动画)和Drawable Animation(帧动画)。其中视图动画早在Android老版本就已经支持了,只能对view控件编辑动画。属性动画是Android在3.0版本后推出的API,是Google为了解决视图动画推出的,可以对
2017-07-13 18:47:00
542
原创 Android的selector和shape基本使用和color颜色列表
如题,利用Android的selector和shape可以实现自定义的界面显示效果,是美化界面的重要工具,同时可提高项目的解耦性。 1、Android的selector基本使用:(Android studio)选中res文件夹,右击选择new—>android resource file,在resource type选择drawable,在Root element选择selector新建即可。
2017-07-12 17:20:50
2083
原创 Android样式与主题
Android样式与主题1、样式: 目的:为了项目解耦度高,有时许多界面用到同一个插件或者效果时,可利用样式实现重复利用。 基本使用:样式风格可以运行在不同的view的实例中。(以Android studio为平台)在res–>values–>styles.xml下定义如下代码。样式是以style为标签定义一个样式,以item为标签定义一个条目。如下所示 name="radiobu
2017-07-12 16:29:05
443
原创 Android中的PopupWindow基本使用
如题,有时业务需要,需要在界面任意位置随机弹出窗口,可以用PopupWindow。与dialog的区别是,dialog只能显示在界面的中间,PopupWindow可以显示在对应ui控件的下面。 下面以EditText点击触发窗口弹出为例子,可以做成EditText的模糊搜索结果。直接上代码://MainActivity中的全局成员 private PopupWindow popupWin
2017-07-02 14:40:06
689
原创 Android四大组件之广播
Android四大组件之广播(四大组件:广播、活动、服务、内容提供者)分类:广播主要有有序广播、标准广播 标准广播:广播一发出,所有广播接收者同时能够收到。 有序广播:广播由优先级高到低一级级接收,高优先级的广播接收者可以截断广播信号,不再发送到第一级的广播的接收者。 系统广播(有序广播):系统自带的广播,例如无网络链接时会发出一条无网络链接信号,电量低系统会发出一条电量低的广播信号等。基本使
2017-06-29 21:05:37
446
原创 Android四大组件之一的服务
主要复习Android四大组件之一的服务(Android四大组件:活动、服务、内容提供者、广播)。作用:服务主要运行在后台,为应用程序提供数据和逻辑操作支持。 Android提供的服务主要有两种方式:startService和bindService。 startService主要特征是:“不求同年同月同日生,不求同年同月同日死”,即不要求同时创建运行,应用程序退出也不会随程序退出而终止,需
2017-06-28 17:45:21
413
rpmsg、remoteproc、mailbox框架图,收发调用栈过程
2024-10-20
Android多线程
2017-07-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅