Linux内核分析SMP启动.ppt

上传人:小飞机 文档编号:5437924 上传时间:2023-07-07 格式:PPT 页数:30 大小:254.99KB
返回 下载 相关 举报
Linux内核分析SMP启动.ppt_第1页
第1页 / 共30页
Linux内核分析SMP启动.ppt_第2页
第2页 / 共30页
Linux内核分析SMP启动.ppt_第3页
第3页 / 共30页
Linux内核分析SMP启动.ppt_第4页
第4页 / 共30页
Linux内核分析SMP启动.ppt_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《Linux内核分析SMP启动.ppt》由会员分享,可在线阅读,更多相关《Linux内核分析SMP启动.ppt(30页珍藏版)》请在三一办公上搜索。

1、Linux内核分析多处理器SMP系统结构,黄晶晶 1134444蒋乾悦 1131843魏浩洋 1131841,SMP简介,SMP简介SMP系统的引导SMP结构中的互斥SMP结构中的高速缓存与内存的一致性SMP结构中的中断机制SMP结构中的进程调度,SMP简介,在给定的时间内,CPU的最高速度是有限的,提高计算速度方法之一 就是使用多个CPU多处理器系统(Multi-Processor Systems,MPS)整个硬件系统由统一的操作系统控制,在处理器和程序之间实现作业、任务、程序等的全面并行,并行计算机分类根据指令流和数据流的不同,通常把计算机系统分为:单指令流单数据流(SISD)单指令流多数

2、据流(SIMD)多指令流单数据流(MISD)多指令流多数据流(MIMD)并行计算机系统绝大部分为MIMD系统(5类),包括并行向量机(PVP,Parallel Vector Processor);对称多处理机(SMP,Symmetric Multi Processor);大规模并行处理机(MPP,Massively Parallel Processor);机群(Cluster);分布式共享存储多处理机(DSM,Distributed Shared Memory),SMP简介,SMP简介,对称多处理器(Symmetric Multi-Processor,SMP)硬件上,CPU没主次之分(除启动和

3、初始化外),物理上采用同一种CPU,所有的 CPU通过同一条总线共享同一个内存以及所有的外部设备。为了减少访问内存冲突,SMP结构中的各个CPU通常都有各自的高速缓存软件上,每个CPU平等动态地从进程就绪队列中调度进程加以执行,中断请求也是等概率动态地分配给某个CPU,由其提供中断服务,系统总线,外部设备,SMP简介,对称多处理器(Symmetric Multi-Processor,SMP)SMP系统一般使用同一种商品化微处理器,具有片上或外置高速缓存(减少访问内存的冲突)经由高速总线(或交叉开关)连向共享存储器单一操作系统映像共享总线带宽。所有处理器共享总线带宽,完成对内存模块和I/O模块的

4、访问各个CUP独立地、异步地执行指令,SMP简介,优点:低通信延迟,各个进程通过读/写操作系统提供的共享数据缓存区来完成处理器间的通信,其延迟通常小于网络通信延迟缺点:可用性比较差可扩展性较差,SMP简介,组建SMP系统CPU内部必须内置APIC(Advanced Programmable Interrupt Controllers)单元相同的产品型号,同样类型的CPU核心完全相同的运行频率尽可能保持相同的产品序号编号,SMP简介,与单处理器结构相比,SMP结构的实现的特殊问题处理器间的同步与互斥高速缓存与内存之间内容的一致性问题对中断的处理,SMP的启动,SMP的启动 概述SMP启动的过程(

5、1)启动流程(2)相关函数介绍,SMP的启动,概述SMP结构中的CPU都是平等的,没有主次之分,这是基于系统中有多个进程的前提下在同一时间,一个进程只能由一个CPU执行系统启动对于SMP结构来说是一个特例,因为在这个阶段里系统中只有一个CPU,SMP的启动,概述SMP系统在启动,即刚加电或总清时,只能由一个CPU来执行系统引导和初始化。这个CPU称为“引导处理器”,即BP,其余的处理器处于暂停状态,称为“应用处理器”,即AP。,SMP的启动,概述BP完成系统的启动,并创建起多个进程,从而可以由多个CPU同时参与处理时,才启动AP,让它们在完成自身初始化以后投入运行。一旦各个AP都已投入运行,这

6、种暂时的主次关系便告结束,各CPU一律平等了。,SMP的启动,概述 在初始化阶段,“引导处理器”先完成自身的初始化,进入保护模式并开启页式存储管理机制,再完成系统特别是内存的初始化,然后对SMP进行初始化。,SMP的启动,SMP系统启动的过程,BP,SMP的启动,SMP系统启动的过程BP先完成自身初始化,然后从start_kernel()调用smp_init()进行SMP结构初始化smp_init()的主体是smp_boot_cpus(),依次调用do_boot_cpu()启动各个APAP通过执行trampoline.S的一段跳板程序,进入startup_32()完成一些基本初始化,SMP的启

