Linux內核分析作業第八周

進程的切換和系統的一般執行過程

一、進程調度的時機

  • 中斷處理過程(包括時鐘中斷、I/O中斷、系統調用和異常)中,直接調用schedule(),或者返回用戶態時根據need_resched標記調用schedule();

  • 內核線程可以直接調用schedule()進行進程切換,也可以在中斷處理過程中進行調度,也就是說內核線程作為一類的特殊的進程可以主動調度,也可以被動調度;

  • 用戶態進程無法實現主動調度,僅能通過陷入內核態后的某個時機點進行調度,即在中斷處理過程中進行調度。

?

二、進程的切換

  • 為了控制進程的執行,內核必須有能力掛起正在CPU上執行的進程,并恢復以前掛起的某個進程的執行,這叫做進程切換、任務切換、上下文切換;

  • 掛起正在CPU上執行的進程,與中斷時保存現場是不同的,中斷前后是在同一個進程上下文中,只是由用戶態轉向內核態執行;

  • 進程上下文包含了進程執行需要的所有信息

    • 用戶地址空間:包括程序代碼,數據,用戶堆棧等

    • 控制信息:進程描述符,內核堆棧等

    • 硬件上下文(注意中斷也要保存硬件上下文只是保存的方法不同)

  • schedule()函數選擇一個新的進程來運行,并調用context_switch進行上下文的切換,這個宏調用switch_to來進行關鍵上下文切換

    • next = pick_next_task(rq, prev);//進程調度算法都封裝這個函數內部
    • context_switch(rq, prev, next);//進程上下文切換
    • switch_to利用了prev和next兩個參數:prev指向當前進程,next指向被調度的進程

?

31#define switch_to(prev, next, last)                    \
32do {                                    \
33    /*                                \
34     * Context-switching clobbers all registers, so we clobber    \
35     * them explicitly, via unused output variables.        \
36     * (EAX and EBP is not listed because EBP is saved/restored    \
37     * explicitly for wchan access and EAX is the return value of    \
38     * __switch_to())                        \
39     */                                \
40    unsigned long ebx, ecx, edx, esi, edi;                \
41                                    \
42    asm volatile("pushfl\n\t"       /* 保存當前進程的標志位 */    \
43             "pushl %%ebp\n\t"       /* 保存當前進程的堆棧基址EBP */   \
44             "movl %%esp,%[prev_sp]\n\t"    /* 保存當前棧頂ESP */ \
45             "movl %[next_sp],%%esp\n\t"    /* 把下一個進程的棧頂放到esp寄存器中,完成了內核堆棧的切換,從此往下壓棧都是在next進程的內核堆棧中。 */  \
46             "movl $1f,%[prev_ip]\n\t"    /* 保存當前進程的EIP */    \
47             "pushl %[next_ip]\n\t"    /* 把下一個進程的起點EIP壓入堆棧 */    \
48             __switch_canary                    \
49             "jmp __switch_to\n"   /* 因為是函數所以是jmp,通過寄存器傳遞參數,寄存器是prev-a,next-d,當函數執行結束ret時因為沒有壓棧當前eip,所以需要使用之前壓棧的eip,就是pop出next_ip。 */
50             "1:\t"                 /* 認為next進程開始執行。 */ 
51             "popl %%ebp\n\t"        /* restore EBP   */    \
52             "popfl\n"            /* restore flags */    \
53             /* output parameters 因為處于中斷上下文,在內核中 prev_sp是內核堆棧棧頂 prev_ip是當前進程的eip */                        \
54             /* output parameters */                \
55             : [prev_sp] "=m" (prev->thread.sp),        \
56               [prev_ip] "=m" (prev->thread.ip),        \
57               "=a" (last),                    \
58                                    \
59               /* clobbered output registers: */        \
60               "=b" (ebx), "=c" (ecx), "=d" (edx),        \
61               "=S" (esi), "=D" (edi)                \
62                                           \
63               __switch_canary_oparam                \
64                                    \
65               /* input parameters: */                \
66             : [next_sp]  "m" (next->thread.sp),        \
67               [next_ip]  "m" (next->thread.ip),        \
68                                           \
69               /* regparm parameters for __switch_to(): */    \
70               [prev]     "a" (prev),                \
71               [next]     "d" (next)                \
72                                    \
73               __switch_canary_iparam                \
74                                    \
75             : /* reloaded segment registers */            \
76            "memory");                    \
77} while (0)

?

三、Linux系統的一般執行過程

?

1、最一般的情況:正在運行的用戶態進程X切換到運行用戶態進程Y的過程?

  1. 正在運行的用戶態進程X

  2. 發生中斷——save cs:eip/esp/eflags(current) to kernel stack,then load cs:eip(entry of a specific ISR) and ss:esp(point to kernel stack).

  3. SAVE_ALL //保存現場

  4. 中斷處理過程中或中斷返回前調用了schedule(),其中的switch_to做了關鍵的進程上下文切換

  5. 標號1之后開始運行用戶態進程Y(這里Y曾經通過以上步驟被切換出去過因此可以從標號1繼續執行)

  6. restore_all //恢復現場

  7. iret - pop cs:eip/ss:esp/eflags from kernel stack

  8. 繼續運行用戶態進程Y

