User:Wangrui

From Trusted Cloud Group
Jump to: navigation, search

个人简介

wang rui (王睿),2008级硕士,VM组

   * Email: wangrui163@sina.com
   * QQ: 363120908

周记

  • 20090910~200909017

1.了解ELF文件加载过程。
2.学写makefile文件。
感觉makefile文件只有一个语法即

  target : prerequisites
command

其他的一切都是围绕这个展开的。
键盘字符转换其中的主要问题就是组合键的问题,linux解决的办法是建立缓冲区将前一个操作的键盘扫描码写进缓冲区,然后在读下一个扫描码。
3.了解从键盘扫描码到键盘字符的转换过程。


  • 20090903~200909010

JOS大作业进行中。

  • Lab4部分:

Lab4最后的spawn终于完成,make grade终于得到了满分。spawn()函数的作用产生新的进程,在这一部分中,我们需要从文件系统中导出一个程序的映像加载到所创建的进程中来运行该程序。父进程和子进程相对独立的运行。spwan 函数和UNIX 中的fork 函数类似,子进程一旦映射完成立即生效等待调度。此部分的难点一个是init_stack()的实现,一个是load segment的工作,在把elf里的文件load进子进程时哪一部分映射到子进程,哪一部分需拷贝到子进程时出现纠结,后来终于搞清是通过elf的p_filesz和p_memsz这两位比较作为界限来初始化bss段的。
File:Lab4代码及技术文档.rar

  • Lab5部分:

Lab5主要完成的是文件系统,刚开始是熟悉文件系统的结构和建立过程。JOS文件系统的启动过程是Kern\init.c->kern\env.c->lib\libmain.c->fs/serv.c->fs/fs.c
JOS的文件系统作为0号进程存在,所以开头部分是设置权限(EFLAGS中的IOPL)。接下来完成的read_block()和write_block()这两个函数,即读取一个文件块到内存和将一个文件块从内存写到磁盘。接下来就是bitmap的初始化。目前进度到此,grade是30分。本周六大作业检查,争取检查前能多做点。^_^


  • 20090820~20090903

1、JOS大作业Lab4进行中。
->Lab4终于进入到最后一部分最后一个函数的编写。之前fork出现的进程访问虚拟地址权限问题在调试两周后终于找到问题所在,即lab2中的负责物理地址和虚拟地址之间的映射函数page_insert()有错误,修正后终于跑通,耶~
2、grub load kernel部分代码阅读。 ->grub加载内核镜像主要由\stage2\boot.c里的load image()实现,这个函数有七百多行,结构相当不好理清,不得不叹服编写grub的高手。


  • 20090813~20090820

1、JOS大作业Lab4进行中。
->把Lab3成功移进Lab4,并且Lab4第一部分的user page fault handler也终于完成,下一周着手此部分的重头戏copy-on-write fork(lib\fork.c)。
2、cpu亲和性移植。
->发现Linux和Xen在引导和初始化阶段都是只有一个CPU(BP)运行,其余的CPU(AP)处与暂停状态。在创建好多个进程(Xen里面对应的是VCPU,后同)并初始化SMP后,从而可以由多个CPU同时参与处理时,通过PID和CPU的关联实现亲和性。但是目前Zion依附的JOS平台尚未建立进程和SMP,考虑要不要把Lab3的代码加进来。


  • 20090716~20090723

1、JOS大作业。
->发现了上周的不能正常打印当前env_id的问题所在:当发生系统调用,hander指向的是syscall.c里面的syscall()这个函数,case 3不应该返回0,而应该是当前env_id。Part 3进行中。
2、阅读Linux内存管理部分代码,了解Xen内存虚拟化部分原理。
->JOS实验可以参考Linux的一些代码(Part 3的Round-Robin Scheduling 在Linux(alloc_page())中也用到)。阅读了Linux物理页面的使用和周转,以及物理页面的分配,可以看出JOS的内存管理部分基本跟 Linux内存管理的核心部分一致。举个例子,当分配物理页面时,Linux考虑到页面是连续还是离散,当前空闲页面有没有低于最低限度,需不需要等待进程释放内存页面,等等。通过一级级调用最后才给分配页面,而JOS完全不需要考虑这些。
->基本搞清楚了Xen三套页表的管理机制(怎么管理,由谁管理)。


  • 20090709~20090716

1、JOS大作业。
->Lab3进行到Part2,碰到一个问题:当在用户环境下hello.c->libmain.c中读取当前Env_id,即系统调用,系统就 crash掉,跳过此步完成了接下来的page fault和breakpoint后,回过头来执行hello world,仍然无解(虽然此时系统不会crash,而是直接kill environment),接下来几天争取把这个问题和lab3的Part3解决掉。
2、Linux亲和性的一个小实验。
->在安装有Ubuntu的笔记本(单核)上,可以通过PID查询和设置某个进程的cpu mask,但是由于单核,只能把cpu mask设置成1(根据内部机制,若设置为偶数mask报错,奇数mask系统会自动改为1);在虚拟机上实验,使用通过ps获得的PID居然无法查询 cpu mask,疑问中。


  • 20090702~20090709

1、高级操作系统大作业。
2、准备例会的ppt。


  • 20090625~20090702

1、忙完考试。
2、开始JOS大作业。
3、准备下周的presentation。


  • 20090618~20090625

1、基本搞懂了Linux 2.6和Xen 3.4.0关于亲和性部分的代码原理。
->Linux主要就是上周提到的setaffinity()和getaffinity()两个system call,第一个是设置一个给定进程PID的cpu_mask,设置的这个cpu_mask必须是在kernel中注册的CPU,通过cpuset_cpus_allowed()函数获得当前合法CPU号组成的cpu allowed mask,将其与new mask按位相与,获得合法的new mask。第二个是retrieve某个给定进程PID的cpu_mask,原理相同,这里不再撰述。
->Xen客户机启动的时候,虚拟CPU(vcpu)是由dom0系统决定固定在某个物理CPU核心上的,这个分配具有随机性,当然也可以手动给vcpu分配物理cpu号,通过__vcpu_set_affinity()函数实现,再决定虚拟机跑在哪个vcpu上。Xen亲和性部分借鉴了一些Linux的代码,但增加了一个affinity_locked位(old_lock_status和new_lock_status)对affinity的锁定。
2、准备两门考试。
3、完成了windows操作系统大作业。
4、看林芊要讲的论文。
5、接下来一周还有一门考试,高级操作系统课的技术报告和大作业需求文档设计和总体规划。


  • 20090611~20090618

1、看完一遍俞培杰要讲的论文,了解基本原理。
2、阅读了Linux2.6版本关于亲和性部分的代码。
Linux通过一个32位uint的mask来调度某个进程在哪一个CPU上运行,mask的每一位对于相应的CPU的逻辑号(故最多能够支持 32个CPU),mask存放在task_struct结构体中。细节部分还有些不大了解,例如setaffinity()和getaffinity() 之间调用。接下来在搞清楚Linux亲和性部分的基础上,将其和en亲和性部分进行比较异同。
3、windows大作业。 完成了应用层的编写,应用程序进程和系统服务进程可以杀死,但驱动和卡巴斯基还是无法杀死,接下来完成驱动层的编写。
4、准备下周的考试。

1041912 070626jordan05.jpg

Personal tools
Namespaces
Variants
Actions
Navigation
Upload file
Toolbox