自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(329)
  • 资源 (9)
  • 收藏
  • 关注

原创 (一文了解)linux性能分析之CPU篇

目录前言一、CPU 性能指标1、CPU使用率2、负载均衡3、上下文切换4、CPU缓存命中率二、常用工具1、uptime2、vmstat3、mpstat4、top5、sar6、pidstat7、cat /proc/sotfirqs三、分析CPU性能瓶颈方法分析举例四、性能调优1,编译器选项2、进程绑定3,独占CPU组前言本文介绍linux性能优化CPU相关的知识点,首先介绍了CPU相...

2022-04-10 14:51:55 9087 9

原创 linux内核源码分析系列文章汇总

进程,驱动、中断、文件系统、优化、网络、内存专题

2022-04-09 11:53:45 7178 4

原创 linux内核源码之设备驱动系列文章汇总

1、linux 字符设备驱动实战2、linux LED设备驱动文件3、linux 设备树(.dts)实战解析4、linux 使用设备树点亮LED 实战5、linux 驱动中并发与竞争6、linux 内核定时器7、linux 内核中断理解8、linux驱动阻塞和非阻塞9、 linux 内核异步通知10、linux platform设备驱动11、Linux 内核自带的 LED 灯驱动12、linux MISC设备驱动13、linux input子系...

2022-04-09 11:39:31 2720

原创 ss524 硬件板,SD卡插拔时串口没有反应的问题定位

int ret;{},#endif。

2024-04-05 06:30:00 232

原创 ubi文件系统挂载

在此之前一直挂载不上,没有提示错误一直以为内核已经给配置好,少配置了第二项。配置linux内核选上。

2024-04-04 21:07:26 327

原创 ACM linux 驱动验证

1、load kousbcore.kocdc-acm.koIn the。

2024-04-04 21:06:00 993

原创 udhcpc 获取不到ip地址

usr/share/udhcpc 目录下文件。/etc/udhcpc 目录下文件。resolv.conf 文件内容。配置文件参考busybox。文件系统的目录以及文件。

2024-04-03 00:15:28 159

原创 mt7601 kernel 4.19内核版本使用iw,以及交叉编译后使用iwpriv

/os/linux/Makefile.6文件: 添加 EXTRA_CFLAGS += -Wno-incompatible-pointer-types -Wno-date-time。看下iwpriv与iwconfig的源码区别,左侧为iwconfig ,没有用到ioctl,右侧为iwpriv。1、init_timer kernel 4.19内核版本API已经改变,使用timer_setup。使用iwpriv 提示如下,iwpriv工具无法使用了,而iwconfig可以使用。makefile的修改。

2024-04-03 00:09:56 720

原创 pppd-2.4.7交叉编译问题 undefined reference to `setkey‘

运行pppd call gprs-dial时 提示chat 不支持参数 -f ,这个chat 是busybox编译出来的,可能版本的问题参数有变,在menuconfig中没有找到chat的说明;想单独编译chat.于是找到pppd2.4.7开发包。编译出错,其实错误是pppd的错误,而chat已经编译出来。1、pppcrypt.c找不到setkey ,在makefile中添加ssl的lib库。这两个提示正式解决问题的方法,在.c文件找到对应的行替换函数即可。3、在错误提示之前有两行提示。

2024-04-02 23:45:47 155

原创 linux kernel 物理内存概述 (八)bootmem引导内存分配

memblock_alloc 负责分配内存,把主要工作委托给函数 memblock_alloc_range_nid。memblock_add: 添加新的内存块区域到 memblock.memory 中。memblock_remove: 删除内存块 区域。,每个内存节点有一个bootmem_data实例。memblock 分配器对外提供的接口如下。memblock_alloc: 分配内存。memblock_free: 释放内存。

2024-03-08 23:08:25 470

原创 编译内核错误 multiple definition of `yylloc‘

解决方法,在以下文件添加extern。

2024-03-08 22:42:02 547 1

原创 linux kernel物理内存概述(七)