?

2、幾種特殊情況

  • 通過中斷處理過程中的調度時機,用戶態進程與內核線程之間互相切換和內核線程之間互相切換,與最一般的情況非常類似,只是內核線程運行過程中發生中斷沒有進程用戶態和內核態的轉換;
  • 內核線程主動調用schedule(),只有進程上下文的切換,沒有發生中斷上下文的切換,與最一般的情況略簡略;
  • 創建子進程的系統調用在子進程中的執行起點及返回用戶態,如fork;
  • 加載一個新的可執行程序后返回到用戶態的情況,如execve;

四、Linux操作系統架構和系統執行過程概覽


1、操作系統基本概念

任何計算機系統都包含一個基本的程序集合,稱為操作系統。

  • 內核(進程管理,進程調度,進程間通訊機制,內存管理,中斷異常處理,文件系統,I/O 系統,網絡部分)
  • 其他程序(例如函數庫、shell程序、系統程序 等等)


操作系統的目的

  • 與硬件交互,管理所有的硬件資源
  • 為用戶程序(應用程序)提供一個良好的執行環境

2、Linux系統架構

  • 硬件管理
  • 內核實現
  • 系統調用
  • 基礎軟件(shell、lib)
  • 用戶程序


3、最簡單也是最復雜的操作ls

?

4、站在CPU和內存角度看Linux系統的執行

?

5、從內存的角度

五、Linux的系統結構

六、用gdb對schedule進行

1、環境搭建:

?

2、設置斷點

3、list查看斷點所在代碼段,發現schedule()被調用

4、c之后按n單步執行,直到遇到__schedule函數

?

5、繼續執行,直到發現context_switch函數

6、繼續單步執行,直到發現context_switch函數

?

7、設置斷點后,進入其內部查看

轉載于:https://www.cnblogs.com/20135231hj/p/5379217.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396337.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396337.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396337.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS--數據存儲NSUserDefaults

2019獨角獸企業重金招聘Python工程師標準>>> 今天去面試,被問道NSUserDefaults的存取并手寫出來,一時想不起來,回來之后看看之前的筆記,稍作一些整理 NSUserDefaults是一個單例,在整個程序中只有一個實例對…

巨人肩膀_如何站在巨人的肩膀上

巨人肩膀“If I have seen further than others, it is by standing on the shoulders of giants.” — Isaac Newton“如果我能比其他人看到更多,那就是站在巨人的肩膀上。” —艾薩克牛頓 In 1676, Isaac Newton spoke of the great thinkers who came before him…

mysql 觸發器定義變量_MySQL 函數存儲過程觸發器定義簡單示例

