0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

secondary cpu执行流程介绍

麦辣鸡腿堡 来源:TrustZone 作者:Hcoco 2023-12-05 16:12 次阅读

secondary cpu执行流程

aarch64架构secondary cpu的内核入口函数为secondary_entry(arch/arm64/kernel/head.S),以下为其执行主流程:

图片
由于其底层相关初始化流程与primary cpu类似,因此此处不再介绍。我们这里主要看一下它是如何通过secondary_start_kernel启动idle线程的:

asmlinkage notrace void secondary_start_kernel(void)
{
	struct mm_struct *mm = &init_mm;              			
	…
	current- >active_mm = mm;                               (1)

	cpu_uninstall_idmap();                                 (2)
	…
	ops = get_cpu_ops(cpu);
	if (ops- >cpu_postboot)
		ops- >cpu_postboot();                           (3)
	…
	set_cpu_online(cpu, true);                             (4)
	complete(&cpu_running);                                (5)
	…
	cpu_startup_entry(CPUHP_AP_ONLINE_IDLE);               (6)
}

(1)由于内核线程并没有用于地址空间,因此其active_mm通常指向上一个用户进程的地址空间。而cpu初始化时,由于之前并没有运行过用户进程,因此将其初始化为init_mm

(2)idmap地址映射仅仅是用于mmu使能时地址空间的平滑切换,在mmu使能完成后已经没有作用。更进一步,由于idmap页表所使用的ttbr0_elx页表基地址寄存器,正常情况下是用于用户空间页表的,在调度器接管该cpu之前也必须要将其归还给用户空间

(3)执行cpu_postboot回调

(4)由secondary cpu已经启动成功,故将其设置为online状态

(5)唤醒cpu hotplug线程

(6)让cpu执行idle线程,其代码实现如下:

void cpu_startup_entry(enum cpuhp_state state)
{
	arch_cpu_idle_prepare();
	cpuhp_online_idle(state);
	while (1)
		do_idle();
}

至此,cpu已经启动完成,并开始执行idle线程了。最后当然是要通知调度器,将该cpu的管理权限移交给调度器了。它是通过cpu hotplug的以下回调实现的:

static struct cpuhp_step cpuhp_hp_states[] = {
…
[CPUHP_AP_SCHED_STARTING] = {
		.name			= "sched:starting",
		.startup.single		= sched_cpu_starting,
		.teardown.single	= sched_cpu_dying,
}
…
}

以下为该函数的实现:

int sched_cpu_starting(unsigned int cpu)
{
…
sched_rq_cpu_starting(cpu);        (1sched_tick_start(cpu);             (2)
…
}

(1)用于初始化负载均衡相关参数,此后该cpu就可以在其后的负载均衡流程中拉取进程

(2)tick时钟是内核调度器的脉搏,启动了该时钟之后,cpu就会在时钟中断中执行调度操作,从而让cpu参与到系统的调度流程中

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10456

    浏览量

    206607
  • SMP
    SMP
    +关注

    关注

    0

    文章

    68

    浏览量

    19453
  • 线程
    +关注

    关注

    0

    文章

    490

    浏览量

    19503
收藏 人收藏

    评论

    相关推荐

    U-boot的执行流程

    本文主要讲述了U-boot的执行流程
    发表于 07-14 16:58 469次阅读
    U-boot的<b class='flag-5'>执行</b><b class='flag-5'>流程</b>

    求芯片内部的程序执行流程

    想了解仿真连接仿真后,芯片内部的程序执行流程,请问有相关介绍的资料吗?
    发表于 05-25 12:08

    SOC的多核启动流程详解

    , COLD_BOOT_SINGLE_CPU=1, _secondary_cold_boot=0,则下面代码不被编译, 则无论主核还是从核都不需要走 _secondary_cold_boot
    发表于 02-21 15:11

    什么是CPU分枝预测和推测执行技术?

    什么是分枝预测和推测执行技术?  分枝预测(branch prediction)和推测执行(speculation execution)是CPU动态执行技术中的主要内容,
    发表于 02-04 10:47 796次阅读

    ATMEL的CPU介绍

    ATMEL的CPU介绍ATMEL的CPU介绍ATMEL的CPU介绍ATMEL的
    发表于 10-30 18:08 5次下载

    mfc程序执行流程小结,MFC程序的执行顺序

     摘要:本文章主要以MFC程序的执行流程执行顺序等执行过程的剖析做出的结论,下面一起来看看原文的具体介绍
    发表于 12-08 15:48 9228次阅读
    mfc程序<b class='flag-5'>执行</b><b class='flag-5'>流程</b>小结,MFC程序的<b class='flag-5'>执行</b>顺序

    晶圆如何变成cpu

    本文开始介绍了晶圆的概念,其次阐述了CPU的工艺要素和和CPU生产流程,最后详细介绍了晶圆如何变成cpu
    的头像 发表于 03-16 13:54 2w次阅读

    CPU到底是怎么执行到每一个逻辑的

    总述 最近一位朋友问我,开发的代码是怎么在芯片运行起来的,我就开始给他介绍代码的预编译、汇编、编译、链接然后到一般的文件属性,再到代码运行。但是大佬问了我一句,CPU到底是怎么执行到每一个逻辑
    的头像 发表于 10-10 10:26 4017次阅读

    reset_primary函数的执行流程

    reset_primary函数的执行 以CONFIG_BOOT_SYNC_CPU使能为例, 在使能PSCI系统中,不需要使能此宏 。 reset_primary函数执行流程
    的头像 发表于 11-02 18:06 293次阅读
    reset_primary函数的<b class='flag-5'>执行</b><b class='flag-5'>流程</b>

    for循环的执行流程

    for循环是编程中常用的一种循环结构,它可以重复执行一段代码块,直到达到指定的条件才结束循环。在这篇文章中,我将详细介绍for循环的执行流程,以帮助读者深入理解该循环结构的工作原理。
    的头像 发表于 11-21 14:55 1023次阅读

    cpu执行程序内部变化

    CPU(Central Processing Unit)是计算机的核心部件之一,它负责执行计算机程序的指令,并进行数据处理和控制操作。CPU执行程序时会经历一系列复杂的内部变化。本文
    的头像 发表于 12-05 11:26 349次阅读

    secondary cpu初始化状态设置

    spin-table spin-table启动流程的示意图如下: 芯片上电后primary cpu开始执行启动流程,而secondary
    的头像 发表于 12-05 15:27 351次阅读
    <b class='flag-5'>secondary</b> <b class='flag-5'>cpu</b>初始化状态设置

    如何在内核中启动secondary cpu

    启动secondary cpu 内核在启动secondary cpu之前当然需要为其准备好执行环境,因为内核中
    的头像 发表于 12-05 15:46 279次阅读
    如何在内核中启动<b class='flag-5'>secondary</b> <b class='flag-5'>cpu</b>

    使用自旋表启动的平台设备树cpu节点介绍

    在spin_table_secondary_jump处wfe睡眠,主处理器通过修改设备树的cpu节点的cpu-release-addr属性为spin_table_cpu_release
    的头像 发表于 12-05 16:19 333次阅读

    SMP多核secondary cpu启动流程

    secondary cpu启动 由于psci方式启动secondary cpu流程,除了其所执行
    的头像 发表于 12-05 17:41 280次阅读
    SMP多核<b class='flag-5'>secondary</b> <b class='flag-5'>cpu</b>启动<b class='flag-5'>流程</b>