JOS实验三实验记录作者卓达城指导老师邵志远单位华中科技大学.PDFVIP

JOS实验三实验记录作者卓达城指导老师邵志远单位华中科技大学.PDF

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JOS实验三实验记录作者卓达城指导老师邵志远单位华中科技大学.PDF

JOS 实验三实验记录 作者:卓达城 指导老师:邵志远 单位:华中科技大学集群网络与服务计算实验室 首先为envs 分配内存空间,然后映射到物理地址上。 具体实现如下: kmap.c vm_init() 分配空间 kmap.c vm_init() 映射地址 这两个函数以后,内存的布局如下图所示。 线性地址: 0 KSTACKTOP-KSTKSIZE 4M 4M 4M 4M 4M UTOP UPAGES UVPT ULIM KSTACKTOP KERNBASE UENVS envs pages- bootstack- 0-256m 然后现在初始化环境空闲链表,我们想要修改 env_init 函数,这里有一点要注意,应该把 envs[0]放在链表的头部,方便下面调用。具体代码如下: 按照实验的要求,现在开始补充env_setup_vm 函数: 这个函数的主要作用是为新的环境设置页目录,请注意,这里每个新的环境都有一个属于自 己的页目录,当设置好页目录之后,把内核的页目录(UTOP 上面的线性地址)映射到新环 境的页目录,以便新环境可以通过某些形式访问内核。 然后是segment_alloc()函数 这个函数的主要作用是从地址va 开始分配len 字节的空间 具体实现代码如下: load_icode()函数 这个函数是第一部分最难的一个函数,它的主要任务是把程序加载到新环境的虚 拟地址上,参数提供了要加载的程序的首地址。由于要在新环境(进程)中加载 所以必须把cr3 换成新环境的cr3,加载完之后回到原来的cr3。 然后要明白函数里面循环部分的意义必须明白elf 的结构,每个应用程序都有自 己的elf 结构,包括内核,所有应用程序都为操作系统提供elf 结构,然后操作 系统根据这个结构把程序加载到合适的地方,elf 的结构如下图: 程序头表把程序分成好几个段,然后段的信息放在 proghdr 中,通过 proghdr 就可以把程序加载到指定的虚拟内存地址上。 具体信息可参照 第三章的书稿 《系统的启动和初始化》 具体实现代码如下: 方框部分注意了,这样写比较安全,这个上课听说是bss 段有可能不全部为零, 所以有了这样的写法,具体原因我暂时还不是很清楚。 如果把方框里的前两句调换位置,这个程序就有问题了。+ 写完这个函数之后,第一部分就差不多了。 然后进入env_create 函数 这个函数里面调用了env_alloc 这个函数我们不用改,但是最好理解。 现在先解释这个函数: 从空闲链表拿出一个新的env,然后初始化。 这几句是用来生成env_id 的,低10位势根据e - envs 定的,NENV 等于1024, 刚好是10 位,这样就确保每一个env_id 都不重复。如果前面把env_id 初始化 成零的话,那么(1)env 就会根据e - envs 来定,具体就是0-1024,(2)而且在 init.c 里面还有一个就是env_run(env[0]),这就是上面的env_init 为什么要 把第零项放第一的原因,其实更重要的是后一个原因,但是第一个原因也是有的 (个人认为)。 这几句是设置好段寄存器,并把他们的特权级设置为3,至于gdt 表在上面时候 设置,请看下面(i386_vm_init): gdt 表项在: 这里的段基地址都是一样,至于JOS 是怎样使用段保护的,我暂时也不是很清楚。 到后面应该会明白。 然后回到env_create 函数: 它把应用程序放到指定的虚拟内存上去。然后就完了。具体代码如下: 我们再来看这个宏 我们一定想知道user_hello 到底在哪里。这个也是暂时不知道,我这几个文件 中都找不到它的信息。补充信息:后来我在 kernel.sym 中找到了 user_hello 的信息。 然后就是 env_run,这个函数很简单,但是它调用的函数env_pop_tf 比较有意 思,先看看env_run 的具体实现,很简单: 现在进入env_pop_tf 函数,在看代码之前要先看看Trapframe 的结构: 我们可以看到 Trapframe 的前面部分按照一定的顺序,就是pushal 的顺把 32 为的寄存器排好,然后后面就是段寄存器,tf_padding1

文档评论(0)

duyingjie1 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档