📄 sched.h.bak
字号:
#ifndef _SCHED_H#define _SCHED_H#define NR_TASKS 64 /*最大进程数*/#define HZ 100#define FIRST_TASK task[0]#define LAST_TASK task[NR_TASKS-1]#include <linux/head.h>#include <linux/fs.h>#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 /* 进程正在运行或等待使用CPU*/#define TASK_INTERRUPTIBLE 1 /* 进程等待某一事件(能被信号唤醒并激活)*/#define TASK_UNINTERRUPTIBLE 2 /* 等待硬件条件的满足,不会接受任何信号,只能通过wake_up明确唤醒*/#define TASK_ZOMBIE 3 /* 进程已经中止,但PCB仍在任务结构表中,一旦其父进程调用阿了wait()取得子进程信息时,该进程的PCB被释放*/#define TASK_STOPPED 4 /*当收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU信号时进程进入停止状态 ,可通过向其发送SIGCONT信号使其成为可运行态(LINUX0。11中,将该状态视为进程中止来处理)*/#ifndef NULL#define NULL ((void *) 0)#endifextern int copy_page_tables(unsigned long from, unsigned long to, long size);extern int free_page_tables(unsigned long from, unsigned long size);extern void sched_init(void);extern void schedule(void);extern void trap_init(void);extern void panic(const char * str);extern int tty_write(unsigned minor,char * buf,int count);typedef int (*fn_ptr)();struct i387_struct { long cwd; long swd; long twd; 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;};/*进程控制块*/struct task_struct {/* these are hardcoded - don't touch */ long state; /* -1 unrunnable, 0 runnable, >0 stopped 进程的当前状态*/ long counter; /* 任务的时间片,即该进程还会持续多少个系统时钟才会切换到下一个进程 */ long priority; /* 运行优先级,初始时COUNTER=PRIORITY (15个滴答)*/ long signal; /* 信号。是位图,每个BIT位代表一种信号,信号值=位偏移值+1,linux最多有32个信号,在每个系统调用处理过程的最后,系统会使用该信号位图对信号进行预处理*/ struct sigaction sigaction[32];/* 信号执行属性结构,对信号将要执行的操作和标志信息 */ long blocked; /* 进程信号屏蔽码(对应信号位图) *//* various fields */ int exit_code;/* 任务执行停止的退出码,其父进程会取 */ unsigned long start_code,end_code,end_data,brk,start_stack;/* 代码段起始地址(线性地址)、代码长度、代码+数据长度、总长度(指针指向进程尾,通过修改该指针(调用MALLOC()并通过系统调用BRK由内核完成)可动态的为进程添加和释放内存)、堆栈段地址 */ long pid,father,pgrp,session,leader;/* 进程标识号、父进程号、进程组号、会话号、会话首领 */ unsigned short uid,euid,suid;/* 用户标识、有效用户、保存的用户、组标识号、有效组ID、保存的组ID */ unsigned short gid,egid,sgid; long alarm;/* 报警定时值(滴答数) */ long utime,stime,cutime,cstime,start_time;/* 用户态运行时间(滴答数)、系统态运行时间(滴答数)、 子进程用户态运行时间、 子进程系统态运行时间、进程开始运行时刻*/ unsigned short used_math;/*标识:是否使用了协处理器 *//* file system info */ int tty; /* 进程使用TTY终端的子设备号,-1表示没有使用*/ unsigned short umask;/* 文件创建属性屏蔽位,即新建文件所设置的访问属性*/ struct m_inode * pwd;/*当前工作目录路I节点结构指针 ,每个进程都有一个当前工作目录,用于解析相对路径名,可通过系统调用CHDIR来改变*/ struct m_inode * root;/* 根目录I节点结构指针,用于解析绝对路径,只有超级用户和通过系统调用CHROOT来修改这个根目录*/ struct m_inode * executable;/* 执行文件I节点结构指针,指向的数据结构表示由系统从文件系统上加载运行的执行文件(进程运行的执行文件)*/ unsigned long close_on_exec;/* 执行时关闭文件句柄位涂标志(INCLLUDE/FCNTL.H)*/ struct file * filp[NR_OPEN];/* 文件结构指针表(指向进程使用的所有打开文件的数据结构),最多32项。表项号即文件描述符的值*//* ldt for this task 0 - zero 1 - cs 2 - ds&ss */ struct desc_struct ldt[3];/*该进程局部描述符表。0-空、1-代码段CS描述符、2-数据和堆栈段DS&SS描述符*//* tss for this task */ struct tss_struct tss;/* 进程的任务状态段信息结构(task state segment),当任务从执行中被切换出时该结构保存了当前处理器的所有寄存器值*/};/* * INIT_TASK is used to set up the first task table, touch at * your own risk!. Base=0, limit=0x9ffff (=640kB) */#define INIT_TASK \/* state etc */ { 0,15,15, \/* signals */ 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,}, \ { \ {0,0}, \/* ldt */ {0x9f,0xc0fa00}, \ {0x9f,0xc0f200}, \ }, \/*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, \ {} \ }, \}extern struct task_struct *task[NR_TASKS];extern struct task_struct *last_task_used_math;extern struct task_struct *current;extern long volatile jiffies;extern long startup_time;#define CURRENT_TIME (startup_time+jiffies/HZ)/*获取当前系统时间,秒*/extern void add_timer(long jiffies, void (*fn)(void));extern void sleep_on(struct task_struct ** p);extern void interruptible_sleep_on(struct task_struct ** p);extern void wake_up(struct task_struct ** p);/* * Entry into gdt where to find first TSS. 0-nul, 1-cs, 2-ds, 3-syscall * 4-TSS0, 5-LDT0, 6-TSS1 etc ... */#define FIRST_TSS_ENTRY 4 /*进程0的tss在gdt中的位置*/#define FIRST_LDT_ENTRY (FIRST_TSS_ENTRY+1) /*进程0的ldt在gdt中的位置*/#define _TSS(n) ((((unsigned long) n)<<4)+(FIRST_TSS_ENTRY<<3))#define _LDT(n) ((((unsigned long) n)<<4)+(FIRST_LDT_ENTRY<<3))#define ltr(n) __asm__("ltr %%ax"::"a" (_TSS(n)))#define lldt(n) __asm__("lldt %%ax"::"a" (_LDT(n)))#define str(n) \__asm__("str %%ax\n\t" \ "subl %2,%%eax\n\t" \ "shrl $4,%%eax" \ :"=a" (n) \ :"a" (0),"i" (FIRST_TSS_ENTRY<<3))/* * switch_to(n) should switch tasks to task nr n, first * checking that n isn't the current task, in which case it does nothing. * This also clears the TS-flag if the task we switched to has used * tha math co-processor latest. */#define switch_to(n) {\/*实际的进程切换操作*/struct {long a,b;} __tmp; \__asm__("cmpl %%ecx,_current\n\t" \ /*检查要切换的进程是否是当前进程*/ "je 1f\n\t" \ /*若是则直接退出*/ "movw %%dx,%1\n\t" \ "xchgl %%ecx,_current\n\t" \ /*否则首先把内核全局变量current置为新任务的指针*/ "ljmp %0\n\t" \ /*长跳转(ljmp 段选择符)到新任务的任务状态段tss组成的地址处,造成cpu执行任务切换操作此时cpu会把其所有寄存器的状态保存到当前任务寄存器tr中tss段选择符所指向的当前进程任务数据结构的tss结构中然后把新任务状态段选择符所指向的新任务数据结构中的tss结构中的信息恢复到cpu中,系统就正式开始运行新的任务了*/ "cmpl %%ecx,_last_task_used_math\n\t" \ "jne 1f\n\t" \ "clts\n" \ "1:" \ ::"m" (*&__tmp.a),"m" (*&__tmp.b), \ "d" (_TSS(n)),"c" ((long) task[n])); \}#define PAGE_ALIGN(n) (((n)+0xfff)&0xfffff000)#define _set_base(addr,base) \__asm__("movw %%dx,%0\n\t" \ "rorl $16,%%edx\n\t" \ "movb %%dl,%1\n\t" \ "movb %%dh,%2" \ ::"m" (*((addr)+2)), \ "m" (*((addr)+4)), \ "m" (*((addr)+7)), \ "d" (base) \ :"dx")#define _set_limit(addr,limit) \__asm__("movw %%dx,%0\n\t" \ "rorl $16,%%edx\n\t" \ "movb %1,%%dh\n\t" \ "andb $0xf0,%%dh\n\t" \ "orb %%dh,%%dl\n\t" \ "movb %%dl,%1" \ ::"m" (*(addr)), \ "m" (*((addr)+6)), \ "d" (limit) \ :"dx")#define set_base(ldt,base) _set_base( ((char *)&(ldt)) , base )#define set_limit(ldt,limit) _set_limit( ((char *)&(ldt)) , (limit-1)>>12 )#define _get_base(addr) ({\unsigned long __base; \__asm__("movb %3,%%dh\n\t" \ "movb %2,%%dl\n\t" \ "shll $16,%%edx\n\t" \ "movw %1,%%dx" \ :"=d" (__base) \ :"m" (*((addr)+2)), \ "m" (*((addr)+4)), \ "m" (*((addr)+7))); \__base;})#define get_base(ldt) _get_base( ((char *)&(ldt)) )#define get_limit(segment) ({ \unsigned long __limit; \__asm__("lsll %1,%0\n\tincl %0":"=r" (__limit):"r" (segment)); \__limit;})#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -