登录社区云,与社区用户共同成长
邀请您加入社区
Arm Performix 是面向 Arm 平台的一体化性能工具链:主机侧 GUI + CLI(apx),目标侧轻量 agent 与采集器,把 PMU/SPE、/proc、strace、微基准等数据统一转成 parquet/CSV,再由 DuckDB 渲染时间线、火焰图、Top-down 与热图。本文从设计目标、核心机制、数据模型、代码框架到接入与运维逐层拆解。
最早期的计算机,程序是打在卡片上的,CPU 读一张卡片执行一条指令,效率极低。后来有了内存,程序要先加载到内存再执行,也就是 “存储程序” 概念,这才开启了操作系统的发展。1. 单道编程的内存管理2. 多道编程的内存管理:解决 “同时跑多个程序” 的问题为了提升资源利用率,出现了。
在 ARM 体系里,中断属于。中断的作用是让 CPU 能够响应外部设备的请求,比如键盘按下、网卡收到数据、定时器到期。有了中断,CPU 就不必轮询等待设备状态,可以专心执行当前任务,设备有事时再“打断”它,从而大幅提升系统效率。小细节:引脚名前面的n表示“低电平有效”,也就是信号拉低才表示触发中断。I=1I=0F=1F=0操作系统里的,本质上就是通过修改 PSTATE 的 I 位来开关中断。现代
内核模块卸载是 “校验 - 清理 - 回收” 的闭环:4.校验层:确保模块无依赖、无引用、状态合法;5.清理层:执行模块自定义卸载逻辑 + 内核自动资源清理;6.回收层:释放内存、移除模块控制结构,彻底脱离内核管理。
事实上,在编译内核模块时,就算make命令没带CROSS_COMPILE=参数,M=参数肯定是必须带的。我们很难保证M参数里面没有s这个字符。在这句命令中,“driver_test”就含有s字符,所以就会触发安静模式。编译内核模块时,只显示最底部的Error,不显示任何C语言的错误信息。编译通过了,CC MODPOST LD等字样也能正常显示了。注释掉内核根目录的Makefile文件里面的下面三句
在运行时添加 / 删除的代码Linux支持在系统启动和运行时从内核中动态的插入或移除代码。在运行时添加/删除的代码叫做内核模块。Linux内核模块通过向内核引入新的功能(安全、设备驱动、文件系统驱动、系统调用、其他)来动态的扩展内核的功能。模块化的方法,像正在运行的内核的插件。嵌入式Linux系统可以由最小的基本内核镜像 + 可选的设备驱动/其他功能通过模块插入按需提供例如一个热拔插的USB设备,
Linux内核是Linux操作系统的核心代码,它主要负责和硬件打交道,主要实现资源调度、内存管理、存储管理、进程管理、文件系统、设备驱动、网络通信、系统调用等功能。本节将介绍如何下载和编译Linux内核源码并将其移植到Qemu虚拟开发板上跑起来。
modinfo命令用于显示Linux内核模块的详细信息。它提供了关于模块的作者、描述、许可证、依赖关系以及其他相关信息的概述。通过modinfo命令,用户可以获取有关特定内核模块的更多信息,以便更好地了解和管理系统中的模块。
参照博文(一般厂家会给到这样的操作手册,没有就凉凉了,玩不了):http://nicekwell.net/blog/20171108/shu-mei-pai-nei-he-kai-fa-shuo-ming-xia-zai-dai-ma-bian-yi-ti-huan-nei-he.html前提:交叉编译工具要先安装好,因为内核配置全部在宿主机ubuntu下完成的,必须要有交叉编译工具。1.打包zI
uboot将控制权交给 kernel,kernel入口为 stext,主要完成验证是否支持此 CPU、验证 uboot 传入的设备树(dtb)合法性、使能 MMU 等工作,最终会调用 C 函数 start_kernel()相当于内核的 main 函数,内核的生命周期就是从执行这个函数的第一条语句开始的,直到最后一个函数 reset_init(),内核将不再从这个函数中返回。本文详解了kernel启
uboot启动Linux内核uImage卡在Starting kernel
但是当需要申请连续物理内存页框的时候,随着进程的对内存的申请和释放,系统的内存会不断的区域碎片化,分页机制就不一定能保证有足够的连续物理内存页了。当回收一个内存块,会将该内存块插入到对应的链表中,然后查询其buddy内存块是否也在链表上,如果是则合并两个内存块,然后插入到大一级的内存块链表中。如果大一级的内存块链表中没有空闲内存块,则会向更大的内存块链表中查找,然后一层层二分下来,分到合适大小后分
CPU访问外设的数据寄存器和状态寄存器时,也是需要将寄存器的值映射到内存上进行读写,外设寄存器的值由硬件修改,也可以由CPU读写,因此外设和CPU对寄存器映射的内存访问也是异步的。在没有写回之前,核心B的cache中的同个数据还没改,当B去访问它时则会与A不一致。因为DMA是直接内存访问,对内存的访问不需要经过CPU,因此如果DMA修改了内存上的CPU访问过的数据,而CPU的cache中并不知道内
在 32 位操作系统,因为进程最大只能申请 3 GB 大小的虚拟内存,所以直接申请 8G 内存,会申请失败。在 64 位操作系统,因为进程最大可以申请 128 TB 大小的虚拟内存,即使物理内存只有 4GB,申请 8G 内存也是没问题,因为申请的内存是虚拟内存。如果这块虚拟内存被访问了,要看系统有没有 Swap 分区:* 如果没有 Swap 分区,因为物理空间不够,进程会被OOM机制杀掉
分段和分页的工作方式相似,都是非连续存储。分段的逻辑地址=段号+段内偏移。段表存放段描述符。段描述符=段基址+段界限。物理地址=段基址+段内偏移。分页的虚拟地址=页号+页内偏移。页表存放页面映射。页面映射=虚拟页号+物理页号。物理地址=物理页号+页内偏移。
使用malloc时,会从两个区分配内存,分别是 文件映射区 和 堆区。当申请的内存小于 128K 时,会通过 brk() 系统调用,从堆区分配内存。当申请的内存大于 128K 时,会通过 mmap() 系统调用,从文件映射区分配内存。下面讲两种分配方式的区别。
为什么要有虚拟内存?1. 让每个进程都有独立的内存空间,每个进程都有自己的私有页表,提供一个可以执行多进程的环境。2. 利用程序运行局部性原理,允许进程的内存空间超过物理内存大小。3. 页表中维护着页的权限属性,使内存访问更安全。
内容全部来自韦神《嵌入式Linux应用开发完全手册》在上一篇的Linux内核学习(三)Bootloader的特种兵-Uboot(一)中我们学习了关于Uboot的介绍、源码结构以及配置和编译的过程,到这一章我们来看看U-Boot的启动过程源码的分析。很多的时候会把系统文件那些放在flash,然后运行的时候加载到内存中,然后启动。这个加载的过程就是需要UBOOT来完成。那Uboot本身的位置放在哪里呢
Linux驱动之Linux内核定时器与应用层ioctl的应用
ftrace最早出现在Linux2.6.27版本中,其设计目标简单,基于静态代码插桩技术,不需要用户通过额外的编程来定义跟踪行为。(打桩这个根据字面意思就知道是打标记点,然后将标记点连接操作,形容出轨迹)静态代码插桩技术比较可靠,不会因为用户的不当使用而导致内核崩溃。ftrace的名字由functiontrace而来,它利用gcc编译器的profile特性在所有函数入口处添加了一段插桩代码,ftr
前言偶然间,发现了一个很好用的仓,可以十分方便地进行 arm 架构的 linux 内核调试,该仓地址如下 https://github.com/cc-droid/v-kernel-qemu ,对应的解析视频在 《linux内核源码分析 【0-00】从零搭建分析调试环境》本篇笔记旨在记录一下对于该仓的使用流程,并且对其进行了一些小调整环境搭建Ubuntu安装VMware + Ubuntu20.04
ARM-Linux内核知识点文章目录ARM-Linux内核知识点前言一、概述二、ARM-Linux内核的主要架构及功能三、Linux内核源码目录结构四、ARM-Linux进程管理五、进程的创建六、进程、线程和内核线程七、进程的执行(exec函数族)八、总结构图前言这方面的知识点是计科有别于软件工程专业的知识,偏向计算机底层知识,也偏向硬件方面,本次参考教科书是《嵌入式系统设计与应用》。一、概述Li
全局变量rctree:= $(if $(KBUILD_SRC),$(KBUILD_SRC),$(CURDIR))objtree:= $(CURDIR)src:= $(srctree)obj:= $(objtree)VPATH:= $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))export srctree objtree VPATH体系架构相关变
在实际需要某个虚拟内存区域的数据之前,虚拟和物理内存之间的关联不会建立。如果进程访问的虚拟地址空间部分尚未与页帧关联,处理器自动地引发一个缺页异常,内核必须处理此异常。缺页处理的实现因处理器的不同而有所不同。由于CPU采用了不同的内存管理概念,生成缺页异常的细节也不太相同。因此,缺页异常的处理例程在内核代码中位于特定于体系结构的部分。1.缺页异常CPU通过地址总线可以访问连接在地址总线上的所有外设
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、内核模块二、.ko文件说明1.引入库三、如何编译和加载内核文件四、实验2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:开发环境硬件开发板imx6ull内核uboot文件系统提示:以下是本篇文章正文内容,下面案例可供参考一、内核模块示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务
1.将驱动框架复制到drives下的char文件夹中,因为IO属于字符设备目录。2.修改char文件夹下的Makefile添加如下代码obj-m+= pin4drivers.opin4drivers为文件名3.在Makefile文件中指定用-m方式编译,接下来执行make modulesARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kerne
分析完uboot启动流程,该篇分析bootz启动linux内核。如下图所示,bootz 命令的执行函数为 do_bootz,主要分为三个阶段:①bootz_start;②bootm_disable_interruptes;③do_bootm_states。1、bootz_start函数bootz_start()主要分为四个阶段:① do_bootm_states();② images->ep
对于arm,驱动gpio步骤大概如下;a) 得到gpio编号b) 管脚复用;c) 输入输出选择d) 若是输出, 输出值是0还是1;1. linux驱动写法#include <linux/gpio.h>#define GPIO_POWER_EN33//gpio4_1gpio_request(GPIO_POWER_EN,"GPIO_POWER_EN"); //申请gpiogpio_dire
Linux内核协议栈中一些关于 TCP MSS 的细节https://switch-router.gitee.io/blog/tcp-mss/为什么会有MSS(Maximum Segment Size) 这种东西呢?我们知道网络报文在线缆中以是有长度限制的,比如标准的以太网接口能允许通过的以太帧长度上限是 1518 字节。超过了这个长度的数据必然会被分成多个报文发送,这个工作 IP 层可以做,也就
文章目录????中断的概念????中断下半部tasklet????tasklet_struct结构体的定义????使用tasklet⌛销毁tasklet(下半部)⚡️实战篇:重点代码分析♐终极篇: 完整代码演示????中断的概念中断是整个系统的核心,用来事件的切换或者响应。在Linux内核下又分为上半部中断和下半部中断,他们都遵循以下两个规律。① 不能嵌套;② 越快越好。在上半部处理紧急的事情,在
ARM64架构基础知识
Linux内核配置及编译解压内核建立源码目录该目录下以patch结尾的文件为ST官方提供的补丁文件,linux-5.4.31.tar.xz为标准linux源码包。解压标准内核源码包
arm
——arm
联系我们(工作时间:8:30-22:00)
400-660-0108 kefu@csdn.net