📄 sched.h
字号:
#ifndef _SCHED_H#define _SCHED_H#define HZ 100#define NR_TASKS 64#define TASK_SIZE 0x04000000#define LIBRARY_SIZE 0x00400000#if (TASK_SIZE & 0x3fffff)#error "TASK_SIZE must be multiple of 4M"#endif#if (LIBRARY_SIZE & 0x3fffff)#error "LIBRARY_SIZE must be a multiple of 4M"#endif#if (LIBRARY_SIZE >= (TASK_SIZE/2))#error "LIBRARY_SIZE too damn big!"#endif#if (((TASK_SIZE>>16)*NR_TASKS) != 0x10000)#error "TASK_SIZE*NR_TASKS must be 4GB"#endif#define LIBRARY_OFFSET (TASK_SIZE - LIBRARY_SIZE)#define CT_TO_SECS(x) ((x) / HZ)#define CT_TO_USECS(x) (((x) % HZ) * 1000000/HZ)#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 <sys/param.h>#include <sys/time.h>#include <sys/resource.h>#include <signal.h>#if (NR_OPEN > 32)#error "Currently the close-on-exec-flags and select masks are in one long, max 32 files/proc"#endif#define TASK_RUNNING 0#define TASK_INTERRUPTIBLE 1#define TASK_UNINTERRUPTIBLE 2#define TASK_ZOMBIE 3#define TASK_STOPPED 4#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; 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,pgrp,session,leader; int groups[NGROUPS]; /* * pointers to parent process, youngest child, younger sibling, * older sibling, respectively. (p->father can be replaced with * p->p_pptr->pid) */ struct task_struct *p_pptr, *p_cptr, *p_ysptr, *p_osptr; unsigned short uid,euid,suid; unsigned short gid,egid,sgid; unsigned long timeout,alarm; long utime,stime,cutime,cstime,start_time; struct rlimit rlim[RLIM_NLIMITS]; unsigned int flags; /* per process flags, defined below */ 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; struct m_inode * library; 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;};/* * Per process flags */#define PF_ALIGNWARN 0x00000001 /* Print alignment warning msgs */ /* Not implemented yet, only for 486*//* * 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,0,0,0, \/* suppl grps*/ {NOGROUP,}, \/* proc links*/ &init_task.task,0,0,0, \/* uid etc */ 0,0,0,0,0,0, \/* timeout */ 0,0,0,0,0,0,0, \/* rlimits */ { {0x7fffffff, 0x7fffffff}, {0x7fffffff, 0x7fffffff}, \ {0x7fffffff, 0x7fffffff}, {0x7fffffff, 0x7fffffff}, \ {0x7fffffff, 0x7fffffff}, {0x7fffffff, 0x7fffffff}}, \/* flags */ 0, \/* math */ 0, \/* fs info */ -1,0022,NULL,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 unsigned long volatile jiffies;extern unsigned long startup_time;extern int jiffies_offset;#define CURRENT_TIME (startup_time+(jiffies+jiffies_offset)/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);extern int in_group_p(gid_t grp);/* * 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#define FIRST_LDT_ENTRY (FIRST_TSS_ENTRY+1)#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" \ "ljmp %0\n\t" \ "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 + -