- 博客(22)
- 资源 (5)
- 收藏
- 关注
原创 /proc/sys/vm/下各参数含义
o 适用场景:若 HugeTLB 页是“即时”分配的(例如未显式通过 nr_hugepages 分配,而是仅设置 nr_overcommit_hugepages,导致超额提交的 HugeTLB 页动态分配),需权衡内存节省与分配/释放 HugeTLB 页时的额外开销(比未优化时慢约 2 倍)。若线程频繁触发直接回收(allocstall)或 kswapd 过早休眠(kswapd_low_wmark_hit_quickly),可能表明 kswapd 为降低延迟所维护的自由页数过少,无法应对系统的分配突发。
2025-04-21 14:38:34
876
原创 Iotop使用
源码路径:https://github.com/Tomas-M/iotop#how-to-build-from-source (GitHub - Tomas-M/iotop: A top utility for IO)源码路径:https://invisible-island.net/ncurses/ncurses.html#download_ncurses。需要修改Makefile,然后需要将Ncurses的成果物放到iotop的跟目录。到板子上的/usr/share/terminfo/v/目录下。
2024-11-11 19:57:58
670
原创 VMEMMAP分析
如下图,第二种已经被sparsemem淘汰了vmemmap是内核中page 数据的虚拟地址。针对sparse内存模型。内核申请page获取的page地址从此开始综上所述,vmemmap就是针对sparse内存模型管理page的一种技术,使用虚拟映射的内存映射来优化pfn_to_page和page_to_pfn操作。
2024-09-06 18:15:40
1402
原创 Linux之slub分配器分析
简要分析下这个图:kmem_cache是一个cache_chain的链表,描述了一个高速缓存,每个高速缓存包含了一个slabs的列表,这通常是一段连续的内存块。存在3种slab:slabs_full(完全分配的slab),slabs_partial(部分分配的slab),slabs_empty(空slab,或者没有对象被分配)。slab是slab分配器的最小单位,在实现上一个slab有一个或多个连续的物理页组成(通常只有一页)。
2024-03-15 14:01:20
1611
1
原创 linux MTD子系统分析
Nand Flash,每一个页,对应一个空闲区域(OOB),这个区域是基于Nand Flash的硬件特性,数据在读写的时候容易出错,为了保证数据的正确性,就产生了这样一个检测和纠错的区域,用来放置数据的校验值。OOB的读写操作,一般都是随着页的操作一起完成,也就是在读写页的时候,对应的OOB就产生了。
2024-02-27 19:40:33
2295
1
原创 Linux之伙伴系统分析
伙伴系统是内核中用来管理物理内存的一种算法,我们知道内存中有一些是被内核代码占用,还有一些是被特殊用途所保留,那么剩余的空闲内存都会交给内核内存管理系统来进行统一管理和分配。内核中会把内存按照页来组织分配,随着进程的对内存的申请和释放,系统的内存会不断的区域碎片化,到最后会发现,明明系统还有很多空闲内存,却无法分配出一块连续的内存,这对于系统来说并不是好事。而伙伴系统算法就是为了缓解这种碎片化。
2024-01-06 14:52:21
2013
1
原创 Linux FS文件夹下函数分析
一、从系统调用开始linux系统通过向内核发出系统调用(systemcall)实现了用户态进程和硬件设备之间的大部分接口。系统调用是操作系统提供的服务,用户程序通过各种系统调用,来引用内核提供的各种服务,系统调用的执行让用户程序陷入内核,该陷入动作由swi软中断完成。在/kernel/kernel_sdk/arch/arm/kernel/entry-common.S中可以找到关于swi中断的入口,具体源码不进行分析,总之该中断实现对“现场”进行保护最后进行返回,我们只关注其查找系统调用表并调用的过程。如
2023-11-30 11:18:59
1455
1
原创 linux之内存分析
MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。物理地址:(英语:physical address),也叫实地址(real address)、二进制地址(binary address),它是在地址总线上,以电子形式存在的,使得数据总线可以访问主存的某个特定存储单元的内存地址。虚拟地址:虚拟地址是相对于物理地址来说的。
2023-08-30 16:38:18
1871
1
原创 用VSCODE看linux内核代码
其实本质上是因为内核代码太多导致,二实际上我们在看内核代码时很多是不需要的。因此作为VSCODE 单推人,是时候解决如上问题了,思路就是make工具在make源码时会自动根据makefile找到需要的文件,所以只要能够修改make,只把需要的文件找出来,然后再搞个脚本,把需要的文件拷出来创建工作区,然后再看代码。就能解决上述各种问题如下为make源码下载地址。我这里使用的make4.4最新版源码进行修改。
2022-11-28 14:16:11
2323
原创 Linux之USB分析
一、USB概念概述USB1.0版本速度1.5Mbps(低速USB) USB1.1版本速度12Mbps(全速USB) USB2.0版本速度480Mbps(高速USB)。USB 分为主从两大体系,一般而言, PC 中的 USB 系统就是作主,而一般的 USB 鼠标, U 盘则是典型的 USB 从系统。下是简单的列出了 USB 设备类型,理想的情况 USB 系统要对这些设备作完整的支持,设备也必须符合 USB 规范中的要求。随着 USB 技术的发展, USB 系统中的一些不足也逐渐被承认, OTG
2022-03-11 16:04:10
19728
3
原创 UBI文件系统分析
UBI文件系统引言什么是UBIFS文件系统UBIFS是UBI file system的简称,用于裸的flash设备,作为jffs2的后继文件系统之一。UBIFS通过UBI子系统处理与MTD设备之间动作。UBIFS文件系统更适合MLCNAND FLASH。需要注意的是UBIFS并不是为SSD,MMC,SD,Compact Flash等之类的基于flash的存储设备,其是针对于裸flash设备。裸flash有以下特点:l 其包含的块被称为可擦除块,而对于SSD这类的设备,并无可擦除块的概念,取而代之
2021-09-02 11:15:15
5133
原创 基于单片机的差分升级
研究了几天发现不算困难。首先要了解一点就是,差分包的制作由 “差分算法” 计算 “diff” (差分后的数据) 然后根据 “压缩算法” 进行压缩,压缩后的数据文件即为 “patch” 即差分包。因为差分算法有开源的bsdiff,压缩算法也有开源的单片机就能用的,把这两个结合起来放单片机里就可以实现差分升级。由于上位机负责进行差分和压缩的操作,而上位机没有ram的限制,可以随意。因此只要解压缩和解差分在单片机中实现就可以了。如下图,对整个Flash分成3个区域。boot区:用于存放引导程序和解压,解差
2021-04-20 15:20:38
3027
8
原创 ucosiii输出CPU利用率和堆栈利用率
代码如下 需要开启统计任务并把OS_CFG_DBG_EN 置一效果如下:void CPUUsage (void){#if OS_CFG_DBG_EN > 0 CPU_STK_SIZE free; CPU_STK_SIZE used; OS_ERR err; CPU_SR cpu_sr = 0u; OS_TCB *p_tcb; CPU_CRITICAL_ENTER(); p_tcb = OSTaskDbgListPtr; CPU_CRITICAL_EXIT(); print
2020-12-21 15:35:16
1174
8
原创 基于内存池的动态内存分配(malloc)
源代码是原子哥的内存池动态内存分配,实际使用中发现分配速度不够快,因此优化了一下分配算法。在malloc.c中有两种分配的方式,屏蔽的那种在原子哥原有的基础上增加了内存块大小占用区直接跳过,这样遇到大块内存占用块可以一下子节约很多for循环的次数,很好理解,但是缺点是如果中间存在多个未利用区域也会浪费for循环的次数。第二种方式是先计算出需求的内存块大小,然后直接去找对应大小的块,往后推是否为全空。如果不全空,则在那个不空的基础上在向前偏移相应大小,依次计算,这种方法会比第一种更快的找出需求内存块。举
2020-12-21 14:33:20
702
原创 学习在单片机上使用C++(移植uCOSII)
移植uCOSII没什么难度,而且我使用的版本V2.92.08直接支持C++的扩展C声明,省了很多事。使用的开发板为复旦微(国产)FM33G048(M0+)实现的功能也很简单,点灯,和串口透传数据给NB模块Uart0接电脑波特率115200,然后通过Uart1转给NB模块(MN316,也是国产的,便宜),实现自动连接OneNet平台,并自动解析数据。新手代码写的可能不咋样,相互学习添加链接描述链接:https://pan.baidu.com/s/1zWxwJJgr8mZD0fFJTgsUHQ提取
2020-08-14 09:41:01
739
原创 Boot固化部分API函数
因为我现在使用的单片机使用了大量原厂提供的库函数和标准初始化例程,而这一部分例程很大程度上都是通用的,而且无论是在boot里还是APP1还是APP2都要调用这部分程序,那为什么不将这部分共用的程序都放在同一片FLASH里,通过某种方式统一调用呢?而实现这种方法的方式其实非常简单就是使用函数指针,只要函数指针指能够向对应API所在Flash的地址,就能实现相应的功能。具体方法如下:在boot中的某个位置固定好函数映射的地址表,然后再APP中调用/*boot中使用*/#if ThisBoot==1/*
2020-08-12 10:16:04
450
原创 学习在单片机上使用C++
编程环境为Keil,使用的单片机为FM33G048(m0+)工程需要如下配置,不要勾选MicroLIB建立好工程后,将全部的库函数改成xxx.cpp(其实不改应该也没事,库函数调用的xxx.h里已添加下列关键字)#ifdef __cplusplusextern "C" {#endif/*代码部分*/#ifdef __cplusplus}#endif然后将全部中断拿出来建立 it.cpp和it.h,并在it.h中按照上面的代码方式声明一下#ifndef __FM33G0XX_
2020-08-12 09:45:25
1959
单片机可用的差分升级及其算法(含上位机差分软件).7z
2021-04-26
FR6972_BootLoader_v1.05(远程升级).7z
2020-08-14
UCOS的相关学习资料和在官网下载的ucosii最新版的支持M0和M3核的代码
2020-08-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人