自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

HZero

水母

  • 博客(202)
  • 收藏
  • 关注

转载 [经验] 深入理解MPIDR_EL1寄存器中的affinity [转]

分配给MPIDR的值的域的集合{Aff2, Aff1, Aff0}在整个系统中必须是不同的。0b0 当PEs的性能关联级别最低,或者使用MPIDR_EL1.MT的PEs被设置为1时,级别0的不同值或者级别1的相同值或更高级别,是相互独立的。0b1 当PEs的性能关联级别最低,或者使用MPIDR_EL1.MT的PEs被设置为1时,级别0的不同值或者级别1的相同值或更高级别的相关性非常高。3、aff2/aff3:表示系统中的第几个cluster,这个值由SOC厂商给core的输入信号决定。

2023-03-26 22:32:45 1000 1

原创 匿名页的反向映射

当通过fork创建子进程的时候,在这个过程中会建立反向映射的基础结构,具体在kernel_clone -》 copy_mm -》 dup_mm -》 dup_mmap中:《Linux内核深度分析》《深入理解Linux内核反向机制》

2022-06-26 21:32:46 582

原创 binder学习笔记

device_initcall(binder_init)binder_openstatic int binder_open(struct inode *nodp, struct file *filp) proc = kzalloc(sizeof(*proc), GFP_KERNEL); //此处主要分配了binder_proc结构体,管理数据结构体,每个进程都有独立的记录 proc->tsk = current->group_leader; ...

2022-06-01 23:55:37 818

转载 Linux内核PID管理

目录1. 前言2. PID相关的数据结构struct pidstruct upidstruct pid_namespacestruct task_struct3. PID使用fork函数中如何分配一个新的pid?pid_nr函数1. 前言PID即进程描述符在linux kernel中的分配和管理比较复杂。 本文分析了其相关数据结构以及函数。代码基于v3.0.3,和pid相关的数据结构,函数定义:include/linux/pid.hinclude/linux/pid_namespace.hker

2022-05-06 09:26:59 906

转载 crash处理core文件

目录1.全局变量解析2.局部变量的解析2.1 位于栈中的局部变量2.1.1 在上级函数中通过该变量与堆栈的关系解析2.2.2 在本级或下级函数中通过该变量与堆栈的关系解析2.2 位于寄存器中的局部变量本文转自 https://www.cnblogs.com/hehheai/p/6513699.html本文主要讲述了如何根据crash dump来查找某个特定函数局部变量值的方法,总结起来包括如下几种方法:位于栈中的局部变量的解析(1)在上级函数中通过该变量与堆栈的关系解析如果以函数参数传递给下级

2022-04-02 12:46:44 543 2

原创 LRU页面回收

内存回收算法总是会在一定的时间将一些内存回收, 经典内存回收算法是通过LRU链表对page页面进行管理的,对于那些最新读写的页面会将其插入到LRU链表头,当页面回收线程工作时将会typedef struct pglist_data {... /* Fields commonly accessed by the page reclaim scanner */

2022-03-25 20:30:36 666

原创 工程师成长知识图谱(书籍)

知识类别 书目 # 架构设计==架构== <u>《实时嵌入式系统软件设计》 ==面向对象== <u>《Prentice.Hall.PTR.Applying.UML.and.Patterns.3rd.Edition》 ==模式== <u>《Real-Time+Design+Patterns+-+Robust+Scalable+Architecture+for+Real-Time+Systems》# 基础知识 ...

2022-03-24 10:32:58 8285

原创 关于sdcard读写速率慢的问题排查

1.前言前段时间测试同事在用androbench测试sdcard速率时,发现我们的机器总是比对比机器(三星S7)在读写速率方面慢很多,我们的机器读取速率基本在21MB/S左右,而对比机器一般在40MB/S左右。本文就介绍如上问题分析解决的整个过程。2. 启动时的卡模式识别通过启动时的打印可以看到我们的机器在识别卡的速率模式时,主要有两种情况:卡识别情况一​通过三星S7对比样机的bugreport可以看到,同样一张卡(sandisk class10 32G UHI卡),三星 s7识别为ultra

2022-03-20 23:16:45 4034

原创 tracepoint简介

1. tracepoint原理tracepoint是预先在函数的插入点中插桩,当执行到函数的插入点,则执行插桩函数,进而触发与插入点预先绑定的probe函数,probe函数可以是一个或者多个,probe函数可以定义为任意的行为,从而可以起到对函数内部观测的租用。2. 使用tracepoint的步骤2.1 DECLARE_TRACE需要在头文件中通过DECLARE_TRACE宏声明,DECLARE_TRACE定义如下:#define DECLARE_TRACE(name, proto, args)

2022-03-14 14:37:12 3586 2

原创 CMA简介

1. 前言CMA是一段连续的内存区域,它的所有页面都是可迁移类型,平时在不需要大块连续内存的时候,这段CMA区域可供系统或其它驱动使用,在驱动需要大块内存的时候,已占用的部分需要迁移出去,空闲出大块连续内存以供分配。 有两种CMA area:Global CMA area给大家共享,而per device CMA可以给指定的一个或者几个驱动使用2. 配置cma区域的大小有三种方式可以配置CMA区域大小,dts,commdline, 内核的配置项,优先级分别是dts > commandline

2022-02-25 14:36:15 1293

原创 __reserved_mem_init_node

kenrel: 5.10arch: arm64/** * __reserved_mem_init_node() - call region specific reserved memory init code */static int __init __reserved_mem_init_node(struct reserved_mem *rmem){ extern const struct of_device_id __reservedmem_of_table[];

2022-02-24 14:48:42 573

原创 early_init_fdt_scan_reserved_mem

/** * early_init_fdt_scan_reserved_mem() - create reserved memory regions * * This function grabs memory from early allocator for device exclusive use * defined in device tree structures. It should be called by arch specific code * once the early allo

2022-02-23 23:54:09 371

原创 __fdt_scan_reserved_mem

kenrel: 5.10arch: arm64/** * fdt_scan_reserved_mem() - scan a single FDT node for reserved memory */static int __init __fdt_scan_reserved_mem(unsigned long node, const char *uname, int depth, void *data){

2022-02-23 23:52:03 223

原创 setup_arch:arm64_memblock_init

kernel: 5.10arch: arm64arm64_memblock_init主要是通过memblock_remove将某些memblock_region区域从memblock.memory中移除,这些区域包含了DDR物理地址所不包含的区域,以及内核线性映射区所不能涵盖的区域;同时将某些物理区间添加到memblock.reserved中,这额区间包含dts中预留区域,命令行中通过参数预留的CMA区域,内核的代码段、initrd、页表、数据段等所在区域,crash kernel保留区域以及elf相关

2022-02-23 10:58:01 890

原创 memblock_remove

static int __init_memblock memblock_remove_range(struct memblock_type *type, phys_addr_t base, phys_addr_t size){ int start_rgn, end_rgn; int i, ret; ret = memblock_isolate_range(type, bas

2022-02-23 08:46:50 280

原创 memblock_isolate_range

/** * memblock_isolate_range - isolate given range into disjoint memblocks * @type: memblock type to isolate range for * @base: base of range to isolate * @size: size of range to isolate * @start_rgn: out parameter for the start of isolated region *

2022-02-22 20:32:27 499

原创 memblock: early_init_dt_scan_memory

/** * early_init_dt_scan_memory - Look for and parse memory nodes */int __init early_init_dt_scan_memory(unsigned long node, const char *uname, int depth, void *data){ const char *type = of_get_flat_dt_prop(

2022-02-19 18:14:00 537

原创 memblock:struct memblock

memblock 结构体定义如下,它主要用于描述整个memblock分配器/** * struct memblock - memblock allocator metadata

2022-02-19 18:05:43 295

原创 setup_arch:bootmem_init : sparse_init

首先简单说明一下背景知识,启动阶段的内存模型一般有4种:FLATMEM,经典sparse和sparse vmemmap,以及zone devieFLATMEM这种模型适用于具有连续物理内存或大部分连续物理内存的非NUMA系统。 在FLATMEM内存模型中,有一个全局mem_map数组映射整个物理内存。对于即使是空洞的物理内存,也需要分配struct page结构体,只不过不会被初始化,映射到具体的物理内存。因此使用的时候要通过pfn_valid来进行检测,可以看到这样实际是浪费了一些struct pa

2022-02-19 14:35:57 769

原创 pfn_to_page

kernel: 5.10arch: arm64 #define pfn_to_page __pfn_to_pageVMEMMAP区域存放的的是struct page结构体,pfn_to_page实际就是通过物理页帧号来从VMEMMAP区域索引到对应的struct page结构体指针对于定义了CONFIG_SPARSEMEM_VMEMMAP宏,则#define __pfn_to_page(pfn) (vmemmap + (pfn))注意pfn是按照实际的物理地址编号的,如本例中

2022-02-18 14:58:40 1279

原创 pmd_addr_end宏

# include/linux/pgtable.h/* * When walking page tables, get the address of the next boundary, * or the end address of the range if that comes earlier. Althoug

2022-02-17 18:22:52 505

原创 memblocks_present

PAGE_SECTION_MASK对于sparse内存模型,有三级概念:root, section, page,它通过物理地址来进行组织,本例中物理地址为48bit,其中section大小为1G,占用30bit,而PAGE_SHIFT为12,因此page index也就是PFN_SECTION_SHIFT为30-12=18bit//每个section所占用物理地址的位数#define SECTION_SIZE_BITS 30//30 - 12 = 18#define PFN_SECTI

2022-02-14 14:46:18 431

原创 for_each_mem_pfn_range宏

kenrel: 5.10arch: aarch64前言启动阶段经过arm64_memblock_init之后,通过gdb可以查看到memblock布局如下:(gdb) p/x memblock$5 = { bottom_up = 0x0, current_limit = 0xffffffffffffffff, memory = { cnt = 0x1, max = 0x80, total_size = 0x40000000, regions = 0xff

2022-02-14 09:53:32 548

原创 f2fs学习笔记 -12. f2fs checkpoint[转]

1.前言本文主要记录checkpoint的过程2.checkpoint的时机1.gc: 当空闲segment 不足的时候,可以通过check point 释放。2.sync:执行sync操作时3.super_block: super block 的put_super 接口需要通过f2fs_write_checkpoint() 来把没有来得及umount导致的可能不一致的数据重新做一次check point。3.checkpoint的流程f2fs_sync_fs write_checkpoin

2022-01-11 16:39:30 823

原创 f2fs学习笔记 -11. f2fs gc

1.前言GC分为前台GC和后台GC2.总体流程f2fs_fill_super start_gc_thread(sbi) init_waitqueue_head(&sbi->gc_thread->gc_wait_queue_head) kthread_run(gc_thread_func)3.gc_thread_funcgc_thread_func f2fs_balance_fs(sbi) sync_dirty_dir_inodes sync_node_pa

2022-01-11 16:32:02 681

原创 f2fs学习笔记 -10. f2fs fsync

kernel:linux3.17fs: f2fs初始版本1.前言本文主要记录f2fs fsync的流程。2.总体流程do_fsync fget(fd) vfs_fsync(file, file->f_path.dentry, datasync) fop->fsync(file, dentry, datasync) f2fs_sync_file filemap_write_and_wait_range 元数据相关操作3.详细流程3.1 filemap_

2022-01-11 16:28:24 748

原创 f2fs学习笔记 - 9. f2fs 写文件

1.前言本文主要介绍f2fs写入流程. 写入流程主要分为meta, data, node的写入,本文主要介绍data的写入流程。2.总体流程sys_write fdget file_pos_read vfs_write file_pos_writefdget是从当前进程的文件描述符表获取一个fd;file_pos_read获取文件描述符当前的读写位置vfs_write执行文件写入操作file_pos_write更新文件的写入位置3.vfs_writevfs_w

2022-01-11 16:24:40 1060

原创 f2fs学习笔记 - 8. f2fs 读文件

1.前言本文主要介绍f2fs读取流程2.调用流程vfs_read file->f_op->read(do_sync_read) generic_file_aio_read do_generic_file_read mapping->a_ops->readpageread系统调用会调用到vfs_read,进而调用到file->f_op->read,这个read回调是在创建文件时初始化为i

2022-01-11 16:17:28 666

原创 f2fs学习笔记 - 7. f2fs文件打开

1. 前言本文主要总结f2fs文件的打开过程,以touch test为例2.打开文件总体流程在打开文件时,获取了file描述符,创建了file, 而file->op_s来源于file所对应的inode->i_fop而inode是如何被创建的呢?[<7f003770>] (f2fs_create+0x24/0x1fc [f2fs]) from [<800c1724>] (vfs_create+0x80/0xb4)[<800c1724>] (vfs_c

2022-01-11 16:13:11 680

原创 f2fs学习笔记 - 6. f2fs初始化流程

1.前言初始流程主要包含f2fs文件系统初始化,以及f2fs文件系统mount2. init_f2fs_fsinit_inodecache创建f2fs_inode_cache slab描述符create_node_manager_caches创建nat_entry,free_nid的slab描述符create_gc_caches创建f2fs_gc_inodes的 slab描述符create_checkpoint_caches创建f2fs_orphan_entry,f2fs_dirty_

2022-01-11 15:59:39 877

原创 f2fs学习笔记 - 5. f2fs基本类图

f2fs_nat_entryf2fs node address table entry, 可以认为是main area区域的node block的描述符。version?ino为node所对应的inode number,block_addr为node block的索引(这个索引是从CP区域开始计数吗?)f2fs_nat_entry的作用就是根据nid来查找对应的node block的块号,通过nid也可以确定其所属的ino, 进而找到对应的f2fs_inodef2fs_nat_block...

2022-01-11 15:50:59 1313

原创 f2fs学习笔记 - 4. f2fs文件系统组件说明

目录1. 前言2. f2fs组件说明2.1 定义f2fs文件系统类型(fs/f2fs/super.c)2.2 定义超级块结构与操作集(fs/f2fs/super.c)2.3 定义inode结构(include/linux/f2fs_fs.h)2.4 定义inode操作函数集2.5 定义inode文件操作函数集2.6 定义inode address_space操作函数集2.7 定义dentry操作函数集1. 前言本文主要是以f2fs文件系统为例来说明文件系统编程模式,要实现一个文件系统,需要实现哪些组件,

2022-01-11 15:47:06 1559

原创 f2fs学习笔记 - 3. F2FS文件系统布局

目录1.前言2.F2FS布局说明2.1. super block(block 0x0 ~ block 0x1ff)2.2 CP(block 0x200 ~ block 0x5ff)cp page1nat journalsit journaldata summarycurrent hot node summarycurrent warm node summarycurrent cold node summarycp page22nd checkpoint2.3 SIT(block 0x600 ~ block

2022-01-10 15:11:30 3165 4

原创 f2fs学习笔记 - 1. f2fs概述

1. 前言本文主要通过回答几个问题来概要了解f2fs,这几个问题包括:f2fs是什么?为何引入f2fs?f2fs如何工作?f2fs如何做到随机写入顺序化?f2fs如何解决雪崩问题?2. f2fs是什么?F2FS (Flash Friendly File System) 是专门针对SSD、eMMC、UFS等闪存设备设计的文件系统。基于LFS,同时解决了LFS的一些问题。由三星工程师Jaegeuk Kim于2012年10月发布到Linux社区,并于2012年12月进入Linux 3.8 内核

2022-01-10 11:37:17 6327

翻译 Kprobe-based Event Tracing

前言本文是对内核文档 《Kprobe-based Event Tracing》的翻译和整理。kprobe可以在except those with __kprobes/nokprobe_inline annotation and those marked NOKPROBE_SYMBOL的任何函数设置trace event。使用前需要打开内核选项:CONFIG_KPROBE_EVENTS=y.可以通过/sys/kernel/debug/tracing/kprobe_events来增加kprobe跟踪点,

2022-01-04 14:43:04 482

原创 trace系列0 - 概述

1.前言本文主要是根据阅码场 《Linux内核tracers的实现原理与应用》视频课程在aarch64上的实践。这是整个系列文章的第一篇,本篇主要解决如下几个问题:ftrace是什么?ftrace框架包含哪些tracer?这些tracer的基本使用方法有哪些?kernel版本:5.10平台:arm642. ftrace是什么?ftrace是一个内核跟踪工具,旨在帮助系统开发人员和设计人员了解内核内部的情况。从2008年由Steven Rostedt 开发并在合并到2.6.27主线内核,

2021-12-31 15:31:35 1321

转载 Node.js简介

1. 前言Node.js 是一个开源和跨平台的 JavaScript 运行时环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。Node.js = 运行环境+ JavaScript库.2. npmNPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:允许用户从NPM服务器下载别人编写的第三方包到本地使用。允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。允许用户将自己编写的包或命令行

2021-12-21 09:52:46 122

转载 Android 显示系统(文章综述)

1. CPU 与 GPU 职责对比GPUResterization 栅格化是绘制那些 Button,Shape,Path,String,Bitmap 等组件最基础的操作。它把那些组件拆分到不同的像素上进行显示。这是一个很费时的操作,GPU 的引入就是为了加快栅格化的操作。CPUCPU 负责把 UI 组件计算成 Polygons,Texture 纹理,然后交给 GPU 进行栅格化渲染2. Android 渲染机制Android 系统采用一种称为 Surface 的 UI 架构为应用程序提供用

2021-12-07 17:13:12 863

翻译 提问的智慧(学习笔记)

先尝试google精确的描述问题并言之有物仔细、清楚地描述你的问题或bug的症状。描述问题发生的环境(机器配置、作业系统、应用程式、以及相关的资讯),提供经销商的发行版和版本号(如:Fedora Core 4、Slackware 9.1等)。描述在提问前你是怎样去研究和理解这个问题的。描述在提问前为确定问题而采取的诊断步骤。描述最近做过什么可能相关的硬体或软体变更。尽可能的提供一个可以重制这个问题的既定环境的方法尽量去揣测一个黑客会怎样反问你,在他提问的时候预先给他答案。如果还是搞不懂

2021-11-27 16:25:34 862

原创 git学习笔记

1. 概述2.几种版本控制系统本地版本控制系统集中版本控制分布式版本控制3. git的诞生2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了免费使用 BitKeeper 的权力。速度简单的设计对非线性开发模式的强力支持(允许上千个并行开发的分支)完全分布式有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)4. git的特点直接记录快照,而非差异比较近乎所有操作都是本地执行时刻保持数据完整

2021-11-25 17:38:42 867

空空如也

空空如也

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

TA关注的人

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