使用比页小的内存,内核的处理方式使用fork 内核需要使用task_struct专属的slab对象池分配task_struct对象为进程创建虚拟内存空间是,内核使用mm_struct专属的slab对象池分配mm_struct对象。向高速缓存page cache查找对应的文件缓存页时,内核需要使用struct page专属的slab对象池分配使用open打开文件时,内核需要使用struct file 专属的slab对象池分配 struct file对象socket对象。

2024-03-08 22:38:25 1029

原创 linux kernel物理内存概述(六)

伙伴必须是大小相同并且在物理上连续的两个或者多个页。

2024-03-05 20:33:21 457

原创 linux kernel物理内存概述(五)

物理内存分配步骤1、初始化,参数初始化2、内存充足,快速分配3、内存压力大,慢速分配4、内存紧张,内存规整,

2024-03-05 20:05:43 1130

原创 linux kernel物理内存概述(四)

first_zoneslist() 以GFP_KERNEL为例,gfp_zone(GFP_KERNEL)返回1,即highest_zoneidx=1,第一个zone是ZONE_NORMAL,其zone_idx=1 for_each_zonelist_nodemask() 会遍历ZONE_NORMAL和ZONE_DMA32。每个内存节点在内核中抽象成一个zone,zone划分为多个区域,如ZONE_DMA,ZONE_DMA32,ZONE_NORMAL等。alloc_pages函数分析 ...

2024-03-05 07:00:00 330

原创 linux kernel物理内存概述(三)

free_low_memory_core_eearly函数,通过for_each_free_mem_range遍历所有内存块,找出内存块的起始地址和结束地址。内核中计算线性映射的物理地址和虚拟地址的转换关系 线性映射的物理地址 = vaddr - PAGE_OFFSET + PHYS_OFFSET。CONFIG_ARM64_VA_BITS设置48,那么PAGE_OFFSET的值为0xFFFF 8000 0000 0000。在内核启动时,DDR大小,内存起始地址和内核空间内存布局,以及映射关系。

2024-03-04 20:49:07 891

原创 linux kernel物理内存概述(二)

dts文件的解析 start_kernel->setup_arch->setup_machine_fdt->early_init_dt_scan_nodes->early_init_dt_scan_memory。在内核使用之前,需要初始化内核页表,paging_init 函数完成,主要做两次映射,map_kernel与map_mem。对页表的初始化完成后,内核可以对内存进行管理,内核采样zone管理区来管理。都是建立物理地址到内核虚拟地址的线性映射,但映射的地址不一样。

2024-03-04 20:44:30 1384

原创 linux kernel物理内存概述(一)

编程接触内存使用malloc C函数库申请,此函数申请的是虚拟内存,要了解虚拟内存,需要了解MMU,页表、物理内存、物理页面、映射关系、按需分配、缺页中断、写时复制等;当了解MMU时,除了要了解MMU工作原理外,还需要了解Linux内核如何建立页表映射,用户空间页表的建立和内核空间页表的建立,以及内核是如何查询页表和修改页表当了解物理内存和物理页面时,接触数据结构pglist_data,zone,page,这三个数据结构描述了系统中物理内存的组织架构。

2024-03-04 20:08:58 732

原创 linux每处理器内存分配

分配图的初始状态,第一项存放第一个小块的偏移0,空闲,第二项存放单元的结束标记,偏移单元长度pcpu_unit_size,最低位被设置;最小单元长度 min_unit_size = size_sum,并且不允许小于宏PCPU_MIN_UNIT_SIZE 值是32KB。分配长度 alloc_size = min_unit_size向上对齐到原子长度的整数倍,原子长度是页长度;,放在每个小块的偏移和分配状态,使用最低位表示小块的分配状态;块的状态,每个单元中偏移0,长度32字节的小块被分配出去;

2023-09-28 08:20:49 1206

原创 linux缓存-利用缓存提高性能的编程技巧

