返回顶部
首页 > 资讯 > 操作系统 >Linux中arm64多核启动流程是怎样的
  • 265
分享到

Linux中arm64多核启动流程是怎样的

2023-06-28 10:06:07 265人浏览 安东尼
摘要

今天小编给大家分享一下linux中arm64多核启动流程是怎样的的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Kernel

今天小编给大家分享一下linux中arm64多核启动流程是怎样的的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

Linux中arm64多核启动流程是怎样的

Kernel :4.12.8

arm64多核启动流程

smp_init_cpus() //设置多核启动参数和动作
=>static int __init smp_cpu_setup(int cpu) //位于 arch/arm64/kenerl/smp.c
=> cpu_read_ops
=> cpu_get_ops
{ ops = acpi_disabled ? dt_supported_cpu_ops : acpi_supported_cpu_ops; }

.cpu_init    = smp_spin_table_cpu_init,

//分析从dts获取启动多核的两种方式 spin_table 和 psci
static const struct cpu_operations *dt_supported_cpu_ops[] __initconst = {
&smp_spin_table_ops,
&cpu_psci_ops,
NULL,
};

// spin_table 方式的几个动作接口
const struct cpu_operations smp_spin_table_ops = {
.name        = “spin-table”,
.cpu_init    = smp_spin_table_cpu_init,
.cpu_prepare    = smp_spin_table_cpu_prepare,
.cpu_boot    = smp_spin_table_cpu_boot, //bring up实际动作
};

bringup_cpu
=>int __cpu_up(unsigned int cpu, struct task_struct *idle)
=>ret = boot_secondary(cpu, idle);
cpu_ops[cpu]->cpu_boot(cpu); //实际调用 smp_spin_table_cpu_boot 之类的启动

==============================
下面分析怎么执行cpu_boot的过程
==============================
static struct cpuhp_step cpuhp_bp_states[] =

[CPUHP_BRINGUP_CPU] = {
.name            = “cpu:bringup”,
.startup.single        = bringup_cpu,
.teardown.single    = NULL,
.cant_stop        = true,
},

cpuhp_get_step() //唤起一个核有多步,这个是根据state选择对应的状态动作
sp = cpuhp_is_ap_state(state) ? cpuhp_ap_states : cpuhp_bp_states;
return sp + state;

kernel_init() =>kernel_init_freeable()

|=>void __init smp_prepare_cpus(unsigned int max_cpus)

