- 博客(39)
- 资源 (1)
- 收藏
- 关注
原创 linux-kernel 启动过程 一
前边的章节我们分析了UBOOT是怎么加载内核的,最终是通过bootz等指令跳转到了一个地址,就开始进入到内核,要分析内核的起始点也是得先从链接脚本开始分析,因此我们先编译下内核,然后从链接脚本开始分析。
2022-11-01 00:32:53
1565
原创 linux-uboot 移植四 uboot的移植
前边的章节中介绍到如果要移植uboot的话,最好的参考就是由官方提供的demo。uboot 中每个板子都有一个对应的文件夹来存放板级文件,比如开发板上外设驱动文件等等。 NXP 的 I.MX 系列芯片的所有板级文件夹都存放在 board/freescale 目录下,在这个目录下有个名为 mx6ullevk 的文件夹,这个文件夹就是 NXP 官方 I.MX6ULL EVK 开发板的板级文件夹。复制 mx6ullevk,将其重命名为 mx6ull_alientek_emmc进 入 mx6ull_alientek
2022-07-07 15:44:59
1350
1
原创 linux-uboot 移植三 uboot启动内核过程
uboot 的本质工作是引导 Linux,所以 uboot 肯定有相关的 boot(引导)命令来启动 Linux。常用的跟 boot 有关的命令有: bootz、 bootm 和 boot。要启动 Linux,需要先将 Linux 镜像文件拷贝到 DRAM 中,如果使用到设备树的话也需要将设备树拷贝到 DRAM 中。可以从EMMC 或者 NAND 等存储设备中将 Linux 镜像和设备树文件拷贝到 DRAM,也可以通过 nfs 或者 tftp 将 Linux 镜像文件和设备树文件下载到 DRAM 中。不管用
2022-06-19 19:23:18
3719
原创 linux-uboot 移植二 uboot-main_loop
main_loop 函数定义在文件 common/main.c 里面,代码如下第48行bootstage_mark_name:会打印出启动进度第57行setenv:设置环境变量version,进入到uboot后,可通过version命令来打印版本信息第60行cli_init:跟初始化命令有关,初始化命令链表第62行run_preboot_environment_command:获取环境变量perboot的内容,perboot是一些预启动命令,一般不使用这个环境变量第68行bootdelay_process
2022-06-08 23:58:05
579
原创 linux-uboot 移植一 uboot启动加载过程
概述Linux系统启动之前还需要一段程序来进行引导工作,比如先初始化DDR内存等外设,然后将内核从外部的flash(nandflash、SD、EMMC等)中拷贝到DDR中,最后启动内核。这段程序就是BootLoader,它功能就是用于引导操作系统,类似于bios和windows的关系。UBOOT就是一款开源的BootLoader程序,可用于引导多种操作系统,并且支持多种体系结构(ARM、MIPCS、PPC、X86等),因此收到广泛的应用。uboot 的全称是 Universal Boot Loader,
2022-06-02 10:52:31
2850
3
原创 ARM V8A体系结构-第十九章 ARMv8 Models
概述平台模型(如本章中描述的模型)允许在不需要实际硬件的情况下开发软件。软件模型从程序员的角度提供处理器和设备的模型。模型的功能行为等效于实际硬件。为了实现快速的模拟执行速度,牺牲了绝对计时精度。这意味着您可以使用PV模型来确认软件功能,但您不能依赖周期计数的准确性、低级组件交互或其他特定于硬件的行为。ARMv8-A基础平台中的处理器不基于任何现有处理器设计,但仍符合ARMv8-A体系结构规范。ARMv8-A基础平台使用ARM快速建模技术,是ARM处理器建模解决方案套件的一部分。这些建模解决方案在通过AR
2022-05-20 17:37:42
412
原创 ARM V8A体系结构-第十八章 调试
概述调试是软件开发的一个关键部分,通常被认为是整个过程中最耗时、最昂贵的部分。它使软件开发人员能够创建满足高性能、低功耗和可靠性三个关键标准的应用程序、中间件和平台软件。然而,bug可能很难检测、复制和修复。也很难预测解决缺陷所需的时间长度。当产品交付给客户时,解决问题的成本会显著增加。在许多情况下,当一个产品的销售时间窗口很小时,如果产品推迟,就会错过市场机会。因此,系统提供的调试工具对于任何开发人员来说都是一个重要的考虑因素。许多使用ARM处理器的嵌入式系统的输入/输出设施有限。这意味着传统的桌面调
2022-05-20 16:03:29
1247
原创 ARM V8A体系结构-第十七章 安全
概述提供一定安全级别的系统,即可信系统,可以保护资产(例如密码和加密密钥或信用卡详细信息)免受一系列看似合理的攻击,以防止它们被复制、损坏或不可用。安全性通常由机密性、完整性和可用性原则定义。机密性是密码和加密密钥等资产的关键安全问题。对用于安全的安全软件和芯片机密进行修改和真实性证明是至关重要的。可信系统的示例可能包括为移动支付输入密码、数字版权管理和电子客票。在开放系统的世界中,安全性更难实现,在开放系统中,您可以将各种软件下载到平台上,无意中还会下载恶意或不受信任的代码,这些代码可能会篡改您的系统
2022-05-19 11:25:22
1130
原创 ARM V8A体系结构-第十六章 big.LITTLE技术
概述现在软件在移动系统中存在许多冲突性需求。一方面是对游戏等任务的高性能要求,另一方面是对音频播放等低强度应用的节能要求。传统上,单处理器设计不可能既具有高峰值性能又具有高能效。这意味着大量能源被浪费,因为高性能的核心将用于低强度任务,导致电池寿命缩短。性能本身会受到堆芯可以持续运行的热极限的影响。ARM的big.LITTLE技术就解决了这一问题,将小内核的能耗和大内核的高性能结合在一起。bit.LITTLE是一个异构系统的例子。这类系统通常包括几种不同的处理器类型和不同的微体系结构,如通用处理器和专
2022-05-18 17:45:03
882
原创 ARM V8A体系结构-第十五章 能量管理
概述许多ARM系统都是移动设备,由电池供电。在这样的系统中,电力使用和总能源使用的优化是一个关键的设计约束。在这样的系统中,程序员通常会花费大量时间来节省电池寿命。即使在不使用电池的系统中,节能也可能是个问题。例如,出于环境原因,您可能希望尽量减少能源使用,以降低消费者的电费成本,或者尽量减少设备产生的热量。ARM内核内置了许多旨在降低功耗的硬件设计方法。能源使用可分为两部分:静态:每当核心逻辑或RAM块通电时,就会发生静态功耗,也称为泄漏。一般来说,漏电流与总硅面积成正比,这意味着芯片越大,漏
2022-05-12 13:47:44
627
原创 ARM V8A体系结构-第十四章 多核处理器
概述ARMv8-A体系结构为包含多个处理元素的系统提供了高水平的支持。Cortex-A57MPCore和Cortex-A53MPCore处理器等ARM多核处理器可以包含一到四个核。使用Cortex-A57或Cortex-A53处理器的系统几乎总是以这种方式实现的。多核处理器可能包含多个能够独立执行指令的核心,这些核心可以被视为单个单元或集群。ARM多核技术使集群中的四个组件核中的任何一个在不使用时都可以关闭以节省电源,例如当设备轻载或处于待机模式时。当需要更高的性能时,每个处理器都在使用以满足需求,同时仍
2022-05-06 18:21:56
4531
原创 ARM V8A体系结构-第十三章 内存排序
概述如果您的代码直接与硬件或其他内核上执行的代码交互,或者直接加载或写入要执行的指令,或者修改页表,则需要注意内存排序问题。如果您是一名应用程序开发人员,那么硬件交互可能是通过设备驱动程序进行的,与其他内核的交互是通过Pthreads或另一个多线程API进行的,与分页内存系统的交互是通过操作系统进行的。在所有这些情况下,相关代码会为您解决内存排序问题。然而,如果您正在编写操作系统内核或设备驱动程序,或实现虚拟机监控程序、JIT编译器或多线程库,那么您必须对ARM体系结构的内存排序规则有很好的理解。您必须
2022-04-26 23:40:03
1449
原创 ARM V8A体系结构-第十二章 The Memory Management Unit
概述内存管理单元(MMU)的一个重要功能是使系统能够运行多个任务,作为独立的程序在它们自己的私有虚拟内存空间中运行。他们不需要了解系统的物理内存映射,也就是硬件实际使用的地址,或者可能同时执行的其他程序。您可以为每个程序使用相同的虚拟内存地址空间。您还可以使用连续的虚拟内存映射,即使物理内存是碎片化的。这个虚拟地址空间与系统中内存的实际物理映射是分开的。您可以编写、编译和链接应用程序以在虚拟内存空间中运行。第12-2页的图12-2显示了一个示例系统,说明了内存的虚拟和物理视图。单个系统中的不同处理器
2022-04-14 17:57:53
1181
原创 ARM V8A体系结构-第十一章 caches
概述当ARM架构首次开发时,处理器的时钟速度和内存的访问速度大致相似。如今的处理器内核要复杂得多,而且可以更快地实现数个数量级的时钟。然而,外部总线和内存设备的频率并没有达到相同的程度。可以实现小的片上SRAM块,这些块可以以与内核相同的速度运行,但与标准DRAM块相比,这种RAM非常昂贵,标准DRAM块的容量可以高出数千倍。在许多基于ARM处理器的系统中,对外部存储器的访问需要数十甚至数百个核心周期。缓存是位于核心和主内存之间的一个小而快速的内存块。它在主内存中保存项目的副本。对缓存的访问速度明显快
2022-04-07 23:57:13
911
原创 ARM V8A体系结构-第十章 AArch64异常处理
概述严格地说,中断是指中断软件执行的流程。然而,在ARM术语中,这通常称为异常。异常是指需要特权级(异常处理程序)执行某些操作以确保系统顺利运行的条件或系统事件。每个异常都有一个相关的异常处理程序。一旦异常得到处理,特权级软件会将core恢复到处理异常前的位置,以继续处理它正在做的事情。存在的异常类型如下:中断:有两种类型的中断称为IRQ和FIQ。FIQ的优先级高于IRQ。...
2022-01-23 23:16:21
1224
原创 ARM V8A体系结构-第九章 ARM64平台的ABI(Application Binary Interface )
概述ARM体系结构的应用程序二进制接口(ABI)指定了所有可执行本机代码模块必须遵守的基本规则,以便它们能够正确地协同工作。这些基本规则由特定编程语言(例如C++)的附加规则补充。单个操作系统或执行环境(例如Linux)可能会指定附加规则以满足其自身的特定需求,而不是ARM ABI指定的规则。AArch64体系结构的ABI有许多组件:可执行和可链接格式(ELF):ARM 64位体系结构(AArch64)的ELF指定对象和可执行格式。程序调用标准(PCS):ARM 64位体系结构(AArch64)A
2022-01-11 23:45:18
2342
原创 ARM V8A体系结构-第八章 移植到A64
概述本章并不打算作为为所有系统编写可移植代码的详尽指南,但是,本章应涵盖应用工程师在ARM特定机器上进行代码移植时应了解的主要领域。在将代码从A32和T32指令集移动到AArch64中的A64指令集时,您应该注意一些明显的差异:A32指令集中的大多数指令都可以有条件地执行。也就是说,可以将条件代码附加到指令,并基于先前标志设置指令的结果执行(或不执行)指令。尽管这使得编程技巧能够减少代码大小和周期计数,但这会使高性能处理器的设计变得非常复杂,并且会导致无序执行。操作码字段中保留的用于表示预测的必要
2021-12-30 00:16:18
723
原创 ARM V8A体系结构-第七章 AArch64的浮点和NEON
ARM高级SIMD体系结构、相关实现和支持软件通常被称为NEON技术。AArch32(相当于ARMv7 NEON指令)和AArch64都有NEON指令集。这两种方法都可以大大加快大型数据集上的重复操作。这在音视频编解码器等应用程序中非常有用。AArch64的NEON架构使用32×128位寄存器,是ARMv7的两倍。这些寄存器与浮点指令使用的寄存器相同。所有编译的代码和子例程都符合EABI,EABI规定了哪些寄存器可能被破坏,哪些寄存器必须保留在特定的子例程中。编译器可以在代码中的任意点自由地使用任何NEO
2021-12-27 22:39:27
4056
2
原创 ARM V8A体系结构-第六章 A64指令集
概述现在许多应用程序编程是不需要用到汇编语言写代码的,但是在需要高度优化的情况下,汇编语言就会凸显它的优势。启动代码、设备驱动程序或开发操作系统时都需要用到汇编。最后,在调试C代码时能够阅读汇编代码,特别是理解汇编指令和C语句之间的映射,这是非常有用的。1、指令助记符A64汇编语言重载指令助记符,并根据操作数寄存器名称区分不同形式的指令。例如,下面的ADD指令都有不同的编码,但您只需要记住一个助记符,汇编程序会根据操作数自动选择正确的编码。2、数据处理指令这些是处理器的基本算术和逻辑运算,对通用
2021-12-14 22:49:56
3642
原创 ARM V8A体系结构-第四章 ARMv8 寄存器
概述AArch64执行状态提供31×64位通用寄存器,可在所有时间和所有异常级别访问。每个寄存器的宽度为64位,通常称为寄存器X0-X30。每个AArch64位通用寄存器(X0-X30)也有一个32位(W0-W30)形式。32位的W寄存器是64位X寄存器的低位,也就是说,W0映射到X0的低位字,W1映射到X1的低位字。读取W寄存器会从X读取低32bit值,高位忽略,但是写入W寄存器,会将X寄存器高32bit置0,也就是说,将0xFFFFFF写入W0会将X0设置为0x00000000FFFFFF。
2021-11-24 22:49:09
2268
原创 ARM V8A体系结构-第三章 ARMv8A基本原理
概述在ARMv8中,程序总是运行在四种异常状态中的一种。在AArch64中,异常级别决定特权级别,与ARMv7中定义的特权级别类似。异常级别决定特权级别,例如ELn对应PLn。n越大则特权等级越高。在所有ARMv8架构中,特权等级的有着不用的操作权限,它类似于计算机中常见保护域的概念。不用的特权级别如下所示EL0 应用程序EL1 操作系统内核EL2 虚拟化EL3 低级固件,包含安全监控等通常一个软件只在一个特权级运行,例如应用程序、操作系统内核、虚拟化,但KVM之类的内核
2021-11-10 00:23:50
2862
1
原创 ARM V8A体系结构-第二章 体系结构和处理器
ARM发展历程ARM适于1985年,且一直处理更新换代之中,历程如下:ARMv4及更早的版本:仅使用ARM32位指令集ARMv4T:将新增16位的thumb指令集到32位指令集中,这是收到广泛任何的一个架构ARMv5TE:改善DSP类型的运算ARMv6:优化架构,新增非对齐内存的访问、内存结构优化、新增多处理器支持。此外,新增32位寄存器对于SIMD(Single Instruction Multiple Data,单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集)
2021-11-05 00:11:09
1172
原创 ARM V8A体系结构-第一章 序
概述ARMv8是支持64位指令集的处理器架构,可以包含32bit和64bit两种执行状态,分别为AArch64和AAch32,两种状态的切换需要先进入到异常模式EL中。AArch32和ARMv7a较为类似。AArch64常吃那个也被写作ARM64。ARMV7:Cortex-A5, Cortex-A7, Cortex-A8, Cortex-A9, Cortex-A15, and Cortex-A17ARMV8: Cortex-A53 and Cortex-A57ARMv8通常支持由ARMv7编写的可执
2021-11-03 23:06:10
696
原创 ARM V7A 体系结构-第三章 ARM处理器模式和寄存器
ARM V7A体系-第三章 ARM处理器模式和寄存器1.模式介绍如下图所示,有六种特权模式和一种非特权用户模式(新版本的ARM v7为支持TrustZone 安全扩展和HYP虚拟化新增了monitor模式和HYP模式)用户模式是无法操作硬件的,比如修改某些寄存器值,修改MMU配置或cache的操作。用户的应用程序通常在用户态工作,而操作系统通常工作在System模式下,若用户想要操作硬件需要引发系统调用陷入到内核态,需要借助系统调用,本质上是产生一个软中断。安全模式的引入新加了两种状态,区别于特权
2021-10-31 19:31:10
2717
原创 ARM Cortex A7 架构简介
Cortex-A7 MPCore 简介MP表示是多核的意思,Cortex-A7 MPcore 处理器支持 1~4 核,A7主打低功耗,因此多用于运行普通应用,通常和Cortex-A15 组成 big.LITTLE 架构的,Cortex-A15 作为大核负责高性能运算。Cortex-A7 本身性能也不弱,不要看它叫做 Cortex-A7 但是它可是比 Cortex-A8 性能要强大,而且更省电。A...
2020-03-10 20:01:55
24386
原创 android 系统架构
android 系统架构粗略解析(一)android 系统架构按照层次分为5层结构,分别为应用层、应用框架层、系统运行库层、硬件抽象层、内核层如下图所示1、应用层系统的应用程序,比如手机安装的各种软件等,负责直接与用户交互,是java语言写的2、应用框架层提供给应用层编写所需的API,我们平时开发用到的API都是应用层框架层提供的,当然也包括系统的应用,这一层也是是用Java 语言编写...
2019-11-24 16:30:05
412
原创 linux 系统启动 第三课
linux系统从上电到系统运行起来(三)通过前两课的分析,我们已经跟踪到了关键的一个函数kernel_init,它最终也就是1号进程,是从内核态到用户态转变的关键点,我们在这里对这个函数进行分析static int __ref kernel_init(void *unused){ kernel_init_freeable(); /* need to finish all async __...
2019-10-21 16:24:37
152
转载 gcc内嵌汇编
开发Arm程序的时候,大多数时候使用C/C++语言就可以了,但汇编语言在某些情况下能够实现一些C语言无法实现的功能,这时候就要调用一些汇编语言的程序.我们需要大概了解一下在C语言中如何嵌入汇编语言.内嵌汇编语法如下: __asm__(汇编语句模板: 输出部分: 输入部分: 破坏描述部分) 共四个部分:汇编语句模板,输出部分,输入部分,破坏描述部分,各部分使用“:”格开,汇编语句模板必不...
2019-10-17 17:15:38
384
原创 linux 应用程序调试技术-堆内存调试工具
内存调试工具memwatch 使用介绍段错误和内存错误是C语言编程中常见的问题,内存错误通常是指使用动态内存时出现的各种错误,比如内存溢出和缓冲区溢出等问题。memwatch是一个开源的内存错误检测工具,它可以跟踪程序中的内存泄露和错误,并提供结果日志记录,能检测双重释放、错误释放、未释放、溢出等。memwatch并不是一个可以单独运行的程序,它提供一套实现动态内存管理、检测的代码,用它们来替...
2019-10-16 19:43:36
262
原创 杂谈-常用算法
本文介绍一些常用的简单算法冒泡排序冒泡排序算法的原理如下:1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。3、针对所有的元素重复以上的步骤,除了最后一个。4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。冒泡排序总的平均时间复杂度为O(n^2)vo...
2019-10-12 17:25:39
122
原创 浅谈container_of
在Linux 内核中,container_of 函数使用非常广,例如 Linux内核链表 list_head、工作队列work_struct中,它的作用就是通过结构体内成员的地址来找到这个结构体的地址,现在我们就来看看它到底是个什么鬼东西首先看看内核中它是如何定义的原来是个宏,然后看下这个宏里边又包含了几处不太清楚的地方,我们来一一探究1、typeoftypeof是GNU C对标准C的扩...
2019-10-12 14:50:00
319
原创 关于链表-详解
链表杂谈链表和数组作为算法中的两个基本数据结构,在程序设计过程中经常用到。尽管两种结构都可以用来存储一系列的数据,但又各有各的特点。数组的优势,在于可以方便的遍历查找需要的数据。在查询数组指定位置的操作中,只需要进行1次操作即可,时间复杂度为O(1)。但是,这种时间上的便利性,是因为数组在内存中占用了连续的空间,在进行类似的查找或者遍历时,本质是指针在内存中的定向偏移。然而,当需要对数组成员进...
2019-10-12 10:11:07
384
原创 常见通讯协议介绍
UART通讯协议介绍UART是什么?UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器,是设备间进行异步通信的关键模块。UART负责处理数据总线和串行口之间的串/并、并/串转换,并规定了帧格式;通信双方只要采用相同的帧格式和波特率,就能在未共享时钟信号的情况下,仅用两根信号线(Rx 和Tx...
2019-10-11 13:51:11
1250
原创 链表的小应用-约瑟夫问题
约瑟夫问题:传说在公元1世纪的犹太战争中,犹太约瑟夫是公元一世纪著名的历史学家。在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人俘虏,于是决定了一个流传千古的自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报到第3人该人就必须自杀,然后再由下一个人重新报数,直到所有人都自杀身亡为止。然而约瑟夫和他的朋友并不想遵从这个约定,约瑟夫要他的...
2019-10-11 09:57:03
180
原创 linux 系统启动 第二课
linux系统从上电到系统运行起来(二)运行嵌入式linux的系统,一般都由引导程序、内核以及根文件系统等几部分组成,一般都存放在flash闪存这样的存储介质上,各映像在存储介质上的逻辑分区如下:1、这些映像文件可能并不存在于同一存储介质上2、这些映像文件可能并不是以完全独立的文件存在,有的系统将这些功能的文件重新打包,生成一个整体的映像文件。即使如此,但是从逻辑上,还是能够划分为这些功能...
2019-10-09 17:02:42
404
1
原创 linux 系统启动 第一课
linux系统从上电到系统运行起来预备知识1、常见存储器存储器根据掉电时数据是否丢失分为RAM-RandomAccessMemory(随机存取存储器)和ROM-ReadOnlyMemory(只读存储器)两大类RAM掉电数据就会丢失,但是访问的速度较快,常见比如计算机的内存ROM掉电数据不丢失RAM又可分为SRAM-Static RAM和DRAM-DynamicRAMSRAM速度非常快...
2019-09-16 17:55:48
724
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人