?? sched.h
字號:
#ifndef _SCHED_H#define _SCHED_H#define NR_TASKS 64 // 系統中同時最多任務(進程)數。#define HZ 100 // 定義系統時鐘滴答頻率(1 百赫茲,每個滴答10ms)#define FIRST_TASK task[0] // 任務0 比較特殊,所以特意給它單獨定義一個符號。#define LAST_TASK task[NR_TASKS-1] // 任務數組中的最后一項任務。#include <linux/head.h> // head 頭文件,定義了段描述符的簡單結構,和幾個選擇符常量。#include <linux/fs.h> // 文件系統頭文件。定義文件表結構(file,buffer_head,m_inode 等)。#include <linux/mm.h> // 內存管理頭文件。含有頁面大小定義和一些頁面釋放函數原型。#include <signal.h> // 信號頭文件。定義信號符號常量,信號結構以及信號操作函數原型。#if (NR_OPEN > 32)#error "Currently the close-on-exec-flags are in one word, max 32 files/proc"#endif// 這里定義了進程運行可能處的狀態。#define TASK_RUNNING 0 // 進程正在運行或已準備就緒。#define TASK_INTERRUPTIBLE 1 // 進程處于可中斷等待狀態。#define TASK_UNINTERRUPTIBLE 2 // 進程處于不可中斷等待狀態,主要用于I/O 操作等待。#define TASK_ZOMBIE 3 // 進程處于僵死狀態,已經停止運行,但父進程還沒發信號。#define TASK_STOPPED 4 // 進程已停止。#ifndef NULL#define NULL ((void *) 0) // 定義NULL 為空指針。#endif// 復制進程的頁目錄頁表。Linus 認為這是內核中最復雜的函數之一。( mm/memory.c, 105 )extern int copy_page_tables (unsigned long from, unsigned long to, long size);// 釋放頁表所指定的內存塊及頁表本身。( mm/memory.c, 150 )extern int free_page_tables (unsigned long from, unsigned long size);// 調度程序的初始化函數。( kernel/sched.c, 385 )extern void sched_init (void);// 進程調度函數。( kernel/sched.c, 104 )extern void schedule (void);// 異常(陷阱)中斷處理初始化函數,設置中斷調用門并允許中斷請求信號。( kernel/traps.c, 181 )extern void trap_init (void);// 顯示內核出錯信息,然后進入死循環。( 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) (); // 定義函數指針類型。// 下面是數學協處理器使用的結構,主要用于保存進程切換時i387 的執行狀態信息。struct i387_struct{ long cwd; // 控制字(Control word)。 long swd; // 狀態字(Status word)。 long twd; // 標記字(Tag word)。 long fip; // 協處理器代碼指針。 long fcs; // 協處理器代碼段寄存器。 long foo; long fos; long st_space[20]; /* 8*10 bytes for each FP-reg = 80 bytes */};// 任務狀態段數據結構(參見列表后的信息)。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;};// 這里是任務(進程)數據結構,或稱為進程描述符。// ==========================// long state 任務的運行狀態(-1 不可運行,0 可運行(就緒),>0 已停止)。// long counter 任務運行時間計數(遞減)(滴答數),運行時間片。// long priority 運行優先數。任務開始運行時counter = priority,越大運行越長。// long signal 信號。是位圖,每個比特位代表一種信號,信號值=位偏移值+1。// struct sigaction sigaction[32] 信號執行屬性結構,對應信號將要執行的操作和標志信息。// long blocked 進程信號屏蔽碼(對應信號位圖)。// --------------------------// int exit_code 任務執行停止的退出碼,其父進程會取。// unsigned long start_code 代碼段地址。// unsigned long end_code 代碼長度(字節數)。// unsigned long end_data 代碼長度 + 數據長度(字節數)。// unsigned long brk 總長度(字節數)。// unsigned long start_stack 堆棧段地址。// long pid 進程標識號(進程號)。// long father 父進程號。// long pgrp 父進程組號。// long session 會話號。// long leader 會話首領。// unsigned short uid 用戶標識號(用戶id)。// unsigned short euid 有效用戶id。// unsigned short suid 保存的用戶id。// unsigned short gid 組標識號(組id)。// unsigned short egid 有效組id。// unsigned short sgid 保存的組id。// long alarm 報警定時值(滴答數)。// long utime 用戶態運行時間(滴答數)。// long stime 系統態運行時間(滴答數)。// long cutime 子進程用戶態運行時間。// long cstime 子進程系統態運行時間。// long start_time 進程開始運行時刻。// unsigned short used_math 標志:是否使用了協處理器。// --------------------------// 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 執行時關閉文件句柄位圖標志。(參見include/fcntl.h)// struct file * filp[NR_OPEN] 進程使用的文件表結構。// --------------------------// struct desc_struct ldt[3] 本任務的局部表描述符。0-空,1-代碼段cs,2-數據和堆棧段ds&ss。// --------------------------// struct tss_struct tss 本進程的任務狀態段信息結構。// ==========================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 is used to set up the first task table, touch at* your own risk!. Base=0, limit=0x9ffff (=640kB)*//** INIT_TASK 用于設置第1 個任務表,若想修改,責任自負?!* 基址Base = 0,段長limit = 0x9ffff(=640kB)。*/// 對應上面任務結構的第1 個任務的信息。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -