Linux多核CPU启动内核调试(详细)总结

目录

    • 一、综述
    • 二、调试流程简介
      • 2.1 大体流程
      • 2.2 spin-table简介
    • 三、uboot和内核配置
      • 3.1 uboot配置
      • 3.2 timer配置
      • 3.3 GIC中断配置
      • 3.4 驱动确认
      • 3.5 SMP配置
      • 3.6 内核config配置
    • 四、其他相关链接
      • 1、[交叉编译linux内核总结](https://blog.csdn.net/Luckiers/article/details/124531266)
      • 2、[uboot方式启动硬盘手动制作的根文件系统方案](https://blog.csdn.net/Luckiers/article/details/122476023)
      • 3、[Linux下设备树dts内容总结](https://blog.csdn.net/Luckiers/article/details/124772722)

一、综述

本文主要工作中围绕ARM A55的EVB版多核启动问题进行分析,涉及到timer、gic中断模块,详细整理了整个过程。
目标机器:ARM A55 8核CPU
交叉编译环境:Ubuntu 22.04.2 LTS
内核版本:5.15.79

二、调试流程简介

2.1 大体流程

本文重点讲述内核调试过程,uboot部分讲述相关配置,本次使用spin-table方式启动多核、涉及ARM通用时钟模块,GIC500中断,整体过程如下:
1、uboot编译;
2、内核相关配置打开;
3、内核相关模块驱动确认;
4、内核编译;
5、linux系统定制;

在这里插入图片描述

2.2 spin-table简介

spin-table方式的多核启动方式,顾名思义在于自旋,主处理器和从处理器上电都会启动,主处理器先启动,从处理器在spin_table_secondary_jump处wfe睡眠,主处理器通过修改设备树的cpu节点的cpu-release-addr属性为spin_table_cpu_release_addr,这是从处理器的释放地址所在的地方,主处理器进入内核后,会通过smp_prepare_cpus函数调用spin-table 对应的cpu操作集的cpu_prepare方法从而在smp_spin_table_cpu_prepare函数中设置从处理器的释放地址为secondary_holding_pen这个内核函数,然后通过sev指令唤醒从处理器,从处理器继续从secondary_holding_pen开始执行(从处理器来到了内核的世界),发现secondary_holding_pen_release不是自己的处理编号,然后通过wfe继续睡眠,当主处理器完成了大多数的内核组件的初始化之后,调用smp_init来来开始真正的启动从处理器,最终调用spin-table 对应的cpu操作集的cpu_boot方法从而在smp_spin_table_cpu_boot将需要启动的处理器的编号写入secondary_holding_pen_release中,然后再次sev指令唤醒从处理器,从处理器得以继续执行(设置自己异常向量表,初始化mmu等),最终在idle线程中执行wfi睡眠。其他从处理器也是同样的方式启动起来,同样最后进入各种idle进程执行wfi睡眠,主处理器继续往下进行内核初始化,直到启动init进程,后面多个处理器都被启动起来,都可以调度进程,多进程还会被均衡到多核。

三、uboot和内核配置

3.1 uboot配置

1、配置时钟频率,影响uboot中uart时钟和启动linux内核timer时钟
#define SCFG_SYS_CLOCK 100000000
在这里插入图片描述

#define COUNTER_FREQUENCY 200000000 // 200 MHz generic timer clock
在这里插入图片描述

2、设置CPU_RELEASE_ADDR地址
该地址为DDR中一段地址即可,不可与uboot、内核加载地址重合,建议放在内存的后面部分
/* #define CPU_RELEASE_ADDR infa_slave_cores_halt */
#define CPU_RELEASE_ADDR 0x9b0000000
uboot在启动后将该值存放在X1寄存器中,后续传给内核。

该地址的作用:
芯片上电后primary cpu开始执行启动流程,而secondary cpu则将自身设置为WFE睡眠状态,并且为内核准备了一块内存,用于填写secondary cpu的入口地址。
uboot负责将这块内存的地址写入devicetree中,当内核初始化完成,需要启动secondary cpu时,就将其内核入口地址写到那块内存中,然后唤醒cpu。
secondary cpu被唤醒后,检查该内存的内容,确认内核已经向其写入了启动地址,就跳转到该地址执行启动流程。
在这里插入图片描述
注:因为该芯片为公司基于ARM自研的芯片,部分配置进行了定制,配置信息可参考相应修改。

3、config配置

CONFIG_ARMV8_MULTIENTRY=y

3.2 timer配置

1、修改dts

		timer {compatible = "arm,armv8-timer";interrupts = <GIC_PPI 13 IRQ_TYPE_LEVEL_HIGH>,<GIC_PPI 14 IRQ_TYPE_LEVEL_HIGH>,<GIC_PPI 11 IRQ_TYPE_LEVEL_HIGH>,<GIC_PPI 10 IRQ_TYPE_LEVEL_HIGH>;};

2、确定驱动
该timer驱动为ARM通用驱动模块,中断号一般都是固定的
在这里插入图片描述

3.3 GIC中断配置

1、dts配置

		gic: interrupt-controller@3A000000 {compatible = "arm,gic-v3";#interrupt-cells = <3>;interrupt-controller;reg = <0x0 0x3A000000 0x0 0x020000>,  /* GICD */<0x0 0x3A100000 0x0 0x100000>;  /* GICR */#address-cells = <2>;#size-cells = <2>;ranges;gic_its: gic-its@3A400000{compatible = "arm,gic-v3-its";reg = <0x0 0x3A020000 0x0 0x10000>;socionext,synquacer-pre-its = <0x3A400000 0x400000>;msi-controller;#msi-cells = <1>;};

注:该gic中断对应的基地址与具体芯片有关。

3.4 驱动确认

在这里插入图片描述

3.5 SMP配置

1、修改dts新增多核CPU配置

主要是cpu-release-addr = <0x9 0xb0000000>要与uboot下设置的值一致,同时reg = <0x0 0x0>;中通过MPIDR方式记录cpu核的id,本块板子是用MPIDR[23:8]进行记录,所以cpu1是偏移8bit从0x100开始的。
在这里插入图片描述
dts内容如下:

	cpus {#address-cells = <2>;#size-cells    = <0>;cpu0: cpu@0 {device_type = "cpu";compatible = "arm,armv8";reg = <0x0 0x0>;enable-method = "spin-table";cpu-release-addr = <0x9 0xb0000000>;next-level-cache = <&l2_cluster0>;clock-frequency = <1600000000>;};cpu1: cpu@1 {device_type = "cpu";compatible = "arm,armv8";reg = <0x0 0x100>; /*should be 0x100,0x200.....MPIDR[23:8] is ID*/enable-method = "spin-table";cpu-release-addr = <0x9 0xb0000000>; /*just used to save Secondary CPU Start Addr*/next-level-cache = <&l2_cluster0>;clock-frequency = <1600000000>;};cpu2: cpu@2 {device_type = "cpu";compatible = "arm,armv8";reg = <0x0 0x200>; /*should be 0x100,0x200.....MPIDR[23:8] is ID*/enable-method = "spin-table";cpu-release-addr = <0x9 0xb0000000>; /*just used to save Secondary CPU Start Addr*/next-level-cache = <&l2_cluster0>;clock-frequency = <1600000000>;};cpu3: cpu@3 {device_type = "cpu";compatible = "arm,armv8";reg = <0x0 0x300>;enable-method = "spin-table";cpu-release-addr = <0x9 0xb0000000>;next-level-cache = <&l2_cluster0>;clock-frequency = <1600000000>;};cpu4: cpu@4 {device_type = "cpu";compatible = "arm,armv8";reg = <0x0 0x400>; /*should be 0x100,0x200.....MPIDR[23:8] is ID*/enable-method = "spin-table";cpu-release-addr = <0x9 0xb0000000>; /*just used to save Secondary CPU Start Addr*/next-level-cache = <&l2_cluster0>;clock-frequency = <1600000000>;};cpu5: cpu@5 {device_type = "cpu";compatible = "arm,armv8";reg = <0x0 0x500>; /*should be 0x100,0x200.....MPIDR[23:8] is ID*/enable-method = "spin-table";cpu-release-addr = <0x9 0xb0000000>; /*just used to save Secondary CPU Start Addr*/next-level-cache = <&l2_cluster0>;clock-frequency = <1600000000>;};cpu6: cpu@6 {device_type = "cpu";compatible = "arm,armv8";reg = <0x0 0x600>; /*should be 0x100,0x200.....MPIDR[23:8] is ID*/enable-method = "spin-table";cpu-release-addr = <0x9 0xb0000000>; /*just used to save Secondary CPU Start Addr*/next-level-cache = <&l2_cluster0>;clock-frequency = <1600000000>;};cpu7: cpu@7 {device_type = "cpu";compatible = "arm,armv8";reg = <0x0 0x700>; /*should be 0x100,0x200.....MPIDR[23:8] is ID*/enable-method = "spin-table";cpu-release-addr = <0x9 0xb0000000>; /*just used to save Secondary CPU Start Addr*/next-level-cache = <&l2_cluster0>;clock-frequency = <1600000000>;};

3.6 内核config配置

CONFIG_SMP=y
CONFIG_NR_CPUS=8

四、其他相关链接

1、交叉编译linux内核总结

2、uboot方式启动硬盘手动制作的根文件系统方案

3、Linux下设备树dts内容总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/122982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python:使用Scikit-image对遥感影像进行傅里叶变换特征提取(fourier)

作者:CSDN @ _养乐多_ 在本博客中,我们将介绍如何使用Scikit-Image来进行傅里叶变换特征提取(fourier),并且提供一个示例代码,演示了如何在单波段遥感图像上应用这些方法。 傅里叶变换特征提取是一种数学工具,用于将图像中的细节、纹理和边缘信息以不同频率的方式呈现…

电脑监控软件哪些比较好用

电脑监控软件在当今信息化时代越来越受到人们的关注&#xff0c;它们可以用于保护公司的商业机密&#xff0c;防止员工在工作中做一些不恰当的事情&#xff0c;以及在家庭中监控孩子的上网行为等。 本文将介绍一些比较好用的电脑监控软件&#xff1a; 一、域之盾软件 这款软件…

npm更新包时This operation requires a one-time password.

[访问我的npm包](mhfwork/yt-ui - npm) 更新npm包时出现 This operation requires a one-time password.是因为需要认证 解决办法 1. 点击红线处的链接 2. 进入npm官网获取指定秘钥 3. 再次填入 one-time password 即可

Linux进程地址空间

文章目录 背景进程地址空间分页和虚拟地址空间 写时拷贝 背景 研究背景&#xff1a;我们在之前通过fork函数创建子进程的时候&#xff0c;我们发现fork的返回值有两个&#xff0c;且值不相同但地址确实相同的&#xff0c;我们知道在物理空间上这种情况是不可能存在的&#xff…

SQL中:语法总结(group by,having ,distinct,top,order by,like等等)

语法总结&#xff1a;group by&#xff0c;distinct ...... 1.分组group by、条件havinggroup byhaving 2.聚集函数count 3.order by4.对表中数据的操作&#xff1a;增insert、删delete、改update增insert删delete改update 5.对表中数据的操作&#xff1a;查select嵌套查询不相…

如何防范AI等技术带来的诈骗风险?从技术、法律、教育等多方面入手

文章目录 前言什么是AI诈骗案例案例一案例二 AI诈骗的特点如何预防和应对AI诈骗建议后记 前言 互联网是一把双刃剑&#xff0c;这是我们常说的一个问题。 随着人工智能技术的快速发展&#xff0c;AI诈骗成为当今社会面临的新兴威胁。不法分子利用人工智能技术&#xff0c;以更…

8.自定义组件布局和详解Context上下文

pages/index.vue layout布局运行在服务端 1、在项目的目录下新建layout文件夹&#xff0c;并新建一个blog.vue布局文件 2、在页面中的layout函数里&#xff0c;返回刚才新建布局文件的名字blog就可以使用了 export default {...layout (context) {console.log(context)retu…

在3分钟内使用AI-Chat生成精美PPT(附AI工具)

前言 在人工智能的大趋势下&#xff0c;AI-Chat是一款令人惊叹的技术。它用强大的自然语言处理技术帮助我们快速生成PPT&#xff0c;提高工作效率。本文将介绍使用ChatAI-Chat生成PPT的方法&#xff0c;以及使用Mindshow转换为炫酷的演示文稿。让技术为我们节省时间&#xff0c…

Ubuntu中使用yum命令出现错误提示:Command ‘yum‘ not found, did you mean:

Ubuntu中使用yum命令出现错误提示:Command ‘yum’ not found, did you mean: command ‘gum’ from snap gum (0.12.0) command ‘num’ from deb quickcal (2.4-1) command ‘yum4’ from deb nextgen-yum4 (4.5.2-6) command ‘uum’ from deb freewnn-jserver (1.1.1~a021…

Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作

文章目录 Stable Diffusion安装AnimateDiff插件适配sdxl模型适配 Stable Diffusion使用插件安装界面设置基础文生图加入lora的文生图 Stable Diffusion安装 我的情况比较特殊&#xff0c;显卡版本太老&#xff0c;最高也就支持cuda10.2&#xff0c;因此只能安装pytorch1.12.1&…

计算机网络【CN】介质访问控制

信道划分介质访问控制 FDMTDMWDMCDM【掌握eg即可】 随机介质访问控制 CSMA 1-坚持CSMA 非坚持CSMA p-坚持CSMA 空闲时 立即发送数据 立即发送数据 以概率P发送数据&#xff0c;以概率1-p推迟到下一个时隙 忙碌时 继续坚持侦听 放弃侦听&#xff0c;等待一个随机的时…

车载音频项目

加我微信hezkz17进数字音频系统研究开发交流答疑群(课题组) ー 1&#xff0e;负责此项目的音频链路的设计及其实现 在ADSP21375上实现音频链路的处理。如噪声门&#xff0c;压限器&#xff0c;高低通&#xff0c;PEQ、各种效果等。 2&#xff0e;负责DSP与MCU端SPI协议实现。M…

Builder 请进:波卡最新开发入门指南

撰文&#xff1a;Dennis Zoma 编译&#xff1a;OneBlock 社区 本文更新于 2023 年 10 月 3 日&#xff0c;来源&#xff1a;https://wiki.polkadot.network/docs/build-guide Polkadot 是一个区块链协议&#xff0c;有两个目标&#xff1a;在所有连接的平行链之间提供共享安全…

【操作系统】进程的控制和通信

文章目录 一. 实验目的二. 实验内容三. 实验步骤四. 实验结果 一. 实验目的 &#xff08;1&#xff09;加深对进程概念的理解&#xff0c;进一步认识并发执行的实质。 &#xff08;2&#xff09;掌握Linux 操作系统中进程的创建和终止操作。 &#xff08;3&#xff09;理解进程…

计算机网络-应用层(2)

一、DHCP 当需要跨越多个网段提供DHCP 服务时必须使用DHCP 中继代理&#xff0c; 就是在DHCP 客户和服务器之间转发DHCP 消息的主机或路由器。 DHCP 服务端使用UDP 的67号端口来监听和接收客户请求消息&#xff0c; 保留UDP 的68号端口用于接收来自DHCP 服务器的消息回复。 在…

基于 Python 的豆瓣电影分析、可视化系统,附源码

文章目录 1 简介2 技术栈具体实现1.设计豆瓣电影自动化爬虫程序&#xff0c;自动获取电影数据2.对爬取到的数据进行清洗和预处理&#xff0c;包括多维度数据字段清洗和扩充3.将清洗好的数据存储到MySQL数据库中 4 具体效果图5 推荐阅读 1 简介 基于Python flask 的豆瓣电影分析…

win11 右键菜单默认 显示更多选项

win10升级至win11后&#xff0c;一个很大的变化就是右键菜单&#xff0c;其不再显示所有的菜单项&#xff0c;而是默认只显示主要的几项&#xff0c;点击“显示更多选项”后&#xff0c;才会显示所有菜单项。 这对于经常需要用到右键其他菜单项的人来说明&#xff0c;非常的不…

【C++】C++入门(下)--内联函数 auto关键字 nullptr

目录 一 内联函数 1 内联函数概念和定义 2 内联函数特性 二 auto关键字 1 auto概念 2 auto 的使用细则 (1) auto与指针和引用结合起来使用 (2) 在同一行定义多个变量 3 auto不能推导的场景 (1) auto不能作为函数的参数 (2) auto不能直接用来声明数组 4 基于范围的fo…

关于深度学习中Attention的一些简单理解

Attention 机制 Attention应用在了很多最流行的模型中&#xff0c;Transformer、BERT、GPT等等。 Attention就是计算一个加权平均&#xff1b;通过加权平均的权值来自计算每个隐藏层之间的相关度&#xff1b; 示例 Attention 机制 Attention应用在了很多最流行的模型中&am…

C# 海康威视平台API接入 和网页摄像头部署

文章目录 前言相关网址综合安防管理平台网址获取Appkey和Secret/密码和密钥测试个人魔改工具类 海康视频接入获取摄像头Id下载海康Web插件原生Html导入网页设置 JS封装封装代码使用设置成功&#xff01; 前言 最近有个需求是将海康的摄像头视频画面传到我们平台上&#xff0c;…