4、以两个下划线开头的宏__cacheline_aligned_in_smp: 在对称多处理器系统中等价于宏__cacheline_aligned, 在单处理器系统中是空的宏。2、以四个下划线开头的宏____cacheline_aligned_in_smp:在对称处理器系统中等价于宏____cacheline_aligned,在单处理器中是空的宏。以两个下划线开头的宏_cacheline_aligned: 对齐到一级缓存行的长度,并且把变。

2023-09-28 07:44:00 961

原创 linux内核中CMA内存分配

当设备驱动需要使用的时候,把已经分配的页迁移到其他地方,形成物理连续的大内存块。CONFIG_CMA_SIZE_SEL_PERCENTAGE 表示指定物理内存容量的百分比,默认使用指定兆字节数的方式;当设备驱动程序需要使用CMA区域的时候,如果CMA区域的物理页已经被页分配器分配出去,需要把物理页迁移到其他地方。全局CMA区域是由所有设备共享的,设备私有CMA区域由指定的一个或多个设备驱动使用。当设备驱动程序不使用CMA区域的时候,内核的其他模块可以借用CMA区域的物理页,

2023-09-28 07:39:40 1734

原创 地址空间标识符ASID

处理器给进程分配ASID时,如果ASID分配完了,那么把全局ASID加1,重新从1开始分配ASID,针对每个处理器,使用该处理器的reserved_asids保存该处理器正在执行的进程的ASID,并且把该处理器的active_asids设置0。1、如果进程的ASID与全局ASID版本号相同,那么调用函数atomic64_xchg 把当前处理器的active_asid设置成进程的ASID,并且返回active_asids的旧值。进程数量超过255,两个ASID可能相同,内核引入版本号,解决。

2023-09-18 21:35:05 966

原创 物理内存分配

4)低端内存区域水线= min_free_pages * zone->managed_pages/lowmem_pages 即把min_free_pages按比例分配到每个低端内存区域;根据物理内存功能不同,将 NUMA 节点内的物理内存划分为:ZONE_DMA,ZONE_DMA32,ZONE_NORMAL,ZONE_HIGHMEM 这几个物理内存区域。ALLOC_HIGH gfp_t掩码设置__GFP_HIGH时才有作用,表示当前内存分配请求是高优先级的,不允许失败,可以从紧急预留内存中分配。

2023-09-18 21:31:49 1719

原创 linux内存概念理解

1)不连续页分配器提供了分配内存的接口vmalloc和释放内存的接口vfree.在内存碎片化的时候,申请连续物理页的成功率很低,可以申请不连续的物理页,映射到连续的虚拟页。4、固定映射区域的范围[FIXADDR_START,FIXADDR_TOP),长度是FIXADDR_SIZE,结束地址是FIXADDR_TOP = (PCI_IO_START-2MB)7、KASAN (动态的内存错误检查工具)影子区域的起始地址是内核虚拟地址空间的起始地址,长度是内核虚拟地址的1/8。通常把文件映射的物理页称为文件页。

2023-09-12 12:53:16 759

原创 linux内核源码分析之物理内存

当剩余内存在WMARK_MIN,WMARK_LOW时,说明内存有压力,但能满足进程此时的内存分配要求,当给进程分配好后,会唤醒kswapd进程开始回收内存,直到剩余内存在WMARK_HIGI之上。GFP_HIGHUSER 给用户空间分配高端内存,因为在用户虚拟内存空间中,都是通过页表来访问非直接映射的高端内存区域,所有用户空间一般使用的是高端内存区域ZONE_HIGHMEM。WMARK_MIN(页最小阈值), WMARK_LOW (页低阈值),WMARK_HIGH(页高阈值)。

2023-09-11 21:52:46 1679

原创 linux内核源码分析之虚拟内存

linux内核虚拟内存一览

2023-09-11 21:39:02 1837

原创 查询与进程调度(CFS)相关信息

