主要有4個資料結構
task_union(
sched.c第
53行)
// 這實際上是一頁記憶體,頁面低端頭部放的是
task_struct(程序控制塊)結構,頁面
// 其他部分當作程序的核心態堆疊使用
union task_union ;
tss_struct(
sched.h第
53行)
// 任務段資料,與80386的tss結構對應
struct tss_struct {
long back_link; /* 16 high bits zero */
long esp0;
long ss0; /* 16 high bits zero */
long esp1;
long ss1; /* 16 high bits zero */
long esp2;
long ss2; /* 16 high bits zero */
long cr3;
long eip;
long eflags;
long eax,ecx,edx,ebx;
long esp;
long ebp;
long esi;
long edi;
long es; /* 16 high bits zero */
long cs; /* 16 high bits zero */
long ss; /* 16 high bits zero */
long ds; /* 16 high bits zero */
long fs; /* 16 high bits zero */
long gs; /* 16 high bits zero */
long ldt; /* 16 high bits zero */
long trace_bitmap; /* bits: trace 0, bitmap 16-31 */
struct i387_struct i387;
task_struct(
sched.c第
80行)
// 程序控制塊
struct task_struct {
/*----------------------- these are hardcoded - don't touch -----------------------*/
long state; // 程序執行狀態(
-1不可執行,
0可執行,
>0以停止)
long counter; // 任務執行時間片,遞減到
0是說明時間片用完
long priority; // 任務執行優先數,剛開始是
counter=
priority
long signal; // 任務的訊號位圖,訊號值
=偏移+1
struct sigaction sigaction[32]; //訊號執行屬性結構,對應訊號將要執行的操作和標誌資訊
long blocked; // 訊號遮蔽碼
/*----------------------------------- various fields--------------------------------- */
int exit_code; // 任務退出碼,當任務結束時其父程序會讀取
unsigned long start_code,end_code,end_data,brk,start_stack;
// start_code **段起始的
線性位址
// end_code **段長度
// end_data **段長度+資料段長度
// brk **段長度+資料段長度+bss段長度
// start_stack 堆疊段起始
線性位址
long pid,father,pgrp,session,leader;
// pid 程序號
// father 父程序號
// pgrp 父程序組號
// session 會話號
// leader 會話首領
unsigned short uid,euid,suid;
// uid 使用者標id
// euid 有效使用者id
// suid 儲存的使用者id
unsigned short gid,egid,sgid;
// gid 組id
// egid 有效組id
// sgid 儲存組id
long alarm; // 報警定時值
long utime,stime,cutime,cstime,start_time;
// utime 使用者態執行時間
// stime 核心態執行時間
// cutime 子程序使用者態執行時間
// cstime 子程序核心態執行時間
// start_time 程序開始執行時刻
unsigned short used_math; // 標誌,是否使用了
387協處理器
/* ----------------------------------file system info-------------------------------- */
int tty; // 程序使用
tty的子裝置號,
-1表示沒有使用
unsigned short umask; //檔案建立屬性遮蔽碼
struct m_inode * pwd; // 當前工作目錄的
i節點struct m_inode * root; // 根目錄的
i節點struct m_inode * executable; // 可執行檔案的
i節點unsigned long close_on_exec; // 執行時關閉檔案控制代碼位圖標誌
struct file * filp[nr_open]; // 程序使用的檔案
/*------------------ ldt for this task 0 - zero 1 - cs 2 - ds&ss -------------------*/
struct desc_struct ldt[3]; // 本任務的
ldt表,
0-空,
1-**段,
2-資料和堆疊段
/* ---------------------------------tss for this task ---------------------------------*/
struct tss_struct tss; // 本任務的
tss段
Linux 0 11 核心筆記
1 任務0的堆疊問題 一直不明白schedule.c裡的task union的stack和user stack是什麼關係,head.s裡就設定了esp指向user stack,卻一直沒有用到task union,直到看到init task才明白,從進入保護模式到跳轉進使用者態都是用的user sta...
Linux0 11核心筆記( )
c語言 彙編知識 嵌入式彙編 x86處理器和程式設計的相關知識和 unix作業系統設計 linus在最初開發linux作業系統時參考了minix作業系統 作業系統 設計與實現 一種基於訊息傳遞在核心各模組之間進行通訊 資訊交換 重要的五個支柱 unix作業系統 分時作業系統 minix作業系統 gn...
Linux0 11核心 fork 函式建立程序
用fork建立程序 除了程序0,其它所有的程序都是fork產生的。子程序是通過複製父程序的資料和 產生的。建立結束後,子程序和父程序的 段 資料段共享。但是子程序有自己的程序控制塊 核心堆疊和頁表。我們知道乙個程序需要有如下3個結構 1 task陣列中的一項,即程序控制塊 task struct 2...