7、动,SMP系统启动的过程AP进入start_secondary()作进一步初始化工作,进入自旋(测试全局变量smp_commenced是否变成1),等待一个统一的“起跑”命令BP完成所有AP启动后,调用smp_commence()发出该起跑命令每个CPU进入cpu_idle(),等待调度,SMP的启动,相关函数介绍smp_init()smp_boot_cpus()对BP的MTRR初始化,设置使用/不使用高速缓存,采用穿透/回写模式。收集CPU的信息,进行一些操作。如CPU逻辑号物理号映射数组的转化。BP的逻辑号总是0。x86_apicid_to_cpu x86_cpu_to_apicid,SM

8、P的启动,CPU有APIC对SMP结构来说是必要条件,所以还要对BP进行是否有APIC的检查以及其初始化。setup_local_APIC()等。开始逐个启动各个AP。phys_cpu_present_map是个全局的CPU位图,根据此位图用一个循环依次对各个AP调用do_boot_cpu()。,SMP的启动,smp_boot_cpus()do_boot_cpu()1.通过fork_by_hand()为目标CPU建立一个内核线程。令idle为指向此线程task_struct的指针。实际上fork_by_hand()就是调用do_fork(),通过init_task取得指向这个task_stru

9、ct数据结构的指针并赋值给idle idle=init_task.prev_task;idle-thread.eip=start_secondary;2.将idle-thread.eip设置指向start_secondary(),这是AP进入正常调度的入口。,SMP的启动,3.此时AP不能直接执行start_secondary(),需借助跳板来一次中转,进入startup_32()完成一些基本初始化。setup_trampoline()的作用就是为其复制好一块跳板,返回值赋给start_eip。start_eip=setup_trampoline()start_eip中的地址是低级阶段地址id

10、le-thread.eip是AP完成自身初始化,建立起页面映射后执行的高级阶段。,SMP的启动,do_boot_cpu()setup_trampoline()trampoline.S是一段汇编代码,主要针对的是AP,使其进入保护模式.把跳转地址设为0 x00100000(1M),也就是系统引导以后初始化程序的起点startup_32()地址。把寄存器%ebx的内容设置成,表示这是一个次CPU,SMP的启动,smp_boot_cpus()do_boot_cpu()4.启动AP之前,BP通过本地APIC对AP的APIC执行一次初始化操作,就是本地APIC中的一些寄存器向目标CPU的APIC发一些信

11、号。初始化在头尾分别把全局量init_deasserted置0与置1 5.接着将start_eip中的初始化程序入口地址发送给目标CPU,等待其回应,此地址写入目标CPU的APIC的控制寄存器APIC_ICR6.AP受到启动后,先进入“跳板”,进入startup_32()执行初始化,调用函数initialize_secondary()进一步初始化,SMP的启动,相关函数介绍startup_32initialize_secondary()AP在startup_32中进入BP为其准备的空转进程中,也就是自己的上下文。此进程的thread.eip指向start_secondary(),所以initi

12、alize_secondary()使其跳转到start_secondary()函数,并重新设置了堆栈指针,SMP的启动,相关函数介绍start_secondary()1.cpu_init()对AP作进一步初始化。cpu_init()主要为进程调度做准备,并把全局位图cpu_initialized对应位置1,让BP知道此AP已经初始化完毕。,SMP的启动,CPU之间的同步与协调(1)全局量init_deasserted。BP为AP初始化前将init_deasserted设置为0,AP进入smp_callin()后在一个循环中等待其成为1,保证AP在此期间不对APIC操作(2)全局位图cpu_ca

13、llout_map,AP在smp_callin()中等待对应位变成1,BP则在do_boot_cpu()中将目标AP对应位设1(3)全局位图cpu_callin_map,BP在do_boot_cpu()中向AP发出启动命令后,在一个定时循环中等待其对应位变成1,AP则在smp_callin()结束前设置相应位为1,BP检测到或超时,才从do_boot_cpu()返回(4)全局量smp_commenced,AP的起跑命令,SMP的启动,相关函数介绍start_secondary()smp_callin()调用calibrate_dalay()测试CPU计算速度同步量的检测与设置cpu_calli

14、n_map标志位设置为1初始化Time Stamp Count时间印记执行完smp_callin(),等待smp_commenced变成1,进入cpu_idle()。,SMP的启动,相关函数介绍smp_init()smp_boot_cpus()我们回到smp_boot_cpus()继续往下讲。完成所有do_boot_cpu()后,首先显示整个系统的运算能力,然后对外部APIC进行初始化,最后通过zap_low_mappings()清除页面映射目录中的低区。,SMP的启动,相关函数介绍smp_init()smp_commence()包括一个原子操作,将smp_commenced设置成1,此后,所有在start_secondary()中待命的CPU结束循环,转入cpu_idle()。至此,关于SMP系统启动的函数及流程到此便告一段落。,Thanks,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号