linux 中进程为0,Linux中0号进程的创建

INIT_TASK宏定义,其实就是0号任务,看起来比较混乱,其实就是初始化task_struct结构体

#define INIT_TASK \

//0表示可运行的,15表示运行时间片,15表示运行优化级

/* state etc */ { 0,15,15, \

//0表示没有信号,{{}}信号处理句柄设为0,0表示不屏蔽信号

/* signals */ 0,{{},},0, \//初始化信号设置

//将exit_code以及start_code,end_code,end_data,brk,start_stack均设为0

/* ec,brk... */ 0,0,0,0,0,0, \

//0表示进程号,-1表示父进程,后面三个0表示,pgrp,session,leader

/* pid etc.. */ 0,-1,0,0,0, \

//设置进程的这6个成员unsigned short uid,euid,suid; unsigned short gid,egid,sgid;

/* uid etc */ 0,0,0,0,0,0, \

//设置进程的报警定时器以及5个时间函数

/* alarm */ 0,0,0,0,0,0, \

//表明该进程未使用协处理器

/* math */ 0, \

/* fs info */ -1,0022,NULL,NULL,NULL,0, \

/* filp */ {NULL,}, \

//这里就是很关键的一部份,表始初始化一个局部LDT表,即第一个任务的

{ \

{0,0}, \

/* ldt */ {0x9f,0xc0fa00}, \

{0x9f,0xc0f200}, \

}, \

//第一个任务的任务状态表,跟踪struct tss_struct可以知道其详细意义

/*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, \

{} \

}, \

}

到这了,也差不多了,额外的部份再看看第一个任务的LDT表与TSS表,由上面可知0号任务的LDT的代码段与数据段分别为{0x9f,0xc0fa00}与{0x9f,0xc0f200},根据保护模式下的定义,可以代码段的段基址为0,段限长为640KB,段属性为存在于内存中、特权级为3,代码段,同理分析得数据段的段基址为0,段限长为640KB,段属性为存在于内存中,特权级为3,数据段

第一个任务的状态表,提一下吧

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;

};

根据这个表可以看到的是任务0的内核态堆栈指针esp0=PAGE_SIZE+(long)&init_task,即第一个PCB块(task_struct)的顶部空间,PAGE_SIZE=4k,ss0=0x10,0x10查一下head.s你就会发现是gdt的第一个描述符,即内核代码段,后面还有几个是对数据段寄存器的定义以及ldt的定义。0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值