我正在开发基于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源是否只在一个核心上运行?如果是,那么其他核心将如何被禁用?
答案 0 :(得分:4)
U-boot源是否只在一个核心上运行?
U-Boot二进制文件(不是源代码)仅在一个处理器核心上执行 引导加载程序的功能不需要并行处理 此外,Linux内核在启动时只需要启用一个核心。
如果是,那么其他核心将如何被禁用?
通常在处理器/系统复位后,只启用一个核心;其他一切都是静止或禁用。
那么Kernel会在启动时启用其他内核吗?
假设OS支持SMP(对称多处理器),它将启用其他内核作为其初始化的一部分。
请你分享内核源代码链接(git),它可以启用其他内核。
对于ARM内核输出的ARM Cortex-A9四核(A15类似),
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.c的 start_kernel()中执行其C代码。
调用的第二个过程是smp_setup_processor_id()的ARM版本,它负责Booting Linux on physical CPU ...
消息文本。
在 start_kernel()结束时, check_bugs()的ARM版本将调用check_writebuffer_bugs(),rest_init()负责CPU: Testing write buffer coherency: ...
消息文本。
在 start_kernel()结束时,secondary_start_kernel()最终通过ARM版smp_init()(CPUn: Booted secondary processor
)初始化其他处理器核心,并通过某种方式调用{{3}}(Brought up N CPUs
)。