1.创建第一进程

##第一步:进程表数据结构 进程表就是个结构体数组 ``` #define LDT_SIZE 2 // LDT大小 #define NR_TASKS 1 // 支持的进程个数,Number Restriction // 进程调度的时候,保存现场用的栈帧,保存寄存器的值 typedef struct s_stackframe { uint32 gs; uint32 fs; uint32 es; uint32 ds; uint32 edi; uint32 esi; uint32 ebp; uint32 kernel_esp; // 内存栈指针 uint32 ebx; uint32 edx; uint32 ecx; uint32 eax; uint32 retaddr; // 返回地址:运行中被中断的话,存放的是eip;初始时,应存放程序入口地址 uint32 eip; uint32 cs; uint32 eflags; uint32 esp; uint32 ss; } __attribute__((packed)) STACK_FRAME; // 进程定义 typedef struct s_proc { STACK_FRAME regs; // 寄存器现场信息 uint16 ldt_sel; // LDT选择子 DESCRIPTOR ldts[LDT_SIZE]; // uint32 pid; // 进程号 char p_name[16]; // 进程名 } __attribute__((packed)) PROCESS; // 进程表 PROCESS proc_table[NR_TASKS]; ``` ##第二步:添加init_for_first_process()函数,在cstart()函数中调用 ##第三步:(初始化进程)初始化LDT段描述符和TSS段描述符 1.TSS和LDT段描述符 ``` /* 描述符索引 */ #define INDEX_DUMMY 0 // ┓ #define INDEX_FLAT_C 1 // ┣ LOADER 里面已经确定了的. #define INDEX_FLAT_RW 2 // ┃ #define INDEX_VIDEO 3 // ┛ #define INDEX_TSS 4 #define INDEX_LDT_FIRST 5 /* 选择子 */ /** 段选择子结构:16位整型 * | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | * | 段描述符索引index | T1 | RPL | * T1:T1=0表示从全局描述符表GDT中读取描述符; * T1=1表示从局部描述符表中读取描述符; */ #define SELECTOR_DUMMY 0 // ┓ #define SELECTOR_FLAT_C 0x08 // ┣ LOADER 里面已经确定了的 1 000,GDT中,RPL=0,索引号是1 #define SELECTOR_FLAT_RW 0x10 // ┃ 10 000,GDT中,RPL=0,索引号是2 #define SELECTOR_VIDEO (0x18+3) // ┛<-- RPL=3 11 011,GDT中,RPL=3,索引号是3 #define SELECTOR_TSS 0x20 // TSS 0x20 = 32d = 100 000b GDT中,RPL=0,索引号是4 #define SELECTOR_LDT_FIRST 0x28 // 0x28 = 40d = 101 000b GDT中,RPL=0,索引号是5 ``` 2. 在loader中,GDT中初始化了0、1、2、3描述符;`现在要初始化TSS和LDT描述符`。

你可能感兴趣的:(1.创建第一进程)