Linux0 11核心 程序相關資料結構

2021-08-25 18:25:04 字數 3629 閱讀 9669

主要有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...