📄 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 + -