二、变量(static):
1. static union task_union init_task:联合体就是一个page的内存,保存着第一个进程结构体内容,在sched.h中已经将它初始化好了,我们在来体会一下这个最初的生命体。
1)long state:0,表示就绪态。
2)long counter:15,时间片滴答数。
3)long priority:15,优先级值。
4)long signal:0,还没有任何信号存在。
5)struct sigaction sigaction[32]:{{},},空。
6)long blocked:0,不屏蔽任何信号。
7)long exit_code:0。
8)long start_code,end_code,end_data,brk,start_stack:0,0,0,0,0,对于进程0用不到。
13)long pid:0,初始进程。
14)long pgrp,session,leader:0,0,0,初始化为0,其实也只有0号进程。
17)int groups[32]:{-1,},暂时还没有。
18)struct task_struct *p_pptr,*p_cptr,*p_ysptr,*p_osptr:&init_task.task,0,0,0:,它将父进程指向了自己,其他的都还没有。
22)unsigned short uid,euid,suid,gid,egid,sgid:0,0,0,0,0,0,都是0号进程。
28)unsigned long timeout:0,没有启动。
29)unsigned long alarm:0,没有启动。
30)long utime,stime,cutime,cstime,start_time:0,0,0,0,0,都没有需要。
35)struct rlimit rlim[6]:{{0x7fffffff,0x7fffffff},...},都赋值为最大值。
36)unsigned int flags:0。
37)unsigned short used_math:0,没有使用数学协处理器。
38)int tty:-1,没有对应的tty设备。
39)unsigned short umask:0022,八进制,用户进程不可读不可写不可执行,同一用户组进程不可读可写不可执行,其他用户不可读可写不可执行。怎么感觉怪怪的!
40)struct m_inode *pwd,*root,*executable,*library:NULL,NULL,NULL,NULL,是的,都没有。
44)unsigned long close_on_exec:0,木有。
45)struct file *filp[20]:{NULL,},木有。
46)struct desc_struct ldt[3]:{{0,0},{0x9f,0xc0fa00},{0x9f,0xc0f200}},嘿嘿,这个是重点,这些可是进程0的段描述符哦,非常重要。ldt[0]没有,ldt[1]是代码段,ldt[2]是数据段,我们拆开看看:
1-段限长:0xc0fa00[19:16]+0x9f[15:0]=0x9f,+1,0xa0,x4Kb,640Kb。
2-基地址:0xc0fa00[31:24][7:0]+0x9f[31:16]=0x0。
3-TYPE:类型,0xc0fa00[11:8]=0xa,b1100,代码,一致性,仅执行。
0xc0f200[11:8]=0x2,b0010,数据,可读写。
4-DPL:特权级,0xc0fa00[14:13]=0x3,ring 3环,表示用户态。
5-P:存在位,0xc0fa00[15:15]=0x1,存在。
6-AVL:软件可用位,0xc0fa00[20:20]=0x0。
7-B:默认操作大小,0xc0fa00[22:22]=0x1,32位地址。
8-G:颗粒度标志,0xc0fa00[23:23]=0x1,4Kb。
47)struct tss_struct tss:
1> long back_link:0。
2> long esp0,ss0:PAGE_SIZE+(long)&init_task,0x10。
4> long esp1,ss1,esp2,ss2:0,0,0,0。
8> long cr3:(long)&pg_dir。
9> long eip:0,到时候会通过iret重设的。
10> long eflags:0,到时候会通过iret重设的。
11> long eax,ecx,edx,ebx:0,0,0,0,用不到。
15> long esp:0,到时候会通过iret重设的。
16> long ebp:0,用不到。
17> long esi,edi:0,0,用不到。
18> long es,cs,ss,ds,fs,gs:0x17,0x17,0x17,0x17,0x17,0x17,都要用数据段即可记得这个是用户态,因此得用LDT,bit2=1。
24> long ldt:_LDT(0),任务0的LDT选择子。
25> long trace_bitmap:0x80000000,?。
26> struct i387_struct i387:{},到时候任务切换的时候会将该内容填满。 |