进程的nice值,优先级,调度策略,vruntime等信息。在proc目录下,以下是查询147号进程的调度信息。先执行 echo 1 > /proc/sys/kernel/sched_schedstats。调度相关的统计 需要配置CONFIG_SCHEDSTATS。再次查看,多出来好多statistics信息。

2023-03-06 22:16:15 574 1

原创 linux内核调度问题分析

假如内核只有3个线程,线程0创建线程1和线程2.当系统时钟到来时,时钟中断处理函数会检查是否有进程需要调度。当有进程需要调度时,调度器会选择线程1或者线程2。start_kernel运行在线程0里,线程0创建线程1和线程2。函数调用关系start_kernel()->kernel_debug()->do_fork 创建新线程,并把新线程添加到调度器的就绪队列中。线程0创建线程1和线程2后,进入while线程,线程0不会退出,等待被调度出去。1、产生时钟中断。处理器采用定时器来周期性地执行。

2023-03-06 21:37:37 2251

原创 数据结构与算法—堆(heap)

然后用同样的方法比较。这就是从上往下的堆化方法。

2023-02-28 12:26:09 496 1

原创 数据结构与算法—二叉树(tree)

二叉查找树在频繁的动态更新过程中,可能会出现树的高度远大于logn的情况,从而导致各个操作的效率下降。2、使用数组的顺序存储法,(左子节点 2*i 右子节点 2*i+1 仅仅浪费了下标为0的存储位置)树的任意一个节点,左子树的值小于这个节点的值,而右子树的值,大于这个节点的值。红黑树的高度近似2logn,比AVL树高度大了一倍,在性能上下降并不多。: 左节点

2023-02-28 12:25:58 339

原创 数据结构与算法—散列表

工业级散列表的特性1,支持快速插入语、删除查找2、内存占用,不能浪费过多内存;3、稳定性,极端情况下的退化实现散列表1、设计合适的散列函数2、定义装载因子阈值,并支持动态扩容3、选择合适的散列冲突解决方法。

2023-02-27 09:32:21 374

原创 在shell中执行一条可执行程序(./a.out) 系统执行的过程

shell 运行test程序,调用fork()系统调用函数来创建一个新进程;分析在命令行下使用./test程序。程序在用户态和内核台中运行的流程。调用exec系统调用函数来装载test程序。do_fork ->新进程。

2023-02-27 09:24:55 913

原创 数据结构与算法—跳表(skiplist)

二分查找用的数组链表可不可以实现二分查找呢?

2023-02-26 14:42:53 1279

原创 数据结构与算法—二分查找

某个给定值的元素。通过二分查找,找到最后一个起始IP小于等于这个IP地址区间,然后,检查这个IP是否在这个IP区间内,如果在,就取出对应的归属地显示,如果不在则返回没找到。二分查找能解决的问题,大部分倾向于用散列表或者二叉查找树。即使二分查找在内存使用上更节省,但毕竟内存如此紧缺的情况并不多。二分查找更适合在“近似”查找问题,如二分查找的变体边界查找的处理。如果用散列表、二叉树、比较难实现。

2023-02-26 09:15:45 431

原创 数据结构与算法—递归recursion

最大深度比较小,如10,50,这样,否则警惕使用递归。因为当前线程剩余的栈空间大小事先无法计算,如果实时计算,代码过于复杂,影响可读性。避免重复计算,可以使用一个数据结构(如散列表)来保存已经求解过的f(k),当递归遇到f(k)时,先看是否已经求解过了,避免重复计算。现象,在递归实现时,如f(6) = f(5)+f(4);f(5)=f(4)+f(3),这样f(4)两次计算。递归调用一次就会在内存栈中保存一次现场数据,在分析递归代码空间复杂度时,需要额外考虑这部分开销。递归,函数调用的数量较大时,非常耗时。

2023-02-26 09:13:23 502

原创 数据结构与算法—队列queue

