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; 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)由于这段地址有特殊用途,内核的内存管理系统不能将其分配给其它模块。因此,需要将其添加到保留内存中
如何才能成为IT的编程高手
智能制造风口正盛 如何提升安全性降低成本
基于SPCE061A单片机的便携式多功能实时生理参数监测仪
麦肯锡谈论人工智能,或将实现就业和劳动力的自动化
科华恒盛UPS在整体机房高效节能的解决方案
SMP多核启动向内核传递参数信息
数字温度传感器按照不同形式分可分为哪几类
单片机加外壳就是PLC吗?
基础射频实验-射频波形基本测量
热流传感器信号采集
加大5G技术投入,联发科力争缩小与高通的差距
苹果iPhone未来或将支持融合通信服务
基于FPGA EP1K10QC208-3芯片实现256级灰度LED点阵屏控制系统的设计
深度解析TVS管的原理和参数
原厂96层3D NAND技术发展,后续SSD价格将持续下滑趋势
基于PBS生物反应器的共享控制平台解决方案
iPhone15全系采用USB-C,订单数量将少于上代
中国移动磐基 PaaS 平台与飞腾 CPU 完成适配,共铸云原生产业生态
手动与自动锡膏印刷机:优缺点全面PK!
电子封装与SMT是平行还是交叉?