spin_table_cpu_release_addr的传递
由于在armv8架构下, uboot只能通过devicetree向内核传递参数信息 ,因此当其开启了CONFIG_ARMV8_SPIN_TABLE配置选项后,就需要在适当的时候将该值写入devicetree中。
我们知道uboot一般通过bootm命令启动操作系统(aarch64支持的booti命令,其底层实现与bootm相同),因此在bootm中会执行一系列启动前的准备工作,其中就包括将spin-table地写入devicetree的工作。以下其执行流程图:
spin_table_update_dt的代码实现如下:
int spin_table_update_dt(void *fdt)
{
…
unsigned long rsv_addr = (unsigned long)&spin_table_reserve_begin;
unsigned long rsv_size = &spin_table_reserve_end -
&spin_table_reserve_begin; (1)
cpus_offset = fdt_path_offset(fdt, "/cpus"); (2)
if (cpus_offset < 0)
return -ENODEV;
for (offset = fdt_first_subnode(fdt, cpus_offset);
offset >= 0;
offset = fdt_next_subnode(fdt, offset)) {
prop = fdt_getprop(fdt, offset, "device_type", NULL);
if (!prop || strcmp(prop, "cpu"))
continue;
prop = fdt_getprop(fdt, offset, "enable-method", NULL); (3)
if (!prop || strcmp(prop, "spin-table"))
return 0;
}
for (offset = fdt_first_subnode(fdt, cpus_offset);
offset >= 0;
offset = fdt_next_subnode(fdt, offset)) {
prop = fdt_getprop(fdt, offset, "device_type", NULL);
if (!prop || strcmp(prop, "cpu"))
continue;
ret = fdt_setprop_u64(fdt, offset, "cpu-release-addr",
(unsigned long)&spin_table_cpu_release_addr); (4)
if (ret)
return -ENOSPC;
}
ret = fdt_add_mem_rsv(fdt, rsv_addr, rsv_size); (5)
…
}
(1)获取其起始地址和长度
(2)从devicetree中获取cpus节点
(3)遍历该节点的所有cpu子节点,并校验其enable-method是否为spin-table。若不是所有cpu的都该类型,则不设置
(4)若所有cpu的enable-method都为spin-table,则将该参数设置到cpu-release-addr属性中
(5)由于这段地址有特殊用途,内核的内存管理系统不能将其分配给其它模块。因此,需要将其添加到保留内存中
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
内核
+关注
关注
3文章
1309浏览量
39862 -
cpu
+关注
关注
68文章
10456浏览量
206594 -
多核
+关注
关注
0文章
43浏览量
12243 -
SMP
+关注
关注
0文章
68浏览量
19452
发布评论请先 登录
相关推荐
AliOS Things SMP系统及其在esp32上实现示例
对应CPU的SMP功能:2.1 核启动加载目前的启动顺序是,系统默认开始启动0核,在0核的主任务入口内启动其他核的加载,使其都进入任务调度,
发表于 05-15 12:45
典型的支持多核处理器的RTOS功能解析
运行中更换或重新启动几乎所有的模块,甚至是设备驱动程序。QNX对多核处理器的支持基于其微内核结构,通信被集成到QNX消息传递原语,本地的IPC和远端节点间的IPC一样。在单CPU上运行
发表于 06-29 08:30
Rk3399串口配置参数的传递过程如何去实现呢
的,通过该参数告诉内核使用哪个串口以及波特率作为调试串口,bootargs可以在设备树(dts)下配置,chosen里有属性项bootargs,启动linux时,内核会使用chosen
发表于 05-24 10:15
ARM64 SMP多核启动相关资料推荐(上)
ddr某个地址,为内核传递参数之后,然后bootloader就完成了它的使命,跳转到内核,就进入了操作系统内核的世界。4)linux
发表于 06-06 17:05
ARM64 SMP多核启动相关资料推荐(下)
psci。下面我们来揭开他神秘的面纱,其实理解了spin-table的启动方式,psci并不难(说白了也是需要主处理器给从处理器一个启动地址,然后从处理器从这个地址执行指令,实际上比这要复杂的多)。下面给出psci方式多核
发表于 06-06 17:11
RT-Thread SMP和AMP初体验简介
的 kernel7.img 文件拷贝到树莓派 SD 卡的 boot 目录中即可;树莓派上电前先使用 USB 转 TTL 模块连接到电脑;启动树莓派后,串口成功显示相关信息, SMP 简单测试成功。原作者:螺丝松掉的人
发表于 02-03 14:33
Linux在SMP系统上的移植研究
基于自主开发以双核嵌入式CPU EM8301为处理核心的嵌入式应用的目的,针对双核CPU芯片的系统结构和Linux内核的特性,通过研究嵌入式Linux操作系统在SMP系统上的移植,探讨SMP架构
发表于 11-14 16:09
•11次下载
Linux内核源码分析--内核启动命令行的传递过程
内核的启动参数其实不仅仅包含在了cmdline中,cmdline不过是bootloader传递给内核的信
发表于 05-05 15:28
•1563次阅读
用户与内核空间数据交换的方式之一:内核启动参数
Linux 提供了一种通过 bootloader 向其传输启动参数的功能,内核开发者可以通过这种方式来向内核传输数据,从而控制内核
发表于 05-14 15:42
•419次阅读
ARM64 SMP多核启动(下)—PSCI
上面说了pin-table的多核启动方式,看似很繁琐,实际上并不复杂,无外乎主处理器唤醒从处理器到指定地址上去执行指令
发表于 06-09 14:31
•462次阅读
SMP是什么?多核芯片(SMP)的启动方法
SMP 英文为Symmetric Multi-Processing ,是对称多处理结构的简称,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构,一个服务器系统可以同时运行多个处理器,并共享内存和其他的主机资源。
SMP是什么 启动方式介绍
,一个服务器系统可以同时运行多个处理器,并共享内存和其他的主机资源。 CMP 英文为Chip multiprocessors,指的是单芯片多处理器,也指多核心。其思想是将大规模并行处理器中的SMP集成到同一芯片内,各个处理器并行执行不同的进程。 (1)CPU数:独立的中央
SMP多核启动cpu操作函数
回调 其中spin-table启动方式的回调如下: const struct cpu_operations smp_spin_table_ops = {.name= "spin-table
评论