GeekOS操作系统课程设计项目介绍_第1页
GeekOS操作系统课程设计项目介绍_第2页
GeekOS操作系统课程设计项目介绍_第3页
GeekOS操作系统课程设计项目介绍_第4页
GeekOS操作系统课程设计项目介绍_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、表1 ELF目标文件格式Spawn_Init_Process() Start_Kernel_Thread()Spawner()Read_Fully()Parse_ELF_Excutable()Spawn_Program()currentrunwait出现需要等待的事件等待的事件发生调度时间片到等图5.1 GeekOS进程状态转换 GeekOS系统最早创建的内核进程有Idle、Reaper和Main三个进程,它们由Init_Scheduler函数创建:最先初始化一个核态进程mainThread,并将该进程作为当前运行进程,函数最后还调用Start_Kernel_Thread 函数创建了两个系统进

2、程Idle和Reaper。 所以,Idle、Reaper和Main三个进程是系统中最早存在的进程。新建 include/kthread.h中定义,具体结构如下:struct Kernel_Thread ulong_t esp; / 进程的内核堆栈esp指针 volatile ulong_t numTicks; / 计时器 int priority; / 进程优先级 DEFINE_LINK(Thread_Queue, Kernel_Thread);/ 指针指向进程队列下一进程 void* stackPage; / 内核堆栈页指针 struct User_Context* userContext;

3、 / 用户进程上下文 struct Kernel_Thread* owner; / 父进程指针 int refCount; / 引用计数 bool alive; / 是否活跃 struct Thread_Queue joinQueue; / 加入队列 int exitCode; / 返回代码 int pid; / 进程ID DEFINE_LINK(All_Thread_List, Kernel_Thread); / 全局进程链表指针#define MAX_TLOCAL_KEYS 128 const void* tlocalDataMAX_TLOCAL_KEYS;/ 本地信息 int curre

4、ntReadyQueue; / 进程当前所在的运行队列的索引编号 bool blocked; / 是否被阻塞; 在GeekOS中为了区分用户态进程和内核进程,在Kernel_Thread结构体中设置了一个字段 userContext,指向用户态进程上下文。对于内核进程来说,这个指针为空,而用户态进程都拥有自己的用户上下文(User_Context)。因此,在GeekOS中要判断一个进程是内核进程还是用户态进程,只要通过userContext字段是否为空来判断就可以了。 图10.1 用户态进程结构图10.2 GDT、LDT和User_Context的关系Spawn () Read_Fully()

5、Parse_ELF_Excutable()Start_User_Thread ()Setup_User_Thread ()Load_User_Program ()Attach_User_Context ()线性地址到物理地址的转换过程n操作系统将需要在磁盘设备上创建一个操作系统将需要在磁盘设备上创建一个page file文件文件暂时保存从内存中替换出去的页,暂时保存从内存中替换出去的页, n实现一个类实现一个类LRU算法在内存中选取一个替换页把它写算法在内存中选取一个替换页把它写到磁盘的到磁盘的page file文件中。文件中。n缺页中断处理缺页中断处理 表12-1 缺页处理表n在在“/src

6、/geekos/mem.c”文件中,已经定义了一个函数文件中,已经定义了一个函数Alloc_Pageable_Page实现交换一页到磁盘的操作,具体执行实现交换一页到磁盘的操作,具体执行步骤如下:步骤如下:调用调用mem.c文件中已经实现的文件中已经实现的Find_Page_To_Page_Out函数来确定要替换的页(这个函数依赖于页数据结构中的函数来确定要替换的页(这个函数依赖于页数据结构中的clock域)。域)。调用调用paging.c文件中已经实现的文件中已经实现的Find_Space_On_Paging_File函数在函数在page file中找到空闲中找到空闲的存储空间。的存储空间。

7、调用调用paging.c文件中已经实现的文件中已经实现的Write_To_Paging_File函函数把被替换的页写到数把被替换的页写到page file文件中。文件中。修改页表的相应表项,清除页存在的标志,标识为此页在内修改页表的相应表项,清除页存在的标志,标识为此页在内存为不存在。存为不存在。修改页表项的页基地址为包含这一页的第一个磁盘块号。修改页表项的页基地址为包含这一页的第一个磁盘块号。修改页表项的修改页表项的kernelInfo位标识为位标识为KINFO_PAGE_ON_DISK状态(标识这一页是在磁盘上存状态(标识这一页是在磁盘上存在,而不是没有效)。在,而不是没有效)。调用调用l

8、owlevel.asm文件中已经实现的文件中已经实现的Flush_TLB来刷新来刷新TLB。用户进程调用C语言库函数Read函数软件中断,内核调用Sys_Read()函数虚拟文件系统层的Read()函数读出文件的数据Sys_Read()函数将数据拷贝到用户缓冲区GOSFS读文件过程系统已经实现系统已经实现PFAT文件系统,用户要实现的是文件系统,用户要实现的是GOSFS文文件系统,可依照件系统,可依照PFAT文件的实现原理文件的实现原理MAX_FILES_PER_DIR GOSFS_Dir_Entryfilename128flagssizeacl10blockList10目录项GOSFS_Di

9、r_EntryGOSFS_Dir_EntryGOSFS_Dir_EntryGOSFS_Dir_EntryGOSFS_Dir_EntryGOSFS_Dir_EntryGOSFS_Dir_Entry目录块文件目录 数据块数据块01234567894KB data blockGOSFS_Dir_Entry.blockList104KB data block4KB data block磁盘= 已分配12KB 大小的文件4KB data block4KB data block4KB data block磁盘0123456789001234.1022102304KB data block4KB data block40KB 大小的文件一级间接索引块.GOSFS_Dir_Entry.blockList104KB data block4KB data block4KB data

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论