arm linux 移植全部过程「建议收藏」

2022-11-08 16:39:29 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

arm linux 移植全部过程

  • 总述
  • 面向的读者
  • 正文
    • 现代计算机系统的工作模式
      • BOOT-ROM
      • U-Boot
        • Makfile

总述

之前做过linux在powerpc上的移植,当然过程曲折,内容不充实,也没有想过要写这样一篇文章,满足实际需求就可以。现在又在做arm移植,自己所用的工具、设备等都有了比较大的改进,那我觉得应该写一篇文章来记录一下,因为过程中的问题,不是简单几句命令就能解释的,而网上的文章真的是初学者的噩梦,没有条理不说,质量也不敢恭维。 有的文章太细,都是在讲指令,大部分也都是抄来抄去,告诉大家照着步骤来就可以;而有的文章呢,则是在讲原理,类似于一些套话,读者想要的有可能只是一个可编译的环境,结果云里雾里不知所云。我是觉得理论与实践相结合是最合理的,如果有什么不对的地方,请留言,虽说只是自己的笔记,也需要对读者负责。当然,觉得我说的是废话,请右上角。

面向的读者

首先声明,作者水平有限,做嵌入式也只是开始,所以在现有这个阶段感觉困难重重。在克服了一些困难之后,觉得有些心得。所以,这篇文章,没有什么写作的目的,本来也是作者心血来潮准备普度众生_,从另一个角度上来讲算是一个笔记,所以更新说不定什么时候这腔热血没了也就停了。也就是说,这篇文章面向的对象一是那些处处寻门而不入的初学者,可以循序渐进的进入嵌入式的大门,再就是那些想要通过最简单的手段获取编译链的工程师,虽说是ARM但是思想我想很明确,是面向嵌入式的。总得来说,这是一篇嵌入式的文章,只要嵌入式系统或PC系统的工作模式不变,这篇文章都是可以作为参考的。

正文

现代计算机系统的工作模式

写在最前面的是现代计算机系统的工作模式,为什么要讲这个呢,就是因为凡事要有始有终,总是要明白在一台计算机或嵌入式系统启动之后的工作流程。 现代的计算机系统都是以CPU为核心运算单元和逻辑控制单元,加之一些外设而按要求构建的信息处理系统。CPU呢,只有运算功能,没有存储功能,这也就是为什么最初的CPU是用纸带的方式执行相关的运算流程。虽说我们生在21世纪,没必要去模拟当年的纸带机,但是CPU的启动过程是必须要明白的。

BOOT-ROM

最开始的计算机是由纸带打孔的方式输入执行程序的,随着计算机系统的不断发展,再加之懒人们的不断改进,最后输入计算机的程序,从纸片进入了ROM。 我查阅了一些文献,如下:

I/O devices that respond like memory components can be accessed through the processor’s physical-memory address space (see Figure 13-1). When using memory-mapped I/O, any of the processor’s instructions that reference memory can be used to access an I/O port located at a physical-memory address. For example, the MOV instruction can transfer data between any register and a memory-mapped I/O port. 只要是可以像内存元件一样工作模式的I/O设备,都可以通过处理器的物理内存地址空间访问。 The AND, OR, and TEST instructions may be used to manipulate bits in the control and status registers of a memory-mapped peripheral devices.

这是Intel Architectures Software Developer中内存映射有关的内容,如图所示:

在x86体系结构中,是没有片上ROM的,所以这个EPROM也就是我们所说的CMOS,就可以装载系统的初始化代码即,BIOS。而在ARM体系架构中,大部分SoC都集成了片上ROM,而这个ROM在ARM嵌入式的领域内被叫作BOOT-ROM。因为x86系统中外设大部分是由主板厂商设计,故BIOS通常是由主板厂商自行设计;而ARM系统中,因为ARM上通常会集成很多相关的外设及接口,故一般是由SoC厂商实现BOOT-ROM。 因为BOOT-ROM的大小一般很小,通常情况下只能实现一些芯片内的初始化功能,以及将下一步的启动代码加载到内存中,然后将CPU控制权交给其执行。

After the BSP and APs have been selected (by means of a hardware protocol, see Section 7.5.3, “MP Initialization Protocol Algorithm for Intel Xeon Processors”), the BSP begins executing BIOS boot-strap code (POST) at the normal IA-32 architecture starting address (FFFF FFF0H). The boot-strap code typically performs the following operations: 1.Initializes memory. 2.Loads the microcode update into the processor. 3.Initializes the MTRRs. 4.Enables the caches. 5.Executes the CPUID instruction with a value of 0H in the EAX register, then reads the EBX, ECX, and EDX registers to determine if the BSP is “GenuineIntel.” 6.Executes the CPUID instruction with a value of 1H in the EAX register, then saves the values in the EAX, ECX, and EDX registers in a system configuration space in RAM for use later. 7.Loads start-up code for the AP to execute into a 4-KByte page in the lower 1 MByte of memory. 8.Switches to protected mode and insures that the APIC address space is mapped to the strong uncacheable (UC) memory type. 9.Determine the BSP’s APIC ID from the local APIC ID register (default is 0), the code snippet below is an example that applies to logical processors in a system whose local APIC units operate in xAPIC mode that APIC registers are accessed using memory mapped interface: MOV ESI, APIC_ID; Address of local APIC ID register MOV EAX, [ESI]; AND EAX, 0FF000000H; Zero out all other bits except APIC ID MOV BOOT_ID, EAX; Save in memory Saves the APIC ID in the ACPI and MP tables and optionally in the system configuration space in RAM.

懒得翻译了,0xFFFFFFF0H就是x86 CPU在上电时IP的指针位置,而由上图可知,这个位置正好位于EPROM的范围内。ARM应该也是如此,但是启动地址没有查看相关文档。

U-Boot

相关的项目介绍什么的都不写了,到处都能搜到。作用就是提供一些访问硬件资源的API,能够访问到后来操作系统启动所需的文件,并初始化相关的启动环境,然后加载镜像或压缩镜像到内存中,进行必要的操作(解压缩等)后,将CPU执行权交给操作系统(什么叫执行权?就是jump到一个内存地址,继续运行的指令就是操作系统的指令。

Makfile

请参看(uboot makefile注释),这里有注释,有兴趣可以看一下。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

0 人点赞