数组实现,队列大小有限,响应时间相对合理。链式实现,可能有更多的请求排队等待,请求处理响应时间过长,针对时间比较敏感的系统,链式不太合适。在循环队列、阻塞队列、并发队列,在底层系统、框架、中间件开发,起到至关重要的作用。队列为空的时候,从队头取数据会被阻塞,没有数据可以获取,知道队列中有数据才能返回;在多线程情况下,会有多个线程同时操作队列,这时要考虑线程安全问题。基于数组的循环队列,利用CAS原子操作,高效实现并发。如果队列满,插入数据操作会被阻塞,直到有空闲位置再插入,然后返回。2)尾指针,指向队尾;

2023-02-25 09:36:54 433

原创 数据结构与算法—栈stack

所以根本上,只要能保证每进入一个新的函数,都是一个新的作用域就可以。在进入被调用函数的时候,分配一段栈空间给这个函数的变量,在函数结束的时候,将栈顶复位,正好回到调用函数的作用域内。其实,我们不一定非要用栈来保存临时变量,只不过如果这个函数调用符合后进先出的特性,用栈这种数据结构来实现,是最顺理成章的选择。出栈和入栈只需要两个临时变量存储空间,空间复杂度O(1),存n个数据,不能说时间复杂度O(n),因为n个空间是必须的。从操作数中取出两个数,进行计算,计算后再将结果压入操作数栈,继续比较。

2023-02-25 09:28:42 393

原创 数据结构与算法—链表list

链表,一种提高数据读取性能的技术,在硬件设计、软件开发中有广泛应用。常见CPU缓存,数据库缓存,浏览器缓存等。而且链表的删除,插入导致内存申请和释放,容易造成内存碎片。数组缺点,系统没有足够的连续空间,导致内存不足。数组申请时大小固定,如果不够用,不支持动态扩容。维护一个链表,越靠近尾部节点,是越早之前访问。有新数据访问时,从链表头开始顺序遍历链表。,预读数组中的数据,访问效率更高。而链表在内存中并不是连续存储,没法预读。数组与链表的对比,并不能局限于时间复杂度。数组简单易用,在实现上使用连续的内存空间,

2023-02-24 21:00:34 560

原创 数据结构与算法—数组array

删除优化:避免每次搬移数据,可以先记录已经删除的数据位置,当数组空间不足时,再出发一次真正删除,减少搬移次数。在尾插入,O(1),如果在头插入,所有的数据都需要移动一位。数组越界,数组大小3,a[0],a[1],a[2]。a[3]是错误的,并且编译器不报错。数组查找的时间复杂度不是O(1),即使排序好的数组,二分查找,复杂度O(logn)用一组连续的内存空间,来存储一组具有相同类型的数据。业务开发,直接使用容器,省时省力。如果 底层开发,性能优化要做到极致,数组优于容器。非线性表,二叉树,堆,图等。

2023-02-24 20:59:06 486

原创 linux内核—启动程序

在shell中执行./a.out程序的时候,内核是如何执行的?//父进程else if(ret == 0)//子进程execve()else//失败shell进程首先创建子进程,然后子进程装载程序a.out。

2023-02-21 10:56:37 1255 3

lora理论值计算,包括通信距离,待机时间等

lora理论值计算,包括通信距离,待机时间等

2021-12-08

lora_8.txt数据

源数据

2021-06-10

realtek.rar

realtek.rar

2021-06-08

openssl+libnl.rar

openssl+libnl.rar

2021-06-08

wpa_supplicant-2.7.tar.gz

wpa_supplicant-2.7.tar.gz

2021-06-08

iwlist_for_visteon-master.tar.bz2

iwlist_for_visteon-master.tar.bz2

2021-06-08

vixie-cron-4.1.rar

linux下 crond crontab 定时文件,源码

2021-03-03

mobilenet_ssd.zip

MobileNetSSD_deploy.prototxt,MobileNetSSD_deploy.caffemodel

2020-06-08

89C51单片机控制的1602液晶显示时间汇编程序

89C51单片机控制的1602液晶显示时间汇编程序

2014-04-13

空空如也

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

TA关注的人

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