0 Linux内核进程上下文切换深入理解,LINUX — 整站优化,SEO整站优化网 -

SEO整站优化

查看: 3335|回复: 10

Linux内核进程上下文切换深入理解

[复制链接]

157

主题

157

帖子

483

积分

中级会员

Rank: 3Rank: 3

积分
483
 楼主| 发表于 2021-8-2 21:13:09| 字数 11,452 | 显示全部楼层 |阅读模式
Linux内乱核历程高低文切换深化明白整站劣化,保举视频:5 g, s6 @; p1 e5 c8 N" @; z0 ~; S
  ~2 l6 ]0 g6 A! X
5个圆里剖析linux内乱核架构,让您对内乱核没有再生疏
  c+ f& o  {+ Y8 k分析Linux内乱核历程治理
: W. a9 _  U! nc/c++ linux效劳器开辟进修天址:C/C++Linux效劳器开辟/背景架构师【整声教诲】-进修视频教程-腾讯教室
8 I, i% |% l% P; C8 ^$ H我皆明白操纵体系的一个主要功效便是举行历程治理,而历程治理便是正在适宜的机会挑选适宜的历程去施行,正在单个cpu运转行列上各个历程宏不雅并止微不雅串止施行,多个cpu运转行列上的各个历程之间完整的并止施行。历程治理是个庞大的历程,比方历程的形貌、建立战烧毁、性命周期治理、历程切换、历程抢占、调理计谋、背载平衡等等。本文次要存眷历程治理的一个切进面,那便是历程的高低文切换,去明白linux内乱核是怎样历程历程高低文切换的,从而掀开高低文切换的奥秘里纱。
, `* z; Z2 I; v. M(注重:本文以linux-5.0内乱核源码解说,接纳arm64架构)% e5 N6 d, e+ @* u; H) c3 u3 @( @
1.历程高低文的观点
4 a5 F' F) b& I, R& Q" ^! n' d- h1 g( F' ]
历程高低文是历程施行运动齐历程的静态形貌。我们把已施行过的历程指令战数据正在相干存放器取客栈中的内乱容称为历程上文,把正正在施行的指令战数据正在存放器取客栈中的内乱容称为历程注释,把待施行的指令战数据正在存放器取客栈中的内乱容称为历程下文。) K. h6 F$ p5 |4 P
现实上linux内乱核中,历程高低文包罗历程的假造天址空间战硬件高低文。
! p0 n! x1 {- ~5 i历程硬件高低文包罗了当前cpu的一组存放器的荟萃,arm64中利用task_struct构造的thread成员的cpu_context成员去形貌,包罗x19-x28,sp, pc等。
9 y. y9 r' H7 ?以下为硬件高低文寄存示例图:  C1 Z  N5 k4 a) b
5 c% {0 K0 h2 v& ^* q8 k5 X7 b& d
Linux内乱核历程高低文切换深化明白-1.jpg

) c/ J! Q6 V% Y% f! g2.高低文切换具体历程
% X6 z9 ~5 |* U9 ^$ C* c9 @3 e# y& G2 _/ ^2 _
历程高低文切换次要触及到两部门次要历程:历程天址空间切换战处置惩罚器形态切换。天址空间切换次要是针对用户历程而行,而处置惩罚器形态切换对应于一切的调理单元。上面我们划分看下那两个历程:
$ `5 w6 |; r( Q3 l' }__schedule   // kernel/sched/core.c->context_switch  ->switch_mm_irqs_off   //历程天址空间切换  ->switch_to //处置惩罚器形态切换2.1 历程天址空间切换7 \" ~9 G' q" x+ P  H' b
历程天址空间指的是历程所具有的假造天址空间,而那个天址空间是假的,是linux内乱核经由过程数据构造去形貌出去的,从而使得每个历程皆感受到本人具有全部内乱存的假象,cpu会见的指令战数据终极会降真到现实的物理天址,对用历程而行经由过程缺页非常去分派战建设页表映照。历程天址空间内乱有历程运转的指令战数据,因而到调理器从其他历程从头切换到我的时间,为了包管当行进程会见的假造天址是本人的必需切换天址空间。' c8 t* y2 w  F' h! o; P
现实上,历程天址空间利用mm_struct构造体去形貌,那个构造体被嵌进到历程形貌符(我们凡是所道的历程掌握块PCB)task_struct中,mm_struct构造体将各个vma构造起去举行治理,此中有一个成员pgd相当主要,天址空间切换中最主要的是pgd的设置。6 {7 q& U4 g. ~( H% m8 `  I
pgd中生存的是历程的页齐局目次的假造天址(本文会触及到页表相干的一些观点,正在此没有是重面,没有清晰的能够查阅相干材料,前期有时机会解说历程页表),记着生存的是假造天址,那末pgd的值是什么时候被设置的呢?谜底是fork的时间,若是是建立历程,需求分派设置mm_struct,此中会分派历程页齐局目次地点的页,然后将尾天址赋值给pgd。2 l8 \+ O( p8 g# B. \5 M
我们去看看历程天址空间事实是怎样切换的,效果会让您年夜吃一惊(那里临时没有思量asid机造,前面有时机会正在其他文章中解说):
( c  z2 p9 U2 I; B% J( N" q代码途径以下:# Y4 U3 R& l( ~. h: O- z
context_switch  // kernel/sched/core.c->switch_mm_irqs_off  ->switch_mm  ->__switch_mm    ->check_and_switch_context    ->cpu_switch_mm      ->cpu_do_switch_mm(virt_to_phys(pgd),mm) //arch/arm64/include/asm/mmu_context.h    arch/arm64/mm/proc.S158 /*159  *      cpu_do_switch_mm(pgd_phys, tsk)160  *161  *      Set the translation table base pointer to be pgd_phys.162  *163  *      - pgd_phys - physical address of new TTB164  */165 ENTRY(cpu_do_switch_mm)166         mrs     x2, ttbr1_el1167         mmid    x1, x1                          // get mm->context.id168         phys_to_ttbr x3, x0169170 alternative_if ARM64_HAS_CNP171         cbz     x1, 1f                          // skip CNP for reserved ASID172         orr     x3, x3, #TTBR_CNP_BIT173 1:174 alternative_else_nop_endif175 #ifdef CONFIG_ARM64_SW_TTBR0_PAN176         bfi     x3, x1, #48, #16                // set the ASID field in TTBR0177 #endif178         bfi     x2, x1, #48, #16                // set the ASID179         msr     ttbr1_el1, x2                   // in TTBR1 (since TCR.A1 is set)180         isb181         msr     ttbr0_el1, x3                   // now update TTBR0182         isb183         b       post_ttbr_update_workaround     // Back to C code...184 ENDPROC(cpu_do_switch_mm)代码中最焦点的为181止,终极将历程的pgd假造天址转化为物理天址寄存正在ttbr0_el1中,那是用户空间的页表基址存放器,当会见用户空间天址的时间mmu会经由过程那个存放器去做遍历页表得到物理天址(ttbr1_el1是内乱核空间的页表基址存放器,会见内乱核空间天址时利用,一切历程同享,没有需求切换)。完成了那一步,也便完成了历程的天址空间切换,切当的道是历程的假造天址空间切换。
: s( ?8 ]3 [. O: F2 q: ~# I: G/ D内乱核处置惩罚的是否是很简朴,很文雅,别看只是设置了页表基址存放器,也便是将行将施行的历程的页齐局目次的物理天址设置到页表基址存放器,他却完成了天址空间切换的豪举,有的小同伴能够没有明确为啥那便完成了天址空间切换?试念若是历程念要会见一个用户空间假造天址,cpu的mmu所做的事情,便是从页表基址存放器拿到页齐局目次的物理基天址,然后战假造天址共同去查查找页表,终极找到物理天址举行会见(固然若是tlb掷中便没有需求遍历页表),每次用户假造天址会见的时间(内乱核空间同享没有思量),因为页表基天址存放器内乱寄存的是当前施行历程的页齐局目次的物理天址,以是会见本人的一套页表,拿到的是属于本人的物理天址(现实上,历程是会见假造天址空间的指令数据的时间不停发作缺页非常,然后缺页非常处置惩罚法式为历程分派现实的物理页,然后将页帧号战页表属性挖进本人的页表条目中),便没有会会见其他历程的指令战数据,那也是为什么多个历程能够会见不异的假造天址而没有会泛起不对的缘故原由,并且做到的各个天址空间的断绝互没有影响(同享内乱存除中)。' v3 Z; N/ H2 Y5 s* a% A9 @" |0 d
实在,天址空间切换过程当中,借会浑空tlb,避免当行进程假造天址转化过程当中掷中上一个历程的tlb表项,一样平常会将一切的tlb无效,可是那会招致很年夜的机能丧失,由于新历程被切换出去的时间面临的是齐新的空的tlb,形成很或许率的tlb miss,需求从头遍历多级页表,以是arm64正在tlb表项中增添了非齐局(nG)位辨别内乱核战历程的页表项,利用ASID辨别差别历程的页表项,去包管能够正在切换天址空间的时间能够没有刷tlb,前面会次要解说ASID手艺。
' @. f9 @2 V4 v' |! ]借需求注重的是仅仅切换用户天址空间,内乱核天址空间因为是同享的没有需求切换,也便是为什么切换到内乱核线程没有需求也出有天址空间的缘故原由。
1 C6 i- X, F. X7 b2 Y5 A, I, v; U以下为历程天址空间切换示例图:
* [- X+ F$ z' Y' w9 f3 F" F) _/ l4 l5 Z# U/ f% }9 Y
Linux内乱核历程高低文切换深化明白-2.jpg
4 W$ @4 |+ T: f  G. i$ s5 v5 \5 @
【文章祸利】需求C/C++ Linux效劳器架构师进修材料减群812855908(材料包罗C/C++,Linux,golang手艺,内乱核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等)& V1 ]. ~% W5 \: z3 w( q
2 p7 v, J" p+ A4 Q' {1 Y' n' p
Linux内乱核历程高低文切换深化明白-3.jpg
  o+ A4 ~% ?2 J5 A
2.2 处置惩罚器形态(硬件高低文)切换
0 h  ]+ |( q) @+ Z前里举行了天址空间切换,只是包管了历程会见指令数据时会见的是本人天址空间(固然高低文切换的时间处于内乱核空间,施行的是内乱核天址数据,当返回用户空间的时间才有时机施行用户空间指令数据**,天址空间切换为历程会见本人用户空间做好了筹办**),可是历程施行的内乱核栈照旧前一个历程的,当前施行流也照旧前一个历程的,需求做切换。
1 h/ \1 B* D- a; U! Karm64中切换代码以下:$ ]6 l  _) c" f2 b0 v  c
switch_to->__switch_to  ... //浮面存放器等的切换  ->cpu_switch_to(prev, next)arch/arm64/kernel/entry.S:1032 /*1033  * Register switch for AArch64. The callee-saved registers need to be saved1034  * and restored. On entry:1035  *   x0 = previous task_struct (must be preserved across the switch)1036  *   x1 = next task_struct1037  * Previous and next are guaranteed not to be the same.1038  *1039  */1040 ENTRY(cpu_switch_to)1041         mov     x10, #THREAD_CPU_CONTEXT1042         add     x8, x0, x101043         mov     x9, sp1044         stp     x19, x20, [x8], #16             // store callee-saved registers1045         stp     x21, x22, [x8], #161046         stp     x23, x24, [x8], #161047         stp     x25, x26, [x8], #161048         stp     x27, x28, [x8], #161049         stp     x29, x9, [x8], #161050         str     lr, [x8]1051         add     x8, x1, x101052         ldp     x19, x20, [x8], #16             // restore callee-saved registers1053         ldp     x21, x22, [x8], #161054         ldp     x23, x24, [x8], #161055         ldp     x25, x26, [x8], #161056         ldp     x27, x28, [x8], #161057         ldp     x29, x9, [x8], #161058         ldr     lr, [x8]1059         mov     sp, x91060         msr     sp_el0, x11061         ret1062 ENDPROC(cpu_switch_to)此中x19-x28是arm64 架构划定需求挪用生存的存放器,能够看随处理器形态切换的时间将前一个历程(prev)的x19-x28,fp,sp,pc生存到了历程形貌符的cpu_contex中,然后将行将施行的历程(next)形貌符的cpu_contex的x19-x28,fp,sp,pc规复到响应存放器中,并且将next历程的历程形貌符task_struct天址寄存正在sp_el0中,用于经由过程current找到当行进程,如许便完成了处置惩罚器的形态切换。* j0 m. K' {9 f
现实上,处置惩罚器形态切换便是将前一个历程的sp,pc等存放器的值生存到一块内乱存上,然后将行将施行的历程的sp,pc等存放器的值从另外一块内乱存中规复到响应存放器中,规复sp完成了历程内乱核栈的切换,规复pc完成了指令施行流的切换。此中生存/规复所用到的那块内乱存需求被历程所标识,那块内乱存那便是cpu_contex那个构造的地位(历程切换皆是正在内乱核空间完成)。; |- }5 M5 ]/ V
因为用户空间经由过程非常/中止进进内乱核空间的时间皆需求生存现场,也便是生存发作非常/中止时的一切通用存放器的值,内乱核会把“现场”生存到每一个历程独有的历程内乱核栈中,并用pt_regs构造去形貌,当非常/中止处置惩罚完成以后会返回用户空间,返回之前会规复之前生存的“现场”,用户法式持续施行。
5 r( p" @: V" T8 I以是当历程切换的时间,当行进程被时钟中止挨断,将发作中止时的现场生存到历程内乱核栈(如:sp, lr等),然后会切换到下一个历程,当再次回切换返来的时间,返回用户空间的时间会规复之前的现场,历程就能够持续施行(施行之前被中止挨断的下一条指令,持续利用本人用户态sp),那关于用户历程来讲是通明的。6 F5 z  w7 k6 J
以下为硬件高低文切换示例图:
; p9 V; ?; j$ g" F5 k1 c! i! C3 C! J, f3 B) A6 }. A
Linux内乱核历程高低文切换深化明白-4.jpg

; n9 Y& J- ~' q& M" P% u4 v3 N/ W
- W& W6 R: ]( X' V( f
+ P  v0 b4 r  V% `& p: D. g3.ASID机造# Q6 C5 \' {0 I
: ~1 h' H* P3 l
前里讲过,历程切换的时间,因为tlb中寄存的多是其他历程的tlb表项,一切才需求正在历程切换的时间举行tlb的浑空事情(浑空便是使得一切的tlb表项无效,天址转换需求遍历多级页表,找到页表项,然后从头减载页表项到tlb),有了ASID机造以后,掷中tlb表项,由假造天址战ASID配合决议(固然另有nG位),能够加小历程切换中tlb被浑空的时机。; g; E/ Y  K) k) Y& O; S* T1 D: B3 v
上面我们解说ASID机造,ASID(Address Space Identifer 天址空间标识符),用于区分差别历程的页表项,arm64中,能够挑选两种ASID少度8位大概16位,那里以8位来说解。
# |" o. F8 d& g若是ASID少度为8位,那末ASID有256个值,可是因为0是保存的,一切能够分派的ASID规模便为1-255,那末能够标识255个历程,当超越255个历程的时间,会泛起两个历程的ASID不异的情形,因而内乱核利用了ASID版本号。
5 p) F3 U/ x& U" R- C内乱核中处置惩罚以下(参考arch/arm64/mm/context.c):" r! U, J0 Z1 Q# u
1)内乱核为每一个历程分派一个64位的硬件ASID,此中低8位为硬件ASID,下56位为ASID版本号,那个硬件ASID寄存放正在历程的mm_struct构造的context构造的id中,历程建立的时间会初初化为0。- K+ K7 }& K5 G5 Q/ Z
2)内乱核中有一个64位的齐局变量asid_generation,一样它的下56位为ASID版本号,用于标识当前ASID分派的批次。4 q( I& [) U1 |% H- G. c' ^
3)当历程调理,由prev历程切换到next历程的时间,若是没有是内乱核线程则举行天址空间切换挪用check_and_switch_context,此函数会判定next历程的ASID版本号能否战齐局的ASID版本号不异(能否处于统一批次),若是不异则没有需求为next历程分派ASID,没有不异则需求分派ASID。3 `2 E8 d, ?0 O& O3 W
4)内乱核利用asid_map位图去治理硬件ASID的分派,asid_bits记载利用的ASID的少度,每处置惩罚器变量active_asids生存当前分派的硬件ASID,每处置惩罚器变量reserved_asids寄存保存的ASID,tlb_flush_pending位图记载需求浑空tlb的cpu荟萃。% L! x% x' T0 K/ o, Q
硬件ASID分派计谋以下:7 p( v2 h  p& ]9 }3 b
(1)若是历程的ASID版本号战当前齐局的ASID版本号不异(同批次情形),则没有需求从头分派ASID。4 n% N6 s; Q* o0 ]# r" b
(2)若是历程的ASID版本号战当前齐局的ASID版本号没有不异(差别批次情形),且历程本来的硬件ASID曾经被分派,则从头分派新的硬件ASID,并将当前齐局的ASID版本号组开新分派的硬件ASID写到历程的硬件ASID中。
+ k/ V  _& [4 [5 D& |(3)若是历程的ASID版本号战当前齐局的ASID版本号没有不异(差别批次情形),且历程本来的硬件ASID借出有被分派,则没有需求从头分派新的硬件ASID,只需求更新历程硬件ASID版本号,并将当前齐局的ASID版本号组开历程本来的硬件ASID写到历程的硬件ASID中。
0 f' y/ [8 t/ M0 q" s4 x(4)若是历程的ASID版本号战当前齐局的ASID版本号没有不异(差别批次情形),需求分派硬件ASID时,发明硬件ASID曾经被其他历程分派完(asid_map位图中查找,发明位图齐1),则那个时间需求递删齐局的ASID版本号, 浑空一切cpu的tlb, 浑空asid_map位图,然后分派硬件ASID,并将当前齐局的ASID版本号组开新分派的硬件ASID写到历程的硬件ASID中。1 ^& [7 i0 z% x3 o, e
上面我们以真例去看ASID的分派历程:
5 b; F! }* F- z! A: _. _以下图:2 ?% |/ e( u  l" a
& G  S3 C  E  X; a6 ^5 e" P: i
Linux内乱核历程高低文切换深化明白-5.jpg
& c8 m' o" m6 f9 J7 x) v
我们假定图中从A历程到D历程,有255个历程,恰好分派完了asid, ,从A到D的切换过程当中利用的皆是统一批次的asid版本号。! a6 a5 I6 P$ N3 B; Z
则那个过程当中,有历程会建立的时间被切换到,假定没有超越255个历程,正在切换过程当中会为新历程分派硬件的ASID,分派完后下次切换到他时因为他的ASID版本号战当前的齐局的ASID版本号不异,以是没有需求再次分派ASID,固然也没有需求浑空tlb。! K. ~6 |& F- o5 F% U
注:那里道的ASID即为硬件ASID区分于ASID版本号。5 Z' A5 U$ |8 g
情形1-ASID版本号稳定 属于计谋(1):从C历程到D历程切换,内乱核判定D历程的ASID版本号战当前的齐局的ASID版本号不异,以是没有需求为他分派ASID(施行快速途径switch_mm_fastpath来设置ttbrx_el1))。
+ c9 S7 L2 ^2 }, v情形2 -硬件ASID所有分派完 属于计谋(4):假定抵达D历程时,asid曾经所有分派完(体系中有255个历程皆分派到了硬件asid号),那个时间新建立的历程E被调理器选中,切换到E,因为新建立的历程的硬件ASID被初初化为0,以是战当前的齐局的ASID版本号差别(没有正在统一批次),则那个时间会施行new_context为历程分派ASID,可是因为出有能够分派的ASID,以是会将齐局的ASID版本号减1(发作ASID缭绕),那个时间齐局的ASID为801,然后浑空asid_map,置位tlb_flush_pending一切bit用于浑空一切cpu的tlb,然后再次来分派硬件ASID给E历程,那个时间分派到了1给他(将ASID版本号)。
' w+ G% B6 F) X: k8 O/ S8 W* S情形3-ASID版本号发作转变,历程的硬件ASID能够再次利用 属于计谋(3):假定从E切换到了B历程,而B历程之前曾经正在齐局的ASID版本号为800的批次上分派了编号为5的硬件ASID,可是B历程的ASID版本号800战如今齐局的ASID版本号801没有不异,一切需求new_context为历程分派ASID,分派的时间发明asid_map中编号为5出有被置位,也便是出有其他历程分派了5那个ASID,一切能够持续利用本来分派的硬件ASID 5。
2 Z% t% m1 u& i6 P# o情形4 - ASID版本号发作转变,有其他历程曾经分派了不异的硬件ASID 属于计谋(2): 假定从B历程切换到A历程,而B历程之前曾经正在齐局的ASID版本号为800的批次上分派了编号为1的硬件ASID,可是B历程的ASID版本号800战如今齐局的ASID版本号801没有不异,一切需求new_context为历程分派ASID,分派的时间发明asid_map中编号为1曾经被置位,也便是其他历程曾经分派了1那个ASID,需求从asid_map寻觅下一个闲暇的ASID,则分派了新的ASID为6。4 F7 u( [  V( v
假定从A到E,因为E的ASID版本号战齐局的ASID版本号(统一批次),战情形1不异,没有需求分派ASID。可是之前本来处于800那个ASID版本号批次的历程皆需求从头分派ASID,有的可使用本来的硬件ASID,有的从头分派硬件ASID,可是皆将ASID版本号修正为了如今齐局的ASID版本号801。可是,跟着硬件ASID的不停分派,终极处于801那一批次的硬件ASID也会分派完,那个时间便是上里的情形2,要情形一切cpu的tlb。
! X0 y$ _% Q& R我能够看到有了ASID机造以后,因为只要当硬件ASID被分派完了(如被255个历程利用),发作缭绕的时间才会浑空一切cpu的tlb,年夜年夜进步了体系的机能(出有ASID机造的情形下每次历程切换需求天址空间切换的时间皆需求浑空tlb)。
6 n/ r$ f1 ]7 K! C' b4. 通俗用户历程、通俗用户线程、内乱核线程切换的差异
8 y  r7 ^+ r: L$ }- C" e  s& f$ g. ~9 S, T  U0 ]; T7 o
内乱核天址空间切换的时间有一下准绳:看的是历程形貌符的mm_struct构造,便是成员mm:
+ J# x+ Q7 T8 E5 P+ i1)若是mm为NULL,则表现行将切换的是内乱核线程,没有需求切换天址空间(一切使命同享内乱核天址空间)。
$ u$ ]4 S6 q& i. E4 ]3 z' H! |8 k& `2)内乱核线程会借用前一个用户历程的mm,赋值到本人的active_mm(自己的mm为空),历程切换的时间便会比力前一个历程的active_mm战当行进程的mm。8 M, y9 a: [) O9 E0 {) S
3)若是前一个使命的战行将切换的使命,具有不异的mm成员,也便是同享天址空间的线程则也没有需求切换天址空间。2 q. h: P& |- J# I" ]" o3 ~
->一切的历程线程之间举行切换皆需求切换处置惩罚器形态。1 @/ z6 _9 Y2 z) v
->关于通俗的用户历程之间举行切换需求切换天址空间。9 ?9 d- T8 N4 o2 g! c3 u' E# l
->统一个线程组中的线程之间切换没有需求切换天址空间,由于他们同享不异的天址空间。
& |' ~4 \' L6 s; ?  r6 ^% D-> 内乱核线程正在高低文切换的时间没有需求切换天址空间,仅仅是借用上一个历程mm_struct构造。
8 h9 Z4 ^8 v# Z; M" J  S, {有一了局景:* y6 M4 f! q2 n! l* H% _
商定:我们将历程/线程统称为使命,此中U表现用户使命(历程/线程),K表现内乱核线程,带无数字表现统一个线程组中的线程。. x' T% A7 x7 \6 U' L
有以下使命:Ua1 Ua2 Ub Uc Ka Kb (eg:Ua1为用户历程, Ua2为战Ua1正在统一线程组的用户历程,Ub通俗的用户历程,Ka通俗的内乱核线程 )。
& p, Q1 @6 `0 d若是调理挨次以下:
& m8 n, Y: c8 m( O/ L7 qUc -> Ua1 -> Ua2 -> Ub -> Ka -> Kb -> Ub* t, i0 q& e9 b
从Uc -> Ua1 因为是差别的历程,需求切换天址空间。
9 g, B5 o( v( Y7 v从 Ua1 -> Ua2 因为是不异线程组中的差别线程,同享天址空间,正在切换到Ua1的时间曾经切换了天址空间,一切没有需求切换天址空间。, k( Y; [6 T# l8 p* {+ \
从 Ua2 -> Ub 因为是差别的历程,需求切换天址空间。3 {& Y! |+ _% e1 D
从 Ub -> Ka 因为切换到内乱核线程,以是没有需求切换天址空间。: B/ U" U$ j1 ?2 W3 @; T, Q
从Ka -> Kb 俩内乱核线程之前切换,没有需求切换天址空间。
& f" |; |/ F1 I0 y" L7 d. u) T: x从Kb -> Ub 从内乱核线程切换到用户历程,因为Ka战Kb皆是借用Ub的active_mm,而Ub的active_mm 即是Ub的mm,以是那个时间 Kb的active_mm战 Ub的mm不异,一切也没有会切换天址空间。& D7 u8 J" `7 z  F  B9 ]1 h
以下为多使命天址空间切换示例图:
. T. L, M% ?2 B' V3 t: r7 ~# Q2 H1 f8 w  b3 R3 |" x
Linux内乱核历程高低文切换深化明白-6.jpg

