LINUX核心分析。6
一、程式的描述
- 程式控制塊PCB——task_struct
• 作業系統的三大管理功能
• - 程式管理
• - 記憶體管理
- 檔案系統
• PCB task_struct中包含
• - 程式狀態
• - 程式開啟的檔案 - 程式優先順序資訊
• struct task_struct資料結構很龐大
- Linux程式的狀態
不同於作業系統(就緒、執行、阻塞)
,
- TASK_RUNNING具體是就緒還是執行,要看系統當前的資源分配情況;
-
TASK_ZOMBIE也叫殭屍程式
為了管理程式,核心必須對每個程式進行清晰的描述,程式描述符提供了核心所需瞭解的程式資訊。二,程式的建立
1.程式的建立概覽及fork一個程式的原始碼
- 回顧:start_kernel建立了cpu_idle,也就是0號程式。而0號程式又建立了兩個執行緒,一個是kernel_init,也就是1號程式,這個程式最終啟動了使用者態;另一個是kthreadd。這就是“道生一,一生二”。0號程式是固定的程式碼;1號程式是通過複製0號程式PCB之後在此基礎上做修改得到的。
- 回顧:系統呼叫的程式建立過程
fork程式碼
1.#include
2.#include
3.#include
4.int main(int argc, char * argv[])
5.{
6.int pid;
7./* fork another process /
8.pid = fork();
9.if (pid < 0)
10.{
11./ error occurred /
12.fprintf(stderr,"Fork Failed!");
13.exit(-1);
14.}
15.else if (pid == 0) //pid == 0和下面的else都會被執行到(一個是在父程式中即pid ==0的情況,一個是在子程式中,即pid不等於0)
16.{
17./ child process /
18.printf("This is Child Process!\n");
19.}
20.else
21.{
22./ parent process /
23.printf("This is Parent Process!\n");
24./ parent will wait for the child to complete*/
25.wait(NULL);
26.printf("Child Complete!\n");
27.}
}
建立新程式的框架
fork,vfork,clone都可以建立新程式,他們都是通過呼叫do_fork來實現的。
• dup_thread複製父程式的PCB
•
• copy_process修改複製的PCB以適應子程式的特點,也就是子程式的初始化
•
• 分配一個新的核心堆疊(用於存放子程式資料)
• 核心堆疊的一部分也要從父程式中拷貝
•
- • 根據拷貝的核心堆疊情況設定eip,esp暫存器的值
-
一個新建立的子程式,(當它獲得CPU之後)是從哪一行程式碼程式執行的?
• 與之前寫過的my_kernel相比較,kernel中是可以指定新程式開始的位置(也就是通過eip暫存器指定程式碼行)。fork中也有相似的機制
• 這就涉及子程式的核心堆疊資料狀態和task_struct中thread記錄的sp和ip的一致性問題,這是在哪裡設定的?copy_thread in copy_process
• 1.childregs = current_pt_regs(); //複製核心堆疊,並不是全部,只是regs結構體(核心堆疊棧底的程式)
• 2.childregs->ax = 0; //為什麼子程式的fork返回0,這裡就是原因!
• 3.
• 4.p->thread.sp = (unsigned long) childregs; //排程到子程式時的核心棧頂
5.p->thread.ip = (unsigned long) ret_from_fork; //排程到子程式時的第一條指令地址,也就是說返回的就是子程式的空間了三,使用gdb除錯
四,總結
通過本次的實踐我瞭解到了關於程式的一些原理明白程式在核心的中建立的過程。
——轉載
相關文章
- Linux核心分析。3Linux
- Linux核心分析。4Linux
- Linux核心分析。5Linux
- LINUX核心分析。7Linux
- LINUX核心分析。8Linux
- Linux核心技術分析Linux
- Linux核心分析方法(轉)Linux
- ThinkPHP6 核心分析(五):多應用解析PHP
- Linux核心排程分析(程式排程)Linux
- Linux程式排程核心實現分析Linux
- 深入分析LInux核心連結串列Linux
- ThinkPHP6 核心分析之應用程式初始化PHP
- ThinkPHP6 核心分析(二):Request 類的例項化PHP
- Linux核心分析--系統呼叫實現程式碼分析(轉)Linux
- 《Linux核心分析》筆記與課件整理Linux筆記
- Linux核心記憶體管子系統分析Linux記憶體
- Linux核心原始碼分析之setup_arch (四)Linux原始碼
- Linux核心原始碼分析之setup_arch (二)Linux原始碼
- Linux核心原始碼分析之set_arch (一)Linux原始碼
- Linux核心原始碼分析之setup_arch (三)Linux原始碼
- Linux核心建立一個程式的過程分析Linux
- [轉帖]Linux核心原始碼分析分享專題Linux原始碼
- Linux 2.6核心*必須修正*問題列表 ver 6 (轉)Linux
- ES6核心特性
- Linux 核心排程器原始碼分析 - 初始化Linux原始碼
- Linux4.1.15核心啟動流程簡單分析Linux
- Linux核心之 核心同步Linux
- 認識linux核心(linux核心的作用)Linux
- ThinkPHP6 核心分析之Http 類跟Request類的例項化PHPHTTP
- 《Linux核心分析》 之 計算機是如何工作的。1Linux計算機
- es6核心特性圖
- Cent OS 6升級核心
- toa 核心模組分析
- Android核心分析Android
- 初識Linux核心-DIY核心模組Linux
- Linux 4.x MTD原始碼分析-核心資料結構Linux原始碼資料結構
- 《Linux核心分析》 之 作業系統是如何工作的。2Linux作業系統
- linux核心檔案IO的系統呼叫實現分析(open)Linux