国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

lab5:深入理解進程切換

這篇具有很好參考價值的文章主要介紹了lab5:深入理解進程切換。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本文主要分析 Linux 5.4.34 版本內(nèi)核中進程切換的基本操作與基本代碼框架。

一、進程切換的工作機制

    在實際的代碼中,每個進程切換基本都由兩個步驟組成,即切換頁全局目錄以安裝一個新的地址空間以及切換內(nèi)核態(tài)堆棧和進程cpu上下文。
  具體的代碼走向如下:schedule()函數(shù)選擇一個新的進程來運行,并調(diào)用context_switch進行上下文的切換。context_switch首先調(diào)用switch_mm切換CR3,然后調(diào)用宏switch_to來進行CPU上下文切換。

content_switch 函數(shù)位于 Linux 內(nèi)核源碼目錄的 kernel/sched/core.c 中,代碼如下:
lab5:深入理解進程切換
lab5:深入理解進程切換

content_switch 函數(shù)有三個參數(shù):rq、prev、next,其中 rq 指向本次進程切換發(fā)生的 進程就緒隊列;prev 和 next 分別指向切換前后進程的進程描述符。下面我們來分析一下具體的執(zhí)行過程。

看代碼可知,首先執(zhí)行的是prepare_task_switch函數(shù),該函數(shù)需要在進程切換之前調(diào)用,內(nèi)核會執(zhí)行與體系結(jié)構(gòu)相關(guān)的一些調(diào)測指令。上下文切換完成后,必須調(diào)用 finish_task_switch,即這兩個函數(shù)一定是要成對出現(xiàn)的。

然后是arch_start_context_switch()函數(shù),該函數(shù)給各個體系結(jié)構(gòu)專有的開始上下文切換的工作提供了入口,在不同的體系結(jié)構(gòu)中其實現(xiàn)是不同的。

在本函數(shù)的主體部分(上述if-else部分)實現(xiàn)了進程地址空間切換過程,這里prev是進程切換之前的進程,next是進程切換后要執(zhí)行的進程,mm是進程的地址空間描述符。

  • 這里首先判斷next進程mm是否為空,如果為空的話,說明是內(nèi)核級線程(否則就是用戶進程),如果是內(nèi)核級線程的話需要調(diào)用enter_lazy_tlb,標(biāo)記cpu內(nèi)核進入了lazy tlb mode(這里查閱了資料應(yīng)該是為了減少切換上下文時不必要的TLB更新,CPU進入該模式后不對TLB進行更新)。然后地址空間不用更改,如果之前的是用戶進程,則引用計數(shù)增加1個,如果之前的進程是內(nèi)核級線程,則需要把原來的進程的active_mm清空,結(jié)束對mm_struct的借用。

  • 如果next->mm不為空,即要切換到的進程為用戶進程。首先調(diào)用membarrier_switch_mm函數(shù)來建立了一個內(nèi)存屏障,來保證上一個進程訪問其內(nèi)存空間與下一個進程訪問內(nèi)存空間之前的一個先后順序(其實就是一個進程同步),避免在訪存時出現(xiàn)訪存錯誤;然后是執(zhí)行switch_mm_irqs_off函數(shù),即真正切換 mm_struct;最后如果切換前的進程是內(nèi)核進程,則需要設(shè)置一些東西來用于后續(xù)清除引用計數(shù)。

    最后面就是switch_to函數(shù),即切換寄存器狀態(tài)和棧,switch_to會進一步調(diào)用__switch_to_asm,而 __switch_to_asm 的實現(xiàn)是和體系結(jié)構(gòu)強相關(guān)的。

二、sp和ip在不同體系及結(jié)構(gòu)下匯編代碼的切換方法

__switch_to_asm是在C代碼中調(diào)用的,也就是使用call指令,而這段匯編的結(jié)尾是jmp __switch_to,__switch_to函數(shù)是C代碼最后有個return,也就是ret指令。 將__switch_to_asm和__switch_to結(jié)合起來,正好是call指令和ret指令的配對出現(xiàn)。 call指令壓棧RIP寄存器到進程切換前的prev進程內(nèi)核堆棧;而ret指令出棧存入RIP寄存器的是進程切換之后的next進程的內(nèi)核堆棧棧頂數(shù)據(jù).
lab5:深入理解進程切換

然后下面是arm64下的代碼

lab5:深入理解進程切換

arm64 也沒有顯式保存和恢復(fù)程序計數(shù)器 PC 的值,這和 x86_64 的處理方法是大同小異的,也是通過函數(shù)調(diào)用堆棧的特性來巧妙解決這一問題。文章來源地址http://www.zghlxwxcb.cn/news/detail-454045.html

到了這里,關(guān)于lab5:深入理解進程切換的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 網(wǎng)絡(luò)攻防技術(shù)-Lab5-shellcode編寫實驗(SEED Labs – Shellcode Development Lab)

    網(wǎng)絡(luò)攻防技術(shù)-Lab5-shellcode編寫實驗(SEED Labs – Shellcode Development Lab)

    網(wǎng)絡(luò)攻防技術(shù)實驗,實驗環(huán)境、實驗說明、實驗代碼見 Shellcode Development Lab 1) 編譯mysh.s得到二進制文件 2) 執(zhí)行 1)中的二進制文件 ,結(jié)果如下圖, 我們 看到運行mysh之前的PID與運行mysh之后的PID是不同的,證明我們通過mysh啟動了一個新的shell。 3) 獲取機器碼,以便進一步

    2023年04月13日
    瀏覽(42)
  • 《深入理解計算機系統(tǒng)》Lab2-Bomblab

    《深入理解計算機系統(tǒng)》Lab2-Bomblab

    這篇文章主要記錄了我做bomblab的過程,希望能給你一些靈感 本次實驗為 熟悉匯編程序 及其 調(diào)試方法 的實驗。 實驗內(nèi)容包含2個文件:bomb(可執(zhí)行文件)和bomb.c(c源文件)。 實驗主題內(nèi)容為: 程序運行在linux環(huán)境中。程序運行中有6個關(guān)卡(6個phase),每個phase需要用戶在

    2024年02月04日
    瀏覽(28)
  • 【Linux】關(guān)于進程的理解、狀態(tài)、優(yōu)先級和進程切換

    【Linux】關(guān)于進程的理解、狀態(tài)、優(yōu)先級和進程切換

    進程不同的狀態(tài)本質(zhì)都是在滿足不同的運行場景的 1.運行隊列 運行隊列 進程如何在CPU上運行的:CPU在內(nèi)核上維護了一個運行隊列,進行進程的管理。讓進程入隊列,本質(zhì)就是將該進程的task_struct 結(jié)構(gòu)體對象放入運行隊列之中。 2.運行狀態(tài) 運行狀態(tài) 進程PCB在運行隊列里就是運

    2024年02月04日
    瀏覽(22)
  • 6.s081/6.1810(Fall 2022)Lab5: Copy-on-Write Fork for xv6

    6.s081/6.1810(Fall 2022)Lab5: Copy-on-Write Fork for xv6

    本來往年這里還有個Lazy Allocation的,今年不知道為啥直接給跳過去了。. 環(huán)境搭建 Lab1: Utilities Lab2: System calls Lab3: Page tables Lab4: Traps Lab5: Copy-on-Write Fork for xv6 官網(wǎng)鏈接 xv6手冊鏈接,這個挺重要的,建議做lab之前最好讀一讀。 xv6手冊中文版,這是幾位先輩們的辛勤奉獻來的呀!

    2024年02月14日
    瀏覽(46)
  • 【Linux】Linux進程的理解 --- 馮諾依曼體系、進程描述符、狀態(tài)、優(yōu)先級、切換…

    【Linux】Linux進程的理解 --- 馮諾依曼體系、進程描述符、狀態(tài)、優(yōu)先級、切換…

    如果不改變自己,就別把跨年搞的和分水嶺一樣,記住你今年是什么吊樣,明年就還會是什么吊樣!??! 1.馮諾依曼體系結(jié)構(gòu)中的存儲器指的是內(nèi)存,帶電存儲,具有掉電易失的特點。 2.CPU中含有能夠解釋計算機指令的指令集,指令集又可分為精簡指令集和復(fù)雜指令集,這也

    2024年01月25日
    瀏覽(50)
  • 【云原生-深入理解 Kubernetes 系列 3】深入理解容器進程的文件系統(tǒng)

    【云原生-深入理解 Kubernetes 系列 3】深入理解容器進程的文件系統(tǒng)

    【云原生-深入理解Kubernetes-1】容器的本質(zhì)是進程 【云原生-深入理解Kubernetes-2】容器 Linux Cgroups 限制 大家好,我是秋意零。 ?? CSDN作者主頁 ?? 博客主頁 ?? 簡介 ?? 普通本科生在讀 在校期間參與眾多計算機相關(guān)比賽,如:?? “省賽”、“國賽” ,斬獲多項獎項榮譽證書

    2024年02月06日
    瀏覽(52)
  • 【Linux】深入理解進程概念

    【Linux】深入理解進程概念

    個人主頁:??在肯德基吃麻辣燙 我的gitee:Linux倉庫 個人專欄:Linux專欄 分享一句喜歡的話:熱烈的火焰,冰封在最沉默的火山深處 本篇文章繼上一篇的馮諾依曼體系結(jié)構(gòu)和操作系統(tǒng)這兩個軟硬件的概念之后,開始講解Linux下 三座大山 之一的 進程 。 因為進程概念雖然不是

    2024年02月14日
    瀏覽(18)
  • 【從零學(xué)習(xí)python 】84.深入理解線程和進程

    進程,能夠完成多任務(wù),比如在一臺電腦上能夠同時運行多個QQ。 線程,能夠完成多任務(wù),比如一個QQ中的多個聊天窗口。 進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位。 線程是進程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。線程

    2024年02月11日
    瀏覽(17)
  • 【云原生-深入理解Kubernetes-1】容器的本質(zhì)是進程

    【云原生-深入理解Kubernetes-1】容器的本質(zhì)是進程

    大家好,我是秋意零。 ?? CSDN作者主頁 ?? 博客主頁 ?? 簡介 ?? 普通本科生在讀 在校期間參與眾多計算機相關(guān)比賽,如:?? “省賽”、“國賽” ,斬獲多項獎項榮譽證書 ?? 各個平臺, 秋意零/秋意臨 賬號創(chuàng)作者 ?? 云社區(qū) 創(chuàng)建者 點贊、收藏+關(guān)注下次不迷路! 歡迎加

    2024年02月02日
    瀏覽(29)
  • 【多線程系列-01】深入理解進程、線程和CPU之間的關(guān)系

    【多線程系列-01】深入理解進程、線程和CPU之間的關(guān)系

    多線程系列整體欄目 內(nèi)容 鏈接地址 【一】深入理解進程、線程和CPU之間的關(guān)系 https://blog.csdn.net/zhenghuishengq/article/details/131714191 【二】java創(chuàng)建線程的方式到底有幾種?(詳解) https://blog.csdn.net/zhenghuishengq/article/details/127968166 【三】深入理解java中線程的生命周期,任務(wù)調(diào)度 ht

    2024年02月16日
    瀏覽(58)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包