⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sched.h

📁 linux0.11内核源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
#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 + -