2 j9 D& }# s$ N% ?
3 M; X4 a% `3 J3 N# G7 ?7 a: B) _0 Y2 R- A, p; Z+ p! h% [
5. 历程切换齐景视图3 M! h: @) o+ \$ e! M( Y
' k) Z0 \: c% `8 a5 c2 t
我们以了局景为例:7 Y$ ^! M7 {- r2 x" p" S) O. W
A,B两个历程皆是通俗的用户历程,从历程A切换到历程B,简朴起睹我们正在那里没有思量其他的抢占机会,我们假定A,B历程只是轮回举行一些根本的运算操纵,历来没有挪用任何体系挪用,只思量被时钟中止,返回用户空间之前被抢占的情形。/ |& g7 y6 ~" h! h
上面给出历程切换的齐景视图:
3 p0 }2 _* n9 _/ b% g5 V1 E" A4 @5 n/ @
Linux内乱核历程高低文切换深化明白-7.jpg

9 O7 a, S4 N6 X9 g视图中曾经解说很清晰,需求夸大3个要害面:
4 v" _9 O8 Z" u6 v1 ]1.发作中止时的生存现场,将发作中止时的一切通用存放器生存到历程的内乱核栈,利用struct pt_regs构造。4 N5 b. [7 m4 [8 f
2.天址空间切换将历程本人的页齐局目次的基天址pgd生存正在ttbr0_le1中,用于mmu的页表遍历的肇端面。
8 m9 b) ^0 C- S. @; _3 I( {% L) V3.硬件高低文切换的时间,将此时的挪用生存存放器战pc, sp生存到struct cpu_context构造中。做好了那几个生存事情,当历程再次被调理返来的时间,经由过程cpu_context中生存的pc回到了cpu_switch_to的下一条指令持续施行,而因为cpu_context中生存的sp招致当行进程回到本人的内乱核栈,经由一系列的内乱核栈的出栈处置惩罚,最初将本来生存正在pt_regs中的通用存放器的值规复到了通用存放器,如许历程回到用户空间就能够持续沿着被中止挨断的下一条指令最先施行,用户栈也回到了被挨断之前的地位,而历程会见的指令数据做天址转化(VA到PA)也皆是从本人的pgd最先举行,统统对用户来讲便似乎出有发作一样,几乎完美无缺。! V+ [+ o( Y3 e* I
6. 总结
  p4 N. ?' ?& w% o
8 r& |4 R- L* p历程治理中最主要的一步要举行历程高低文切换,此中次要有两年夜步调:天址空间切换战处置惩罚器形态切换(硬件高低文切换),前者包管了历程回到用户空间以后可以会见到本人的指令战数据(此中包罗加小tlb浑空的ASID机造),后者包管了历程内乱核栈战施行流的切换,会将当行进程的硬件高低文生存正在历程所治理的一块内乱存,然后将行将施行的历程的硬件高低文从内乱存中规复到存放器,有了那两步的切换历程包管了历程运转的杂乱无章,固然切换的历程是正在内乱核空间完成,那关于历程来讲是通明的。, y- u6 ?# _( I6 m: `; `: e
1 z9 I+ c1 Z8 o: Z1 m+ V! c! p8 a
本文链接:linux手艺栈|存眷整站劣化网 进修更多seo相干要领...
回复

使用道具 举报

0

主题

25

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2021-8-2 22:06:32| 字数 3 | 显示全部楼层
转发了
回复

使用道具 举报

0

主题

37

帖子

79

积分

注册会员

Rank: 2

积分
79
发表于 2021-8-2 22:33:18| 字数 3 | 显示全部楼层
转发了
回复

使用道具 举报

0

主题

23

帖子

54

积分

注册会员

Rank: 2

积分
54
发表于 2021-8-2 23:05:13| 字数 3 | 显示全部楼层
转发了
回复

使用道具 举报

0

主题

26

帖子

58

积分

注册会员

Rank: 2

积分
58
发表于 2021-8-2 23:45:21| 字数 3 | 显示全部楼层
转发了
回复

使用道具 举报

0

主题

17

帖子

42

积分

新手上路

Rank: 1

积分
42
发表于 2021-8-3 00:11:46| 字数 3 | 显示全部楼层
转发了
回复

使用道具 举报

0

主题

25

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2021-8-3 00:37:40| 字数 3 | 显示全部楼层
转发了
回复

使用道具 举报

0

主题

25

帖子

59

积分

注册会员

Rank: 2

积分
59
发表于 2021-8-3 00:59:08| 字数 3 | 显示全部楼层
转发了
回复

使用道具 举报

0

主题

29

帖子

65

积分

注册会员

Rank: 2

积分
65
发表于 2021-8-3 01:46:22| 字数 3 | 显示全部楼层
转发了
回复

使用道具 举报

0

主题

39

帖子

81

积分

注册会员

Rank: 2

积分
81
发表于 2021-8-3 02:12:37| 字数 3 | 显示全部楼层
转发了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • QQ|Archiver|手机版|小黑屋|SEO整站优化 — 外包整站SEO优化,万维网【SEO外包】整站优化网 ( 粤ICP备19158344号 ) |

    GMT+8, 2022-5-26 04:42 , Processed in 0.148400 second(s), 16 queries , Gzip On, Redis On.

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表