1.變量提示NEW 是新值-- OLD 是舊值INSERT 只有NEW ----UPDATE有NEW和OLD ---DELETE只有OLD2.準備測試表(userinfo、userinfolog)use test;create table userinfo(userid int,username varchar(10),userbirthday date);create table userinfolog(logtime datetime,loginfo varc…

[EOJ439] 強制在線

Description 見EOJ439 Solution 先考慮不強制在線怎么做。 按詢問區間右端點排序&#xff0c;從左往右掃&#xff0c;維護所有后綴的答案。 如果掃到 \(a[i]\)&#xff0c;那么讓統計個數的 \(cnt[a[i]]\). 如果\(cnt[a[i]]<a[i]\)&#xff0c;那么在當前的右端點固定的情況…

大數據 就業 缺口_中國AI&大數據就業趨勢報告:平均月薪超2萬,缺口650萬人...

2019世界人工智能大會開幕式上&#xff0c;特斯拉公司聯合創始人兼首席執行官Elon Musk 和中國企業家俱樂部主席、聯合國數字合作高級別小組聯合主席馬云進行了一場“雙馬”對話。談到人工智能話題時&#xff0c;馬斯克認為&#xff0c;“未來的科技發展變化將超越我們的能力”…

Android pm 命令詳解

一、pm命令介紹與包名信息查詢 1.pm命令介紹 pm工具為包管理&#xff08;package manager&#xff09;的簡稱 可以使用pm工具來執行應用的安裝和查詢應用寶的信息、系統權限、控制應用 pm工具是Android開發與測試過程中必不可少的工具&#xff0c;shell命令格式如下&#xff1a…

開源 非開源_開源為善

開源 非開源by Michael D. Johnson邁克爾約翰遜(Michael D.Johnson) 開源為善 (Open Source for Good) We’ve spent two years coding for a cause, one nonprofit at a time. And now Free Code Camp’s pushing ahead to help organizations at scale.我們花了兩年的時間為…

mysql5.6熱升級_Mysql5.6主從熱備配置

數據庫是應用系統的核心&#xff0c;為了保證數據庫的安全采用主從熱備是很常見的方法&#xff0c;也就是主數據庫DDL、DML都將被同步到從數據庫。一、 實驗環境操作系統&#xff1a;windowsserver 2008 R2數據庫&#xff1a;mysql-advanced-5.6.21-winx64二、 準備工作1、…

InfluxDB(官方使用說明)

安裝InfluxDB OSS 此頁面提供有關安裝&#xff0c;啟動和配置InfluxDB的說明。 InfluxDB OSS安裝要求 root為了成功完成&#xff0c;需要安裝InfluxDB軟件包或具有管理員權限。 InfluxDB OSS網絡端口 InfluxDB默認使用以下網絡端口&#xff1a; TCP端口8086用于通過InfluxDB的H…

incc與oracle連接_Oracle 連接和會話的區別

連接并不是會話的同義詞&#xff0c;發現這一點時很多人都很詫異。在大多數人眼里&#xff0c;它們都是一樣的&#xff0c;但事實上并不一定如此。在一條連接上可以建立0個、一個或多個會話。各個會話是單獨而且獨立的&#xff0c;即使它們共享同一條數據庫物理連接也是如此。一…

CodeForces 176B Word Cut(DP)

題意&#xff1a;給你a串和b串&#xff0c;你能切k次&#xff0c;每次切完將尾部分放在頭的前面&#xff0c;問有多少種方案切k次從a串變為b串 思路&#xff1a;令dp[i][0]為砍了i次變成b串的方案數&#xff0c;dp[i][1]為砍了i次變成非b串的方案數&#xff0c;然后預處理一下前…

如何將React App轉換為React Native

I have been working on a lot of mobile projects lately?—?including Cordova, PhoneGap, React Native, some Ionic and Swift?—?but I have to say, React Native is by far the best experience in mobile development I have had so far. It has great, web-like d…

HTTP狀態碼:400\500 錯誤代碼

轉自&#xff1a;http://blog.sina.com.cn/s/blog_59b052fa0100it74.html一些常見的狀態碼為&#xff1a;200 - 服務器成功返回網頁404 - 請求的網頁不存在503 - 服務不可用詳細分解&#xff1a;1xx&#xff08;臨時響應&#xff09;表示臨時響應并需要請求者繼續執行操作的狀態…

dhcp服務

安裝與配置 配置文件 修改配置文件 復制這個文件到另一端 打開另一端的配置文件 原端輸入這些命令可以去掉英文 然后vim進入另一端配置文件 全局配置不在{}內的 分發范圍是指哪個ip到哪個ip的范圍 指定固定電腦獲取固定位置 原端修改配置文件 下面進行啟動dhcp 克隆一臺虛擬機&…

python數據結構與算法40題_Python數據結構與算法40:遞歸編程練習題3:ASCII謝爾賓斯基地毯...

注&#xff1a;本文如涉及到代碼&#xff0c;均經過Python 3.7實際運行檢驗&#xff0c;保證其嚴謹性。本文閱讀時間約為7分鐘。遞歸編程練習題3&#xff1a;ASCII謝爾賓斯基地毯謝爾賓斯基地毯謝爾賓斯基地毯是形如上圖的正方形分形圖案&#xff0c;每個地毯可分為等大小的9份…

使用Python發送電子郵件

by Arjun Krishna Babu通過Arjun Krishna Babu 如何使用Python發送電子郵件 (How to send emails using Python) As a learning exercise, I recently dug into Python 3 to see how I could fire off a bunch of emails. There may be more straightforward methods of doing…

此blog不更了

1轉載于:https://www.cnblogs.com/ybai62868/p/5384097.html

Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart)

在接觸WebService時值得收藏的一篇文章&#xff1a; 在調試Axis1.4訪問WebService服務時&#xff0c;出現以下錯誤&#xff1a; Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart) 有錯誤找到錯誤原因以及發現值得收藏的…

java遍歷樹結構數據_Java數據結構——二叉樹的遍歷(匯總)

二叉樹的遍歷分為深度優先遍歷(DFS)和廣度優先遍歷(BFS)DFS遍歷主要有&#xff1a;前序遍歷中序遍歷后序遍歷一、遞歸實現DFSNode.java:public class Node {private Object data;Node richild;Node lechild;public Object getData() {return data;}public void setData(Object …

vue 移動端頭像裁剪_使用vue-cropper裁剪正方形上傳頭像-阿里云開發者社區

引用方式在組件內使用import { VueCropper } from vue-croppercomponents: {VueCropper,},main.js里面使用import VueCropper from vue-cropperVue.use(VueCropper)基本使用方法ref"cropper":img"option.img":autoCrop"true":fixedNumber"[…