【问题标题】:U-boot will run on single core?U-boot 会在单核上运行吗?
【发布时间】:2015-12-29 20:55:07
【问题描述】:

我正在开发基于 TI Jacinto6(ARM CortexA15) 的开发板。我正在了解 U-boot 源。 根据 start.S 文件,执行以下汇编指令以禁用 L1 I/D 缓存和 TLB。此说明来自 start.s(http://git.denx.de/?p=u-boot.git;a=blob;f=arch/arm/cpu/armv7/start.S;h=fedd7c8f7e00d0427405173849e6c0743d6b886f;hb=524123a70761110c5cf3ccc5f52f6d4da071b959)

 mov     r0, #0                  @ set up for MCR
 mcr     p15, 0, r0, c8, c7, 0   @ invalidate TLBs
 mcr     p15, 0, r0, c7, c5, 0   @ invalidate icache
 mcr     p15, 0, r0, c7, c5, 6   @ invalidate BP array
 mcr     p15, 0, r0, c7, c10, 4  @ DSB
 mcr     p15, 0, r0, c7, c5, 4   @ ISB

根据 ARM 文档,CortexA15 有 4 个内核。 上面的代码将禁用它正在运行的内核上的缓存和 TLB,那么其他内核的缓存和 TLB 呢? U-boot 源代码会仅在一个内核上运行吗?如果是这样,那么如何禁用其他核心?

【问题讨论】:

  • 通常在处理器/系统重置后,仅启用一个内核;其他一切都是静止的或禁用的。检查您提到的 ARM 文档。 U-Boot 将仅在一个内核上执行
  • “根据 ARM 文档,CortexA15 有 4 个内核” - 你确定吗? Cortex-A15 设计可能支持每个集群最多 4 个内核的配置,但我在 TI 网站上看到的所有内容都表明 Jacinto 6 实现了双内核配置。
  • @sawdust 感谢您的信息。那么内核会在启动时启用其他内核吗?请您分享启用其他内核的内核源链接(git)。
  • @Notlikethat CortexA15 根据图表 @arm.com/products/processors/cortex-a/cortex-a15.php 有 4 个内核。 Jacinto 6 有 CortexA15 和 Cortex M4,您能否分享一下说明 Jacinto 6 使用两个内核运行的 TI 链接。

标签: arm embedded-linux u-boot smp


【解决方案1】:

U-boot 源代码会只在一个内核上运行吗?

U-Boot 二进制文件(不是源代码)仅在一个处理器内核上执行。
引导加载程序的功能不需要并行处理。
此外,Linux 内核希望在启动时只启用一个内核。

如果是这样,那么其他内核将如何被禁用?

通常在处理器/系统重置后,仅启用一个内核;其他一切都是静止的或禁用的。

所以内核会在启动时启用其他内核?

操作系统,假设它支持 SMP(对称多处理器),将启用其他内核作为其初始化的一部分。

您能否分享启用其他内核的内核源代码链接(git)。

对于 ARM Cortex-A9 四核(A15 类似),Linux 内核输出:

Booting Linux on physical CPU 0x0
Linux version 3.10.60+wandboard_1.0.2+1.0.0-wandboard (root@host) (gcc version 4.8.3 (crosstool-NG 1.19.0) ) #7 SMP Mon Dec 29 18:49:06 PST 2014
CPU: ARMv7 Processor [412fc09a] revision 10 (ARMv7), cr=10c53c7d
CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
Machine: Freescale i.MX6 Quad/DualLite (Device Tree), model: Wandboard Quad based on Freescale i.MX6 Quad
...  
L310 cache controller enabled
l2x0: 16 ways, CACHE_ID 0x410000c7, AUX_CTRL 0x32070000, Cache size: 1048576 B
...
CPU: Testing write buffer coherency: ok
CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
Setting up static identity map for 0x804bdd30 - 0x804bdd88
CPU1: Booted secondary processor
CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
CPU2: Booted secondary processor
CPU2: thread -1, cpu 2, socket 0, mpidr 80000002
CPU3: Booted secondary processor
CPU3: thread -1, cpu 3, socket 0, mpidr 80000003
Brought up 4 CPUs
SMP: Total of 4 processors activated (6324.22 BogoMIPS).
CPU: All CPU(s) started in SVC mode.
devtmpfs: initialized
...

Linux 内核在init/main.cstart_kernel() 中开始执行其C 代码。
第二个调用的过程是smp_setup_processor_id() 的ARM 版本,它负责Booting Linux on physical CPU ... 消息文本。

start_kernel() 结束时,check_bugs() 的 ARM 版本将调用负责 CPU: Testing write buffer coherency: ... 消息文本的 check_writebuffer_bugs()

start_kernel()结束时,rest_init() 最终通过secondary_start_kernel() (CPUn: Booted secondary processor) 的 ARM 版本初始化其他处理器内核,通过 smp_init() (@987654331) 以某种方式调用@)。

【讨论】:

    猜你喜欢
    • 2020-05-03
    • 1970-01-01
    • 2021-10-24
    • 2014-06-06
    • 2022-11-04
    • 2016-09-10
    • 1970-01-01
    • 2018-12-26
    • 2011-11-24
    相关资源
    最近更新 更多