Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1838472
  • 博文数量: 333
  • 博客积分: 10791
  • 博客等级: 上将
  • 技术积分: 4314
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-08 07:39
文章分类

全部博文(333)

文章存档

2015年(1)

2011年(116)

2010年(187)

2009年(25)

2008年(3)

2007年(1)

分类:

2009-04-10 00:27:46

毕业实习总结








目录


实习概况 -----------------------------------2


实习时间 -----------------------------------2


实习主要工作 -----------------------------------2


实习体会 -----------------------------------5









  1. 实习概况

当今社会科技飞速发展,计算机广泛用于各种领域。随着计算机的普及,操作系统也普及开来。目前用于通用计算机上的分布的操作系统主要两个家族:类Unix家族和微软Windows家族。

随着科技的不断发展及生活质量的提高,硬件水平也在不断发展,如何有效、高效地组织和管理这些硬件呢?这便是一大问题。这便需要一个设计良好的操作系统。

而本人在实习期间所做的是微型操作系统中启动与内存管理部分,使该操作系统能够顺利启动并进行内存的初始化分配。


  1. 实习时间

200931日(星期四)至200942日(星期四)


  1. 实习主要工作

    1. 开发环境:

此次实习是利用Linux环境下开发的,所使用的开发工具有:GCC编译器、AS编译器、LD链接器和利用OBJDUMP查看目标文件信息。微型操作系统运行与debug是利用bochs完成的。bochs提供了强大的系统调试功能,可以设置断点,进行代码调试;可以观察系统运行时的硬件信息。从而快速准确的找到bug所在。

下面简单介绍bochs模拟器的常用命令:

调试:vb addr, lb addr, b(pb) addr

运行:s, c

查看内存:x(xv)/nuf addr, xp/nuf addr

查看寄存器:info r, info eflags

查看GDT内容:info gdt [a[ b]]

查看CPU状态:info cpu, dump_cpu


    1. 操作系统引导(bootloader):

3.2.1、启动过程:


  • BIOS0xffff0开始执行

  • 进行硬件测试、初始化设备等

  • boot loader拷贝于0x7c00

  • 跳转后进入boot loader

  • kern/entry.设置GDT,初始化堆栈

3.2.2、几个重要知识点:

1A20地址线:从80286开始,系统出现了一种新的机制,被称为保护模式。到了80386,保护模式得到了进一步的完善和发展,并且对于80386以后的芯片,保护模式的变化就非常小了。在保护模式下,如果A20 Gate被禁止,则可以访问的内存只能是奇数1M段,即1M,3M,5M…,也就是00000-FFFFF, 200000-2FFFFF,300000-3FFFFF…。如果A20 Gate被打开,则可以访问的内存则是连续的。

打开A20 Gate,从理论上讲,打开A20 Gate的方法是通过设置8042芯片输出端口(64h)的2nd-bit,但事实上,当你向8042芯片输出端口进行写操作的时候,在键盘缓冲区中,或许还有别的数据尚未处理,因此你必须首先处理这些数据。

2、实模式到保护模式的转换:将控制寄存器cr0PE(protection enable)位置1

具体代码如下:

movl %cr0, %eax

orl $CR0_PE_ON, %eax

movl %eax, %cr0

3ELFExecutable and Linking Format)文件格式:Boot loader需要将磁盘上的内核映像加载到内存中,内核映像是ELF格式文件。

ELF的数据结构:

struct Elf {

uint32_t e_magic; // must equal ELF_MAGIC

uint8_t e_elf[12];

uint16_t e_type; //identifies the object file type

uint16_t e_machine; //specifies the required architecture for an individual file

uint32_t e_version; //identifies the object file version

uint32_t e_entry; //Unsigned program address

uint32_t e_phoff; //program header table's file offset in bytes

uint32_t e_shoff; //section header table's file offset in bytes

uint32_t e_flags; //processor-specific flags associated with the file

uint16_t e_ehsize; //ELF header's size in bytes

//the size in bytes of one entry in the file's program header table

uint16_t e_phentsize;

uint16_t e_phnum; //the number of entries in the program header table

uint16_t e_shentsize; //a section header's size in bytes

uint16_t e_shnum; //the number of entries in the section header table

uint16_t e_shstrndx; //the section header table index of the entry

};


    1. 存储管理:

3.3.1、虚拟内存的布局:

其中,KERNBASE是内核逻辑地址的起始点。从KERNBASE4G的逻辑地址映射了0256M的物理内存,以方便内核直接访问

3.3.2、几个重要知识点:

1、段页式内存映射机制:

2struct Page的数据结构:

struct Page {

Page_LIST_entry_t pp_link; /* free list link */

//用于page链表管理

uint16_t pp_ref;

//该物理页面被引用数(即被map到虚拟地址的数量)

//当引用数为0,即可释放

};


  1. 实习体会

“实践是检验真理的唯一标准!”

在书本的学习中,我只重视了操作系统的理论,并没有真正意义上的实践,注重的是如何进行进程管理、内存管理、如何防止死锁等等。所以在刚开始进行实习很不适应。不知从何入手——怎样引导操作系统。所以,从最基础的知识点开始逐步深入。首先知道一个引导程序是512字节的,因为BIO只读一个扇区(512字节)进入内存。那BIOS怎样判断是不是引导程序呢?是在这512字节的最后两个字节是“55 AA

在完成操作系统的引导后,变逐渐适应了该如何配合计算机执行一个程序,这一刻我也才深深的了解操作系统的重要性了:她是连接人与机器这两个完全不同的个体的纽带。她的每一个动作都是以人的思想为指导,计算机的动作标准而进行。

在内存管理中,首先就是要知道这个操作系统对内存是如何分配的。正如在这个实习中, 我只不过是通过自己的理解完成JOS规定的任务。在设计上没有多大自己发挥的地方,这是一个比较遗憾的地方。不过,这也是一个很好的实习项目,通过理解他人对操作系统的架构可以很快的整理出自己对操作系统设计的框架。

总之,这次实习让我对操作系统本身有了更深刻的认识,不过这也只是一个开始,一个小学生刚刚进去学校的大门。我需要学习的地方还有很多,大牛级别的人物很多,要通过不断地磨练自己逐步向他们看齐。

昨天已经逝去,今天需要努力,明天依然美好!





阅读(2300) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~