相信很多小伙伴都有类似这样的疑问,下面围绕Cortex-M、 ARM、 Linux来讲讲相关内容。
ARM 存储 体系 简介 : ARM 处理器分为三个等级, 处理器寄存器 -> TCM 存储器 -> 辅助存储器, 由上到下, 处理速度依次变慢, 但是存储空间依次增加 ;
目标: (1)创建Source Insight 工程,方便后面分析如何启动内核的 (2)分析uboot传递参数,链接脚本如何进入stext的 (3) 分析stext函数如何启动内核: (3.1
ARM7:ARMv4架构,ARM9:ARMv5架构,ARM11:ARMv6架构,ARM-Cortex 系列:ARMv7架构。 ARM7没有MMU(内存管理单元),只能叫做MCU(微控制器),不能运行诸如Linux、WinCE等这些现代的多用户多进程操作系统,因为运行这些系统需要MMU,才能给每个用户进程分配进程自己独立的地址空间。ucOS、ucLinux这些精简实时的RTOS不需要MMU,当然可以在ARM7上运行。 ARM9、ARM11,是嵌入式CPU(处理器),带有MMU,可以运行诸如Linux等多用户多进程的操作系统,应用场合也不同于ARM7。 到了ARMv7架构的时候开始以Cortex来命名,并分成Cortex-A、Cortex-R、Cortex-M三个系列。三大系列分工明确:“A”系列面向尖端的基于虚拟内存的操作系统和用户应用;“R”系列针对实时系统;“M”系列对微控制器。简单的说Cortex-A系列是用于移动领域的CPU,Cortex-R和Cortex-M系列是用于实时控制领域的MCU。 所以看上去ARM7跟Cortex-M很像,因为他们都是MCU,但确是不同代不同架构的MCU(Cortex-M比ARM7高了三代!),所以性能也有很大的差距。此外,Cortex-M系列还细分为M0、M3、M4和超低功耗的M0+,用户依据成本、性能、功耗等因素来选择芯片。 想必楼主现在肯定知道了ARM7、Cortex-M的区别,不过还是花了点时间整理在此,可以帮助后来的初学者搞明白这些基本的概念性问题。
STM32是一款单片机,它由意法半导体公司制造。ST是意法半导体的简称,M是指微控制器(也就是单片机的)MCU的第一个英文字母,32是指32位的CPU,它的CPU是采用的ARM公司的Cortex-M系列的内核设计。
从ARM32到ARM64不止将处理器从32位升级到了64位,还有许多性能的技术也得到了极大的提升,光是个头长了可不行啊!能耐也得跟着长啊!哈哈哈
通用操作系统,通常都会开启mmu来支持虚拟内存管理,而页表管理是在虚拟内存管理中尤为重要,本文主要以回答几个页表管理中关键性问题来解析Linux内核页表管理,看一看页表管理中那些鲜为人知的秘密。
前面Linux专题中关于Linux下系统编程总结了17篇博文,主要是为了提高Linux下的C编程应用能力,熟悉Linux编程应用环境,从此篇博文起开始Linux驱动的总结,后面计划加一些综合实践项目练习。
从启动引导程序 bootloader(uboot)跳转到 Linux 内核后,Linux 内核开始启动,今天我们分析一下 Linux 内核启动入口。
MMU概念介绍 MMU分为两个部分: TLB maintenance 和 address translation MMU的作用,主要是完成地址的翻译,无论是main-memory地址(DDR地址),还是IO地址(设备device地址),在开启了MMU的系统中,CPU发起的指令读取、数据读写都是虚拟地址,在ARM Core内部,会先经过MMU将该虚拟地址自动转换成物理地址,然后在将物理地址发送到AXI总线上,完成真正的物理内存、物理设备的读写访问。 下图是一个linux kernel系统中宏观的虚拟地址到物
其中,ARM7、ARM9、ARM9E和ARM10为4个通用处理器系列,每一个系列提供一套相对独特的性能来满足不同应用领域的需求。SecurCore系列专门为安全要求较高的应用而设计。
模块在加载时,会调用module_alloc()来申请一块内存来存放模块的内容,需要的大小如下:
上面代码中可以看到代码中向量表位于__vectors_start,它在arch/arm/kernel/vmlinux.lds中定义:
KSMA的全称是Kernel Space Mirror Attack,即内核镜像攻击。本文主要记录对该攻击方法的原理分析以及Linux内核中相关内存管理部分。
在学习嵌入式的路上,我们可能会接触到这两个比较典型的MCU。其中最大的区别就是S3C2440能跑linux操作系统,常常作为学习嵌入式linux的硬件平台。可能大家会问既然S3C2440能跑linux操作系统,似乎比stm32厉害多了,为什么不直接去学习S3C2440呢? 下面我就大概解释一下大家遇到的困惑:
经常看到一些博客在讲 Linux 内存的 PAGE SIZE 时,都会提到 Linux 默认页大小是 4KB。
操作系统用于处理内存访问异常的入口操作系统的核心任务是对系统资源的管理,而重中之重的是对CPU和内存的管理。为了使进程摆脱系统内存的制约,用户进程运行在虚拟内存之上,每个用户进程都拥有完整的虚拟地址空间,互不干涉。而实现虚拟内存的关键就在于建立虚拟地址(Virtual Address,VA)与物理地址(Physical Address,PA)之间的关系,因为无论如何数据终究要存储到物理内存中才能被记录下来。
我们经常可以看到初学者在单片机论坛中询问他们是否可以在他们微不足道的小的8位微机中运行Linux。这些问题的结果通常是带来笑声。我们也经常看到,在Linux论坛中,询问Linux运行的最低要求是什么。常见的答案是Linux需要一个32位架构和一个MMU(存储器管理单元),并至少1MB的RAM来满足内核的需求。
芯片复位后,将在异常向量表中复位向量的位置开始执行。复位操作的代码必须做以下事情:
ARM中的MMU就是内存管理单元,是Memory Management Unit的缩写,那这个东西主要是解决什么问题呢,MMU诞生的主要原因就是解决程序,数据、堆栈的总的大小大于实际的物理存储器介质的大小这个问题。比如程序运行需要2GB内存,而现在处理器可支配的实际物理内存只有1GB,那怎么办呢,那就将程序的2GB按照需求分时保留在内存中。
Kmalloc分配的是连续的物理地址空间。如果需要连续的物理页,可以使用此函数,这是内核中内存分配的常用方式,也是大多数情况下应该使用的内存分配方式。
最近一直在学习内存管理,也知道MMU是管理内存的映射的逻辑IP,还知道里面有个TLB。
随着linux的代码更新,阅读linux-4.15代码,从中发现很多与众不同的地方。之所以与众不同,就是因为和我之前从网上博客或者书籍中看到的内容有所差异。当然了,并不是为了表明书上或者博客的观点是错误的。而是因为linux代码更新的太快,网上的博客和书籍跟不上linux的步伐而已。究竟是哪些发生了差异了?例如:kernel image映射区域从原来的linear mapping region(线性映射区域)搬移到VMALLOC区域。因此,我希望通过本篇文章揭晓这些差异。当然,我相信不久的将来这篇文章也将会成为一段历史。
应用程序和驱动程序之间传递数据时,可以通过read、write函数进行。这涉及在用户态buffer和内核态buffer之间传数据,如下图所示:
本文以Linux3.14版本源码为例分析其启动流程。各版本启动代码略有不同,但核心流程与思想万变不离其宗。
ARM架构中的处理器核一般都没有I/O部件和模块,ARM架构处理器的I/O可通过AMBA总线来扩充。
因为嵌入式往往需要把程序放到板子上去运行,而再树莓派上做rt-thread开发调试的时候,通常有三种办法。
作者简介: 周文嘉: 曾服务于ARM、阿里系子公司、HTC等公司。10年以上工作经验,主要从事系统软件开发,涵盖:系统库开发、指令集优化、Linux内核开发等。累计为某些开源社贡献过一定数量的patch。 在 Linux 内核启动之后,对于 32 位的系统来说,他会把 0 ~ 896M 这部分低端内存(low memory)都做线性映射,不管这部分内存是否需要用到。对于 64 位的系统,内核会把所有的物理(一般情况如此,除非物理内存特别大)内存都映射出来。这么做的目的是啥?这里先说结论,然后分析代码。 这么
本系列将按照类别对题目进行分类整理,重要的地方标上星星,这样有利于大家打下坚实的基础。
Zircon 是 Google 新操作系统 Fuchsia 的内核,基于 LK - Little Kernel 演变而来。而 Little Kernel 前面一直作为 Android 系统的 Bootloader 的核心而存在。Zircon 在此基础上增加了 MMU,System Call 等功能。
从技术角度来说,一讲到TEE就会提到TrustZone,这是因为虽然TEE OS实现有多种多样,主芯片厂商也有好几种,但是大部分都是基于Arm的TrustZone架构。
对于 C/C++ 来说,程序中的内存包括这几部分:栈区、堆区、静态区 等,其中各个部分功能都不相同,比如函数的栈帧位于 栈区,动态申请的空间位于 堆区,全局变量和常量位于 静态区 ,区域划分的意义是为了更好的使用和管理空间,那么 真实物理空间 也是如此划分吗?多进程运行 时,又是如何区分空间的呢?写时拷贝 机制原理是什么?本文将对这些问题进行解答
在引入虚拟地址概念以后,程序员和CPU看到的都是虚拟地址。当CPU尝试去访问某个虚拟地址的时候,这时候硬件单元MMU就会将此虚拟地址转化为物理地址,然后CPU再去访问。
前言: Intel爆出来的漏洞,搞了一个大新闻,然后Linus也对Intel的补丁批判了一番。 关于meltdown攻击的原理,以及retpoline防御,见下文。 分析: 1,MMU & CPU Cache & CPL & spectulative exection & Syscall 有几个关键的概念需要说明: MMU,Memory Management Unit。在CPU(本文的CPU默认是x86)跑在protected mode下的时候,使用的是虚拟地址,MMU是一个硬件,负责把虚拟地址翻译成虚
作者:Jim Wallace, Arm; Joseph Byrne, NXP,安智客译 很难想象,哪一天能够不依靠电脑或智能手机工作,购物或银行业务,与朋友聊天,甚至听音乐或观看节目时都是如此。 与此同时,当头条新闻报道大量盗用信用卡数据,医院运营被勒索赎金,或者访问一个受欢迎的网站被拒绝时,很难不感到这些冲击带来的脆弱感。 随着我们变得更加容易连接,攻击面不断增长,安全性,恢复能力和隐私等信任要素将需要内置到下一代智能边缘设备,网络和数据中心中,以减少漏洞并实现到我们超连接世界的好处。 安全技术是SoC
来源:Linux阅码场, 罗玉平原创,欢迎投稿原创文章(要求投稿前未在任何平台发表),稿费500元人民币。投稿邮箱:21cnbao@gmail.com
熟悉高通平台的童鞋可能会比较熟悉,高通有ramdump功能,当系统crash后通过warm reset重启来抓取ram中的数据,然后利用Trace32进行故障现场的查看来排查问题。这实际上用到的就是trace32的simulator功能,也就是仿真器功能,我们只需要获取到设备的内存快照来进行指令集的仿真,以此查看故障现场,而不用真实的连接目标板来实时调试。
虚拟内存就是在你电脑的物理内存不够用时把一部分硬盘空间作为内存来使用,这部分硬盘空间就叫作虚拟内存。
大家在看内核代码时会经常看的以上术语,但在ARM的芯片手册中并没有用到这些术语,而是使用L1,L2,L3页表这种术语。
linux高端内存中的临时内存区为固定内存区的一部分, 对于固定内存在linux内核中有下面描述
本节我们将从linux启动的第一个进程说起,以及后面第一个进程是如何启动1号进程,然后启动2号进程。然后系统中所有的进程关系图做个简单的介绍
1.怎样将虚拟地址转换为物理地址, 2.MMU的内存訪问权限机制, 3.TLB,Catch和write buffer原理。 ………………………… 内存管理单元MMU的功能:将虚拟地址映射到物理地址,并提供内存訪问权限。 没启动MMU时。cpu核。cache,MMU和外设等全部部件使用的都是物理地址。
在以字节为单位寻址的存储器中有“小端”和“大端”两种方式存储字,这两种方式是根据最低有效字节与相邻较高有效字节相比是存放在较低的还是较高的地址来划分的,两种存储方式如图所示。
在这个技术日新月异的时代,ARMv8/ARMv9架构已经成为了处理器设计的主流。为了帮助大家更好地学习和掌握这一架构,本文将为您提供一个高效率的学习线路图,共分为6大阶段。让我们一起卷起袖子,深入学习ARMv8/ARMv9架构吧!
这本书属于学习Linux内核原理必读推荐书目之一!对Linux内核的设计原理进行了细致的说明,也有具体实现部分的介绍,结合源码能很好的理解Linux内核;
如上图所示,smmu 的作用和mmu 类似,mmu作用是替cpu翻译页表将进程的虚拟地址转换成cpu可以识别的物理地址。同理,smmu的作用就是替设备将dma请求的地址,翻译成设备真正能用的物理地址,但是当smmu bypass的时候,设备也可以直接使用物理地址来进行dma;
接上一篇分析: 《bootloader启动之【 Pre-loader -> Lk】》
领取专属 10元无门槛券
手把手带您无忧上云