Linux内核分析 SMP启动

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SMP简介
与单处理器结构相比,SMP结构的实现 的特殊问题 处理器间的同步与互斥 高速缓存与内存之间内容的一致性问题 对中断的处理
SMP的启动
SMP的启动 概述 SMP启动的过程 (1) 启动流程 (2) 相关函数介绍
SMP的启动
概述 SMP结构中的CPU都是平等的,没有主次 之分,这是基于系统中有多个进程的前提 下 在同一时间,一个进程只能由一个CPU执 行 系统启动对于SMP结构来说是一个特例, 因为在这个阶段里系统中只有一个CPU
Thanks ~
SMP的启动
相关函数介绍 smp_init( )>smp_boot_cpus( ) 我们回到smp_boot_cpus( )继续往下讲。 完成所有do_boot_cpu( )后,首先显示整 个系统的运算能力,然后对外部APIC进行 初始化,最后通过zap_low_mappings( )清 除页面映射目录中的低区。
CPU 内存 CPU CPU
SMP简介
并行计算机分类 根据指令流和数据流的不同,通常把计算机系统分为: 单指令流单数据流(SISD) 单指令流多数据流(SIMD) 多指令流单数据流(MISD) 多指令流多数据流(MIMD) 并行计算机系统绝大部分为MIMD系统(5类),包括 并行向量机(PVP,Parallel Vector Processor); 对称多处理机(SMP , Symmetric Multi Processor); 大规模并行处理机(MPP,Massively Parallel Processor); 机群(Cluster); 分布式共享存储多处理机(DSM,Distributed Shared Memory)
SMP的启动
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( ) 4. 启动AP之前,BP通过本地APIC对AP的APIC执行一次 初始化操作,就是本地APIC中的一些寄存器向目标CPU 的APIC发一些信号。初始化在头尾分别把全局量 init_deasserted置0与置1 5. 接着将start_eip中的初始化程序入口地址发送给目标 CPU,等待其回应,此地址写入目标CPU的APIC的控制 寄存器APIC_ICR 6. AP受到启动后,先进入“跳板”,进入startup_32( ) 执行初始化,调用函数initialize_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_callout_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的启动
相关函数介绍 smp_init( )>smp_commence( ) 包括一个原子操作,将smp_commenced 设置成1,此后,所有在start_secondary( ) 中待命的CPU结束循环,转入cpu_idle( )。 至此,关于SMP系统启动的函数及流程到 此便告一段落。
SMP的启动
3. 此时AP不能直接执行start_secondary( ),需借 助跳板来一次中转,进入startup_32( )完成一些基 本初始化。 setup_trampoline( )的作用就是为其复制好一块跳 板,返回值赋给start_eip。 start_eip= setup_trampoline( ) start_eip中的地址是低级阶段地址 idle->thread.eip是AP完成自身初始化,建立起页 面映射后执行的高级阶段。
SMP的启动
SMP系统启动的过程 AP进入start_secondary( )作进一步初始 化工作,进入自旋(测试全局变量 smp_commenced是否变成1),等待一 个统一的“起跑”命令 BP完成所有AP启动后,调用 smp_commence( )发出该起跑命令 每个CPU进入cpu_idle( ),等待调度
SMP的启动
概述 在初始化阶段,“引导处理器”先完成 自身的初始化,进入保护模式并开启页式 存储管理机制,再完成系统特别是内存的 初始化,然后对SMP进行初始化。
SMP系统启动的过程
BP
SMP的启动
SMP的启动
SMP系统启动的过程 BP先完成自身初始化,然后从 start_kernel( )调用smp_init( )进行SMP结 构初始化 smp_init( )的主体是smp_boot_cpus( ), 依次调用do_boot_cpu( )启动各个AP AP通过执行trampoline.S的一段跳板程序, 进入startup_32( )完成一些基本初始化
SMP的启动
相关函数介绍 startup_32>initialize_secondary( ) AP在startup_32中进入BP为其准备的空转进程中, 也就是自己的上下文。 此进程的thread.eip指向start_secondary( ),所 以initialize_secondary( )使其跳转到 start_secondary( )函数,并重新设置了堆栈指针
SMP的启动
do_boot_cpu( )>setup_trampoline( ) trampoline.S是一段汇编代码,主要针对的是 AP,使其进入保护模式. 把跳转地址设为0x00100000(1M),也就是系统 引导以后初始化程序的起点startup_32( )地址。 把寄存器%ebx的内容设置成1,表示这是一个次 CPU
SMP的启动
相关函数介绍 smp_init( )>smp_boot_cpus( ) 对BP的MTRR初始化,设置使用/不使用高 速缓存,采用穿透/回写模式。 收集CPU的信息,进行一些操作。如CPU 逻辑号物理号映射数组的转化。BP的逻辑号 总是0。 x86_apicid_to_cpu[ ] x86_cpu_to_apicid[ ]
SMP简介
对称多处理器(Symmetric Multi-Processor, SMP)
硬件上,CPU没主次之分(除启动和初始化外),物理上 采用同一种CPU,所有的 CPU通过同一条总线共享同一个 内存以及所有的外部设备。为了减少访问内存冲突,SMP 结构中的各个CPU通常都有各自的高速缓存 软件上,每个CPU平等动态地从进程就绪队列中调度进程 加以执行,中断请求也是等概率动态地分配给某个CPU, 由其提供中断服务
Linux内核分析 多处理器SMP系统结构
黄晶晶 1134444 蒋乾悦 1131843 魏浩洋 1131841
SMP简介
SMP简介 SMP系统的引导 SMP结构中的互斥 SMP结构中的高速缓存与内存的一致性 SMP结构中的中断机制 SMP结构中的进程调度
SMP简介
在给定的时间内,CPU的最高速度是有限的, 提高计算速度方法之一 就是使用多个CPU 多处理器系统(Multi-Processor Systems, MPS) 整个硬件系统由统一的操作系统控制, 在处理器和程序之间实现作业、任务、 CPU 程序等的全面并行
SMP简介
优点:
低通信延迟,各个进程通过读/写操作系统提供 的共享数据缓存区来完成处理器间的通信,其延 迟通常小于网络通信延迟
缺点:
可用性比较差 可扩展性较差
SMP简介
组建SMP系统 CPU内部必须内置APIC(Advanced Programmable Interrupt Controllers) 单元 相同的产品型号,同样类型的CPU核心 完全相同的运行频率 尽可能保持相同的产品序号编号
SMP的启动
概述 SMP系统在启动,即刚加电或总清时,只 能由一个CPU来执行系统引导和初始化。 这个CPU称为“引导处理器”,即BP,其 余的处理器处于暂停状态,称为“应用处 理器”,即AP。
SMP的启动
概述 BP完成系统的启动,并创建起多个进程, 从而可以由多个CPU同时参与处理时,才 启动AP,让它们在完成自身初始化以后投 入运行。 一旦各个AP都已投入运行,这种暂时的主 次关系便告结束,各CPU一律平等了。
CPU 高速缓存 CPU 高速缓存 系统总线 外部设备 内存 CPU 高速缓存
SMP简介
对 称 多 处 理 器 ( Symmetric MultiProcessor,SMP)
SMP系统一般使用同一种商品化微处理器,具有 片上或外置高速缓存(减少访问内存的冲突) 经由高速总线(或交叉开关)连向共享存储器 单一操作系统映像 共享总线带宽。所有处理器共享总线带宽,完成 对内存模块和I/O模块的访问 各个CUP独立地、异步地执行指令
SMP的启动
smp_boot_cpus( )>do_boot_cpu( ) 1. 通过fork_by_hand( )为目标CPU建立一个内 核线程。令idle为指向此线程task_struct的指针。 实际上fork_by_hand()就是调用do_fork(),通 过init_task取得指向这个task_struct数据结构的 指针并赋值给idle idle=init_task.prev_task; idle->thread.eip=start_secondary; 2. 将idle->thread.eip设置指向 start_secondary( ),这是AP进入正常调度的入 口。
SMP的启动
相关函数介绍 start_secondary( )>smp_callin( ) 调用calibrate_dalay()测试CPU计算速度同步 量的检测与设置 cpu_callin_map标志位设置为1 初始化Time Stamp Count时间印记 执行完smp_callin( ),等待smp_commenced 变成1,进入cpu_idle( )。
相关文档
最新文档