for_each_possible_cpu(cpu) {
err = cpu_ops[cpu]->cpu_prepare(cpu);
|=>smp_init => cpu_up=>do_cpu_up  // 同样是从kernel_init_freeable()调用下来的
=>_cpu_up(unsigned int cpu, int tasks_frozen, enum cpuhp_state target)
=>cpuhp_up_callbacks
=>cpuhp_invoke_callback(unsigned int cpu, enum cpuhp_state state,
bool bringup, struct hlist_node *node)
{
if (!step->multi_instance) {
cb = bringup ? step->startup.single : step->teardown.single;
ret = cb(cpu);
//这里实际就是拿出了bringup_cpu,调用之

}

   spin table方式启动

实际就是把地址写入spin table中,然后发出sev (send envent,是一个指令)从核就奔跑起来了。

在smp_prepare_cpus() 中调用了smp_spin_table_cpu_prepare() 从核就开始跑了,不过内核设置了wfe 等待真正任务才能真正执行任务。

smp_init()中调用了smp_spin_table_cpu_boot()就是真正的启动了一个idle任务了(待确认)

  static int smp_spin_table_cpu_prepare(unsigned int cpu) {  __le64 __iomem *release_addr;   if (!cpu_release_addr[cpu])   return -ENODEV;     release_addr = ioremap_cache(cpu_release_addr[cpu],          sizeof(*release_addr));  if (!release_addr)   return -ENOMEM;     writeq_relaxed(__pa_symbol(secondary_holding_pen), release_addr);  __flush_dcache_area((__force void *)release_addr,        sizeof(*release_addr));     sev();   iounmap(release_addr);   return 0; }  static int smp_spin_table_cpu_boot(unsigned int cpu) {    write_pen_release(cpu_logical_map(cpu));     sev();   return 0; }

以上就是“Linux中arm64多核启动流程是怎样的”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网操作系统频道。

--结束END--

本文标题: Linux中arm64多核启动流程是怎样的

本文链接: https://lsjlt.com/news/318646.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Linux中arm64多核启动流程是怎样的
    今天小编给大家分享一下Linux中arm64多核启动流程是怎样的的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Kernel ...
    99+
    2023-06-28
  • Linux系统启动流程是怎么样的
    这篇文章主要为大家展示了“Linux系统启动流程是怎么样的”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux系统启动流程是怎么样的”这篇文章吧。linux启动时我们会看到许多启动信息,Li...
    99+
    2023-06-27
  • CentOS6 启动流程是怎样的
    CentOS6 启动流程是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。我们在使用Linux操作系统的时候,我们只需按下电源键,等待,然后输入账户和密码就可以使用Linu...
    99+
    2023-06-16
  • Ubuntu启动流程是怎样的
    这篇文章主要介绍“Ubuntu启动流程是怎样的”,在日常操作中,相信很多人在Ubuntu启动流程是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ubuntu启动流程是怎样的”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-17
  • Linux操作系统启动流程是怎么样的
    这篇文章主要为大家展示了“Linux操作系统启动流程是怎么样的”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux操作系统启动流程是怎么样的”这篇文章吧。Linux操作系统启动流程02 Ce...
    99+
    2023-06-15
  • CentOS系统启动流程是怎样的
    这篇文章给大家介绍CentOS系统启动流程是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1. CentOS5POST开机自检运行CMOS中的BIOS程序,加载第一个启动磁盘的Bootloader由Bootloa...
    99+
    2023-06-28
  • Linux系统启动过程是怎样的
    今天就跟大家聊聊有关Linux系统启动过程是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。第三部分:系统初始化在init的配置文件中有这么一行:si::sysinit:/etc...
    99+
    2023-06-16
  • Linux系统启动过程是怎么样的
    小编给大家分享一下Linux系统启动过程是怎么样的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多;一...
    99+
    2023-06-28
  • PostgreSQL启动恢复流程框架是怎么样的
    小编给大家分享一下PostgreSQL启动恢复流程框架是怎么样的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!以上是“Postg...
    99+
    2024-04-02
  • Linux内核是怎样的
    这篇文章主要介绍“Linux内核是怎样的”,在日常操作中,相信很多人在Linux内核是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux内核是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-05
  • Linux开机启动的流程是什么
    这篇文章主要讲解了“Linux开机启动的流程是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux开机启动的流程是什么”吧!Linux开机分为以下6个步骤,分别是BIOS, MBR,...
    99+
    2023-06-27
  • linux系统的启动流程是什么
    Linux系统的启动流程主要分为以下几个阶段: BIOS/UEFI启动:计算机加电后,首先由基本输入输出系统(BIOS)或统一可...
    99+
    2024-04-02
  • Linux内核处理中断的过程是怎样的
    Linux内核处理中断的过程是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。中断是现代 CPU 工作方式中重要的部分。例如:当你每次在键盘上按下一个按键后,CPU 会...
    99+
    2023-06-28
  • Linux内核驱动fsync机制实现过程是怎样的
    Linux内核驱动fsync机制实现过程是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在Linux内核中的IO模型基本分为4类: 1、同步阻塞I/O 2、同步非阻塞I/...
    99+
    2023-06-13
  • Linux的启动流程介绍
    这篇文章主要讲解了“Linux的启动流程介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux的启动流程介绍”吧!第一步、加载内核操作系统接管硬件以后,首先读入 /boot 目录下的内...
    99+
    2023-06-06
  • Linux内核是怎么样的
    这篇文章将为大家详细讲解有关Linux内核是怎么样的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Linux 内核,这个经常听见,却不不知道它具体是干嘛的东西,是不是觉得非常神秘Linux 内核看不见摸不...
    99+
    2023-06-16
  • 升级Linux内核的教程是怎样的
    本篇文章为大家展示了升级Linux内核的教程是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。大家好,今天我们学习一下如何从Elrepo或者源代码来安装最新的Linux内核4.0。代号为&...
    99+
    2023-06-13
  • 一文带你看懂Android Application启动流程是怎样的
    基于Android11-API30 总览 获取applicationThread,AMS这两个Binder2.attach时,将获取applicationThread对象也...
    99+
    2024-04-02
  • Linux内核中dev_info、dev_dbg、dev_err及动态调试是怎样的
    Linux内核中dev_info、dev_dbg、dev_err及动态调试是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。目前在kernel驱动代码中,都不再建议直接使用...
    99+
    2023-06-15
  • Netty NioEventLoop启动过程是怎样的
    本篇内容介绍了“Netty NioEventLoop启动过程是怎样的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!启动分析NioEventL...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作