?? sched.h
字號(hào):
#ifndef _SCHED_H#define _SCHED_H#define NR_TASKS 64 // 系統(tǒng)中同時(shí)最多任務(wù)(進(jìn)程)數(shù)。#define HZ 100 // 定義系統(tǒng)時(shí)鐘滴答頻率(1 百赫茲,每個(gè)滴答10ms)#define FIRST_TASK task[0] // 任務(wù)0 比較特殊,所以特意給它單獨(dú)定義一個(gè)符號(hào)。#define LAST_TASK task[NR_TASKS-1] // 任務(wù)數(shù)組中的最后一項(xiàng)任務(wù)。#include <linux/head.h> // head 頭文件,定義了段描述符的簡單結(jié)構(gòu),和幾個(gè)選擇符常量。#include <linux/fs.h> // 文件系統(tǒng)頭文件。定義文件表結(jié)構(gòu)(file,buffer_head,m_inode 等)。#include <linux/mm.h> // 內(nèi)存管理頭文件。含有頁面大小定義和一些頁面釋放函數(shù)原型。#include <signal.h> // 信號(hào)頭文件。定義信號(hào)符號(hào)常量,信號(hào)結(jié)構(gòu)以及信號(hào)操作函數(shù)原型。#if (NR_OPEN > 32)#error "Currently the close-on-exec-flags are in one word, max 32 files/proc"#endif// 這里定義了進(jìn)程運(yùn)行可能處的狀態(tài)。#define TASK_RUNNING 0 // 進(jìn)程正在運(yùn)行或已準(zhǔn)備就緒。#define TASK_INTERRUPTIBLE 1 // 進(jìn)程處于可中斷等待狀態(tài)。#define TASK_UNINTERRUPTIBLE 2 // 進(jìn)程處于不可中斷等待狀態(tài),主要用于I/O 操作等待。#define TASK_ZOMBIE 3 // 進(jìn)程處于僵死狀態(tài),已經(jīng)停止運(yùn)行,但父進(jìn)程還沒發(fā)信號(hào)。#define TASK_STOPPED 4 // 進(jìn)程已停止。#ifndef NULL#define NULL 0 // 定義NULL 為空指針。#endif// 復(fù)制進(jìn)程的頁目錄頁表。Linus 認(rèn)為這是內(nèi)核中最復(fù)雜的函數(shù)之一。( mm/memory.c, 105 )extern int copy_page_tables (unsigned long from, unsigned long to, long size);// 釋放頁表所指定的內(nèi)存塊及頁表本身。( mm/memory.c, 150 )extern int free_page_tables (unsigned long from, unsigned long size);// 調(diào)度程序的初始化函數(shù)。( kernel/sched.c, 385 )extern void sched_init (void);// 進(jìn)程調(diào)度函數(shù)。( kernel/sched.c, 104 )extern void schedule (void);// 異常(陷阱)中斷處理初始化函數(shù),設(shè)置中斷調(diào)用門并允許中斷請求信號(hào)。( kernel/traps.c, 181 )extern void trap_init (void);// 顯示內(nèi)核出錯(cuò)信息,然后進(jìn)入死循環(huán)。( kernel/panic.c, 16 )。extern void panic (const char *str);// 往tty 上寫指定長度的字符串。( kernel/chr_drv/tty_io.c, 290 )。extern int tty_write (unsigned minor, char *buf, int count);typedef int (*fn_ptr) (); // 定義函數(shù)指針類型。// 下面是數(shù)學(xué)協(xié)處理器使用的結(jié)構(gòu),主要用于保存進(jìn)程切換時(shí)i387 的執(zhí)行狀態(tài)信息。struct i387_struct{ long cwd; // 控制字(Control word)。 long swd; // 狀態(tài)字(Status word)。 long twd; // 標(biāo)記字(Tag word)。 long fip; // 協(xié)處理器代碼指針。 long fcs; // 協(xié)處理器代碼段寄存器。 long foo; long fos; long st_space[20]; /* 8*10 bytes for each FP-reg = 80 bytes */};// 任務(wù)狀態(tài)段數(shù)據(jù)結(jié)構(gòu)(參見列表后的信息)。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;};// 這里是任務(wù)(進(jìn)程)數(shù)據(jù)結(jié)構(gòu),或稱為進(jìn)程描述符。// ==========================// long state 任務(wù)的運(yùn)行狀態(tài)(-1 不可運(yùn)行,0 可運(yùn)行(就緒),>0 已停止)。// long counter 任務(wù)運(yùn)行時(shí)間計(jì)數(shù)(遞減)(滴答數(shù)),運(yùn)行時(shí)間片。// long priority 運(yùn)行優(yōu)先數(shù)。任務(wù)開始運(yùn)行時(shí)counter = priority,越大運(yùn)行越長。// long signal 信號(hào)。是位圖,每個(gè)比特位代表一種信號(hào),信號(hào)值=位偏移值+1。// struct sigaction sigaction[32] 信號(hào)執(zhí)行屬性結(jié)構(gòu),對應(yīng)信號(hào)將要執(zhí)行的操作和標(biāo)志信息。// long blocked 進(jìn)程信號(hào)屏蔽碼(對應(yīng)信號(hào)位圖)。// --------------------------// int exit_code 任務(wù)執(zhí)行停止的退出碼,其父進(jìn)程會(huì)取。// unsigned long start_code 代碼段地址。// unsigned long end_code 代碼長度(字節(jié)數(shù))。// unsigned long end_data 代碼長度 + 數(shù)據(jù)長度(字節(jié)數(shù))。// unsigned long brk 總長度(字節(jié)數(shù))。// unsigned long start_stack 堆棧段地址。// long pid 進(jìn)程標(biāo)識(shí)號(hào)(進(jìn)程號(hào))。// long father 父進(jìn)程號(hào)。// long pgrp 父進(jìn)程組號(hào)。// long session 會(huì)話號(hào)。// long leader 會(huì)話首領(lǐng)。// unsigned short uid 用戶標(biāo)識(shí)號(hào)(用戶id)。// unsigned short euid 有效用戶id。// unsigned short suid 保存的用戶id。// unsigned short gid 組標(biāo)識(shí)號(hào)(組id)。// unsigned short egid 有效組id。// unsigned short sgid 保存的組id。// long alarm 報(bào)警定時(shí)值(滴答數(shù))。// long utime 用戶態(tài)運(yùn)行時(shí)間(滴答數(shù))。// long stime 系統(tǒng)態(tài)運(yùn)行時(shí)間(滴答數(shù))。// long cutime 子進(jìn)程用戶態(tài)運(yùn)行時(shí)間。// long cstime 子進(jìn)程系統(tǒng)態(tài)運(yùn)行時(shí)間。// long start_time 進(jìn)程開始運(yùn)行時(shí)刻。// unsigned short used_math 標(biāo)志:是否使用了協(xié)處理器。// --------------------------// int tty 進(jìn)程使用tty 的子設(shè)備號(hào)。-1 表示沒有使用。// unsigned short umask 文件創(chuàng)建屬性屏蔽位。// struct m_inode * pwd 當(dāng)前工作目錄i 節(jié)點(diǎn)結(jié)構(gòu)。// struct m_inode * root 根目錄i 節(jié)點(diǎn)結(jié)構(gòu)。// struct m_inode * executable 執(zhí)行文件i 節(jié)點(diǎn)結(jié)構(gòu)。// unsigned long close_on_exec 執(zhí)行時(shí)關(guān)閉文件句柄位圖標(biāo)志。(參見include/fcntl.h)// struct file * filp[NR_OPEN] 進(jìn)程使用的文件表結(jié)構(gòu)。// --------------------------// struct desc_struct ldt[3] 本任務(wù)的局部表描述符。0-空,1-代碼段cs,2-數(shù)據(jù)和堆棧段ds&ss。// --------------------------// struct tss_struct tss 本進(jìn)程的任務(wù)狀態(tài)段信息結(jié)構(gòu)。// ==========================struct task_struct{/* these are hardcoded - don't touch */ long state; /* -1 unrunnable, 0 runnable, >0 stopped */ long counter; long priority; long signal; struct sigaction sigaction[32]; long blocked; /* bitmap of masked signals *//* various fields */ int exit_code; unsigned long start_code, end_code, end_data, brk, start_stack; long pid, father, pgrp, session, leader; unsigned short uid, euid, suid; unsigned short gid, egid, sgid; long alarm; long utime, stime, cutime, cstime, start_time; unsigned short used_math;/* file system info */ int tty; /* -1 if no tty, so it must be signed */ unsigned short umask; struct m_inode *pwd; struct m_inode *root; struct m_inode *executable; 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];/* tss for this task */ struct tss_struct tss;};/** INIT_TASK 用于設(shè)置第1 個(gè)任務(wù)表,若想修改,責(zé)任自負(fù)?!* 基址Base = 0,段長limit = 0x9ffff(=640kB)。*/// 對應(yīng)上面任務(wù)結(jié)構(gòu)的第1 個(gè)任務(wù)的信息。#define INIT_TASK \{\
/* state etc */0,15,15, \
/* signals */0, {{0},}, 0,\/* ec,brk... */0, 0, 0, 0, 0, 0,\/* pid etc.. */ 0, -1, 0, 0, 0, \/* uid etc */ 0, 0, 0, 0, 0, 0, \/* alarm */ 0, 0, 0, 0, 0, 0, \/* math */ 0, \/* fs info */ -1, 0022, NULL, NULL, NULL, 0, \/* filp */ {NULL,}, \/* ldt[3]*/ {{0, 0}, \ {0x9f, 0xc0fa00}, /* 代碼長640K,基址0x0,G=1,D=1,DPL=3,P=1 TYPE=0x0a*/ \ { 0x9f, 0xc0f200},}, /* 數(shù)據(jù)長640K,基址0x0,G=1,D=1,DPL=3,P=1 TYPE=0x02*/ \/*tss*/ {0, PAGE_SIZE + (long) (&init_task), 0x10, 0, 0, 0, 0, (long) &pg_dir,\ 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, _LDT (0), 0x80000000, {0} },\}extern struct task_struct *task[NR_TASKS]; // 任務(wù)數(shù)組。extern struct task_struct *last_task_used_math; // 上一個(gè)使用過協(xié)處理器的進(jìn)程。extern struct task_struct *current; // 當(dāng)前進(jìn)程結(jié)構(gòu)指針變量。extern long volatile jiffies; // 從開機(jī)開始算起的滴答數(shù)(10ms/滴答)。extern long startup_time; // 開機(jī)時(shí)間。從1970:0:0:0 開始計(jì)時(shí)的秒數(shù)。#define CURRENT_TIME (startup_time+jiffies/HZ) // 當(dāng)前時(shí)間(秒數(shù))。// 添加定時(shí)器函數(shù)(定時(shí)時(shí)間jiffies 滴答數(shù),定時(shí)到時(shí)調(diào)用函數(shù)*fn())。( kernel/sched.c,272)extern void add_timer (long jiffies, void (*fn) ());// 不可中斷的等待睡眠。( kernel/sched.c, 151 )extern void sleep_on (struct task_struct **p);// 可中斷的等待睡眠。( kernel/sched.c, 167 )extern void interruptible_sleep_on (struct task_struct **p);// 明確喚醒睡眠的進(jìn)程。( kernel/sched.c, 188 )extern void wake_up (struct task_struct **p);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -