From 5cff517a9f3cd14cb0b3f0912a8443ff012280b5 Mon Sep 17 00:00:00 2001 From: Object Ho Date: Mon, 6 Oct 2014 08:26:48 +0800 Subject: [PATCH] All contents --- lab0.md | 163 ++ lab0/.DS_Store | Bin 0 -> 6148 bytes lab0/image001.png | Bin 0 -> 97038 bytes lab0/image002.png | Bin 0 -> 65187 bytes lab0/image003.png | Bin 0 -> 10745 bytes lab0/image004.png | Bin 0 -> 10962 bytes lab0/image005.png | Bin 0 -> 6396 bytes lab0/image006.png | Bin 0 -> 19318 bytes lab0/image007.png | Bin 0 -> 19385 bytes lab0/image008.png | Bin 0 -> 13733 bytes lab1.htm | 4019 +++++++++++++++++++++++++++++++++++++++ lab1.md | 6 + lab1/.DS_Store | Bin 0 -> 6148 bytes lab1/image001.png | Bin 0 -> 15818 bytes lab1/image002.png | Bin 0 -> 16583 bytes lab1/image003.png | Bin 0 -> 43293 bytes lab1/image004.png | Bin 0 -> 11354 bytes lab1/image005.png | Bin 0 -> 23088 bytes lab1/image006.png | Bin 0 -> 51963 bytes lab1/image007.png | Bin 0 -> 13513 bytes lab1/image008.png | Bin 0 -> 27879 bytes lab1/image009.png | Bin 0 -> 13993 bytes lab1/image010.png | Bin 0 -> 20842 bytes lab1/image011.png | Bin 0 -> 55970 bytes lab1/image012.png | Bin 0 -> 72749 bytes lab2.files/image001.png | Bin 0 -> 26448 bytes lab2.files/image002.png | Bin 0 -> 12994 bytes lab2.files/image003.png | Bin 0 -> 48307 bytes lab2.files/image004.png | Bin 0 -> 67544 bytes lab2.files/image005.png | Bin 0 -> 1155 bytes lab2.files/image006.png | Bin 0 -> 37896 bytes lab2.files/image007.png | Bin 0 -> 27244 bytes lab2.files/image008.png | Bin 0 -> 31949 bytes lab2.files/image009.png | Bin 0 -> 1155 bytes lab2.files/image010.png | Bin 0 -> 1155 bytes lab2.files/image011.png | Bin 0 -> 1155 bytes lab2.files/image012.png | Bin 0 -> 1155 bytes lab2.files/image013.png | Bin 0 -> 1155 bytes lab2.htm | 3931 ++++++++++++++++++++++++++++++++++++++ lab3.files/image001.png | Bin 0 -> 44760 bytes lab3.files/image002.png | Bin 0 -> 30671 bytes lab3.htm | 2046 ++++++++++++++++++++ lab4.htm | 2166 +++++++++++++++++++++ lab5.files/image001.png | Bin 0 -> 27351 bytes lab5.htm | 2331 +++++++++++++++++++++++ lab6.files/.DS_Store | Bin 0 -> 6148 bytes lab6.files/image001.png | Bin 0 -> 15833 bytes lab6.files/image002.png | Bin 0 -> 15385 bytes lab6.htm | 2220 +++++++++++++++++++++ lab7.files/image001.png | Bin 0 -> 47000 bytes lab7.htm | 1876 ++++++++++++++++++ lab8.files/image001.png | Bin 0 -> 113278 bytes lab8.files/image002.png | Bin 0 -> 107546 bytes lab8.files/image003.png | Bin 0 -> 8578 bytes lab8.files/image004.png | Bin 0 -> 36032 bytes lab8.htm | 3688 +++++++++++++++++++++++++++++++++++ 56 files changed, 22446 insertions(+) create mode 100644 lab0.md create mode 100644 lab0/.DS_Store create mode 100644 lab0/image001.png create mode 100644 lab0/image002.png create mode 100644 lab0/image003.png create mode 100644 lab0/image004.png create mode 100644 lab0/image005.png create mode 100644 lab0/image006.png create mode 100644 lab0/image007.png create mode 100644 lab0/image008.png create mode 100644 lab1.htm create mode 100644 lab1.md create mode 100644 lab1/.DS_Store create mode 100644 lab1/image001.png create mode 100644 lab1/image002.png create mode 100644 lab1/image003.png create mode 100644 lab1/image004.png create mode 100644 lab1/image005.png create mode 100644 lab1/image006.png create mode 100644 lab1/image007.png create mode 100644 lab1/image008.png create mode 100644 lab1/image009.png create mode 100644 lab1/image010.png create mode 100644 lab1/image011.png create mode 100644 lab1/image012.png create mode 100644 lab2.files/image001.png create mode 100644 lab2.files/image002.png create mode 100644 lab2.files/image003.png create mode 100644 lab2.files/image004.png create mode 100644 lab2.files/image005.png create mode 100644 lab2.files/image006.png create mode 100644 lab2.files/image007.png create mode 100644 lab2.files/image008.png create mode 100644 lab2.files/image009.png create mode 100644 lab2.files/image010.png create mode 100644 lab2.files/image011.png create mode 100644 lab2.files/image012.png create mode 100644 lab2.files/image013.png create mode 100644 lab2.htm create mode 100644 lab3.files/image001.png create mode 100644 lab3.files/image002.png create mode 100644 lab3.htm create mode 100644 lab4.htm create mode 100644 lab5.files/image001.png create mode 100644 lab5.htm create mode 100644 lab6.files/.DS_Store create mode 100644 lab6.files/image001.png create mode 100644 lab6.files/image002.png create mode 100644 lab6.htm create mode 100644 lab7.files/image001.png create mode 100644 lab7.htm create mode 100644 lab8.files/image001.png create mode 100644 lab8.files/image002.png create mode 100644 lab8.files/image003.png create mode 100644 lab8.files/image004.png create mode 100644 lab8.htm diff --git a/lab0.md b/lab0.md new file mode 100644 index 0000000..033128d --- /dev/null +++ b/lab0.md @@ -0,0 +1,163 @@ +# 实验零:操作系统实验准备 ## 1.实验目的: - 了解操作系统开发实验环境 - 熟悉命令行方式的编译、调试工程 - 掌握基于硬件模拟器的调试技术 - 熟悉C语言编程和指针的概念 - 了解X86汇编语言 ## 2.准备知识: ### 2.1了解OS实验 写一个操作系统难吗?别被现在上百万行的Linux和Windows操作系统吓倒。当年Thompson乘他老婆带着小孩度假留他一人在家时,写了UNIX;当年Linus还是一个21岁大学生时完成了Linux雏形。站在这些巨人的肩膀上,我们能否也尝试一下做“巨人”的滋味呢? MIT的Frans Kaashoek等在2006年参考PDP-11上的UNIX Version 6写了一个可在X86上跑的操作系统xv6(基于MIT License),用于学生学习操作系统。我们可以站在他们的肩膀上,基于xv6的设计,尝试着一步一步完成一个从“空空如也”到“五脏俱全”的“麻雀”操作系统—ucore,此“麻雀”包含虚存管理、进程管理、处理器调度、同步互斥、进程间通信、文件系统等主要内核功能,总的内核代码量(C+asm)不会超过5K行。充分体现了“小而全”的指导思想。 ucore的运行环境可以是真实的X86计算机,不过考虑到调试和开发的方便,我们可采用X86硬件模拟器,比如QEMU、BOCHS、VirtualBox、VMware Player等。ucore的开发环境主要是GCC中的gcc、gas、ld和MAKE等工具,也可采用集成了这些工具的IDE开发环境Eclipse-CDT等。在分析源代码上,可以采用Scitools提供的understand软件(跨平台),windows环境上的source insight软件,或者基于emacs+ctags,vim+ctags等,都可以比较方便在在一堆文件中查找变量、函数定义、调用/访问关系等。软件开发的版本管理可以采用GIT、SVN等。比较文件和目录的不同可发现不同实验中的差异性和进行文件合并操作,可使用meld、kdiff3、UltraCompare等软件。调试(deubg)实验有助于发现设计中的错误,可采用gdb(配合qemu)等调试工具软件。并可整个实验的运行环境和开发环境既可以在Linux或Windows中使用。推荐使用Linux环境。 那我们准备如何一步一步来实现ucore呢?根据一个操作系统的设计实现过程,我们可以有如下的实验步骤: + 1. 启动操作系统的bootloader,用于了解操作系统启动前的状态和要做的准备工作,了解运行操作系统的硬件支持,操作系统如何加载到内存中,理解两类中断--“外设中断”,“陷阱中断”等; 2. 物理内存管理子系统,用于理解x86分段/分页模式,了解操作系统如何管理物理内存; 3. 虚拟内存管理子系统,通过页表机制和换入换出(swap)机制,以及中断-“故障中断”、缺页故障处理等,实现基于页的内存替换算法; 4. 内核线程子系统,用于了解如何创建相对与用户进程更加简单的内核态线程,如果对内核线程进行动态管理等; 5. 用户进程管理子系统,用于了解用户态进程创建、执行、切换和结束的动态管理过程,了解在用户态通过系统调用得到内核态的内核服务的过程; 6. 处理器调度子系统,用于理解操作系统的调度过程和调度算法; 7. 同步互斥与进程间通信子系统,了解进程间如何进行信息交换和共享,并了解同步互斥的具体实现以及对系统性能的影响,研究死锁产生的原因,以及如何避免死锁; 8. 文件系统,了解文件系统的具体实现,与进程管理等的关系,了解缓存对操作系统IO访问的性能改进,了解虚拟文件系统(VFS)、buffer cache和disk driver之间的关系。 其中每个开发步骤都是建立在上一个步骤之上的,就像搭积木,从一个一个小木块,最终搭出来一个小房子。在搭房子的过程中,完成从理解操作系统原理到实践操作系统设计与实现的探索过程。这个房子最终的建筑架构和建设进度如下图所示: ![ucore系统结构图](./lab0/image001.png "ucore系统结构图") + 图1 ucore系统结构图 + 如果完成上诉实验后还想做更大的挑战,那么可以参加ucore的研发项目,我们可以完成ucore的网络协议栈,增加图形系统,在ARM嵌入式系统上运行,支持虚拟化功能等。这些项目已经有同学参与,欢迎有兴趣的同学加入! + ### 2.2 设置实验环境 我们参考了MIT的xv6、Harvard的OS161和Linux等设计了ucore OS实验,所有OS实验需在Linux下运行。对于经验不足的同学,推荐参考“通过虚拟机使用Linux实验环境”一节用虚拟机方式进行试验。 #### 2.2.1 开发OS实验的简单步骤 在校内OS FTP服务器上或在github网站(https://github.com/chyyuu/ucore_pub)可下载我们提供的lab1~lab8实验软件和文档中,大致经过如下过程就可以完成使用。 1. 下载&解压软件包 例如执行:tar jxf lab1.tar.bz2 2. 进入各个OS实验工程目录 例如: cd lab1 3. 根据实验要求阅读源码并修改代码(用各种代码分析工具和文本编辑器) 4. 并编译源码 例如执行:make 5. 如编译不过则返回步骤3 6. 如编译通过则测试是否基本正确,例如执行:make grade 7. 如果实现基本正确(即看到步骤6的输出存在不是 OK的情况)则返回步骤3 8. 如果实现基本正确(即看到步骤6的输出都是 OK)则生成实验提交软件包,例如执行:make handin 9. 把生成的使用提交软件包和实验报告上传/email给助教和老师。 另外,可以通过”make qemu”让OS实验工程在qemu上运行;可以通过”make debug”或“make debug-nox “命令实现通过gdb远程调试 OS实验工程。 #### 2.2.2 通过虚拟机使用Linux实验环境(推荐:最容易的实验环境安装方法) 这是最简单的一种通过虚拟机方式使用Linux并完成OS各个实验的方法,不需要安装Linux操作系统和各种实验所需开发软件。首先安装VirtualBox 虚拟机软件(有windows版本和其他OS版本,可到 http://www.virtualbox.org/wiki/Downloads 下载),然后在网上下载一个已经安装好各种所需编辑/开发/调试/运行软件的Linux实验环境的VirtualBox虚拟硬盘文件(oslabs_for_student_2012.zip,包含一个虚拟磁盘镜像文件和两个配置描述文件,下载此文件的网址址见https://github.com/chyyuu/ucore_lab下的README中的描述)。用2345好压软件(有windows版本,可到http://www.haozip.com 下载。一般软件解压不了xz格式的压缩文件)先解压到C盘的vms目录下即: + C:\vms\ubuntu-12.04.vbox.xz C:\vms\ubuntu-12.04.vmdk.vmdk.xz C:\vms\ubuntu-12.04.vmdk-flat.vmdk.xz 在分别用好压软件或其他能够解压xz压缩格式的软件进一步解压上诉三个文件,形成 + C:\vms\ubuntu-12.04.vbox C:\vms\ubuntu-12.04.vmdk.vmdk C:\vms\ubuntu-12.04.vmdk-flat.vmdk 解压后这三个文件所占用的硬盘空间为12GB左右。在VirtualBox中加载ubuntu-12.04.vbox,就可以启动并运行Linux实验环境了。 启动到提示输入用户名时,请输入 chy + 当提示输入口令时,只需简单敲一个空格键和回车键即可。然后就进入到开发环境中了。实验内容位于ucore_lab目录下。可以通过如下命令获得整个实验的代码和文档: + $ git clone https://github.com/chyyuu/ucore_lab.git 并可通过如下命令获得以后更新后的代码和文档: + $ git pull + 当然,你需要了解一下git的基本使用方法,这可以通过网络获得很多这方面的信息。 #### 2.2.3 安装使用Linux实验环境(适合希望自己安装Linux系统的同学) 这里我们主要以Ubuntu Linux 12.04(32 bit)作为整个实验的系统软件环境。首先我们需要安装Ubuntu Linux 12.04。 **WUBI方式安装(最容易的Linux安装方法)** + WUBI是一个专门针对Windows用户的UBUNTU Linux安装工具,你需要做的只是点击几下鼠标而已。不需要改变分区设置,不需要启动文件,不需要Live CD。WUBI让你如同Windows操作系统里的其他软件一样安装卸载Ubuntu,如果你从来没有安装过UBUNTU Linux,Wubi很适合你第一次安装UBUNTU Linux。具体方法如下: 1. 去OS course ftp或官方网站http://releases.ubuntu.com/12.04/ubuntu-12.04-desktop-i386.iso下载了一个ubuntu-12.04-desktop-i386的ISO文件。 2. 通过winrar等工具将下载来的ISO文件中的wubi.exe解压出来,放在任意一个分区的根目录下。这里推荐预留了一个至少大小为8G的NTFS分区,单击wubi.exe安装文件,这时会弹出对话框。 3. 设置好分区将要安装的分区,语言,分配的系统大小,用户名和密码(务必记住)之后,点击“安装”,这时如果你的机器已经联网了,会自动从镜像网站上下载ISO文件。这里采用绕过wubi下载镜像ISO的方法安装ubuntu 12.04,会节省大量时间。避免下载ISO文件的这一步非常关键。在进行这一步之前请将网线断开,然后将提前下载来的ubuntu-12.04-desktop-i386.iso文件拷贝至wubi所创建的ubuntu目录下的install文件夹中,重新运行wubi.exe。这次再也不会提示下载ISO文件了。几秒钟后,wubi就会提示你重新启动系统。注意,此时ubuntu并没有安装在硬盘上,必须重新启动才开始进行ubuntu 12.04的安装。 4. 点击”完成”按钮,选择重启计算机。计算机重启后,在启动选项中选择ubuntu,出现”press 'ESC' to … ” 时,不用理会,这时我们熟悉的ubuntu 滚动条出现在屏幕上。此时,才正式开始安装ubuntu 12.04至硬盘分区某一目录下。接下来我们什么也不用做,只需等待。当提示正式安装完成后,重新启动计算机系统,可以发现在启动选项中有"ubuntu"和“windows”。你可以根据你的情况进行选择。 **使用Linux** + 在实验过程中,我们需要了解基于命令行方式的编译、调试、运行操作系统的实验方法。为此,需要了解基本的Linux命令行使用。 ***命令模式的基本结构和概念*** + Ubuntu是图形界面友好和易操作的linux发行版,但有时只需执行几条简单的指令就可以完成繁琐的鼠标点击才能完成的操作。linux的命令行操作模式功能可以实现你需要的所有操作。简单的说,命令行就是基于字符命令的用户界面,也被称为文本操作模式。绝大多数情况下, 用户通过输入一行或多行命令直接与计算机互动,来实现对计算机的操作。 ***如何进入命令模式*** + 假设使用默认的图形界面为GNOME的任意版本Ubuntu Linux。点击GNOME菜单->附件->终端,就可以启动名为gnome-terminal程序,从而可以在此软件界面中进行命令行操作。 打开gnome-terminal程序后你首先可能会注意到类似下面的界面: chy@chyhome-PC:~$ ls file1.txt file2.txt file3.txt tools 你所看到的这些被称为命令终端提示符,它表示计算机已就绪,正在等待着用户输入操作指令。以我的屏幕画面为例,“chy"是当前所登录的用户名,“laptop”是这台计算机的主机名,“~”表示当前目录。此时输入任何指令按回车之后该指令将会提交到计算机运行,比如你可以输入命令:ls 再按下回车: ls [ENTER] *注意*:[ENTER]是指输入完ls后按下回车键,而不是叫你输入这个单词,ls这个命令将会列出你当前所在目录里的所有文件和子目录列表。 下面介绍bash shell程序的基本使用方法,它是ubuntu缺省的外壳程序。 ***常用指令*** (1) 查询文件列表:(ls) chy@chyhome-PC:~$ ls file1.txt file2.txt file3.txt tools ls命令默认状态下将按首字母升序列出你当前文件夹下面的所有内容,但这样直接运行所得到的信息也是比较少的,通常它可以结合以下这些参数运行以查询更多的信息: ls / # 将列出根目录'/'下的文件清单.如果给定一个参数,则命令行会把该参数当作命令行的工作目录。换句话说,命令行不再以当前目录为工作目录。 ls -l # 将给你列出一个更详细的文件清单. ls -a # 将列出包括隐藏文件(以.开头的文件)在内的所有文 件. ]ls -h # 将以KB/MB/GB的形式给出文件大小,而不是以纯粹的Bytes. (2) 查询当前所在目录:(pwd) chy@chyhome-PC:~$ pwd /home/chy (3) 进入其他目录:(cd) + chy@chyhome-PC:~$ pwd /home/chy chy@chyhome-PC:~$ cd /root/ chy@chyhome-PC:~$ pwd /root 上面例子中,当前目录原来是/home/chy,执行cd /root/之后再运行pwd可以发现,当前目录已经改为/root了。 (4) 在屏幕上输出字符: (echo) chy@chyhome-PC:~$ echo "Hello World" Hello World 这是一个很有用的命令,它可以在屏幕上输入你指定的参数(""号中的内容),当然这里举的这个例子中它没有多大的实际意义,但随着你对LINUX指令的不断深入,就会发现它的价值所在。 (5) 显示文件内容:cat chy@chyhome-PC:~$ cat file1.txt Roses are red. Violets are blue, and you have the bird-flue! 也可以使用less或more来显示比较大的文本文件内容。 (6) 复制文件: cp chy@chyhome-PC:~$ cp file1.txt file1_copy.txt chy@chyhome-PC:~$ cat file1_copy.txt Roses are red. Violets are blue, and you have the bird-flue! (7) 移动文件:mv chy@chyhome-PC:~$ ls file1.txt file2.txt chy@chyhome-PC:~$ mv file1.txt new_file.txt chy@chyhome-PC:~$ ls file2.txt new_file.txt *注意*:在命令操作时系统基本上不会给你什么提示,当然,绝大多数的命令可以通过加上一个参数-v来要求系统给出执行命令的反馈信息; chy@chyhome-PC:~$ mv -v file1.txt new_file.txt `file1.txt' -> `new_file.txt' (8) 建立一个空文本文件:touch chy@chyhome-PC:~$ ls file1.txt chy@chyhome-PC:~$ touch tempfile.txt chy@chyhome-PC:~$ ls file1.txt tempfile.txt (9) 建立一个目录:mkdir chy@chyhome-PC:~$ ls file1.txt tempfile.txt chy@chyhome-PC:~$ mkdir test_dir chy@chyhome-PC:~$ ls file1.txt tempfile.txt test_dir (10) 删除文件/目录:rm chy@chyhome-PC:~$ ls -p file1.txt tempfile.txt test_dir/ chy@chyhome-PC:~$ rm -i tempfile.txt rm: remove regular empty file `test.txt'? y chy@chyhome-PC:~$ ls -p file1.txt test_dir/ chy@chyhome-PC:~$ rm test_dir rm: cannot remove `test_dir': Is a directory chy@chyhome-PC:~$ rm -R test_dir chy@chyhome-PC:~$ ls -p file1.txt 在上面的操作:首先我们通过ls命令查询可知当前目下有两个文件和一个文件夹; [1] 你可以用参数 -p来让系统显示某一项的类型,比如是文件/文件夹/快捷链接等等; [2] 接下来我们用rm -i尝试删除文件,-i参数是让系统在执行删除操作前输出一条确认提示;i(interactive)也就是交互性的意思; [3] 当我们尝试用上面的命令去删除一个文件夹时会得到错误的提示,因为删除文件夹必须使用-R(recursive,循环)参数 特别提示:在使用命令操作时,系统假设你很明确自己在做什么,它不会给你太多的提示,比如你执行rm -Rf /,它将会删除你硬盘上所有的东西,并且不会给你任何提示,所以,尽量在使用命令时加上-i的参数,以让系统在执行前进行一次确认,防止你干一些蠢事。如 果你觉得每次都要输入-i太麻烦,你可以执行以下的命令,让-i成为默认参数: alias rm='rm -i' (11) 查询当前进程:ps chy@chyhome-PC:~$ ps PID TTY TIME CMD 21071 pts/1 00:00:00 bash 22378 pts/1 00:00:00 ps 这条命令会例出你所启动的所有进程; ps -a #可以例出系统当前运行的所有进程,包括由其他用户启动的进程; ps auxww #是一条相当人性化的命令,它会例出除一些很特殊进程以外的所有进程,并会以一个高可读的形式显示结果,每一个进程都会有较为详细的解释; 基本命令的介绍就到此为止,你可以访问网络得到更加详细的Linux命令介绍。 ***控制流程*** + (1) 输入/输出 input用来读取你通过键盘(或其他标准输入设备)输入的信息,output用于在屏幕(或其他标准输出设备)上输出你指定的输出内容.另外还有一些标准的出错提示也是通过这个命令来实现的。通常在遇到操作错误时,系统会自动调用这个命令来输出标准错误提示; 我们能重定向命令中产生的输入和输出流的位置。 (2) 重定向 如果你想把命令产生的输出流指向一个文件而不是(默认的)终端,你可以使用如下的语句: chy@chyhome-PC:~$ ls >file4.txt chy@chyhome-PC:~$ cat file4.txt file1.txt file2.txt file3.txt + 以上例子将创建文件file4.txt如果file4.txt不存在的话。注意:如果file4.txt已经存在,那么上面的命令将复盖文件的内容。如果你想将内容添加到已存在的文件内容的最后,那你可以用下面这个语句: command >> filename 示例: chy@chyhome-PC:~$ ls >> file4.txt chy@chyhome-PC:~$ cat file4.txt file1.txt file2.txt file3.txt file1.txt file2.txt file3.txt file4.txt 在这个例子中,你会发现原有的文件中添加了新的内容。接下来我们会见到另一种重定向方式:我们将把一个文件的内容作为将要执行的命令的输入。以下是这个语句: command < filename 示例: chy@chyhome-PC:~$ cat > file5.txt a3.txt a2.txt file2.txt file1.txt # 这表示敲入Ctrl+D键 chy@chyhome-PC:~$ sort < file5.txt a2.txt a3.txt file1.txt file2.txt (3) 管道 Linux的强大之处在于它能把几个简单的命令联合成为复杂的功能,通过键盘上的管道符号'|' 完成。现在,我们来排序上面的"grep"命令: grep -i command < myfile | sort > result.text 搜索 myfile 中的命令,将输出分类并写入分类文件到 result.text 。 有时候用ls列出很多命令的时候很不方便 这时“|”就充分利用到了 ls -l | less 慢慢看吧. (4) 后台进程 CLI 不是系统的串行接口。您可以在执行其他命令时给出系统命令。要启动一个进程到后台,追加一个“&”到命令后面。 sleep 60 & ls 睡眠命令在后台运行,您依然可以与计算机交互。除了不同步启动命令以外,最好把 '&' 理解成 ';'。 如果您有一个命令将占用很多时间,您想把它放入后台运行,也很简单。只要在命令运行时按下ctrl-z,它就会停止。然后键入 bg使其转入后台。fg 命令可使其转回前台。 sleep 60 # 这表示敲入Ctrl+Z键 bg fg 最后,您可以使用 ctrl-c 来杀死一个前台进程。 ***环境变量*** 特殊变量。PATH, PS1, ... (1) 不显示中文 可通过执行如下命令避免显示乱码中文。在一个shell中,执行: export LANG=”” 这样在这个shell中,output信息缺省时英文。 ***获得软件包*** (1) 命令行获取软件包 Ubuntu 下可以使用 apt-get 命令,apt-get 是一条 Linux 命令行命令,适用于 deb 包管理式的操作系统,主要用于自动从互联网软件库中搜索、安装、升级以及卸载软件或者操作系统。一般需要 root 执行权限,所以一般跟随 sudo 命令,如: sudo apt-get install gcc [ENTER] 常见的以及常用的 apt 命令有: + apt-get install 下载 以及所依赖的软件包,同时进行软件包的安装或者升级。 apt-get remove 移除 以及所有依赖的软件包。 apt-cache search 搜索满足 的软件包。 apt-cache show/showpkg 显示软件包 的完整描述。 + 例如: chy@chyhome-PC:~$apt-cache gcc gcc-4.6 - The GNU C compiler gcc-4.6-base - The GNU Compiler Collection (base package) gcc-4.6-doc - Documentation for the GNU compilers (gcc, gobjc, g++) gcc-4.6-multilib - The GNU C compiler (multilib files) gcc-4.6-source - Source of the GNU Compiler Collection gcc-4.6-locales - The GNU C compiler (native language support files) chy@chyhome-PC:~$ + (2) 图形界面软件包获取 + 新立得软件包管理器,是 Ubuntu 下面管理软件包得图形界面程序,相当于命令行中得 apt 命令。进入方法可以是 菜单栏 > 系统管理 > 新立得软件包管理器 + (System > Administration > Synaptic Package Manager) 使用更新管理器可以通过标记选择适当的软件包进行更新操作。 (3) 配置升级源 Ubuntu的软件包获取依赖升级源,可以通过修改 “/etc/apt/sources.list” 文件来修改升级源(需要 root 权限);或者修改新立得软件包管理器中 “设置 > 软件库”。 ***查找帮助文件*** + Ubuntu 下提供 man 命令以完成帮助手册得查询。man 是 manual 的缩写,通过 man 命令可以对 Linux 下常用命令、安装软件、以及C语言常用函数等进行查询,获得相关帮助。 例如: cchy@chyhome-PC:~$man printf PRINTF(1) BSD General Commands Manual PRINTF(1) NAME printf -- formatted output SYNOPSIS printf format [arguments ...] DESCRIPTION The printf utility formats and prints its arguments, after the first, under control of the format. The format is a character string which contains three types of objects: plain characters, which are simply copied to standard output, character escape sequences which are converted and copied to the standard output, and format specifications, each of which causes ... ... The characters and their meanings are as follows: \e Write an character. \a Write a character. ... 通常可能会用到的帮助文件例如: gcc-doc cpp-doc glibc-doc 上述帮助文件可以通过 apt-get 命令或者软件包管理器获得。获得以后可以通过 man 命令进行命令或者参数查询。 ##### 2.2.3.1 实验中可能使用的软件 ***编辑器*** (1) Ubuntu 下自带的编辑器可以作为代码编辑的工具。例如 gedit 是 gnome 桌面环境下兼容UTF-8的文本编辑器。它十分的简单易用,有良好的语法高亮,对中文支持很好。通常可以通过双击或者命令行打开目标文件进行编辑。 (2) Vim 编辑器:Vim是一款极方便的文本编辑软件,是UNIX下的同类型软件VI的改进版本。Vim经常被看作是“专门为程序员打造的文本编辑器”,功能强大且方便使用,便于进行程序开发。 Ubuntu 下默认安装的 vi 版本较低,功能较弱,建议在系统内安装或者升级到最新版本的 Vim。 [1]关于Vim的常用命令以及使用,可以通过网络进行查找。 [2]配置文件:Vim 的使用需要配置文件进行设置,例如: set nocompatible + set encoding=utf-8 + set fileencodings=utf-8,chinese + set tabstop=4 + set cindent shiftwidth=4 + set backspace=indent,eol,start + autocmd Filetype c set omnifunc=ccomplete#Complete + autocmd Filetype cpp set omnifunc=cppcomplete#Complete + set incsearch + set number + set display=lastline + set ignorecase + syntax on + set nobackup + set ruler + set showcmd + set smartindent + set hlsearch + set cmdheight=1 + set laststatus=2 + set shortmess=atI + set formatoptions=tcrqn + set autoindent + +可以将上述配置文件保存到: ~/.vimrc 注意:.vimrc 默认情况下隐藏不可见,可以在命令行中通过 “ls -a” 命令进行查看。如果 '~' 目录下不存在该文件,可以手动创建。修改该文件以后,重启 Vim 可以使配置生效。 ***exuberant-ctags*** + exuberant-ctags 可以为程序语言对象生成索引,其结果能够被一个文本编辑器或者其他工具简捷迅速的定位。支持的编辑器有 Vim、Emacs 等。 实验中,可以使用命令: ctags -h=.h.c.S -R + 默认的生成文件为 tags (可以通过 -f 来指定),在相同路径下使用 Vim 可以使用改索引文件,例如: 使用 “ctrl + ]” 可以跳转到相应的声明或者定义处,使用 “ctrl + t” 返回(查询堆栈)等。 提示:习惯GUI方式的同学,可采用图形界面的understand、source insight等软件。 + ***diff & patch*** diff 为 Linux 命令,用于比较文本或者文件夹差异,可以通过 man 来查询其功能以及参数的使用。使用 patch 命令可以对文件或者文件夹应用修改。 例如实验中可能会在 projb 中应用前一个实验proja 中对文件进行的修改,可以使用如下命令: diff -r -u -P proja_original proja_mine > diff.patch cd projb patch -p1 -u < ../diff.patch 注意:proja_original 指 proja 的源文件,即未经修改的源码包,proja_mine 是修改后的代码包。第一条命令是递归的比较文件夹差异,并将结果重定向输出到 diff.patch 文件中;第三条命令是将 proja 的修改应用到 projb 文件夹中的代码中。 提示:习惯GUI方式的同学,可采用图形界面的meld、kdiff3、UltraCompare等软件。 ### 2.3 了解编程开发调试的基本工具 在Ubuntu Linux中的C语言编程主要基于GNU C的语法,通过gcc来编译并生成最终执行文件。GNU汇编(assembler)采用的是AT&T汇编格式,Microsoft 汇编采用Intel格式。 #### 2.3.1 gcc的基本用法 如果你还没装gcc编译环境或自己不确定装没装,不妨先执行 : sudo apt-get install build-essential + ###### 2.3.1.1 编译简单的 C 程序 C 语言经典的入门例子是 Hello World,下面是一示例代码: #include int main(void) { printf("Hello, world!\n"); return 0; } 我们假定该代码存为文件‘hello.c’。要用 gcc 编译该文件,使用下面的命令: $ gcc -Wall hello.c -o hello 该命令将文件‘hello.c’中的代码编译为机器码并存储在可执行文件 ‘hello’中。机器码的文件名是通过 -o 选项指定的。该选项通常作为命令行中的最后一个参数。如果被省略,输出文件默认为 ‘a.out’。 注意到如果当前目录中与可执行文件重名的文件已经存在,它将被复盖。 选项 -Wall 开启编译器几乎所有常用的警告──**强烈建议你始终使用该选项**。编译器有很多其他的警告选项,但 -Wall 是最常用的。默认情况下GCC 不会产生任何警告信息。当编写 C 或 C++ 程序时编译器警告非常有助于检测程序存在的问题。 本例中,编译器使用了 -Wall 选项而没产生任何警告,因为示例程序是完全合法的。 要运行该程序,输入可执行文件的路径如下: $ ./hello Hello, world! 这将可执行文件载入内存,并使 CPU 开始执行其包含的指令。 路径 ./ 指代当前目录,因此 ./hello 载入并执行当前目录下的可执行文件 ‘hello’。 ##### 2.3.1.2 AT&T汇编基本语法 Ucore中用到的是AT&T格式的汇编,与Intel格式的汇编有一些不同。二者语法上主要有以下几个不同: * 寄存器命名原则 AT&T: %eax Intel: eax * 源/目的操作数顺序 AT&T: movl %eax, %ebx Intel: mov ebx, eax * 常数/立即数的格式  AT&T: movl $_value, %ebx Intel: mov eax, _value 把value的地址放入eax寄存器 AT&T: movl $0xd00d, %ebx Intel: mov ebx, 0xd00d * 操作数长度标识 AT&T: movw %ax, %bx Intel: mov bx, ax * 寻址方式 AT&T: immed32(basepointer, indexpointer, indexscale) Intel: [basepointer + indexpointer × indexscale + imm32) + 如果操作系统工作于保护模式下,用的是32位线性地址,所以在计算地址时不用考虑segment:offset的问题。上式中的地址应为: imm32 + basepointer + indexpointer × indexscale 下面是一些例子: + * 直接寻址 AT&T: _boo ; _boo是一个全局的C变量。注意加上$是表示地址引用,不加是表示值引用。对于局部变量,可以通过堆栈指针引用。 + Intel: [_boo] * 寄存器间接寻址 AT&T: (%eax) Intel: [eax] * 变址寻址 AT&T: _variable(%eax) Intel: [eax + _variable] AT&T: _array( ,%eax, 4) Intel: [eax × 4 + _array] AT&T: _array(%ebx, %eax,8) Intel: [ebx + eax × 8 + _array] ##### 2.3.1.3 GCC内联汇编 基本的GCC内联汇编很简单,一般是按照下面的格式: + asm("statements"); 例如: asm("nop"); asm("cli"); "asm" 和 "\_\_asm\_\_" 的含义是完全一样的。如果有多行汇编,则每一行都要加上 "\n\t"。其中的 “\n” 是换行符,"\t” 是 tab 符,在每条命令的 结束加这两个符号,是为了让 gcc 把内联汇编代码翻译成一般的汇编代码时能够保证换行和留有一定的空格。例如: + asm( "pushl %eax\n\t" "movl $0,%eax\n\t" "popl %eax" ); + 实际上gcc在处理汇编时,是要把asm(...)的内容"打印"到汇编文件中,所以格式控制字符是必要的。再例如: + asm("movl %eax, %ebx"); asm("xorl %ebx, %edx"); asm("movl $0, _boo); 在上面的例子中,由于我们在内联汇编中改变了 edx 和 ebx 的值,但是由于 gcc 的特殊的处理方法,即先形成汇编文件,再交给 GAS 去汇编,所以 GAS 并不知道我们已经改变了 edx和 ebx 的值,如果程序的上下文需要 edx 或 ebx 作暂存,这样就会引起严重的后果。对于变量 _boo也存在一样的问题。为了解决这个问题,就要用到扩展 GCC 内联汇编语法。 ##### 2.3.1.4 扩展GCC内联汇编 使用扩展GCC内联汇编的例子如下: #define read_cr0() ({ \ unsigned int __dummy; \ __asm__( \ "movl %%cr0,%0\n\t" \ :"=r" (__dummy)); \ __dummy; \ }) 它代表什么含义呢?这需要从其基本格式讲起。扩展GCC内联汇编的基本格式是: __asm__ __volatile__ ("" : output : input : modify); 其中,\_\_asm\_\_ 表示汇编代码的开始,其后可以跟 \_\_volatile\_\_(这是可选项),其含义是避免 “asm” 指令被删除、移动或组合,在执行代码时,如果不希望汇编语句被 gcc 优化而改变位置,就需要在 asm 符号后添加 volatile 关键词:asm volatile(...);或者更详细地说明为:\_\_asm\_\_ \_\_volatile\_\_(...);然后就是小括弧,括弧中的内容是具体的内联汇编指令代码。 "" 为汇编指令部分,例如,"movl %%cr0,%0\n\t"。数字前加前缀 “%“,如%1,%2等表示使用寄存器的样板操作数。可以使用的操作数总数取决于具体CPU中通用寄存器的数 量,如Intel可以有8个。指令中有几个操作数,就说明有几个变量需要与寄存器结合,由gcc在编译时根据后面输出部分和输入部分的约束条件进行相应的 处理。由于这些样板操作数的前缀使用了”%“,因此,在用到具体的寄存器时就在前面加两个“%”,如%%cr0。输出部分(output),用以规定对输出变量(目标操作数)如何与寄存器结合的约束(constraint),输出部分可以有多个约束,互相以逗号分开。每个约束以“=”开头,接着用一个字母来表示操作数的类型,然后是关于变量结合的约束。例如,上例中: :"=r" (__dummy) “=r”表示相应的目标操作数(指令部分的%0)可以使用任何一个通用寄存器,并且变量__dummy 存放在这个寄存器中,但如果是: :“=m”(__dummy) + “=m”就表示相应的目标操作数是存放在内存单元__dummy中。表示约束条件的字母很多,下表给出几个主要的约束字母及其含义: + + + + + + + + + + + +
字母含义
m, v, o内存单元
R任何通用寄存器
Q寄存器eax, ebx, ecx,edx之一
I, h直接操作数
E, F浮点数
G任意
a, b, c, d寄存器eax/ax/al, ebx/bx/bl, ecx/cx/cl或edx/dx/dl
S, D寄存器esi或edi
I常数(0~31)
输入部分(Input):输入部分与输出部分相似,但没有“=”。如果输入部分一个操作数所要求使用的寄存器,与前面输出部分某个约束所要求的是同一个寄存器,那就把对应操作数的编号(如“1”,“2”等)放在约束条件中,在后面的例子中,我们会看到这种情况。修改部分(modify):这部分常常以“memory”为约束条件,以表示操作完成后内存中的内容已有改变,如果原来某个寄存器的内容来自内存,那么现在内存中这个单元的内容已经改变。 注意,指令部分为必选项,而输入部分、输出部分及修改部分为可选项,当输入部分存在,而输出部分不存在时,分号“:“要保留,当“memory”存在时,三个分号都要保留,例如 + #define __cli() __asm__ __volatile__("cli": : :"memory") + 下面是一个例子(为方便起见,我使用全局变量): + int count=1; + int value=1; + int buf[10]; + void main() + { + asm( + "cld nt" + "rep nt" + "stosl" + : + : "c" (count), "a" (value) , "D" (buf[0]) + : "%ecx","%edi" + ); + } + +得到的主要汇编代码为: + + movl count,%ecx + movl value,%eax + movl buf,%edi + #APP + cld + rep + stosl + #NO_APP + +cld,rep,stos就不用多解释了。这几条语句的功能是向buf中写上count个value值。冒号后的语句指明输入,输出和被改变的寄存器。通过冒号以后的语句,编译器就知道你的指令需要和改变哪些寄存器,从而可以优化寄存器的分配。其中符号"c"(count)指示要把count的值放入ecx寄存器。类似的还有: + + a eax b ebx c ecx d edx S esi D edi I 常数值,(0 - 31) q,r 动态分配的寄存器 g eax,ebx,ecx,edx或内存变量 A 把eax和edx合成一个64位的寄存器(use long longs) 我们也可以让gcc自己选择合适的寄存器。如下面的例子: asm("leal (%1,%1,4),%0" : "=r" (x) : "0" (x) ); 这段代码实现5 × x的快速乘法。得到的主要汇编代码为: movl x,%eax #APP leal (%eax,%eax,4),%eax #NO_APP movl %eax,x 几点说明: + [1] 使用q指示编译器从eax, ebx, ecx, edx分配寄存器。 使用r指示编译器从eax, ebx, ecx, edx, esi, edi分配寄存器。 [2] 我们不必把编译器分配的寄存器放入改变的寄存器列表,因为寄存器已经记住了它们。 [3] "="是标示输出寄存器,必须这样用。 [4] 数字%n的用法:数字表示的寄存器是按照出现和从左到右的顺序映射到用"r"或"q"请求的寄存器.如果我们要重用"r"或"q"请求的寄存器的话,就可以使用它们。 [5] 如果强制使用固定的寄存器的话,如不用%1,而用ebx,则: asm("leal (%%ebx,%%ebx,4),%0" : "=r" (x) : "0" (x) ); 注意要使用两个%,因为一个%的语法已经被%n用掉了。 #### 2.3.2 make和Makefile GNU make(简称make)是一种代码维护工具,在大中型项目中,它将根据程序各个模块的更新情况,自动的维护和生成目标代码。 make命令执行时,需要一个 makefile (或Makefile)文件,以告诉make命令需要怎么样的去编译和链接程序。首先,我们用一个示例来说明makefile的书写规则。以便给大家一个感兴认识。这个示例来源于gnu的make使用手册,在这个示例中,我们的工程有8个c文件,和3个头文件,我们要写一个makefile来告诉make命令如何编译和链接这几个文件。我们的规则是: - 如果这个工程没有编译过,那么我们的所有c文件都要编译并被链接。 - 如果这个工程的某几个c文件被修改,那么我们只编译被修改的c文件,并链接目标程序。 - 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的c文件,并链接目标程序。 只要我们的makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。 ##### 2.3.2.1.1 makefile的规则 在讲述这个makefile之前,还是让我们先来粗略地看一看makefile的规则。 target ... : prerequisites ... command ... ... target也就是一个目标文件,可以是object file,也可以是执行文件。还可以是一个标签(label)。prerequisites就是,要生成那个target所需要的文件或是目标。command也就是make需要执行的命令(任意的shell命令)。 这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在 command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是makefile的规则。也就是makefile中最核心的内容。 #### 2.3.3 gdb使用 gdb 是功能强大的调试程序,可完成如下的调试任务: + - 设置断点 - 监视程序变量的值 - 程序的单步(step in/step over)执行 - 显示/修改变量的值 - 显示/修改寄存器 - 查看程序的堆栈情况 - 远程调试 - 调试线程 在可以使用 gdb 调试程序之前,必须使用 -g 或 –ggdb编译选项编译源文件。运行 gdb 调试程序时通常使用如下的命令: gdb progname 在 gdb 提示符处键入help,将列出命令的分类,主要的分类有: - aliases:命令别名 - breakpoints:断点定义; - data:数据查看; - files:指定并查看文件; - internals:维护命令; - running:程序执行; - stack:调用栈查看; - status:状态查看; - tracepoints:跟踪程序执行。 键入 help 后跟命令的分类名,可获得该类命令的详细清单。gdb的常用命令如下表所示。 表 gdb 的常用命令 + + + + + + + + + + + + + + + + + + +
break FILENAME:NUM在特定源文件特定行上设置断点
clear FILENAME:NUM删除设置在特定源文件特定行上的断点
run运行调试程序
step单步执行调试程序,不会直接执行函数
next单步执行调试程序,会直接执行函数
backtrace显示所有的调用栈帧。该命令可用来显示函数的调用顺序
where continue继续执行正在调试的程序
display EXPR每次程序停止后显示表达式的值,表达式由程序定义的变量组成
file FILENAME装载指定的可执行文件进行调试
help CMDNAME显示指定调试命令的帮助信息
info break显示当前断点列表,包括到达断点处的次数等
info files显示被调试文件的详细信息
info func显示被调试程序的所有函数名称
info prog显示被调试程序的执行状态
info local显示被调试程序当前函数中的局部变量信息
info var显示被调试程序的所有全局和静态变量名称
kill终止正在被调试的程序
list显示被调试程序的源代码
quit退出 gdb
+ 下面以一个有错误的例子程序来介绍gdb的使用: + /*bugging.c*/ #include #include static char buff [256]; static char* string; int main () { printf ("Please input a string: "); gets (string); printf ("\nYour string is: %s\n", string); } 上面这个程序非常简单,其目的是接受用户的输入,然后将用户的输入打印出来。该程序使用了一个未经过初始化的字符串地址 string,因此,编译并运行之后,将出现 Segment Fault 错误: $ gcc -o bugging -g bugging.c $ ./bugging Please input a string: asdf Segmentation fault (core dumped) 为了查找该程序中出现的问题,我们利用 gdb,并按如下的步骤进行: [1] 运行 “gdb bugging” ,加载 bugging 可执行文件; $gdb bugging [2] 执行装入的 bugging 命令; (gdb) run [3] 使用 where 命令查看程序出错的地方; (gdb) where [4] 利用 list 命令查看调用 gets 函数附近的代码; (gdb) list [5] 在 gdb 中,我们在第 11 行处设置断点,看看是否是在第11行出错; (gdb) break 11 [6] 程序重新运行到第 11 行处停止,这时程序正常,然后执行单步命令next; (gdb) next [7] 程序确实出错,能够导致 gets 函数出错的因素就是变量 string。重新执行测试程,用 print 命令查看 string 的值; (gdb) run (gdb) print string (gdb) $1=0x0 [8] 问题在于string指向的是一个无效指针,修改程序,在10行和11行之间增加一条语句 “string=buff; ”,重新编译程序,然后继续运行,将看到正确的程序运行结果。 用gdb查看源代码可以用list命令,但是这个不够灵活。可以使用"layout src"命令,或者按Ctrl-X再按A,就会出现一个窗口可以查看源代码。也可以用使用-tui参数,这样进入gdb里面后就能直接打开代码查看窗口。其他代码窗口相关命令: + + + + + + + + + + + + + + + + +
info win显示窗口的大小
layout next切换到下一个布局模式
layout prev切换到上一个布局模式
layout src只显示源代码
layout asm只显示汇编代码
layout split显示源代码和汇编代码
layout regs增加寄存器内容显示
focus cmd/src/asm/regs/next/prev切换当前窗口
refresh刷新所有窗口
tui reg next显示下一组寄存器
tui reg system显示系统寄存器
update更新源代码窗口和当前执行点
winheight name +/- line调整name窗口的高度
tabset nchar设置tab为nchar个字符
+ +##### 2.3.4进一步的相关内容 请同学网上搜寻相关资料学习: gcc tools相关文档 版本管理软件(CVS、SVN、GIT等)的使用 … + ### 2.4基于硬件模拟器实现源码级调试 #### 2.4.1 安装硬件模拟器QEMU ##### 2.4.1.1Linux运行环境 QEMU用于模拟一台x86计算机,让ucore能够运行在QEMU上。为了能够正确的编译和安装 qemu,尽量使用最新版本的qemu(http://wiki.qemu.org/Download),或者os ftp服务器上提供的qemu源码:qemu-1.1.0.tar.gz)。目前 qemu 能够支持最新的 gcc-4.x 编译器。例如:在 Ubuntu 12.04 系统中,默认得版本是 gcc-4.6.x (可以通过 gcc -v 或者 gcc --version 进行查看)。 可直接使用ubuntu中提供的qemu,只需执行如下命令即可。 sudo apt-get install qemu-system 也可采用下面描述的方法对qemu进行源码级安装。 ##### 2.4.1.2 Linux环境下的源码级安装过程 ###### 2.4.1.2.1获得并应用修改 编译qemu还会用到的库文件有 libsdl1.2-dev 等。安装命令如下: sudo apt-get install libsdl1.2-dev # 安装库文件 libsdl1.2-dev 获得 qemu 的安装包以后,对其进行解压缩(如果格式无法识别,请下载相应的解压缩软件)。 例如 qemu.tar.gz/qemu.tar.bz2 文件,在命令行中可以使用: tar zxvf qemu.tar.gz 或者 + + tar jxvf qemu.tar.bz2 对 qemu 应用修改:如果实验中使用的 qemu 需要打patch,应用过程如下所示: chy@chyhome-PC:~$ls qemu.patch qemu chy@chyhome-PC:~$cd qemu chy@chyhome-PC:~$patch -p1 -u < ../qemu.patch ###### 2.4.1.2.2 配置、编译和安装 编译以及安装 qemu 前需要使用 (表示qemu解压缩路径)下面的 configure 脚本生成相应的配置文件等。而 configure 脚本有较多的参数可供选择,可以通过如下命令进行查看: + configure --help 实验中可能会用到的命令例如: configure --target-list="i386-softmmu" # 配置qemu,可模拟X86-32硬件环境 make # 编译qemu sudo make install # 安装qemu 注意:版本小于0.10.0的qemu 仅支持 gcc-3.x 版本编译器。但0.10.x以上版本的qemu已经支持用gcc-4.x编译器了。 qemu执行程序将缺省安装到 /usr/local/bin 目录下。 如果使用的是默认的安装路径,那么在 “/usr/local/bin” 下面即可看到安装结果: qemu-system-i386 qemu-img qemu-nbd …… 建立符号链接文件qemu sudo ln –s /usr/local/bin/qemu-system-i386 /usr/local/bin/qemu #### 2.4.2 使用硬件模拟器QEMU ##### 2.4.2.1运行参数 如果 qemu 使用的是默认 /usr/local/bin 安装路径,则在命令行中可以直接使用 qemu 命令运行程序。qemu 运行可以有多参数,格式如: qemu [options] [disk_image] 其中 disk_image 即硬盘镜像文件。 部分参数说明: + `-hda file' `-hdb file' `-hdc file' `-hdd file' 使用 file 作为硬盘0、1、2、3镜像。 `-fda file' `-fdb file' 使用 file 作为软盘镜像,可以使用 /dev/fd0 作为 file 来使用主机软盘。 `-cdrom file' 使用 file 作为光盘镜像,可以使用 /dev/cdrom 作为 file 来使用主机 cd-rom。 `-boot [a|c|d]' 从软盘(a)、光盘(c)、硬盘启动(d),默认硬盘启动。 `-snapshot' 写入临时文件而不写回磁盘镜像,可以使用 C-a s 来强制写回。 `-m megs' 设置虚拟内存为 msg M字节,默认为 128M 字节。 `-smp n' 设置为有 n 个 CPU 的 SMP 系统。以 PC 为目标机,最多支持 255 个 CPU。 `-nographic' 禁止使用图形输出。 其他: 可用的主机设备 dev 例如: vc 虚拟终端。 null 空设备 /dev/XXX 使用主机的 tty。 file: filename 将输出写入到文件 filename 中。 stdio 标准输入/输出。 pipe:pipename 命令管道 pipename。 等。 使用 dev 设备的命令如: `-serial dev' 重定向虚拟串口到主机设备 dev 中。 `-parallel dev' 重定向虚拟并口到主机设备 dev 中。 `-monitor dev' 重定向 monitor 到主机设备 dev 中。 其他参数: `-s' 等待 gdb 连接到端口 1234。 `-p port' 改变 gdb 连接端口到 port。 `-S' 在启动时不启动 CPU, 需要在 monitor 中输入 'c',才能让qemu继续模拟工作。 `-d' 输出日志到 qemu.log 文件。 其他参数说明可以参考:http://bellard.org/qemu/qemu-doc.html#SEC15 。其他qemu的安装和使用的说明可以参考http://bellard.org/qemu/user-doc.html。 或者在命令行收入 qemu (没有参数) 显示帮助。 在实验中,例如 lab1,可能用到的命令如: qemu -hda ucore.img -parallel stdio # 让ucore在qemu模拟的x86硬件环境中执行 或 qemu -S -s -hda ucore.img -monitor stdio # 用于与gdb配合进行源码调试 + ##### 2.4.2.2 常用调试命令 qemu 中monitor的常用命令:
help查看 qemu 帮助,显示所有支持的命令。
q|quit|exit退出 qemu。
stop停止 qemu。
c|cont|continue连续执行。
x /fmt addr
xp /fmt addr
显示内存内容,其中 'x' 为虚地址,'xp' 为实地址。
参数 /fmt i 表示反汇编,缺省参数为前一次参数。
p|print'计算表达式值并显示,例如 $reg 表示寄存器结果。
memsave addr size file
pmemsave addr size file
将内存保存到文件,memsave 为虚地址,pmemsave 为实地址。
breakpoint 相关:设置、查看以及删除 breakpoint,pc执行到 breakpoint,qemu 停止。(暂时没有此功能)
watchpoint 相关:设置、查看以及删除 watchpoint, 当 watchpoint 地址内容被修改,停止。(暂时没有此功能)
s|step单步一条指令,能够跳过断点执行。
r|registers显示全部寄存器内容。
info 相关操作查询 qemu 支持的关于系统状态信息的操作。
其他具体的命令格式以及说明,参见 qemu help 命令帮助。 注意:qemu 默认有 ‘singlestep arg’ 命令(arg 为 参数),该命令为设置单步标志命令。例如:'singlestep off' 运行结果为禁止单步,'singlestep on' 结果为允许单步。在允许单步条件下,使用 cont 命令进行单步操作。如: (qemu) xp /3i $pc 0xfffffff0: ljmp $0xf000, $0xe05b 0xfffffff5: xor %bh, (%bx, %si) 0xfffffff7: das (qemu) singlestep on (qemu) cont 0x000fe05b: xor %ax, %ax step命令为单步命令,即qemu执行一步,能够跳过 breakpoint 断点执行。如果此时使用cont命令,则qemu 运行改为连续执行。 log命令能够保存qemu模拟过程产生的信息(与qemu运行参数 `-d' 相同),具体参数可以参考命令帮助。产生的日志信息保存在 “/tmp/qemu.log” 中,例如使用 'log in_asm'命令以后,运行过程产生的的qemu.log 文件为: 1 ---------------- 2 IN: 3 0xfffffff0: ljmp $0xf000,$0xe05b 4 5 ---------------- 6 IN: 7 0x000fe05b: xor %ax,%ax 8 0x000fe05d: out %al,$0xd 9 0x000fe05f: out %al,$0xda 10 0x000fe061: mov $0xc0,%al 11 0x000fe063: out %al,$0xd6 12 0x000fe065: mov $0x0,%al 13 0x000fe067: out %al,$0xd4 #### 2.4.3 基于qemu内建模式调试ucore 调试举例:调试 lab1,跟踪bootmain函数: (1) 运行 qemu -S -hda ucore.img -monitor stdio (2) 查看 bootblock.asm 得到 bootmain 函数地址为 0x7d60,并插入断点。 (3) 使用命令 c 连续执行到断点。 (4) 使用 xp 命令进行反汇编。 (5) 使用 s 命令进行单步执行。 + 运行结果如下: chy@laptop: ~/lab1$ qemu -S -hda ucore.img -monitor stdio (qemu) b 0x7d60 insert breakpoint 0x7d60 success! (qemu) c working … (qemu) break: 0x00007d60: push %ebp (qemu) xp /10i $pc 0x00007d60: push %ebp 0x00007d61: mov %esp,%ebp 0x00007d63: push %esi 0x00007d64: push %ebx 0x00007d65: sub $0x4,%esp 0x00007d68: mov 0x7da8,%esi 0x00007d6e: mov $0x0,%ebx 0x00007d73: movsbl (%esi,%ebx,1),%eax 0x00007d77: mov %eax,(%esp,1) 0x00007d7a: call 0x7c6c (qemu) step 0x00007d61: mov %esp,%ebp (qemu) step 0x00007d63: push %esi #### 2.4.4 结合gdb和qemu源码级调试 ucore ##### 2.4.4.1 编译可调试的目标文件 为了使得编译出来的代码是能够被gdb这样的调试器调试,我们需要在使用gcc编译源文件的时候添加参数:-g –gdb 。这样编译出来的目标文件中才会包含可以用于调试器进行调试的相关符号信息。 ##### 2.4.4.2 ucore 代码编译 (1) 编译过程:在解压缩后的 ucore 源码包中使用 make 命令即可。例如 lab1中: chy@laptop: ~/lab1$ make 生成目标文件为 ucore.img。 (2) 保存修改: 使用 diff 命令对修改后的 ucore 代码和 ucore 源码进行比较,比较之前建议使用 make clean 命令清除不必要文件。(如果有ctags 文件,需要手工清除。) (3)应用修改:参见 patch 命令说明。 ##### 2.4.4.3 使用远程调试 为了与qemu配合进行源代码级别的调试,需要先让qemu进入等待gdb调试器的接入并且还不能让qemu中的CPU执行,因此启动qemu的时候,我们需要使用参数-S –s这两个参数来做到这一点。在使用了前面提到的参数启动qemu之后,qemu中的CPU并不会马上开始执行,这时我们启动gdb,然后在gdb命令行界面下,使用下面的命令连接到qemu: (gdb) target remote 127.0.0.1:1234 然后输入c(也就是continue)命令之后,qemu会继续执行下去,但是gdb由于不知道任何符号信息,并且也没有下断点,是不能进行源码级的调试的。为了让gdb获知符号信息,需要指定调试目标文件,gdb中使用file命令: (gdb) file obj/kernel/kernel.elf 之后gdb就会载入这个文件中的符号信息了。 通过gdb可以对ucore代码进行调试,以lab1中调试memset函数为例: (1) 运行 qemu -S -s -hda ucore.img -monitor stdio (2) 运行 gdb并与qemu进行连接 (3) 设置断点并执行 (4) qemu 单步调试。 运行过程以及结果如下: + + +
窗口一窗口二
+chy@laptop: ~/lab1$ qemu -S -hda ./bin/ucore.img -s chy@laptop: ~/lab1$ gdb ./bin/kernel
(gdb) target remote:1234
Remote debugging using :1234
0x0000fff0 in ?? ()
(gdb) file obj/kernel/kernel.elf
(gdb) break memset
Breakpoint 1 at 0x100d9f: file libs/string.c, line 54.
(gdb) run
Starting program: /home/chenyu/oscourse/develop/ucore/lab1/bin/kernel

Breakpoint 1, memset (s=0x1020fc, c=0 '\000', n=12) at libs/string.c:54
54 return __memset(s, c, n);
(gdb)
##### 2.4.4.4 使用gdb配置文件 在上面可以看到,为了进行源码级调试,需要输入较多的东西,很麻烦。为了方便,可以将这些命令存在脚本中,并让gdb在启动的时候自动载入。 我们可以创建文件gdbinit,并输入下面的内容: target remote 127.0.0.1:1234 file obj/kernel/kernel.elf 为了让gdb在启动时执行这些命令,使用下面的命令启动gdb: $ gdb -x gdbinit 如果觉得这个命令太长,可以将这个命令存入一个文件中,当作脚本来执行。 另外,如果直接使用上面的命令,那么得到的界面是一个纯命令行的界面,不够直观,就像下图这样: ![纯命令行的界面](./lab0/image002.png "纯命令行的界面") 如果想获得上面右图那样的效果,只需要再加上参数-tui就行了,比如: gdb -tui -x gdbinit ##### 2.4.4.5 加载调试目标 在上面小节,我们提到为了能够让gdb识别变量的符号,我们必须给gdb载入符号表等信息。在进行gdb本地应用程序调试的时候,因为在指定了执行文件时就已经加载了文件中包含的调试信息,因此不用再使用gdb命令专门加载了。但是在使用qemu进行远程调试的时候,我们必须手动加载符号表,也就是在gdb中用file命令。 这样加载调试信息都是按照elf文件中制定的虚拟地址进行加载的,这在静态连接的代码中没有任何问题。但是在调试含有动态链接库的代码时,动态链接库的ELF执行文件头中指定的加载虚拟地址都是0,这个地址实际上是不正确的。从操作系统角度来看,用户态的动态链接库的加载地址都是由操作系统动态分配的,没有一个固定值。然后操作系统再把动态链接库加载到这个地址,并由用户态的库链接器(linker)把动态链接库中的地址信息重新设置,自此动态链接库才可正常运行。 由于分配地址的动态性,gdb并不知道这个分配的地址是多少,因此当我们在对这样动态链接的代码进行调试的时候,需要手动要求gdb将调试信息加载到指定地址。 下面,我们要求gdb将linker加载到0x6fee6180这个地址上: (gdb) add-symbol-file android_test/system/bin/linker 0x6fee6180 这样的命令默认是将代码段(.data)段的调试信息加载到0x6fee6180上,当然,你也可以通过“-s”这个参数来指定,比如: + (gdb) add-symbol-file android_test/system/bin/linker –s .text 0x6fee6180 这样,在执行到linker中代码时gdb就能够显示出正确的代码和调试信息出来。 这个方法在操作系统中调试动态链接器时特别有用。 ##### 2.4.4.6 设定调试目标架构 在调试的时候,我们也许需要调试不是i386保护模式的代码,比如8086实模式的代码,我们需要设定当前使用的架构: (gdb) set arch i8086 这个方法在调试不同架构或者说不同模式的代码时还是有点用处的。 ### 2.5了解处理器硬件 要想深入理解ucore,就需要了解支撑ucore运行的硬件环境,即了解处理器体系结构(了解硬件对ucore带来影响)和机器指令集(读懂ucore的汇编)。ucore目前支持的硬件环境是基于Intel 80386以上的计算机系统。更多的硬件相关内容(比如保护模式等)将随着实现ucore的过程逐渐展开介绍。 #### 2.5.1 Intel 80386运行模式 80386有四种运行模式:实模式、保护模式、SMM模式和虚拟8086模式。这里对涉及ucore的实模式、保护模式做一个简要介绍。 实模式:80386加电启动后处于实模式运行状态,在这种状态下软件可访问的物理内存空间不能超过1MB,且无法发挥Intel 80386以上级别的32位CPU的4GB内存管理能力。实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,操作系统和用户程序并没有区别对待,而且每一个指针都是指向实际的物理地址。这样用户程序的一个指针如果指向了操作系统区域或其他用户程序区域,并修改了内容,那么其后果就很可能是灾难性的。 实模式:实模式是为了和8086处理器兼容而设置的。在实模式下,80386处理器就相当于一个快速的8086处理器。80386处理器被复位或加电的时候以实模式启动。这时候处理器中的各寄存器以实模式的初始化值工作。80386处理器在实模式下的存储器寻址方式和8086是一样的,由段寄存器的内容乘以16当做基地址,加上段内的偏移地址形成最终的物理地址,这时候它的32位地址线只使用了低20位,即可访问1MB的物理地址空间。在实模式下,80386处理器不能对内存进行页机制管理,所以指令寻址的地址就是内存中实际的物理地址。在实模式下,所有的段都是可以读、写和执行的。实模式下80386不支持优先级,所有的指令相当于工作在特权级(即优先级0),所以它可以执行所有特权指令,包括读写控制寄存器CR0等。实模式下不支持硬件上的多任务切换。实模式下的中断处理方式和8086处理器相同,也用中断向量表来定位中断服务程序地址。中断向量表的结构也和8086处理器一样,每4个字节组成一个中断向量,其中包括两个字节的段地址和两个字节的偏移地址。 保护模式:实际上,80386就是通过在实模式下初始化控制寄存器,GDTR,LDTR,IDTR与TR等管理寄存器以及页表,然后再通过加载CR0使其中的保护模式使能位置位而进入保护模式的。当80386工作在保护模式下的时候,其所有的32根地址线都可供寻址,物理寻址空间高达4GB。在保护模式下,支持内存分页机制,提供了对虚拟内存的良好支持。保护模式下80386支持多任务,还支持优先级机制,不同的程序可以运行在不同的优先级上。优先级一共分0~3 4个级别,操作系统运行在最高的优先级0上,应用程序则运行在比较低的级别上;配合良好的检查机制后,既可以在任务间实现数据的安全共享也可以很好地隔离各个任务。 #### 2.5.2 Intel 80386内存架构 80386是32位的处理器,即可以寻址的物理内存地址空间为2^32=4G字节。在理解操作系统的过程中,需要用到三个地址空间的概念。地址是访问地址空间的索引。物理内存地址空间是处理器提交到总线上用于访问计算机系统中的内存和外设的最终地址。一个计算机系统中只有一个物理地址空间。线性地址空间是每个运行的应用程序看到的地址空间,在操作系统的虚存管理之下,每个运行的应用程序都认为自己独享整个计算机系统的地址空间,这样可让多个运行的应用程序之间相互隔离。处理器负责把线性地址转换成物理地址。一个计算机系统中可以有多个线性地址空间(比如一个运行的程序就可以有一个私有的线性地址空间)。线性地址空间的大小与物理地址空间的大小没有必然的连续。逻辑地址空间是应用程序直接使用的地址空间。这是由于80386中无法禁用段机制,使得逻辑地址一直存在。比如如下C代码片段: int boo=1; int *foo=&a; 这里的boo是一个整型变量,foo变量是一个指向boo地址的整型指针变量,foo中储存的内容就是boo的逻辑地址。逻辑地址由一个16位的段寄存器和一个32位的偏移量构成。Foo中放的就是32位的偏移量,而对应的段信息位于段寄存器中。 上述三种地址的关系如下: - 分段机制启动、分页机制未启动:逻辑地址->段机制处理->线性地址=物理地址 - 分段机制和分页机制都启动:逻辑地址->段机制处理->线性地址->页机制处理->物理地址 #### 2.5.3 Intel 80386寄存器 80386的寄存器可以分为8组:通用寄存器,段寄存器,指令指针寄存器,标志寄存器,系统地址寄存器,控制寄存器,调试寄存器,测试寄存器,它们的宽度都是32位。一般程序员看到的寄存器包括通用寄存器,段寄存器,指令指针寄存器,标志寄存器。 General Register(通用寄存器):EAX/EBX/ECX/EDX/ESI/EDI/ESP/EBP这些寄存器的低16位就是8086的 AX/BX/CX/DX/SI/DI/SP/BP,对于AX,BX,CX,DX这四个寄存器来讲,可以单独存取它们的高8位和低8位 (AH,AL,BH,BL,CH,CL,DH,DL)。它们的含义如下: EAX:累加器 EBX:基址寄存器 ECX:计数器 EDX:数据寄存器 ESI:源地址指针寄存器 EDI:目的地址指针寄存器 EBP:基址指针寄存器 ESP:堆栈指针寄存器 + ![通用寄存器](./lab0/image003.png "通用寄存器") Segment Register(段寄存器,也称 Segment Selector,段选择符,段选择子):除了8086的4个段外(CS,DS,ES,SS),80386还增加了两个段FS,GS,这些段寄存器都是16位的,它们的含义如下: CS:代码段(Code Segment) DS:数据段(Data Segment) ES:附加数据段(Extra Segment) SS:堆栈段(Stack Segment) FS:附加段 GS 附加段 ![段寄存器](./lab0/image004.png "段寄存器") + Instruction Pointer(指令指针寄存器):EIP的低16位就是8086的IP,它存储的是下一条要执行指令的内存地址,在分段地址转换中,表示指令的段内偏移地址。 ![状态和指令寄存器](./lab0/image005.png "状态和指令寄存器") + Flag Register(标志寄存器):EFLAGS,和8086的16位标志寄存器相比,增加了4个控制位,这20位控制/标志位的位置如下图所示: ![状态寄存器](./lab0/image006.png "状态寄存器") 相关的控制/标志位含义是: CF(Carry Flag):进位标志位; PF(Parity Flag):奇偶标志位; AF(Assistant Flag):辅助进位标志位; ZF(Zero Flag):零标志位; SF(Singal Flag):符号标志位; IF(Interrupt Flag):中断允许标志位,由CLI,STI两条指令来控制;设置 IF 使CPU可识别外部(可屏蔽)中断请求。复位 IF 则禁止中断。 IF 对不可屏蔽外部中断和故障中断的识别没有任何作用。 DF(Direction Flag):向量标志位,由CLD,STD两条指令来控制; OF(Overflow Flag):溢出标志位; IOPL(I/O Privilege Level):I/O特权级字段,它的宽度为2位,它指定了I/O指令的特权级。如果当前的特权级别在数值上小于或等于IOPL,那么I/O指令可执行。否则,将发生一个保护性故障中断。 NT(Nested Task):控制中断返回指令IRET,它宽度为1位。若NT=0,则用堆栈中保存的值恢复EFLAGS,CS和EIP从而实现中断返回;若NT=1,则通过任务切换实现中断返回。 ### 2.6 了解ucore编程方法和通用数据结构 #### 2.6.1 面向对象编程方法 uCore设计中采用了一定的面向对象编程方法。虽然C 语言对面向对象编程并没有原生支持,但没有原生支持并不等于我们不能用 C 语言写面向对象程序。需要注意,我们并不需要用 C语言模拟出一个常见 C++ 编译器已经实现的对象模型。如果是这样,还不如直接采用C++编程。 uCore的面向对象编程方法,目前主要是采用了类似C++的接口(interface)概念,即是让实现细节不同的某类内核子系统(比如物理内存分配器、调度器,文件系统等)有共同的操作方式,这样虽然内存子系统的实现千差万别,但它的访问接口是不变的。这样不同的内核子系统之间就可以灵活组合在一起,实现风格各异,功能不同的操作系统。接口在 C 语言中,表现为一组函数指针的集合。放在 C++ 中,即为虚表。接口设计的难点是如果找出各种内核子系统的共性访问/操作模式,从而可以根据访问模式提取出函数指针列表。 比如对于uCore内核中的物理内存管理子系统,首先通过分析内核中其他子系统可能对物理内存管理子系统,明确物理内存管理子系统的访问/操作模式,然后我们定义了pmm_manager数据结构(位于lab2/kern/mm/pmm.h)如下: // pmm_manager is a physical memory management class. A special pmm manager - XXX_pmm_manager // only needs to implement the methods in pmm_manager class, then XXX_pmm_manager can be used // by ucore to manage the total physical memory space. struct pmm_manager { // XXX_pmm_manager's name const char *name; // initialize internal description&management data structure // (free block list, number of free block) of XXX_pmm_manager void (*init)(void); // setup description&management data structcure according to // the initial free physical memory space void (*init_memmap)(struct Page *base, size_t n); // allocate >=n pages, depend on the allocation algorithm struct Page *(*alloc_pages)(size_t n); // free >=n pages with "base" addr of Page descriptor structures(memlayout.h) void (*free_pages)(struct Page *base, size_t n); // return the number of free pages size_t (*nr_free_pages)(void); // check the correctness of XXX_pmm_manager void (*check)(void); }; + 这样基于此数据结构,我们可以实现不同连续内存分配算法的物理内存管理子系统,而这些物理内存管理子系统需要编写算法,把算法实现在此结构中定义的init(初始化)、init_memmap(分析空闲物理内存并初始化管理)、alloc_pages(分配物理页)、free_pages(释放物理页)函数指针所对应的函数中。而其他内存子系统需要与物理内存管理子系统交互时,只需调用特定物理内存管理子系统所采用的pmm_manager数据结构变量中的函数指针即可 #### 2.6.2 通用数据结构 ##### 2.6.2.1 双向循环链表 在“数据结构”课程中,如果创建某种数据结构的双循环链表,通常采用的办法是在这个数据结构的类型定义中有专门的成员变量 data, 并且加入两个指向该类型的指针next和prev。例如: typedef struct foo { ElemType data; struct foo *prev; struct foo *next; } foo_t; 双向循环链表的特点是尾节点的后继指向首节点,且从任意一个节点出发,沿两个方向的任何一个,都能找到链表中的任意一个节点的data数据。由双向循环列表形成的数据链如下所示: +![双向循环链表](./lab0/image007.png "双向循环链表") 这种双向循环链表数据结构的一个潜在问题是,虽然链表的基本操作是一致的,但由于每种特定数据结构的类型不一致,需要为每种特定数据结构类型定义针对这个数据结构的特定链表插入、删除等各种操作,会导致代码冗余。 在uCore内核(从lab2开始)中使用了大量的双向循环链表结构来组织数据,包括空闲内存块列表、内存页链表、进程列表、设备链表、文件系统列表等的数据组织(在[labX/libs/list.h]实现),但其具体实现借鉴了Linux内核的双向循环链表实现,与“数据结构”课中的链表数据结构不太一样。下面将介绍这一数据结构的设计与操作函数。 uCore的双向链表结构定义为: struct list_entry { struct list_entry *prev, *next; }; 需要注意uCore内核的链表节点list_entry没有包含传统的data数据域,,而是在具体的数据结构中包含链表节点。以lab2中的空闲内存块列表为例,空闲块链表的头指针定义(位于lab2/kern/mm/memlayout.h中)为: /* free_area_t - maintains a doubly linked list to record free (unused) pages */ typedef struct { list_entry_t free_list; // the list header unsigned int nr_free; // # of free pages in this free list } free_area_t; 而每一个空闲块链表节点定义(位于lab2/kern/mm/memlayout)为: /* * * struct Page - Page descriptor structures. Each Page describes one * physical page. In kern/mm/pmm.h, you can find lots of useful functions * that convert Page to other data types, such as phyical address. * */ struct Page { atomic_t ref; // page frame's reference counter …… list_entry_t page_link; // free list link }; 这样以free_area_t结构的数据为双向循环链表的链表头指针,以Page结构的数据为双向循环链表的链表节点,就可以形成一个完整的双向循环链表,如下图所示: ![空闲块双向循环链表](./lab0/image008.png "空闲块双向循环链表") + 图 空闲块双向循环链表 从上图中我们可以看到,这种通用的双向循环链表结构避免了为每个特定数据结构类型定义针对这个数据结构的特定链表的麻烦,而可以让所有的特定数据结构共享通用的链表操作函数。在实现对空闲块链表的管理过程(参见lab2/kern/mm/default_pmm.c)中,就大量使用了通用的链表插入,链表删除等操作函数。有关这些链表操作函数的定义如下。 (1) 初始化 uCore只定义了链表节点,并没有专门定义链表头,那么一个双向循环链表是如何建立起来的呢?让我们来看看list_init这个内联函数(inline funciton): static inline void list_init(list_entry_t *elm) { elm->prev = elm->next = elm; } 参看文件default_pmm.c的函数default_init,当我们调用list_init(&(free_area.free_list))时,就声明一个名为free_area.free_list的链表头时,它的next、prev指针都初始化为指向自己,这样,我们就有了一个表示空闲内存块链的空链表。而且我们可以用头指针的next是否指向自己来判断此链表是否为空,而这就是内联函数list_empty的实现。 (2) 插入 对链表的插入有两种操作,即在表头插入(list_add_after)或在表尾插入(list_add_before)。因为双向循环链表的链表头的next、prev分别指向链表中的第一个和最后一个节点,所以,list_add_after和list_add_before的实现区别并不大,实际上uCore分别用__list_add(elm, listelm, listelm->next)和__list_add(elm, listelm->prev, listelm)来实现在表头插入和在表尾插入。而__list_add的实现如下: static inline void __list_add(list_entry_t *elm, list_entry_t *prev, list_entry_t *next) { prev->next = next->prev = elm; elm->next = next; elm->prev = prev; } 从上述实现可以看出在表头插入是插入在listelm之后,即插在链表的最前位置。而在表尾插入是插入在listelm->prev之后,即插在链表的最后位置。注:list_add等于list_add_after。 (3) 删除 当需要删除空闲块链表中的Page结构的链表节点时,可调用内联函数list_del,而list_del进一步调用了__list_del来完成具体的删除操作。其实现为: static inline void list_del(list_entry_t *listelm) { __list_del(listelm->prev, listelm->next); } static inline void __list_del(list_entry_t *prev, list_entry_t *next) { prev->next = next; next->prev = prev; } 如果要确保被删除的节点listelm不再指向链表中的其他节点,这可以通过调用list_init函数来把listelm的prev、next指针分别自身,即将节点置为空链状态。这可以通过list_del_init函数来完成。 (4) 访问链表节点所在的宿主数据结构 通过上面的描述可知,list_entry_t通用双向循环链表中仅保存了某特定数据结构中链表节点成员变量的地址,那么如何通过这个链表节点成员变量访问到它的所有者(即某特定数据结构的变量)呢?Linux为此提供了针对数据结构XXX的le2XXX(le, member)的宏,其中le,即list entry的简称,是指向数据结构XXX中list_entry_t成员变量的指针,也就是存储在双向循环链表中的节点地址值, member则是XXX数据类型中包含的链表节点的成员变量。例如,我们要遍历访问空闲块链表中所有节点所在的基于Page数据结构的变量,则可以采用如下编程方式(基于lab2/kern/mm/default_pmm.c): //free_area是空闲块管理结构,free_area.free_list是空闲块链表头 free_area_t free_area; list_entry_t * le = &free_area.free_list; //le是空闲块链表头指针 while((le=list_next(le)) != &free_area.free_list) { //从第一个节点开始遍历 struct Page *p = le2page(le, page_link); //获取节点所在基于Page数据结构的变量 …… } le2page宏(定义位于lab2/kern/mm/memlayout.h)的使用相当简单: // convert list entry to page #define le2page(le, member) \ to_struct((le), struct Page, member) 而相比之下,它的实现用到的to_struct宏和offsetof宏(定义位于lab2/libs/defs.h)则有一些难懂: /* Return the offset of 'member' relative to the beginning of a struct type */ #define offsetof(type, member) \ ((size_t)(&((type *)0)->member)) /* * * to_struct - get the struct from a ptr * @ptr: a struct pointer of member * @type: the type of the struct this is embedded in * @member: the name of the member within the struct * */ #define to_struct(ptr, type, member) \ ((type *)((char *)(ptr) - offsetof(type, member))) 这里采用了一个利用gcc编译器技术的技巧,即先求得数据结构的成员变量在本宿主数据结构中的偏移量,然后根据成员变量的地址反过来得出属主数据结构的变量的地址。 我们首先来看offsetof宏,size_t最终定义与CPU体系结构相关,本实验都采用Intel X86-32 CPU,顾szie_t等价于 unsigned int。 ((type \*)0)->member的设计含义是什么?其实这是为了求得数据结构的成员变量在本宿主数据结构中的偏移量。为了达到这个目标,首先将0地址强制"转换"为type数据结构(比如struct Page)的指针,再访问到type数据结构中的member成员(比如page_link)的地址,即是type数据结构中member成员相对于数据结构变量的偏移量。在offsetof宏中,这个member成员的地址(即“&((type \*)0)->member)”)实际上就是type数据结构中member成员相对于数据结构变量的偏移量。对于给定一个结构,offsetof(type,member)是一个常量,to_struct宏正是利用这个不变的偏移量来求得链表数据项的变量地址。接下来再分析一下to_struct宏,可以发现 to_struct宏中用到的ptr变量是链表节点的地址,把它减去offsetof宏所获得的数据结构内偏移量,即就得到了包含链表节点的属主数据结构的变量的地址。 \ No newline at end of file diff --git a/lab0/.DS_Store b/lab0/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b001d495930f3825c6dce1a84b442c91a223a006 GIT binary patch literal 6148 zcmeHKJ5B>J5S`hi2!bLdrOQ-^@GnSb19AWkzyY|y^5&xm?MEvb zgwRYh^X#!-tbJbX*hIvW*Sj&%kcb9w!E6hm!DL*#W|?PXko7uhzGV)p~(B@`B9ZBRH2OVx4!O`(Ee0VeY6@Yvdg^^Y}t| z@T_IMqZZzK$9l)jyzHujchbW9=-{0;^LmdRyt5YGXN8AuSSSz*gaSWO05w}|ux%JI z6bJ=EfsF$4eMoS@+_5m!PX~ft0f2p^)zFrsqHvO9?pPRN1ja@M8kPNu!A3_u`Mlh* zFf=-`Uq0AZW;w{hSXT!obYPq-L>kp;=pSR!tE3D{-0-?ZvQh@u@%jpD9 y#X&%2h!6_=ssdjer*v8X literal 0 HcmV?d00001 diff --git a/lab0/image001.png b/lab0/image001.png new file mode 100644 index 0000000000000000000000000000000000000000..a010e5b03e0400556b94340b97ccb8bfd6d7c8a8 GIT binary patch literal 97038 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 OdGTCHrbNmh@P7f0xYCvY literal 0 HcmV?d00001 diff --git a/lab0/image002.png b/lab0/image002.png new file mode 100644 index 0000000000000000000000000000000000000000..4d97e0e77c570e08957612c6b3b2bdb7e082991a GIT binary patch literal 65187 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 literal 0 HcmV?d00001 diff --git a/lab0/image004.png b/lab0/image004.png new file mode 100644 index 0000000000000000000000000000000000000000..2ff635efad4e0fdd5d36fb36297f0331523f3888 GIT binary patch literal 10962 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

Q?D^c_$Isi^oNGZrSVNmR`Gy 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 F{{vE#Vc`G( literal 0 HcmV?d00001 diff --git a/lab0/image008.png b/lab0/image008.png new file mode 100644 index 0000000000000000000000000000000000000000..30e3cdfbacdcfaec3ddf0f245aeb16df0798b026 GIT binary patch literal 13733 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 literal 0 HcmV?d00001 diff --git a/lab1.htm b/lab1.htm new file mode 100644 index 0000000..a62494b --- /dev/null +++ b/lab1.htm @@ -0,0 +1,4019 @@ + + + + + + +实验一:系统软件启动过程 + + + + + + +

+ +

 

+ +

实验一:系统软件启动过程

+ +

1.实验目的:

+ +

操作系统是一个软件,也需要通过某种机制加载并运行它。在这里我们将通过另外一个更加简单的软件-bootloader来完成这些工作。为此,我们需要完成一个能够切换到x86的保护模式并显示字符的bootloader,为启动操作系统ucore做准备。lab1提供了一个非常小的bootloaderucore OS,整个bootloader执行代码小于512个字节,这样才能放到硬盘的主引导扇区中。通过分析和实现这个bootloaderucore OS,读者可以了解到:

+ +

       基于分段机制的存储管理

+ +

       设备管理的基本概念

+ +

       PC启动bootloader的过程

+ +

       bootloader的文件组成

+ +

       编译运行bootloader的过程

+ +

       调试bootloader的方法

+ +

       ucore +OS的启动过程

+ +

       在汇编级了解栈的结构和处理过程

+ +

       中断处理机制

+ +

       通过串口/并口/CGA输出字符的方法

+ +

 

+ +

2.实验内容:

+ +

lab1中包含一个bootloader和一个OS。这个bootloader可以切换到X86保护模式,能够读磁盘并加载ELF执行文件格式,并显示字符。而这lab1中的OS只是一个可以处理时钟中断和显示字符的幼儿园级别OS

+ +

2.1 +练习

+ +

练习1:理解通过make生成执行文件的过程。(要求在报告中写出对下述问题的回答)

+ +

在此练习中,大家需要通过静态分析代码来了解:

+ +

1.     +操作系统镜像文件ucore.img是如何一步一步生成的?(需要比较详细地解释Makefile中每一条相关命令和命令参数的含义,以及说明命令导致的结果)

+ +

2.     +一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?

+ +

补充材料:

+ +

如何调试Makefile

+ +

当执行make时,一般只会显示输出,不会显示make到底执行了哪些命令。

+ +

如想了解make执行了哪些命令,可以执行:

+ +

$ make "V="

+ +

要获取更多有关make的信息,可上网查询,并请执行

+ +

$ man make

+ +

 

+ +

练习2:使用qemu执行并调试lab1中的软件。(要求在报告中简要写出练习过程)

+ +

为了熟悉使用qemugdb进行的调试工作,我们进行如下的小练习:

+ +

1.     +CPU加电后执行的第一条指令开始,单步跟踪BIOS的执行。

+ +

2.     +在初始化位置0x7c00设置实地址断点,测试断点正常。

+ +

3.     +0x7c00开始跟踪代码运行,将单步跟踪反汇编得到的代码与bootasm.S bootblock.asm进行比较。

+ +

4.     +自己找一个bootloader或内核中的代码位置,设置断点并进行测试。

+ +

 

+ +

提示:参考附录“启动后第一条执行的指令”

+ +

补充材料:

+ +

我们主要通过硬件模拟器qemu来进行各种实验。在实验的过程中我们可能会遇上各种各样的问题,调试是必要的。qemu支持使用gdb进行的强大而方便的调试。所以用好qemugdb是完成各种实验的基本要素。

+ +

默认的gdb需要进行一些额外的配置才进行qemu的调试任务。qemugdb之间使用网络端口1234进行通讯。在打开qemu进行模拟之后,执行gdb并输入

+ +

target remote localhost:1234

+ +

即可连接qemu,此时qemu会进入停止状态,听从gdb的命令。

+ +

另外,我们可能需要qemu在一开始便进入等待模式,则我们不再使用make +qemu开始系统的运行,而使用make debug来完成这项工作。这样qemu便不会在gdb尚未连接的时候擅自运行了。

+ +

 

+ +

gdb的地址断点

+ +

       gdb命令行中,使用b *[地址]便可以在指定内存地址设置断点,当qemu中的cpu执行到指定地址时,便会将控制权交给gdb

+ +

 

+ +

关于代码的反汇编

+ +

       有可能gdb无法正确获取当前qemu执行的汇编指令,通过如下配置可以在每次gdb命令行前强制反汇编当前的指令,在gdb命令行或配置文件中添加:

+ +

define hook-stop

+ +

x/i $pc

+ +

end

+ +

即可

+ +

 

+ +

gdb的单步命令

+ +

gdb中,有next, nexti, step, +stepi等指令来单步调试程序,他们功能各不相同,区别在于单步的跨度上。

+ +

next 单步到程序源代码的下一行,不进入函数。

+ +

nexti 单步一条机器指令,不进入函数。

+ +

step 单步到下一个不同的源代码行(包括进入函数)。

+ +

stepi 单步一条机器指令。

+ +

 

+ +

练习3:分析bootloader进入保护模式的过程。(要求在报告中写出分析)

+ +

BIOS将通过读取硬盘主引导扇区到内存,并转跳到对应内存中的位置执行bootloader。请分析bootloader是如何完成从实模式进入保护模式的。

+ +

提示:需要阅读3.2.1小节“保护模式和分段机制”和lab1/boot/bootasm.S源码,了解如何从实模式切换到保护模式。

+ +

练习4:分析bootloader加载ELF格式的OS的过程。(要求在报告中写出分析)

+ +

通过阅读bootmain.c,了解bootloader如何加载ELF文件。通过分析源代码和通过qemu来运行并调试bootloader&OS

+ +

1.     +bootloader如何读取硬盘扇区的?

+ +

2.     +bootloader是如何加载ELF格式的OS

+ +

提示:可阅读3.2.3“硬盘访问概述”,3.2.4ELF执行文件格式概述”。

+ +

练习5:实现函数调用堆栈跟踪函数 (需要编程)

+ +

我们需要在lab1中完成kdebug.c中函数print_stackframe的实现,可以通过函数print_stackframe来跟踪函数调用堆栈中记录的返回地址。在如果能够正确实现此函数,可在lab1中执行 “make qemu”后,在qemu模拟器中得到类似如下的输出:

+ +
+ + + + + +
+

……

+

ebp:0x00007b28 eip:0x00100992 args:0x00010094 + 0x00010094 0x00007b58 0x00100096

+

    kern/debug/kdebug.c:305: print_stackframe+22

+

ebp:0x00007b38 eip:0x00100c79 args:0x00000000 + 0x00000000 0x00000000 0x00007ba8

+

    kern/debug/kmonitor.c:125: mon_backtrace+10

+

ebp:0x00007b58 eip:0x00100096 args:0x00000000 + 0x00007b80 0xffff0000 0x00007b84

+

    kern/init/init.c:48: grade_backtrace2+33

+

ebp:0x00007b78 eip:0x001000bf args:0x00000000 + 0xffff0000 0x00007ba4 0x00000029

+

    kern/init/init.c:53: grade_backtrace1+38

+

ebp:0x00007b98 eip:0x001000dd args:0x00000000 + 0x00100000 0xffff0000 0x0000001d

+

    kern/init/init.c:58: grade_backtrace0+23

+

ebp:0x00007bb8 eip:0x00100102 args:0x0010353c + 0x00103520 0x00001308 0x00000000

+

    kern/init/init.c:63: grade_backtrace+34

+

ebp:0x00007be8 eip:0x00100059 args:0x00000000 + 0x00000000 0x00000000 0x00007c53

+

    kern/init/init.c:28: kern_init+88

+

ebp:0x00007bf8 eip:0x00007d73 args:0xc031fcfa + 0xc08ed88e 0x64e4d08e 0xfa7502a8

+

<unknow>: -- + 0x00007d72 –

+

……

+
+ +
+ +

请完成实验,看看输出是否与上述显示大致一致,并解释最后一行各个数值的含义。

+ +

提示:可阅读3.3.1小节“函数堆栈”,了解编译器如何建立函数调用关系的。在完成lab1编译后,查看lab1/obj/bootblock.asm,了解bootloader源码与机器码的语句和地址等的对应关系;查看lab1/obj/kernel.asm,了解ucore +OS源码与机器码的语句和地址等的对应关系。

+ +

要求完成函数kern/debug/kdebug.c::print_stackframe的实现,提交改进后源代码包(可以编译执行),并在实验报告中简要说明实现过程,并写出对上述问题的回答。

+ +

 

+ +

补充材料:

+ +

由于显示完整的栈结构需要解析内核文件中的调试符号,较为复杂和繁琐。代码中有一些辅助函数可以使用。例如可以通过调用print_debuginfo函数完成查找对应函数名并打印至屏幕的功能。具体可以参见kdebug.c代码中的注释。

+ +

练习6:完善中断初始化和处理 (需要编程)

+ +

请完成编码工作和回答如下问题:

+ +

1.     +中断向量表中一个表项占多少字节?其中哪几位代表中断处理代码的入口?

+ +

2.     +请编程完善kern/trap/trap.c中对中断向量表进行初始化的函数idt_init。在idt_init函数中,依次对所有中断入口进行初始化。使用mmu.h中的SETGATE宏,填充idt数组内容。注意除了系统调用中断(T_SYSCALL)以外,其它中断均使用中断门描述符,权限为内核态权限;而系统调用中断使用异常,权限为陷阱门描述符。每个中断的入口由tools/vectors.c生成,使用trap.c中声明的vectors数组即可。

+ +

3.     +请编程完善trap.c中的中断处理函数trap,在对时钟中断进行处理的部分填写trap函数中处理时钟中断的部分,使操作系统每遇到100次时钟中断后,调用print_ticks子程序,向屏幕上打印一行文字”100 ticks”

+ +

要求完成问题2和问题3 提出的相关函数实现,提交改进后的源代码包(可以编译执行),并在实验报告中简要说明实现过程,并写出对问题1的回答。完成这问题23要求的部分代码后,运行整个系统,可以看到大约每1秒会输出一次”100 ticks”,而按下的键也会在屏幕上显示。

+ +

提示:可阅读3.3.2小节“中断与异常”。

+ +

 

+ +

扩展练习 Challenge(需要编程)

+ +

l   +扩展proj4,增加syscall功能,即增加一用户态函数(可执行一特定系统调用:获得时钟计数值),当内核初始完毕后,可从内核态返回到用户态的函数,而用户态的函数又通过系统调用得到内核态的服务(通过网络查询所需信息,可找老师咨询。如果完成,且有兴趣做代替考试的实验,可找老师商量)。需写出详细的设计和分析报告。完成出色的可获得适当加分。

+ +

 

+ +
+ +

提示:

+ +

规范一下 challenge 的流程。

+ +

 

+ +

kern_init 调用 switch_test,该函数如下:

+ +

 

+ +

static void

+ +

switch_test(void) {

+ +

    print_cur_status();          // print 当前 +cs/ss/ds 等寄存器状态

+ +

    cprintf("+++ switch to  user  mode +++\n");

+ +

    switch_to_user();            // switch to user mode

+ +

    print_cur_status();

+ +

    cprintf("+++ switch to kernel mode +++\n");

+ +

    switch_to_kernel();         // switch to kernel mode

+ +

    print_cur_status();

+ +

}

+ +

 

+ +

switch_to_* +函数建议通过 中断处理的方式实现。主要要完成的代码是在 trap 里面处理 T_SWITCH_TO* 中断,并设置好返回的状态。

+ +

 

+ +

+lab1 里面完成代码以后,执行 make grade 应该能够评测结果是否正确。

+ +
+ +

2.2 +项目组成

+ +

lab1的整体目录结构如下所示:

+ + + + + +
+

.

+

├── + boot

+

   + ├── asm.h

+

   + ├── bootasm.S

+

   + └── bootmain.c

+

├── + kern

+

   + ├── debug

+

   + │   ├── assert.h

+

   + │   ├── kdebug.c

+

   + │   ├── kdebug.h

+

   + │   ├── kmonitor.c

+

   + │   ├── kmonitor.h

+

   + │   ├── panic.c

+

   + │   └── stab.h

+

   + ├── driver

+

   + │   ├── clock.c

+

   + │   ├── clock.h

+

   + │   ├── console.c

+

   + │   ├── console.h

+

   + │   ├── intr.c

+

   + │   ├── intr.h

+

   + │   ├── kbdreg.h

+

   + │   ├── picirq.c

+

   + │   └── picirq.h

+

   + ├── init

+

   + │   └── init.c

+

   + ├── libs

+

   + │   ├── readline.c

+

   + │   └── stdio.c

+

   + ├── mm

+

   + │   ├── memlayout.h

+

   + │   ├── mmu.h

+

   + │   ├── pmm.c

+

   + │   └── pmm.h

+

   + └── trap

+

       + ├── trap.c

+

       + ├── trapentry.S

+

       + ├── trap.h

+

       + └── vectors.S

+

├── + libs

+

   + ├── defs.h

+

   + ├── elf.h

+

   + ├── error.h

+

   + ├── printfmt.c

+

   + ├── stdarg.h

+

   + ├── stdio.h

+

   + ├── string.c

+

   + ├── string.h

+

   + └── x86.h

+

├── + Makefile

+

└── + tools

+

    + ├── function.mk

+

    + ├── gdbinit

+

    + ├── grade.sh

+

    + ├── kernel.ld

+

    + ├── sign.c

+

    + └── vector.c

+

 

+

10 + directories, 48 files

+

 

+
+ +

 

+ +

其中一些比较重要的文件说明如下:

+ +

    bootloader部分

+ +

l  boot/bootasm.S +:定义并实现了bootloader最先执行的函数start,此函数进行了一定的初始化,完成了从实模式到保护模式的转换,并调用bootmain.c中的bootmain函数。

+ +

l  boot/bootmain.c:定义并实现了bootmain函数实现了通过屏幕、串口和并口显示字符串。bootmain函数加载ucore操作系统到内存,然后跳转到ucore的入口处执行。

+ +

l  boot/asm.h:是bootasm.S汇编文件所需要的头文件,主要是一些与X86保护模式的段访问方式相关的宏定义。

+ +

ucore操作系统部分:

+ +

系统初始化部分:

+ +

l  kern/init/init.cucore操作系统的初始化启动代码

+ +

内存管理部分:

+ +

l  kern/mm/memlayout.hucore操作系统有关段管理(段描述符编号、段号等)的一些宏定义

+ +

l  kern/mm/mmu.hucore操作系统有关X86 MMU等硬件相关的定义,包括EFLAGS寄存器中各位的含义,应用/系统段类型,中断门描述符定义,段描述符定义,任务状态段定义,NULL段声明的宏SEG_NULL, 特定段声明的宏SEG,设置中断门描述符的宏SETGATE(在练习6中会用到)

+ +

l  kern/mm/pmm.[ch]:设定了ucore操作系统在段机制中要用到的全局变量:任务状态段ts,全局描述符表 gdt[],加载全局描述符表寄存器的函数lgdt,临时的内核栈stack0;以及对全局描述符表和任务状态段的初始化函数gdt_init

+ +

    +外设驱动部分

+ +

l  kern/driver/intr.[ch]:实现了通过设置CPUeflags来屏蔽和使能中断的函数;

+ +

l  kern/driver/picirq.[ch]:实现了对中断控制器8259A的初始化和使能操作;

+ +

l  kern/driver/clock.[ch]:实现了对时钟控制器8253的初始化操作;

+ +

l  kern/driver/console.[ch]:实现了对串口和键盘的中断方式的处理操作;

+ +

中断处理部分:

+ +

l  kern/trap/vectors.S:包括256个中断服务例程的入口地址和第一步初步处理实现。注意,此文件是由tools/vector.c在编译ucore期间动态生成的;

+ +

l  kern/trap/trapentry.S:紧接着第一步初步处理后,进一步完成第二步初步处理;并且有恢复中断上下文的处理,即中断处理完毕后的返回准备工作;

+ +

l  kern/trap/trap.[ch]:紧接着第二步初步处理后,继续完成具体的各种中断处理操作;

+ +

内核调试部分:

+ +

l  kern/debug/kdebug.[ch]:提供源码和二进制对应关系的查询功能,用于显示调用栈关系。其中补全print_stackframe函数是需要完成的练习。其他实现部分不必深究。

+ +

l  kern/debug/kmonitor.[ch]:实现提供动态分析命令的kernel monitor,便于在ucore出现bug或问题后,能够进入kernel monitor中,查看当前调用关系。实现部分不必深究。

+ +

l  kern/debug/panic.c +| assert.h:提供了panic函数和assert宏,便于在发现错误后,调用kernel monitor。大家可在编程实验中充分利用assert宏和panic函数,提高查找错误的效率。

+ +

公共库部分

+ +

l  libs/defs.h:包含一些无符号整型的缩写定义。

+ +

l  Libs/x86.h:一些用GNU C嵌入式汇编实现的C函数(由于使用了inline关键字,所以可以理解为宏)。

+ +

工具部分

+ +

l  Makefilefunction.mk:指导make完成整个软件项目的编译,清除等工作。

+ +

l  sign.c:一个C语言小程序,是辅助工具,用于生成一个符合规范的硬盘主引导扇区。

+ +

l  tools/vector.c:生成vectors.S,此文件包含了中断向量处理的统一实现。

+ +

 

+ +

编译方法

+ +

首先下载lab1.tar.bz2,然后解压lab1.tar.bz2。在lab1目录下执行make,可以生成ucore.img(生成于bin目录下)。ucore.img是一个包含了bootloaderOS的硬盘镜像,通过执行如下命令可在硬件虚拟环境 qemu中运行bootloaderOS

+ +

$ make qemu

+ +

    +

+ +

从机器启动到操作系统运行的过程

+ +

3.1  +BIOS启动过程

+ +

当计算机加电后,一般不直接执行操作系统,而是执行系统初始化软件完成基本IO初始化和引导加载功能。简单地说,系统初始化软件就是在操作系统内核运行之前运行的一段小软件。通过这段小软件,我们可以初始化硬件设备、建立系统的内存空间映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。最终引导加载程序把操作系统内核映像加载到RAM中,并将系统控制权传递给它。

+ +

对于绝大多数计算机系统而言,操作系统和应用软件是存放在磁盘(硬盘/软盘)、光盘、EPROMROMFlash等可在掉电后继续保存数据的存储介质上。计算机启动后,CPU一开始会到一个特定的地址开始执行指令,这个特定的地址存放了系统初始化软件,负责完成计算机基本的IO初始化,这是系统加电后运行的第一段软件代码。对于Intel 80386的体系结构而言,PC机中的系统初始化软件由BIOS +(Basic Input Output System,即基本输入/输出系统,其本质是一个固化在主板Flash/CMOS上的软件)和位于软盘/硬盘引导扇区中的OS +Boot Loader(在ucore中的bootasm.Sbootmain.c)一起组成。BIOS实际上是被固化在计算机ROM(只读存储器)芯片上的一个特殊的软件,为上层软件提供最底层的、最直接的硬件控制与支持。更形象地说,BIOS就是PC计算机硬件与上层软件程序之间的一个"桥梁",负责访问和控制硬件。

+ +

Intel 80386为例,计算机加电后,CPU从物理地址0xFFFFFFF0(由初始化的CSEIP确定,此时CSIP的值分别是0xF0000xFFF0))开始执行。在0xFFFFFFF0这里只是存放了一条跳转指令,通过跳转指令跳到BIOS例行程序起始点。BIOS做完计算机硬件自检和初始化后,会选择一个启动设备(例如软盘、硬盘、光盘等),并且读取该设备的第一扇区(即主引导扇区或启动扇区)到内存一个特定的地址0x7c00处,然后CPU控制权会转移到那个地址继续执行。至此BIOS的初始化工作做完了,进一步的工作交给了ucorebootloader

+ +

3.2  +bootloader启动过程

+ +

BIOS将通过读取硬盘主引导扇区到内存,并转跳到对应内存中的位置执行bootloaderbootloader完成的工作包括:

+ +

       +切换到保护模式,启用分段机制

+ +

       +读磁盘中ELF执行文件格式的ucore操作系统到内存

+ +

       +显示字符串信息

+ +

       +把控制权交给ucore操作系统

+ +

    对应其工作的实现文件在lab1中的boot目录下的三个文件asm.hbootasm.Sbootmain.c。下面从原理上介绍完成上述工作的计算机系统硬件和软件背景知识。

+ +

3.2.1 保护模式和分段机制

+ +

为何要了解Intel +80386的保护模式和分段机制?首先,我们知道Intel +80386只有在进入保护模式后,才能充分发挥其强大的功能,提供更好的保护机制和更大的寻址空间,否则仅仅是一个快速的8086而已。没有一定的保护机制,任何一个应用软件都可以任意访问所有的计算机资源,这样也就无从谈起操作系统设计了。且Intel +80386的分段机制一直存在,无法屏蔽或避免。其次,在我们的bootloader设计中,涉及到了从实模式到保护模式的处理,我们的操作系统功能(比如分页机制)是建立在Intel +80386的保护模式上来设计的。如果我们不了解保护模式和分段机制,则我们面向Intel +80386体系结构的操作系统设计实际上是建立在一个空中楼阁之上。

+ +

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +
(1)    实模式
+ +

bootloader接手BIOS的工作后,当前的PC系统处于实模式(16位模式)运行状态,在这种状态下软件可访问的物理内存空间不能超过1MB,且无法发挥Intel 80386以上级别的32CPU4GB内存管理能力。

+ +

实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,操作系统和用户程序并没有区别对待,而且每一个指针都是指向实际的物理地址。这样,用户程序的一个指针如果指向了操作系统区域或其他用户程序区域,并修改了内容,那么其后果就很可能是灾难性的。通过修改A20地址线可以完成从实模式到保护模式的转换。有关A20的进一步信息可参考附录“关于A20 Gate”。

+ +
(2)    保护模式
+ +

只有在保护模式下,80386的全部32根地址线有效,可寻址高达4G字节的线性地址空间和物理地址空间,可访问64TB(有2^14个段,每个段最大空间为2^32字节)的逻辑地址空间,可采用分段存储管理机制和分页存储管理机制。这不仅为存储共享和保护提供了硬件支持,而且为实现虚拟存储提供了硬件支持。通过提供4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码数据的安全及任务的隔离。

+ +
(3)    分段存储管理机制
+ +

只有在保护模式下才能使用分段存储管理机制。分段机制将内存划分成以起始地址和长度限制这两个二维参数表示的内存块,这些内存块就称之为段(Segment)。编译器把源程序编译成执行程序时用到的代码段、数据段、堆和栈等概念在这里可以与段联系起来,二者在含义上是一致的。

+ +

分段机涉及4个关键内容:逻辑地址、段描述符(描述段的属性)、段描述符表(包含多个段描述符的数组)、段选择子(段寄存器,用于定位段描述符表中表项的索引)。转换逻辑地址(Logical +Address,应用程序员看到的地址)到物理地址(Physical +Address, 实际的物理内存地址)分以下两步:

+ +

1.      +分段地址转换:CPU把逻辑地址(由段选择子selector和段偏移offset组成)中的段选择子的内容作为段描述符表的索引,找到表中对应的段描述符,然后把段描述符中保存的段基址加上段偏移值,形成线性地址(Linear +Address)。如果不启动分页存储管理机制,则线性地址等于物理地址。

+ +

2.      +分页地址转换,这一步中把线性地址转换为物理地址。(注意:这一步是可选的,由操作系统决定是否需要。在后续试验中会涉及。

+ +

 上述转换过程对于应用程序员来说是不可见的。线性地址空间由一维的线性地址构成,线性地址空间和物理地址空间对等。线性地址32位长,线性地址空间容量为4G字节。分段地址转换的基本过程如下图所示。

+ +

+ +

1 分段地址转换基本过程

+ +

 

+ +

分段存储管理机制需要在启动保护模式的前提下建立。从上图可以看出,为了使得分段存储管理机制正常运行,需要建立好段描述符和段描述符表(参看bootasm.Smmu.hpmm.c)。

+ +

 

+ +

段描述符

+ +

在分段存储管理机制的保护模式下,每个段由如下三个参数进行定义:段基地址(Base +Address)、段界限(Limit)和段属性(Attributes)。在ucore中的kern/mm/mmu.h中的struct segdesc 数据结构中有具体的定义。

+ +

l  段基地址:规定线性地址空间中段的起始地址。在80386保护模式下,段基地址长32位。因为基地址长度与寻址地址的长度相同,所以任何一个段都可以从32位线性地址空间中的任何一个字节开始,而不象实方式下规定的边界必须被16整除。

+ +

l  段界限:规定段的大小。在80386保护模式下,段界限用20位表示,而且段界限可以是以字节为单位或以4K字节为单位。

+ +

l  段属性:确定段的各种性质。

+ +

u  段属性中的粒度位(Granularity),用符号G标记。G=0表示段界限以字节位位单位,20位的界限可表示的范围是1字节至1M字节,增量为1字节;G=1表示段界限以4K字节为单位,于是20位的界限可表示的范围是4K字节至4G字节,增量为4K字节。

+ +

u        类型(TYPE):用于区别不同类型的描述符。可表示所描述的段是代码段还是数据段,所描述的段是否可读//执行,段的扩展方向等。

+ +

u  描述符特权级(Descriptor Privilege Level)(DPL):用来实现保护机制。

+ +

u  段存在位(Segment-Present bit):如果这一位为0,则此描述符为非法的,不能被用来实现地址转换。如果一个非法描述符被加载进一个段寄存器,处理器会立即产生异常。图5-4显示了当存在位为0时,描述符的格式。操作系统可以任意的使用被标识为可用(AVAILABLE)的位。

+ +

u  已访问位(Accessed bit):当处理器访问该段(当一个指向该段描述符的选择子被加载进一个段寄存器)时,将自动设置访问位。操作系统可清除该位。

+ +

 

+ +

   +上述参数通过段描述符来表示,段描述符的结构如下图所示:

+ +

 

+ +

+ +

2 段描述符结构

+ +

 

+ +

全局描述符表

+ +

全局描述符表的是一个保存多个段描述符的数组,其起始地址保存在全局描述符表寄存器GDTR中。GDTR48位,其中高32位为基地址,低16位为段界限。由于GDT 不能有GDT本身之内的描述符进行描述定义,所以处理器采用GDTRGDT这一特殊的系统段。注意,全部描述符表中第一个段描述符设定为空段描述符。GDTR中的段界限以字节为单位。对于含有N个描述符的描述符表的段界限通常可设为8*N-1。在ucore中的boot/bootasm.S中的gdt地址处和kern/mm/pmm.c中的全局变量数组gdt[]分别有基于汇编语言和C语言的全局描述符表的具体实现。

+ +

 

+ +

选择子

+ +

线性地址部分的选择子是用来选择哪个描述符表和在该表中索引一个描述符的。选择子可以做为指针变量的一部分,从而对应用程序员是可见的,但是一般是由连接加载器来设置的。选择子的格式如下图所示:

+ +

说明: 111298425979212

+ +

3 段选择子结构

+ +

 

+ +

l  +索引(Index:在描述符表中从8192个描述符中选择一个描述符。处理器自动将这个索引值乘以8(描述符的长度),再加上描述符表的基址来索引描述符表,从而选出一个合适的描述符。

+ +

l  +表指示位(Table +IndicatorTI:选择应该访问哪一个描述符表。0代表应该访问全局描述符表(GDT),1代表应该访问局部描述符表(LDT)。

+ +

l  +请求特权级(Requested +Privilege LevelRPL:保护机制,在后续试验中会进一步讲解。

+ +

 

+ +

       全局描述符表的第一项是不能被CPU使用,所以当一个段选择子的索引(Index)部分和表指示位(Table Indicator)都为0的时(即段选择子指向全局描述符表的第一项时),可以当做一个空的选择子(见mmu.h中的SEG_NULL)。当一个段寄存器被加载一个空选择子时,处理器并不会产生一个异常。但是,当用一个空选择子去访问内存时,则会产生异常。

+ +
(4)    保护模式下的特权级
+ +

在保护模式下,特权级总共有4个,编号从0(最高特权)到3(最低特权)。有3种主要的资源受到保护:内存,I/O端口以及执行特殊机器指令的能力。在任一时刻,x86 CPU都是在一个特定的特权级下运行的,从而决定了代码可以做什么,不可以做什么。这些特权级经常被称为为保护环(protection +ring),最内的环(ring 0)对应于最高特权0,最外面的环(ring 3)一般给应用程序使用,对应最低特权3。在ucore中,CPU只用到其中的2个特权级:0(内核态)和3(用户态)。

+ +

有大约15条机器指令被CPU限制只能在内核态执行,这些机器指令如果被用户模式的程序所使用,就会颠覆保护模式的保护机制并引起混乱,所以它们被保留给操作系统内核使用。如果企图在ring +0以外运行这些指令,就会导致一个一般保护异常(general-protection +exception)。对内存和I/O端口的访问也受类似的特权级限制。

+ +

数据段选择子的整个内容可由程序直接加载到各个段寄存器(如SSDS等)当中。这些内容里包含了请求特权级(Requested Privilege +Level,简称RPL)字段。然而,代码段寄存器(CS)的内容不能由装载指令(如MOV)直接设置,而只能被那些会改变程序执行顺序的指令(如JMPINTCALL)间接地设置。而且CS拥有一个由CPU维护的当前特权级字段(Current Privilege Level,简称CPL)。二者结构如下图所示:

+ +

 

+ +

+ +

4 DSCS的结构图

+ +

代码段寄存器中的CPL字段(2位)的值总是等于CPU的当前特权级,所以只要看一眼CS中的CPL,你就可以知道此刻的特权级了。

+ +

CPU会在两个关键点上保护内存:当一个段选择符被加载时,以及,当通过线性地址访问一个内存页时。因此,保护也反映在内存地址转换的过程之中,既包括分段又包括分页。当一个数据段选择符被加载时,就会发生下述的检测过程:

+ +

+ +

5 内存访问特权级检查过程

+ +

 

+ +

因为越高的数值代表越低的特权,上图中的MAX()用于选择CPLRPL中特权最低的一个,并与描述符特权级(Descriptor Privilege +Level,简称DPL)比较。如果DPL的值大于等于它,那么这个访问可正常进行了。RPL背后的设计思想是:允许内核代码加载特权较低的段。比如,你可以使用RPL=3的段描述符来确保给定的操作所使用的段可以在用户模式中访问。但堆栈段寄存器是个例外,它要求CPLRPLDPL3个值必须完全一致,才可以被加载。下面再总结一下CPLRPLDPL

+ +

l  CPL:当前特权级(Current Privilege Level) 保存在CS段寄存器(选择子)的最低两位,CPL就是当前活动代码段的特权级,并且它定义了当前所执行程序的特权级别)

+ +

l  DPL:描述符特权(Descriptor Privilege +Level 存储在段描述符中的权限位,用于描述对应段所属的特权等级,也就是段本身真正的特权级。

+ +

l  RPL:请求特权级RPL(Request Privilege +Level) RPL保存在选择子的最低两位。RPL说明的是进程对段访问的请求权限,意思是当前进程想要的请求权限。RPL的值由程序员自己来自由的设置,并不一定RPL>=CPL,但是当RPL<CPL时,实际起作用的就是CPL了,因为访问时的特权检查是判断:max(RPL,CPL)<=DPL是否成立,所以RPL可以看成是每次访问时的附加限制,RPL=0时附加限制最小,RPL=3时附加限制最大。

+ +

3.2.2地址空间

+ +

分段机制涉及4个关键内容:逻辑地址(Logical Address,应用程序员看到的地址,在操作系统原理上称为虚拟地址,以后提到虚拟地址就是指逻辑地址)、物理地址(Physical +Address, 实际的物理内存地址)、段描述符表(包含多个段描述符的数组)、段描述符(描述段的属性,及段描述符表这个数组中的数组元素)、段选择子(即段寄存器中的值,用于定位段描述符表中段描述符表项的索引)

+ +
(1)    逻辑地址空间
+ +

从应用程序的角度看,逻辑地址空间就是应用程序员编程所用到的地址空间,比如下面的程序片段:

+ +

int val=100;

+ +

int * point=&val;

+ +

其中指针变量point中存储的即是一个逻辑地址。在基于80386的计算机系统中,逻辑地址有一个16位的段寄存器(也称段选择子,段选择子)和一个32位的偏移量构成。

+ +
(2)    物理地址空间
+ +

从操作系统的角度看,CPU、内存硬件(通常说的内存条)和各种外设是它主要管理的硬件资源而内存硬件和外设分布在物理地址空间中。物理地址空间就是一个大数组CPU通过索引(物理地址)来访问这个大数组中的内容。物理地址是指CPU提交到内存总线上用于访问计算机内存和外设的最终地址。

+ +

物理地址空间的大小取决于CPU实现的物理地址位数,在基于80386的计算机系统中,CPU的物理地址空间为4GB,如果计算机系统实际上有1GB物理内存(即我们通常说的内存条),而其他硬件设备的IO寄存器映射到起始物理地址为3GB256MB大小的地址空间,则该计算机系统的物理地址空间如下所示:

+ +
+ + + + + +
+

+------------------+  + <- 0xFFFFFFFF (4GB)

+

|     无效空间     |

+

|                  |

+

+------------------+  <- + addr:3G+256M

+

|     256MB        |

+

| IO外设地址空间   |

+

|                  |

+

+------------------+  <- + 0xC0000000(3GB)

+

|                  |

+

/\/\/\/\/\/\/\/\/\/\

+

 

+

/\/\/\/\/\/\/\/\/\/\

+

|     无效空间     |

+

+------------------+  <- + 0x40000000(1GB)

+

|                  |

+

实际有效内存    |

+

|                  |

+

+------------------+  <- + 0x00100000 (1MB)

+

|     BIOS ROM     |

+

+------------------+  <- + 0x000F0000 (960KB)

+

|  16-bit devices, |

+

|  expansion ROMs  |

+

+------------------+  <- + 0x000C0000 (768KB)

+

|   VGA Display    |

+

+------------------+  <- + 0x000A0000 (640KB)

+

|                  |

+

|    Low Memory    |

+

|                  |

+

+------------------+  <- + 0x00000000

+
+ +
+ +

6 X86计算机系统的物理地址空间

+ +
(3)    线性地址空间
+ +

一台计算机只有一个物理地址空间,但在操作系统的管理下,每个程序都认为自己独占整个计算机的物理地址空间。为了让多个程序能够有效地相互隔离和使用物理地址空间,引入线性地址空间(也称虚拟地址空间)的概念。线性地址空间的大小取决于CPU实现的线性地址位数,在基于80386的计算机系统中,CPU的线性地址空间为4GB。线性地址空间会被映射到某一部分或整个物理地址空间,并通过索引(线性地址)来访问其中的内容。线性地址又称虚拟地址,是进行逻辑地址转换后形成的地址索引,用于寻址线性地址空间。但CPU未启动分页机制时,线性地址等于物理地址;当CPU启动分页机制时,线性地址还需经过分页地址转换形成物理地址后,CPU才能访问内存硬件和外设。三种地址的关系如下所示:

+ +

        +启动分段机制,未启动分页机制:逻辑地址--> (分段地址转换) -->线性地址==物理地址

+ +

        +启动分段和分页机制:逻辑地址--> (分段地址转换) -->线性地址-->分页地址转换) +-->物理地址

+ +

 

+ +

在操作系统的管理下,采用灵活的内存管理机制,在只有一个物理地址空间的情况下,可以存在多个线性地址空间。一个典型的线性地址空间

+ +

3.2.3 硬盘访问概述

+ +

    +bootloaderCPU进入保护模式后,下一步的工作就是从硬盘上加载并运行OS。考虑到实现的简单性,bootloader的访问硬盘都是LBA模式的PIOProgram IO)方式,即所有的IO操作是通过CPU访问硬盘的IO地址寄存器完成。

+ +

一般主板有2IDE通道,每个通道可以接2IDE硬盘。访问第一个硬盘的扇区可设置IO地址寄存器0x1f0-0x1f7实现的,具体参数见下表。一般第一个IDE通道通过访问IO地址0x1f0-0x1f7来实现,第二个IDE通道通过访问0x170-0x17f实现。每个通道的主从盘的选择通过第6IO偏移地址寄存器来设置。

+ +

表一 磁盘IO地址和对应功能

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

IO地址

+
+

功能

+
+

0x1f0

+
+

读数据,当0x1f7不为忙状态时,可以读。

+
+

0x1f2

+
+

要读写的扇区数,每次读写前,你需要表明你要读写几个扇区。最小是1个扇区

+
+

0x1f3

+
+

如果是LBA模式,就是LBA参数的0-7

+
+

0x1f4

+
+

如果是LBA模式,就是LBA参数的8-15

+
+

0x1f5

+
+

如果是LBA模式,就是LBA参数的16-23

+
+

0x1f6

+
+

0~3位:如果是LBA模式就是24-27     4位:为0主盘;为1从盘

+

6位:为1=LBA模式;0 = CHS模式        7位和第5位必须为1

+
+

0x1f7

+
+

状态和命令寄存器。操作时先给命令,再读取,如果不是忙状态就从0x1f0端口读数据

+
+ +
+ +

当前 硬盘数据是储存到硬盘扇区中,一个扇区大小为512字节。读一个扇区的流程(可参看boot/bootmain.c中的readsect函数实现)大致如下:

+ +

1.      等待磁盘准备好

+ +

2.      发出读取扇区的命令

+ +

3.      等待磁盘准备好

+ +

4.      把磁盘扇区数据读到指定内存

+ +

3.2.4 ELF文件格式概述

+ +

ELF(Executable and linking +format)文件格式是Linux系统下的一种常用目标文件(object +file)格式,有三种主要类型:

+ +

l  用于执行的可执行文件(executable +file),用于提供程序的进程映像,加载的内存执行。 这也是本实验的OS文件类型。

+ +

l  用于连接的可重定位文件(relocatable +file),可与其它目标文件一起创建可执行文件和共享目标文件。

+ +

l  共享目标文件(shared +object file),连接器可将它与其它可重定位文件和共享目标文件连接成其它的目标文件,动态连接器又可将它与可执行文件和其它共享目标文件结合起来创建一个进程映像。

+ +

                                                                                                          

+ +

这里只分析与本实验相关的ELF可执行文件类型。ELF header在文件开始处描述了整个文件的组织。ELF的文件头包含整个执行文件的控制结构,其定义在elf.h中:

+ +

 

+ + + + + +
+

struct elfhdr {

+

  uint magic;  // must equal ELF_MAGIC

+

  + uchar elf[12];

+

  + ushort type;

+

  + ushort machine;

+

  + uint version;

+

  + uint entry;  // 程序入口的虚拟地址

+

  + uint phoff;  // program header 表的位置偏移

+

  + uint shoff;

+

  + uint flags;

+

  + ushort ehsize;

+

  + ushort phentsize;

+

  + ushort phnum; //program header表中的入口数目

+

  + ushort shentsize;

+

  + ushort shnum;

+

  + ushort shstrndx;

+

};

+
+ +

 

+ +

program header描述与程序执行直接相关的目标文件结构信息,用来在文件中定位各个段的映像,同时包含其他一些用来为程序创建进程映像所必需的信息。可执行文件的程序头部是一个program +header结构的数组, 每个结构描述了一个段或者系统准备程序执行所必需的其它信息。目标文件的 +“包含一个或者多个节区section ,也就是段内容(Segment Contents。程序头部仅对于可执行文件和共享目标文件有意义。可执行目标文件在ELF头部的e_phentsizee_phnum成员中给出其自身程序头部的大小。程序头部的数据结构如下表所示:

+ +

 

+ + + + + +
+

struct proghdr {

+

  + uint type;   // 段类型

+

  + uint offset;  // 段相对文件头的偏移值

+

  + uint va;     // 段的第一个字节将被放到内存中的虚拟地址

+

  + uint pa;  

+

  + uint filesz;

+

  + uint memsz;  // 段在内存映像中占用的字节数

+

  + uint flags;

+

  + uint align;

+

};

+
+ +

    +根据elfhdrproghdr的结构描述,bootloader就可以完成对ELF格式的ucore操作系统的加载过程(参见boot/bootmain.c中的bootmain函数)。

+ +

 

+ +

[补充材料]

+ +

Link addr& Load addr

+ +

Link Address是指编译器指定代码和数据所需要放置的内存地址,由链接器配置。Load Address是指程序被实际加载到内存的位置(由程序加载器ld配置)。一般由可执行文件结构信息和加载器可保证这两个地址相同。Link AddrLoadAddr不同会导致:

+ +

l  直接跳转位置错误

+ +

l  直接内存访问(只读数据区或bss等直接地址访问)错误

+ +

l  堆和栈等的使用不受影响,但是可能会覆盖程序、数据区域

+ +

注意:也存在Link地址和Load地址不一样的情况(例如:动态链接库)。

+ +

 

+ +

3.3  +操作系统启动过程

+ +

bootloader通过读取硬盘扇区把ucore在系统加载到内存后,就转跳到ucore操作系统在内存中的入口位置(kern/init.c中的kern_init函数的起始地址),这样ucore就接管了整个控制权。当前的ucore功能很简单,只完成基本的内存管理和外设中断管理。ucore主要完成的工作包括:

+ +

       +初始化终端;  

+ +

       +显示字符串;

+ +

       +显示堆栈中的多层函数调用关系;

+ +

       +切换到保护模式,启用分段机制;

+ +

       +初始化中断控制器,设置中断描述符表,初始化时钟中断,使能整个系统的中断机制;

+ +

       +执行while1)死循环。

+ +

    +以后的实验中会大量涉及各个函数直接的调用关系,以及由于中断处理导致的异步现象,可能对大家实现操作系统和改正其中的错误有很大影响。而理解好函数调用关系的建立机制和中断处理机制,对后续实验会有很大帮助。下面就练习5涉及的函数栈调用关系和练习6中的中断机制的建立进行阐述。

+ +

3.3.1 函数堆栈

+ +

栈是一个很重要的编程概念(编译课和程序设计课都讲过相关内容),与编译器和编程语言有紧密的联系。理解调用栈最重要的两点是:栈的结构,EBP寄存器的作用。一个函数调用动作可分解为:零到多个PUSH指令(用于参数入栈),一个CALL指令。CALL指令内部其实还暗含了一个将返回地址(即CALL指令下一条指令的地址)压栈的动作(由硬件完成)。几乎所有本地编译器都会在每个函数体之前插入类似如下的汇编指令:

+ +

pushl   %ebp

+ +

movl   %esp , %ebp

+ +

这样在程序执行到一个函数的实际指令前,已经有以下数据顺序入栈:参数、返回地址、ebp寄存器。由此得到类似如下的栈结构(参数入栈顺序跟调用方式有关,这里以C语言默认的CDECL为例):

+ +

 

+ +
+ + + + + +
+

+| (栈底方向  | 高位地址

+

 | + .................... |

+

 | .................... |

+

 | 参数3    + |

+

 | 参数2    + |

+

 | 参数1    + |

+

 | 返回地址  |

+

| 上一层[ebp] | <-------- [ebp]

+

|局部变量  |  低位地址

+
+ +
+ +

7 函数调用栈结构

+ +

 

+ +

这两条汇编指令的含义是:首先将ebp寄存器入栈,然后将栈顶指针esp赋值给ebp“mov ebp esp”这条指令表面上看是用esp覆盖ebp原来的值,其实不然。因为给ebp赋值之前,原ebp值已经被压栈(位于栈顶),而新的ebp又恰恰指向栈顶。此时ebp寄存器就已经处于一个非常重要的地位,该寄存器中存储着栈中的一个地址(原ebp入栈后的栈顶),从该地址为基准,向上(栈底方向)能获取返回地址、参数值,向下(栈顶方向)能获取函数局部变量值,而该地址处又存储着上一层函数调用时的ebp值。

+ +

一般而言,ss:[ebp+4]处为返回地址,ss:[ebp+8]处为第一个参数值(最后一个入栈的参数值,此处假设其占用4字节内存),ss:[ebp-4]处为第一个局部变量,ss:[ebp]处为上一层ebp值。由于ebp中的地址处总是上一层函数调用时的ebp,而在每一层函数调用中,都能通过当时的ebp向上(栈底方向)能获取返回地址、参数值,向下(栈顶方向)能获取函数局部变量值。如此形成递归,直至到达栈底。这就是函数调用栈。

+ +

提示:练习5的正确实现取决于对这一小节的正确理解和掌握。

+ +

3.3.2中断与异常

+ +

操作系统需要对计算机系统中的各种外设进行管理,这就需要CPU和外设能够相互通信才行。一般外设的速度远慢于CPU的速度。如果让操作系统通过CPU“主动关心外设的事件,即采用通常的轮询(polling)机制,则太浪费CPU资源了。所以需要操作系统和CPU能够一起提供某种机制,让外设在需要操作系统处理外设相关事件的时候,能够主动通知操作系统,即打断操作系统和应用的正常执行,让操作系统完成外设的相关处理,然后在恢复操作系统和应用的正常执行。在操作系统中,这种机制称为中断机制。中断机制给操作系统提供了处理意外情况的能力,同时它也是实现进程/线程抢占式调度的一个重要基石。但中断的引入导致了对操作系统的理解更加困难。

+ +

在操作系统中,有三种特殊的中断事件。由CPU外部设备引起的外部事件如I/O中断、时钟中断、控制台中断等是异步产生的(即产生的时刻不确定),与CPU的执行无关,我们称之为异步中断(asynchronous +interrupt)也称外部中断,简称中断(interrupt)。而把在CPU执行指令期间检测到不正常的或非法的条件(如除零错、地址访问越界)所引起的内部事件称作同步中断(synchronous +interrupt),也称内部中断,简称异常(exception)。把在程序中使用请求系统服务的系统调用而引发的事件,称作陷入中断(trap +interrupt),也称软中断(soft +interrupt),系统调用(system +call)简称trap。在后续试验中会进一步讲解系统调用。

+ +

本实验只描述保护模式下的处理过程。当CPU收到中断(通过8259A完成,有关8259A的信息请看附录A)或者异常的事件时,它会暂停执行当前的程序或任务,通过一定的机制跳转到负责处理这个信号的相关处理例程中,在完成对这个事件的处理后再跳回到刚才被打断的程序或任务中。中断向量和中断服务例程的对应关系主要是由IDT(中断描述符表)负责。操作系统在IDT中设置好各种中断向量对应的中断描述符,留待CPU在产生中断后查询对应中断服务例程的起始地址。而IDT本身的起始地址保存在idtr寄存器中。

+ +
(1)    中断描述符表(Interrupt +Descriptor Table
+ +

中断描述符表把每个中断或异常编号和一个指向中断服务例程的描述符联系起来。同GDT一样,IDT是一个8字节的描述符数组,但IDT的第一项可以包含一个描述符。CPU把中断(异常)号乘以8做为IDT的索引。IDT可以位于内存的任意位置,CPU通过IDT寄存器(IDTR)的内容来寻址IDT的起始地址。指令LIDTSIDT用来操作IDTR。两条指令都有一个显示的操作数:一个6字节表示的内存地址。指令的含义如下:

+ +

l  +LIDTLoad IDT Register)指令:使用一个包含线性地址基址和界限的内存操作数来加载IDT。操作系统创建IDT时需要执行它来设定IDT的起始地址。这条指令只能在特权级0执行。(可参见libs/x86.h中的lidt函数实现,其实就是一条汇编指令)

+ +

l  +SIDTStore IDT Register)指令:拷贝IDTR的基址和界限部分到一个内存地址。这条指令可以在任意特权级执行。

+ +

 

+ +

IDTIDTR寄存器的结构和关系如下图所示:

+ +

+ +

8 IDTIDTR寄存器的结构和关系图

+ +

在保护模式下,最多会存在256Interrupt/Exception Vectors。范围[031]内的32个向量被异常ExceptionNMI使用,但当前并非所有这32个向量都已经被使用,有几个当前没有被使用的,请不要擅自使用它们,它们被保留,以备将来可能增加新的Exception。范围[32255]内的向量被保留给用户定义的InterruptsIntel没有定义,也没有保留这些Interrupts。用户可以将它们用作外部I/O设备中断(8259A IRQ),或者系统调用(System Call Software Interrupts)等。 

+ +
(2)    IDT gate descriptors
+ +

Interrupts/Exceptions应该使用Interrupt GateTrap Gate,它们之间的唯一区别就是:当调用Interrupt Gate时,Interrupt会被CPU自动禁止;而调用Trap Gate时,CPU则不会去禁止或打开中断,而是保留它原来的样子。在IDT中,可以包含如下3种类型的Descriptor

+ +

·       +Task-gate descriptor (这里没有使用)

+ +

·       +Interrupt-gate descriptor (中断方式用到)

+ +

·       +Trap-gate descriptor(系统调用用到)

+ +

下图图显示了80386的任务门描述符、中断门描述符、陷阱门描述符的格式:

+ +

+ +

9 X86的各种门的格式

+ +

可参见kern/mm/mmu.h中的struct gatedesc数据结构对中断描述符的具体定义。

+ +
(3)    中断处理中硬件负责完成的工作
+ +

中断服务例程包括具体负责处理中断(异常)的代码是操作系统的重要组成部分。需要注意区别的是,有两个过程由硬件完成:

+ +

l  硬件中断处理过程1(起始):从CPU收到中断事件后,打断当前程序或任务的执行,根据某种机制跳转到中断服务例程去执行的过程。其具体流程如下:

+ +

1)      CPU在执行完当前程序的每一条指令后,都会去确认在执行刚才的指令过程中中断控制器(如:8259A)是否发送中断请求过来,如果有那么CPU就会在相应的时钟脉冲到来时从总线上读取中断请求对应的中断向量;

+ +

2)       CPU根据得到的中断向量(以此为索引)到IDT中找到该向量对应的中断描述符,中断描述符里保存着中断服务例程的段选择子;

+ +

3)      CPU使用IDT查到的中断服务例程的段选择子从GDT中取得相应的段描述符,段描述符里保存了中断服务例程的段基址和属性信息,此时CPU就得到了中断服务例程的起始地址,并跳转到该地址;

+ +

4)      CPU会根据CPL和中断服务例程的段描述符的DPL信息确认是否发生了特权级的转换。比如当前程序正运行在用户态,而中断程序是运行在内核态的,则意味着发生了特权级的转换,这时CPU会从当前程序的TSS信息(该信息在内存中的起始地址存在TR寄存器中)里取得该程序的内核栈地址,即包括内核态的ssesp的值,并立即将系统当前使用的栈切换成新的内核栈。这个栈就是即将运行的中断服务程序要使用的栈。紧接着就将当前程序使用的用户态的ssesp压到新的内核栈中保存起来;

+ +

5)      CPU需要开始保存当前被打断的程序的现场(即一些寄存器的值),以便于将来恢复被打断的程序继续执行。这需要利用内核栈来保存相关现场信息,即依次压入当前被打断程序使用的eflagscseiperrorCode(如果是有错误码的异常)信息;

+ +

6)        CPU利用中断服务例程的段描述符将其第一条指令的地址加载到cseip寄存器中,开始执行中断服务例程。这意味着先前的程序被暂停执行,中断服务程序正式开始工作。

+ +

l  硬件中断处理过程2(结束):每个中断服务例程在有中断处理工作完成后需要通过iret(或iretd)指令恢复被打断的程序的执行。CPU执行IRET指令的具体过程如下:

+ +

1)      程序执行这条iret指令时,首先会从内核栈里弹出先前保存的被打断的程序的现场信息,即eflagscseip重新开始执行;

+ +

2)      如果存在特权级转换(从内核态转换到用户态),则还需要从内核栈中弹出用户态栈的ssesp,这样也意味着栈也被切换回原先使用的用户态的栈了;

+ +

3)      如果此次处理的是带有错误码(errorCode)的异常,CPU在恢复先前程序的现场时,并不会弹出errorCode。这一步需要通过软件完成,即要求相关的中断服务例程在调用iret返回之前添加出栈代码主动弹出errorCode

+ +

 

+ +

下图显示了从中断向量到GDT中相应中断服务程序起始位置的定位方式:

+ +

+ +

10 中断向量与中断服务例程起始地址的关系

+ +
(4)    中断产生后的堆栈栈变化
+ +

下图显示了给出相同特权级和不同特权级情况下中断产生后的堆栈栈变化示意图:

+ +

 

+ +

+ +

11 相同特权级和不同特权级情况下中断产生后的堆栈栈变化示意图

+ +

 

+ +
(5)    +中断处理的特权级转换
+ +

中断处理得特权级转换是通过门描述符gate descriptor)和相关指令来完成的。一个门描述符就是一个系统类型的段描述符,一共有4个子类型:调用门描述符(call-gate descriptor),中断门描述符(interrupt-gate +descriptor),陷阱门描述符(trap-gate descriptor)和任务门描述符(task-gate +descriptor)。与中断处理相关的是中断门描述符和陷阱门描述符。这些门描述符被存储在中断描述符表(Interrupt Descriptor Table,简称IDT)当中。CPU把中断向量作为IDT表项的索引,用来指出当中断发生时使用哪一个门描述符来处理中断。中断门描述符和陷阱门描述符几乎是一样的。中断发生时实施特权检查的过程如下图所示:

+ +

说明: 161298425979212

+ +

12 中断发生时实施特权检查的过程

+ +

 

+ +

门中的DPL和段选择符一起控制着访问,同时,段选择符结合偏移量(Offset)指出了中断处理例程的入口点。内核一般在门描述符中填入内核代码段的段选择子。产生中断后,CPU一定不会将运行控制从高特权环转向低特权环,特权级必须要么保持不变(当操作系统内核自己被中断的时候),或被提升(当用户态程序被中断的时候)。无论哪一种情况,作为结果的CPL必须等于目的代码段的DPL。如果CPL发生了改变,一个堆栈切换操作(通过TSS完成)就会发生。如果中断是被用户态程序中的指令所触发的(比如软件执行INT n生产的中断),还会增加一个额外的检查:门的DPL必须具有与CPL相同或更低的特权。这就防止了用户代码随意触发中断。如果这些检查失败,会产生一个一般保护异常(general-protection +exception)。

+ +

3.3.3 lab1中对中断的处理实现

+ +

(1)    +外设基本初始化设置

+ +

Lab1实现了中断初始化和对键盘、串口、时钟外设进行中断处理。串口的初始化函数serial_init(位于/kern/driver/console.c)中涉及中断初始化工作的很简单:

+ + + + + +
+

......

+

// + 使能串口1接收字符后产生中断

+

           outb(COM1 + + COM_IER, COM_IER_RDI);

+

......

+

// 通过中断控制器使能串口1中断

+

pic_enable(IRQ_COM1);

+
+ +

键盘的初始化函数kbd_init(位于kern/driver/console.c中)完成了对键盘的中断初始化工作,具体操作更加简单:

+ + + + + +
+

......

+

// 通过中断控制器使能键盘输入中断

+

pic_enable(IRQ_KBD);

+
+ +

时钟是一种有着特殊作用的外设,其作用并不仅仅是计时。在后续章节中将讲到,正是由于有了规律的时钟中断,才使得无论当前CPU运行在哪里,操作系统都可以在预先确定的时间点上获得CPU控制权。这样当一个应用程序运行了一定时间后,操作系统会通过时钟中断获得CPU控制权,并可把CPU资源让给更需要CPU的其他应用程序。时钟的初始化函数clock_init(位于kern/driver/clock.c中)完成了对时钟控制器8253的初始化:

+ + + + + +
+

  ......

+

//设置时钟每秒中断100

+

       outb(IO_TIMER1, + TIMER_DIV(100) % 256);

+

       outb(IO_TIMER1, + TIMER_DIV(100) / 256);

+

// 通过中断控制器使能时钟中断

+

       pic_enable(IRQ_TIMER);

+
+ +

(2)    +中断初始化设置

+ +

操作系统如果要正确处理各种不同的中断事件,就需要安排应该由哪个中断服务例程负责处理特定的中断事件。系统将所有的中断事件统一进行了编号(0255),这个编号称为中断向量。以ucore为例,操作系统内核启动以后,会通过 idt_init 函数初始化 idt (参见trap.c),而其中 vectors 中存储了中断处理程序的入口地址。vectors 定义在 vector.S 文件中,通过一个工具程序 vector.c 生成。其中仅有 System call 中断的权限为用户权限 (DPL_USER),即仅能够使用 int 0x30 指令。此外还有对 tickslock 的初始化,该锁用于处理时钟中断。

+ +

vector.S 文件通过 vectors.c 自动生成,其中定义了每个中断的入口程序和入口地址 (保存在 vectors 数组中)。其中,中断可以分成两类:一类是压入错误编码的 (error code),另一类不压入错误编码。对于第二类, vector.S 自动压入一个 0。此外,还会压入相应中断的中断号。在压入两个必要的参数之后,中断处理函数跳转到统一的入口 +alltraps 处。

+ +

(3)    +中断的处理过程

+ +

trap函数(定义在trap.c中)是对中断进行处理的过程,所有的中断在经过中断入口函数__alltraps预处理后 (定义在 trapasm.S) ,都会跳转到这里。在处理过程中,根据不同的中断类型,进行相应的处理。在相应的处理过程结束以后,trap将会返回,被中断的程序会继续运行。整个中断处理流程大致如下:

+ +

 

+ + + + + + +
+ + + + + +
+

trapasm.S

+

1)产生中断后,CPU 跳转到相应的中断处理入口 (vectors),并在桟中压入相应的 error_code(是否存在与异常号相关) 以及 trap_no,然后跳转到 alltraps 函数入口:

+

注意:此处的跳转是 jmp 过程

+ + + + + + + + + + + + + + + + + + + + + +
+

(high)

+
+

...

+
+

产生中断时的 eip →

+
+

eip

+
+

 

+
+

error_code

+
+

esp →

+
+

trap_no

+
+

(low)

+
+

...

+
+

 

+

在栈中保存当前被打断程序的 trapframe 结构(参见过程trapasm.S)。设置 kernel (内核) 的数据段寄存器,最后压入 esp,作为 trap 函数参数(struct + trapframe * tf) 并跳转到中断处理函数 trap 处:

+

注意:此时的跳转是 call 调用,会压入返回地址 eip,注意区分此处eiptrapframeeip

+

trapframe的结构为:

+ + + + + +
+

Struct trapframe

+

{

+

uint edi;

+

uint esi;

+

uint ebp;

+

+

ushort es;

+

ushort padding1;

+

ushort ds;

+

ushort padding2;

+

uint trapno;

+

uint err;

+

uint eip;

+

...

+

}

+
+

观察 trapframe 结构与中断产生过程的压桟顺序。

+

需要明确 pushal 指令都保存了哪些寄存器,按照什么顺序?

+

 

+

 

+

 

+

← trap_no

+

← trap_error
+ ←
产生中断处的 eip

+
+

进入 trap 函数,对中断进行相应的处理:

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

3)结束 trap 函数的执行后,通过 ret 指令返回到 alltraps 执行过程。

+

从栈中恢复所有寄存器的值。

+

调整 esp 的值:跳过栈中的 trap_no error_code,使esp指向中断返回 eip,通过 iret 调用恢复 cseflag以及 eip,继续执行。

+
+

trap.c

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

 

+

2)详细的中断分类以及处理流程如下:

+

根据中断号对不同的中断进行处理。其中,若中断号是IRQ_OFFSET + IRQ_TIMER 为时钟中断,则把ticks 将增加一。

+

若中断号是IRQ_OFFSET + IRQ_COM1 为串口中断,则显示收到的字符。

+

若中断号是IRQ_OFFSET + IRQ_KBD 为键盘中断,则显示收到的字符。

+

若为其他中断且产生在内核状态,则挂起系统;

+

 

+
+

+
+

 

+
+ +

13 ucore中断处理流程

+ +

至此,对整个lab1中的主要部分的背景知识和实现进行了阐述。请大家能够根据前面的练习要求完成所有的练习。

+ +

4 实验报告要求

+ +

从网站上下载lab1.tar.bz2后,解压得到代码目录lab1,完成实验。在实践中完成实验的各个练习。在报告中回答所有练习中提出的问题。实验报告文档命名为lab1-学生ID.odt or lab1-学生ID.txt。推荐用txt格式,即基本文本格式。对于lab1中编程任务,完成编写之后,在lab1目录下执行make handin任务,即会自动生成lab1-handin.tar.gz文件。建立一个目录,名字为lab1_result,将实验报告文档和之前生成的handin文件放在该目录下。然后用tar软件压缩打包此目录,并命名为lab1-学生ID.tar.bz2(在lab1_result的上层目录下执行“tar jcf lab1-学生ID.tar.bz2 lab1_result “即可)。最后请一定提前或按时提交到网络学堂上。

+ +

注意有LAB1的注释,代码中所有需要完成的地方challenge除外)都有LAB1”和“YOUR CODE的注释,请在提交时特别注意保持注释,并将YOUR CODE替换为自己的学号,并且将所有标有对应注释的部分填上正确的代码。

+ +

 

+ +

附录“关于A20 Gate

+ +

【参考“关于A20 +Gate http://hengch.blog.163.com/blog/static/107800672009013104623747/ +

+ +

【参考“百度文库 激活A20地址线详解” http://wenku.baidu.com/view/d6efe68fcc22bcd126ff0c00.html

+ +

Intel早期的8086 +CPU提供了20根地址线,可寻址空间范围即0~2^20(00000H~FFFFFH) 1MB内存空间。但8086的数据处理位宽位16位,无法直接寻址1MB内存空间,所以8086提供了段地址加偏移地址的地址转换机制。PC机的寻址结构是segment:offsetsegmentoffset都是16位的寄存器,最大值是0ffffh,换算成物理地址的计算方法是把segment左移4位,再加上offset,所以segment:offset所能表达的寻址空间最大应为0ffff0h + 0ffffh = 10ffefh(前面的0ffffhsegment=0ffffh并向左移动4位的结果,后面的0ffffh是可能的最大offset),这个计算出的10ffefh是多大呢?大约是1088KB,就是说,segment:offset的地址表示能力,超过了20位地址线的物理寻址能力。所以当寻址到超过1MB的内存时,会发生回卷(不会发生异常)。但下一代的基于Intel 80286 CPUPC AT计算机系统提供了24根地址线,这样CPU的寻址范围变为 2^24=16M,同时也提供了保护模式,可以访问到1MB以上的内存了,此时如果遇到寻址超过1MB”的情况,系统不会再回卷了,这就造成了向下不兼容。为了保持完全的向下兼容性,IBM决定在PC AT计算机系统上加个硬件逻辑,来模仿以上的回绕特征,于是出现了A20 Gate。他们的方法就是把A20地址线控制和键盘控制器的一个输出进行AND操作,这样来控制A20地址线的打开(使能)和关闭(屏蔽\禁止)。一开始时A20地址线控制是被屏蔽的(总为0),直到系统软件通过一定的IO操作去打开它(参看bootasm.S)。很显然,在实模式下要访问高端内存区,这个开关必须打开,在保护模式下,由于使用32位地址线,如果A20恒等于0,那么系统只能访问奇数兆的内存,即只能访问0--1M2-3M4-5M......,这显然是不行的,所以在保护模式下,这个开关也必须打开。

+ +

A20 地址线控制禁止时,则程序就像在8086中运行,1MB以上的地是不可访问的。在保护模式下A20地址线控制是要打开的。为了使能所有地址位的寻址能力,必须向键盘控制器8042发送一个命令。键盘控制器8042将会将它的的某个输出引脚的输出置高电平,作为 A20 地址线控制的输入。一旦设置成功之后,内存将不会再被绕回(memory +wrapping),这样我们就可以寻址整个 +286 16M 内存,或者是寻址 80386级别机器的所有 4G 内存了。

+ +

键盘控制器8042的逻辑结构图如下所示。从软件的角度来看,如何控制8042呢?早期的PC机,控制键盘有一个单独的单片机8042,现如今这个芯片已经给集成到了其它大片子中,但其功能和使用方法还是一样,当PC机刚刚出现A20 Gate的时候,估计为节省硬件设计成本,工程师使用这个8042键盘控制器来控制A20 Gate,但A20 Gate与键盘管理没有一点关系。下面先从软件的角度简单介绍一下8042这个芯片。

+ +

+ +

键盘控制器8042的逻辑结构图

+ +

8042键盘控制器的IO端口是0x600x6f,实际上IBM PC/AT使用的只有0x600x64两个端口(0x610x620x63用于与XT兼容目的)。8042通过这些端口给键盘控制器或键盘发送命令或读取状态。输出端口P2用于特定目的。位0P20引脚)用于实现CPU复位操作,位1P21引脚)用户控制A20信号线的开启与否。系统向输入缓冲(端口0x64)写入一个字节,即发送一个键盘控制器命令。可以带一个参数。参数是通过0x60端口发送的。 命令的返回值也从端口 0x60去读。80424个寄存器:

+ +

l  18-bit长的Input bufferWrite-Only

+ +

l  18-bit长的Output buffer Read-Only

+ +

l  18-bit长的Status RegisterRead-Only

+ +

l  18-bit长的Control RegisterRead/Write

+ +

有两个端口地址:60h64h,有关对它们的读写操作描述如下:

+ +

l  60h端口,读output buffer 

+ +

l  60h端口,写input buffer 

+ +

l  64h端口,读Status Register

+ +

l  操作Control Register,首先要向64h端口写一个命令(20h为读命令,60h为写命令),然后根据命令从60h端口读出Control Register的数据或者向60h端口写入Control Register的数据(64h端口还可以接受许多其它的命令)。

+ +

Status Register的定义(要用bit 0bit 1):

+ +

   bit    meaning

+ +

 -----------------------------------------------------------------------

+ +

0         +output register (60h) 中有数据

+ +

1         +input register (60h/64h) 有数据

+ +

2         +系统标志(上电复位后被置为0

+ +

3         +data in input register is command (1) or data (0)

+ +

4         +1=keyboard enabled, 0=keyboard disabled (via switch)

+ +

5         +1=transmit timeout (data transmit not complete)

+ +

6         +1=receive timeout (data transmit not complete)

+ +

7         +1=even parity rec'd, 0=odd parity rec'd (should be odd)

+ +

    + 除了这些资源外,8042还有3个内部端口:Input PortOutport PortTest Port,这三个端口的操作都是通过向64h发送命令,然后在60h进行读写的方式完成,其中本文要操作的A20 Gate被定义在Output Portbit 1上,所以有必要对Outport Port的操作及端口定义做一个说明。

+ +

l  Output Port:向64h发送0d0h命令,然后从60h读取Output Port的内容

+ +

l  Output Port:向64h发送0d1h命令,然后向60h写入Output Port的数据 

+ +

l  禁止键盘操作命令:向64h发送0adh 

+ +

l  打开键盘操作命令:向64h发送0aeh 

+ +

  有了这些命令和知识,就可以实现操作A20 Gate来从实模式切换到保护模式了。

+ +

理论上讲,我们只要操作8042芯片的输出端口(64h)的bit 1,就可以控制A20 Gate,但实际上,当你准备向8042的输入缓冲区里写数据时,可能里面还有其它数据没有处理,所以,我们要首先禁止键盘操作,同时等待数据缓冲区中没有数据以后,才能真正地去操作8042打开或者关闭A20 Gate。打开A20 Gate的具体步骤大致如下(参考bootasm.S):

+ +

    1.等待8042 Input buffer为空;

+ +

    2.发送Write 8042 Output Port P2)命令到8042 Input buffer

+ +

    3.等待8042 Input buffer为空;

+ +

    4.8042 Output PortP2)得到字节的第2位置1,然后写入8042 Input buffer

+ +

附录“启动后第一条执行的指令”

+ +

【参考IA-32 +Intel Architecture Software Developer’s Manual Volume 3: System Programming +Guide Section 9.1.4

+ + + + + +
+

9.1.4 First Instruction Executed

+

The + first instruction that is fetched and executed following a hardware reset is located + at physical address FFFFFFF0H. This address is 16 bytes below the processor’s + uppermost physical address. The EPROM containing the softwareinitialization code + must be located at this address.

+

 The + address FFFFFFF0H is beyond the 1-MByte addressable range of the processor while + in real-address mode. The processor is initialized to this starting address + as follows. The CS register has two parts: the visible segment selector part + and the hidden base address part. In real-address mode, the base address is + normally formed by shifting the 16-bit segment selector value 4 bits to the + left to produce a 20-bit base address. However, during a hardware reset, the + segment selector in the CS register is loaded with F000H and the base address + is loaded with FFFF0000H. The starting address is thus formed by adding the + base address to the value in the EIP register (that is, FFFF0000 + FFF0H = + FFFFFFF0H).

+

The + first time the CS register is loaded with a new value after a hardware reset, + the processor will follow the normal rule for address translation in real-address + mode (that is, [CS base address = CS segment selector * 16]). To insure that + the base address in the CS register remains unchanged until the EPROM based + softwareinitialization code is completed, the code must not contain a far + jump or far call or allow an interrupt to occur (which would cause the CS + selector value to be changed).

+
+ +

 

+ +
+ + + + diff --git a/lab1.md b/lab1.md new file mode 100644 index 0000000..b240efe --- /dev/null +++ b/lab1.md @@ -0,0 +1,6 @@ +# 实验一:系统软件启动过程 ## 1.实验目的: 操作系统是一个软件,也需要通过某种机制加载并运行它。在这里我们将通过另外一个更加简单的软件-bootloader来完成这些工作。为此,我们需要完成一个能够切换到x86的保护模式并显示字符的bootloader,为启动操作系统ucore做准备。lab1提供了一个非常小的bootloader和ucore OS,整个bootloader执行代码小于512个字节,这样才能放到硬盘的主引导扇区中。通过分析和实现这个bootloader和ucore OS,读者可以了解到: - 基于分段机制的存储管理 - 设备管理的基本概念 - PC启动bootloader的过程 - bootloader的文件组成 - 编译运行bootloader的过程 - 调试bootloader的方法 - ucore OS的启动过程 - 在汇编级了解栈的结构和处理过程 - 中断处理机制 - 通过串口/并口/CGA输出字符的方法 ## 2.实验内容: lab1中包含一个bootloader和一个OS。这个bootloader可以切换到X86保护模式,能够读磁盘并加载ELF执行文件格式,并显示字符。而这lab1中的OS只是一个可以处理时钟中断和显示字符的幼儿园级别OS。 ### 2.1 练习 #### 练习1:理解通过make生成执行文件的过程。(要求在报告中写出对下述问题的回答) 在此练习中,大家需要通过静态分析代码来了解: 1. 操作系统镜像文件ucore.img是如何一步一步生成的?(需要比较详细地解释Makefile中每一条相关命令和命令参数的含义,以及说明命令导致的结果) 2. 一个被系统认为是符合规范的硬盘主引导扇区的特征是什么? 补充材料: 如何调试Makefile 当执行make时,一般只会显示输出,不会显示make到底执行了哪些命令。 如想了解make执行了哪些命令,可以执行: $ make "V=" 要获取更多有关make的信息,可上网查询,并请执行 $ man make #### 练习2:使用qemu执行并调试lab1中的软件。(要求在报告中简要写出练习过程) 为了熟悉使用qemu和gdb进行的调试工作,我们进行如下的小练习: 1. 从CPU加电后执行的第一条指令开始,单步跟踪BIOS的执行。 2. 在初始化位置0x7c00设置实地址断点,测试断点正常。 3. 从0x7c00开始跟踪代码运行,将单步跟踪反汇编得到的代码与bootasm.S和 bootblock.asm进行比较。 4. 自己找一个bootloader或内核中的代码位置,设置断点并进行测试。 提示:参考附录“启动后第一条执行的指令” 补充材料: + 我们主要通过硬件模拟器qemu来进行各种实验。在实验的过程中我们可能会遇上各种各样的问题,调试是必要的。qemu + 支持使用gdb进行的强大而方便的调试。所以用好qemu和gdb是完成各种实验的基本要素。 默认的gdb需要进行一些额外的配置才进行qemu的调试任务。qemu和gdb之间使用网络端口1234进行通讯。在打开qemu + 进行模拟之后,执行gdb并输入 target remote localhost:1234 即可连接qemu,此时qemu会进入停止状态,听从gdb的命令。 另外,我们可能需要qemu在一开始便进入等待模式,则我们不再使用make qemu开始系统的运行,而使用make debug来完成这项工作。这样qemu便不会在gdb尚未连接的时候擅自运行了。 ***gdb的地址断点*** 在gdb命令行中,使用b *[地址]便可以在指定内存地址设置断点,当qemu中的cpu执行到指定地址时,便会将控制权交给gdb。 ***关于代码的反汇编*** 有可能gdb无法正确获取当前qemu执行的汇编指令,通过如下配置可以在每次gdb命令行前强制反汇编当前的指令,在gdb命令行或配置文件中添加: define hook-stop x/i $pc end 即可 ***gdb的单步命令*** 在gdb中,有next, nexti, step, stepi等指令来单步调试程序,他们功能各不相同,区别在于单步的“跨度”上。 next 单步到程序源代码的下一行,不进入函数。 nexti 单步一条机器指令,不进入函数。 step 单步到下一个不同的源代码行(包括进入函数)。 stepi 单步一条机器指令。 #### 练习3:分析bootloader进入保护模式的过程。(要求在报告中写出分析) BIOS将通过读取硬盘主引导扇区到内存,并转跳到对应内存中的位置执行bootloader。请分析bootloader是如何完成从实模式进入保护模式的。 提示:需要阅读3.2.1小节“保护模式和分段机制”和lab1/boot/bootasm.S源码,了解如何从实模式切换到保护模式。 #### 练习4:分析bootloader加载ELF格式的OS的过程。(要求在报告中写出分析) 通过阅读bootmain.c,了解bootloader如何加载ELF文件。通过分析源代码和通过qemu来运行并调试bootloader&OS, 1. bootloader如何读取硬盘扇区的? 2. bootloader是如何加载ELF格式的OS? 提示:可阅读3.2.3“硬盘访问概述”,3.2.4“ELF执行文件格式概述”。 #### 练习5:实现函数调用堆栈跟踪函数 (需要编程) 我们需要在lab1中完成kdebug.c中函数print_stackframe的实现,可以通过函数print_stackframe来跟踪函数调用堆栈中记录的返回地址。在如果能够正确实现此函数,可在lab1中执行 “make qemu”后,在qemu模拟器中得到类似如下的输出: …… ebp:0x00007b28 eip:0x00100992 args:0x00010094 0x00010094 0x00007b58 0x00100096 kern/debug/kdebug.c:305: print_stackframe+22 ebp:0x00007b38 eip:0x00100c79 args:0x00000000 0x00000000 0x00000000 0x00007ba8 kern/debug/kmonitor.c:125: mon_backtrace+10 ebp:0x00007b58 eip:0x00100096 args:0x00000000 0x00007b80 0xffff0000 0x00007b84 kern/init/init.c:48: grade_backtrace2+33 ebp:0x00007b78 eip:0x001000bf args:0x00000000 0xffff0000 0x00007ba4 0x00000029 kern/init/init.c:53: grade_backtrace1+38 ebp:0x00007b98 eip:0x001000dd args:0x00000000 0x00100000 0xffff0000 0x0000001d kern/init/init.c:58: grade_backtrace0+23 ebp:0x00007bb8 eip:0x00100102 args:0x0010353c 0x00103520 0x00001308 0x00000000 kern/init/init.c:63: grade_backtrace+34 ebp:0x00007be8 eip:0x00100059 args:0x00000000 0x00000000 0x00000000 0x00007c53 kern/init/init.c:28: kern_init+88 ebp:0x00007bf8 eip:0x00007d73 args:0xc031fcfa 0xc08ed88e 0x64e4d08e 0xfa7502a8 : -- 0x00007d72 – …… 请完成实验,看看输出是否与上述显示大致一致,并解释最后一行各个数值的含义。 提示:可阅读3.3.1小节“函数堆栈”,了解编译器如何建立函数调用关系的。在完成lab1编译后,查看lab1/obj/bootblock.asm,了解bootloader源码与机器码的语句和地址等的对应关系;查看lab1/obj/kernel.asm,了解 +ucore OS源码与机器码的语句和地址等的对应关系。 要求完成函数kern/debug/kdebug.c::print_stackframe的实现,提交改进后源代码包(可以编译执行),并在实验报告中简要说明实现过程,并写出对上述问题的回答。 补充材料: 由于显示完整的栈结构需要解析内核文件中的调试符号,较为复杂和繁琐。代码中有一些辅助函数可以使用。例如可以通过调用print_debuginfo函数完成查找对应函数名并打印至屏幕的功能。具体可以参见kdebug.c代码中的注释。 #### 练习6:完善中断初始化和处理 (需要编程) 请完成编码工作和回答如下问题: 1. 中断向量表中一个表项占多少字节?其中哪几位代表中断处理代码的入口? 2. 请编程完善kern/trap/trap.c中对中断向量表进行初始化的函数idt_init。在idt_init函数中,依次对所有中断入口进行初始化。使用mmu.h中的SETGATE宏,填充idt数组内容。注意除了系统调用中断(T_SYSCALL)以外,其它中断均使用中断门描述符,权限为内核态权限;而系统调用中断使用异常,权限为陷阱门描述符。每个中断的入口由tools/vectors.c生成,使用trap.c中声明的vectors数组即可。 3. 请编程完善trap.c中的中断处理函数trap,在对时钟中断进行处理的部分填写trap函数中处理时钟中断的部分,使操作系统每遇到100次时钟中断后,调用print_ticks子程序,向屏幕上打印一行文字”100 ticks”。 要求完成问题2和问题3 提出的相关函数实现,提交改进后的源代码包(可以编译执行),并在实验报告中简要说明实现过程,并写出对问题1的回答。完成这问题2和3要求的部分代码后,运行整个系统,可以看到大约每1秒会输出一次”100 ticks”,而按下的键也会在屏幕上显示。 提示:可阅读3.3.2小节“中断与异常”。 #### 扩展练习 Challenge(需要编程) 扩展proj4,增加syscall功能,即增加一用户态函数(可执行一特定系统调用:获得时钟计数值),当内核初始完毕后,可从内核态返回到用户态的函数,而用户态的函数又通过系统调用得到内核态的服务(通过网络查询所需信息,可找老师咨询。如果完成,且有兴趣做代替考试的实验,可找老师商量)。需写出详细的设计和分析报告。完成出色的可获得适当加分。 提示: 规范一下 challenge 的流程。 kern_init 调用 switch_test,该函数如下: static void switch_test(void) { print_cur_status(); // print 当前 cs/ss/ds 等寄存器状态 cprintf("+++ switch to user mode +++\n"); switch_to_user(); // switch to user mode print_cur_status(); cprintf("+++ switch to kernel mode +++\n"); switch_to_kernel(); // switch to kernel mode print_cur_status(); } switch_to_* 函数建议通过 中断处理的方式实现。主要要完成的代码是在 trap 里面处理 T_SWITCH_TO* 中断,并设置好返回的状态。 在 lab1 里面完成代码以后,执行 make grade 应该能够评测结果是否正确。 ### 2.2 项目组成 lab1的整体目录结构如下所示: . ├── boot │ ├── asm.h │ ├── bootasm.S │ └── bootmain.c ├── kern │ ├── debug │ │ ├── assert.h │ │ ├── kdebug.c │ │ ├── kdebug.h │ │ ├── kmonitor.c │ │ ├── kmonitor.h │ │ ├── panic.c │ │ └── stab.h │ ├── driver │ │ ├── clock.c │ │ ├── clock.h │ │ ├── console.c │ │ ├── console.h │ │ ├── intr.c │ │ ├── intr.h │ │ ├── kbdreg.h │ │ ├── picirq.c │ │ └── picirq.h │ ├── init │ │ └── init.c │ ├── libs │ │ ├── readline.c │ │ └── stdio.c │ ├── mm │ │ ├── memlayout.h │ │ ├── mmu.h │ │ ├── pmm.c │ │ └── pmm.h │ └── trap │ ├── trap.c │ ├── trapentry.S │ ├── trap.h │ └── vectors.S ├── libs │ ├── defs.h │ ├── elf.h │ ├── error.h │ ├── printfmt.c │ ├── stdarg.h │ ├── stdio.h │ ├── string.c │ ├── string.h │ └── x86.h ├── Makefile └── tools ├── function.mk ├── gdbinit ├── grade.sh ├── kernel.ld ├── sign.c └── vector.c 10 directories, 48 files 其中一些比较重要的文件说明如下: bootloader部分 + - boot/bootasm.S :定义并实现了bootloader最先执行的函数start,此函数进行了一定的初始化,完成了从实模式到保护模式的转换,并调用bootmain.c中的bootmain函数。 - boot/bootmain.c:定义并实现了bootmain函数实现了通过屏幕、串口和并口显示字符串。bootmain函数加载ucore操作系统到内存,然后跳转到ucore的入口处执行。 - boot/asm.h:是bootasm.S汇编文件所需要的头文件,主要是一些与X86保护模式的段访问方式相关的宏定义。 ucore操作系统部分: 系统初始化部分: - kern/init/init.c:ucore操作系统的初始化启动代码 内存管理部分: - kern/mm/memlayout.h:ucore操作系统有关段管理(段描述符编号、段号等)的一些宏定义 - kern/mm/mmu.h:ucore操作系统有关X86 MMU等硬件相关的定义,包括EFLAGS寄存器中各位的含义,应用/系统段类型,中断门描述符定义,段描述符定义,任务状态段定义,NULL段声明的宏SEG_NULL, 特定段声明的宏SEG,设置中断门描述符的宏SETGATE(在练习6中会用到) - kern/mm/pmm.[ch]:设定了ucore操作系统在段机制中要用到的全局变量:任务状态段ts,全局描述符表 gdt[],加载全局描述符表寄存器的函数lgdt,临时的内核栈stack0;以及对全局描述符表和任务状态段的初始化函数gdt_init 外设驱动部分  kern/driver/intr.[ch]:实现了通过设置CPU的eflags来屏蔽和使能中断的函数;  kern/driver/picirq.[ch]:实现了对中断控制器8259A的初始化和使能操作;  kern/driver/clock.[ch]:实现了对时钟控制器8253的初始化操作;  kern/driver/console.[ch]:实现了对串口和键盘的中断方式的处理操作; 中断处理部分:  kern/trap/vectors.S:包括256个中断服务例程的入口地址和第一步初步处理实现。注意,此文件是由tools/vector.c在编译ucore期间动态生成的;  kern/trap/trapentry.S:紧接着第一步初步处理后,进一步完成第二步初步处理;并且有恢复中断上下文的处理,即中断处理完毕后的返回准备工作;  kern/trap/trap.[ch]:紧接着第二步初步处理后,继续完成具体的各种中断处理操作; 内核调试部分:  kern/debug/kdebug.[ch]:提供源码和二进制对应关系的查询功能,用于显示调用栈关系。其中补全print_stackframe函数是需要完成的练习。其他实现部分不必深究。  kern/debug/kmonitor.[ch]:实现提供动态分析命令的kernel monitor,便于在ucore出现bug或问题后,能够进入kernel monitor中,查看当前调用关系。实现部分不必深究。  kern/debug/panic.c | assert.h:提供了panic函数和assert宏,便于在发现错误后,调用kernel monitor。大家可在编程实验中充分利用assert宏和panic函数,提高查找错误的效率。 公共库部分  libs/defs.h:包含一些无符号整型的缩写定义。  Libs/x86.h:一些用GNU C嵌入式汇编实现的C函数(由于使用了inline关键字,所以可以理解为宏)。 工具部分  Makefile和function.mk:指导make完成整个软件项目的编译,清除等工作。  sign.c:一个C语言小程序,是辅助工具,用于生成一个符合规范的硬盘主引导扇区。  tools/vector.c:生成vectors.S,此文件包含了中断向量处理的统一实现。 编译方法 首先下载lab1.tar.bz2,然后解压lab1.tar.bz2。在lab1目录下执行make,可以生成ucore.img(生成于bin目录下)。ucore.img是一个包含了bootloader或OS的硬盘镜像,通过执行如下命令可在硬件虚拟环境 qemu中运行bootloader或OS: $ make qemu ## 3 从机器启动到操作系统运行的过程 3.1 BIOS启动过程 当计算机加电后,一般不直接执行操作系统,而是执行系统初始化软件完成基本IO初始化和引导加载功能。简单地说,系统初始化软件就是在操作系统内核运行之前运行的一段小软件。通过这段小软件,我们可以初始化硬件设备、建立系统的内存空间映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。最终引导加载程序把操作系统内核映像加载到RAM中,并将系统控制权传递给它。 对于绝大多数计算机系统而言,操作系统和应用软件是存放在磁盘(硬盘/软盘)、光盘、EPROM、ROM、Flash等可在掉电后继续保存数据的存储介质上。计算机启动后,CPU一开始会到一个特定的地址开始执行指令,这个特定的地址存放了系统初始化软件,负责完成计算机基本的IO初始化,这是系统加电后运行的第一段软件代码。对于Intel 80386的体系结构而言,PC机中的系统初始化软件由BIOS (Basic Input Output System,即基本输入/输出系统,其本质是一个固化在主板Flash/CMOS上的软件)和位于软盘/硬盘引导扇区中的OS Boot Loader(在ucore中的bootasm.S和bootmain.c)一起组成。BIOS实际上是被固化在计算机ROM(只读存储器)芯片上的一个特殊的软件,为上层软件提供最底层的、最直接的硬件控制与支持。更形象地说,BIOS就是PC计算机硬件与上层软件程序之间的一个"桥梁",负责访问和控制硬件。 以Intel 80386为例,计算机加电后,CPU从物理地址0xFFFFFFF0(由初始化的CS:EIP确定,此时CS和IP的值分别是0xF000和0xFFF0))开始执行。在0xFFFFFFF0这里只是存放了一条跳转指令,通过跳转指令跳到BIOS例行程序起始点。BIOS做完计算机硬件自检和初始化后,会选择一个启动设备(例如软盘、硬盘、光盘等),并且读取该设备的第一扇区(即主引导扇区或启动扇区)到内存一个特定的地址0x7c00处,然后CPU控制权会转移到那个地址继续执行。至此BIOS的初始化工作做完了,进一步的工作交给了ucore的bootloader。 3.2 bootloader启动过程 BIOS将通过读取硬盘主引导扇区到内存,并转跳到对应内存中的位置执行bootloader。bootloader完成的工作包括: ● 切换到保护模式,启用分段机制 ● 读磁盘中ELF执行文件格式的ucore操作系统到内存 ● 显示字符串信息 ● 把控制权交给ucore操作系统 对应其工作的实现文件在lab1中的boot目录下的三个文件asm.h、bootasm.S和bootmain.c。下面从原理上介绍完成上述工作的计算机系统硬件和软件背景知识。 3.2.1 保护模式和分段机制 为何要了解Intel 80386的保护模式和分段机制?首先,我们知道Intel 80386只有在进入保护模式后,才能充分发挥其强大的功能,提供更好的保护机制和更大的寻址空间,否则仅仅是一个快速的8086而已。没有一定的保护机制,任何一个应用软件都可以任意访问所有的计算机资源,这样也就无从谈起操作系统设计了。且Intel 80386的分段机制一直存在,无法屏蔽或避免。其次,在我们的bootloader设计中,涉及到了从实模式到保护模式的处理,我们的操作系统功能(比如分页机制)是建立在Intel 80386的保护模式上来设计的。如果我们不了解保护模式和分段机制,则我们面向Intel 80386体系结构的操作系统设计实际上是建立在一个空中楼阁之上。 (1) 实模式 在bootloader接手BIOS的工作后,当前的PC系统处于实模式(16位模式)运行状态,在这种状态下软件可访问的物理内存空间不能超过1MB,且无法发挥Intel 80386以上级别的32位CPU的4GB内存管理能力。 实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,操作系统和用户程序并没有区别对待,而且每一个指针都是指向实际的物理地址。这样,用户程序的一个指针如果指向了操作系统区域或其他用户程序区域,并修改了内容,那么其后果就很可能是灾难性的。通过修改A20地址线可以完成从实模式到保护模式的转换。有关A20的进一步信息可参考附录“关于A20 Gate”。 (2) 保护模式 只有在保护模式下,80386的全部32根地址线有效,可寻址高达4G字节的线性地址空间和物理地址空间,可访问64TB(有2^14个段,每个段最大空间为2^32字节)的逻辑地址空间,可采用分段存储管理机制和分页存储管理机制。这不仅为存储共享和保护提供了硬件支持,而且为实现虚拟存储提供了硬件支持。通过提供4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码数据的安全及任务的隔离。 (3) 分段存储管理机制 只有在保护模式下才能使用分段存储管理机制。分段机制将内存划分成以起始地址和长度限制这两个二维参数表示的内存块,这些内存块就称之为段(Segment)。编译器把源程序编译成执行程序时用到的代码段、数据段、堆和栈等概念在这里可以与段联系起来,二者在含义上是一致的。 分段机涉及4个关键内容:逻辑地址、段描述符(描述段的属性)、段描述符表(包含多个段描述符的“数组”)、段选择子(段寄存器,用于定位段描述符表中表项的索引)。转换逻辑地址(Logical Address,应用程序员看到的地址)到物理地址(Physical Address, 实际的物理内存地址)分以下两步: 1. 分段地址转换:CPU把逻辑地址(由段选择子selector和段偏移offset组成)中的段选择子的内容作为段描述符表的索引,找到表中对应的段描述符,然后把段描述符中保存的段基址加上段偏移值,形成线性地址(Linear Address)。如果不启动分页存储管理机制,则线性地址等于物理地址。 2. 分页地址转换,这一步中把线性地址转换为物理地址。(注意:这一步是可选的,由操作系统决定是否需要。在后续试验中会涉及。 上述转换过程对于应用程序员来说是不可见的。线性地址空间由一维的线性地址构成,线性地址空间和物理地址空间对等。线性地址32位长,线性地址空间容量为4G字节。分段地址转换的基本过程如下图所示。 图1 分段地址转换基本过程 分段存储管理机制需要在启动保护模式的前提下建立。从上图可以看出,为了使得分段存储管理机制正常运行,需要建立好段描述符和段描述符表(参看bootasm.S,mmu.h,pmm.c)。 段描述符 在分段存储管理机制的保护模式下,每个段由如下三个参数进行定义:段基地址(Base Address)、段界限(Limit)和段属性(Attributes)。在ucore中的kern/mm/mmu.h中的struct segdesc 数据结构中有具体的定义。  段基地址:规定线性地址空间中段的起始地址。在80386保护模式下,段基地址长32位。因为基地址长度与寻址地址的长度相同,所以任何一个段都可以从32位线性地址空间中的任何一个字节开始,而不象实方式下规定的边界必须被16整除。  段界限:规定段的大小。在80386保护模式下,段界限用20位表示,而且段界限可以是以字节为单位或以4K字节为单位。  段属性:确定段的各种性质。  段属性中的粒度位(Granularity),用符号G标记。G=0表示段界限以字节位位单位,20位的界限可表示的范围是1字节至1M字节,增量为1字节;G=1表示段界限以4K字节为单位,于是20位的界限可表示的范围是4K 实验一:系统软件启动过程 1.实验目的: 操作系统是一个软件,也需要通过某种机制加载并运行它。在这里我们将通过另外一个更加简单的软件-bootloader来完成这些工作。为此,我们需要完成一个能够切换到x86的保护模式并显示字符的bootloader,为启动操作系统ucore做准备。lab1提供了一个非常小的bootloader和ucore OS,整个bootloader执行代码小于512个字节,这样才能放到硬盘的主引导扇区中。通过分析和实现这个bootloader和ucore OS,读者可以了解到: ● 基于分段机制的存储管理 ● 设备管理的基本概念 ● PC启动bootloader的过程 ● bootloader的文件组成 ● 编译运行bootloader的过程 ● 调试bootloader的方法 ● ucore OS的启动过程 ● 在汇编级了解栈的结构和处理过程 ● 中断处理机制 ● 通过串口/并口/CGA输出字符的方法 2.实验内容: lab1中包含一个bootloader和一个OS。这个bootloader可以切换到X86保护模式,能够读磁盘并加载ELF执行文件格式,并显示字符。而这lab1中的OS只是一个可以处理时钟中断和显示字符的幼儿园级别OS。 2.1 练习 练习1:理解通过make生成执行文件的过程。(要求在报告中写出对下述问题的回答) 在此练习中,大家需要通过静态分析代码来了解: 1. 操作系统镜像文件ucore.img是如何一步一步生成的?(需要比较详细地解释Makefile中每一条相关命令和命令参数的含义,以及说明命令导致的结果) 2. 一个被系统认为是符合规范的硬盘主引导扇区的特征是什么? 补充材料: 如何调试Makefile 当执行make时,一般只会显示输出,不会显示make到底执行了哪些命令。 如想了解make执行了哪些命令,可以执行: $ make "V=" 要获取更多有关make的信息,可上网查询,并请执行 $ man make 练习2:使用qemu执行并调试lab1中的软件。(要求在报告中简要写出练习过程) 为了熟悉使用qemu和gdb进行的调试工作,我们进行如下的小练习: 1. 从CPU加电后执行的第一条指令开始,单步跟踪BIOS的执行。 2. 在初始化位置0x7c00设置实地址断点,测试断点正常。 3. 从0x7c00开始跟踪代码运行,将单步跟踪反汇编得到的代码与bootasm.S和 bootblock.asm进行比较。 4. 自己找一个bootloader或内核中的代码位置,设置断点并进行测试。 提示:参考附录“启动后第一条执行的指令” 补充材料: 我们主要通过硬件模拟器qemu来进行各种实验。在实验的过程中我们可能会遇上各种各样的问题,调试是必要的。qemu支持使用gdb进行的强大而方便的调试。所以用好qemu和gdb是完成各种实验的基本要素。 默认的gdb需要进行一些额外的配置才进行qemu的调试任务。qemu和gdb之间使用网络端口1234进行通讯。在打开qemu进行模拟之后,执行gdb并输入 target remote localhost:1234 即可连接qemu,此时qemu会进入停止状态,听从gdb的命令。 另外,我们可能需要qemu在一开始便进入等待模式,则我们不再使用make qemu开始系统的运行,而使用make debug来完成这项工作。这样qemu便不会在gdb尚未连接的时候擅自运行了。 gdb的地址断点 在gdb命令行中,使用b *[地址]便可以在指定内存地址设置断点,当qemu中的cpu执行到指定地址时,便会将控制权交给gdb。 关于代码的反汇编 有可能gdb无法正确获取当前qemu执行的汇编指令,通过如下配置可以在每次gdb命令行前强制反汇编当前的指令,在gdb命令行或配置文件中添加: define hook-stop x/i $pc end 即可 gdb的单步命令 在gdb中,有next, nexti, step, stepi等指令来单步调试程序,他们功能各不相同,区别在于单步的“跨度”上。 next 单步到程序源代码的下一行,不进入函数。 nexti 单步一条机器指令,不进入函数。 step 单步到下一个不同的源代码行(包括进入函数)。 stepi 单步一条机器指令。 练习3:分析bootloader进入保护模式的过程。(要求在报告中写出分析) BIOS将通过读取硬盘主引导扇区到内存,并转跳到对应内存中的位置执行bootloader。请分析bootloader是如何完成从实模式进入保护模式的。 提示:需要阅读3.2.1小节“保护模式和分段机制”和lab1/boot/bootasm.S源码,了解如何从实模式切换到保护模式。 练习4:分析bootloader加载ELF格式的OS的过程。(要求在报告中写出分析) 通过阅读bootmain.c,了解bootloader如何加载ELF文件。通过分析源代码和通过qemu来运行并调试bootloader&OS, 1. bootloader如何读取硬盘扇区的? 2. bootloader是如何加载ELF格式的OS? 提示:可阅读3.2.3“硬盘访问概述”,3.2.4“ELF执行文件格式概述”。 练习5:实现函数调用堆栈跟踪函数 (需要编程) 我们需要在lab1中完成kdebug.c中函数print_stackframe的实现,可以通过函数print_stackframe来跟踪函数调用堆栈中记录的返回地址。在如果能够正确实现此函数,可在lab1中执行 “make qemu”后,在qemu模拟器中得到类似如下的输出: …… ebp:0x00007b28 eip:0x00100992 args:0x00010094 0x00010094 0x00007b58 0x00100096 kern/debug/kdebug.c:305: print_stackframe+22 ebp:0x00007b38 eip:0x00100c79 args:0x00000000 0x00000000 0x00000000 0x00007ba8 kern/debug/kmonitor.c:125: mon_backtrace+10 ebp:0x00007b58 eip:0x00100096 args:0x00000000 0x00007b80 0xffff0000 0x00007b84 kern/init/init.c:48: grade_backtrace2+33 ebp:0x00007b78 eip:0x001000bf args:0x00000000 0xffff0000 0x00007ba4 0x00000029 kern/init/init.c:53: grade_backtrace1+38 ebp:0x00007b98 eip:0x001000dd args:0x00000000 0x00100000 0xffff0000 0x0000001d kern/init/init.c:58: grade_backtrace0+23 ebp:0x00007bb8 eip:0x00100102 args:0x0010353c 0x00103520 0x00001308 0x00000000 kern/init/init.c:63: grade_backtrace+34 ebp:0x00007be8 eip:0x00100059 args:0x00000000 0x00000000 0x00000000 0x00007c53 kern/init/init.c:28: kern_init+88 ebp:0x00007bf8 eip:0x00007d73 args:0xc031fcfa 0xc08ed88e 0x64e4d08e 0xfa7502a8 : -- 0x00007d72 – …… 请完成实验,看看输出是否与上述显示大致一致,并解释最后一行各个数值的含义。 提示:可阅读3.3.1小节“函数堆栈”,了解编译器如何建立函数调用关系的。在完成lab1编译后,查看lab1/obj/bootblock.asm,了解bootloader源码与机器码的语句和地址等的对应关系;查看lab1/obj/kernel.asm,了解ucore OS源码与机器码的语句和地址等的对应关系。 要求完成函数kern/debug/kdebug.c::print_stackframe的实现,提交改进后源代码包(可以编译执行),并在实验报告中简要说明实现过程,并写出对上述问题的回答。 补充材料: 由于显示完整的栈结构需要解析内核文件中的调试符号,较为复杂和繁琐。代码中有一些辅助函数可以使用。例如可以通过调用print_debuginfo函数完成查找对应函数名并打印至屏幕的功能。具体可以参见kdebug.c代码中的注释。 练习6:完善中断初始化和处理 (需要编程) 请完成编码工作和回答如下问题: 1. 中断向量表中一个表项占多少字节?其中哪几位代表中断处理代码的入口? 2. 请编程完善kern/trap/trap.c中对中断向量表进行初始化的函数idt_init。在idt_init函数中,依次对所有中断入口进行初始化。使用mmu.h中的SETGATE宏,填充idt数组内容。注意除了系统调用中断(T_SYSCALL)以外,其它中断均使用中断门描述符,权限为内核态权限;而系统调用中断使用异常,权限为陷阱门描述符。每个中断的入口由tools/vectors.c生成,使用trap.c中声明的vectors数组即可。 3. 请编程完善trap.c中的中断处理函数trap,在对时钟中断进行处理的部分填写trap函数中处理时钟中断的部分,使操作系统每遇到100次时钟中断后,调用print_ticks子程序,向屏幕上打印一行文字”100 ticks”。 要求完成问题2和问题3 提出的相关函数实现,提交改进后的源代码包(可以编译执行),并在实验报告中简要说明实现过程,并写出对问题1的回答。完成这问题2和3要求的部分代码后,运行整个系统,可以看到大约每1秒会输出一次”100 ticks”,而按下的键也会在屏幕上显示。 提示:可阅读3.3.2小节“中断与异常”。 扩展练习 Challenge(需要编程)  扩展proj4,增加syscall功能,即增加一用户态函数(可执行一特定系统调用:获得时钟计数值),当内核初始完毕后,可从内核态返回到用户态的函数,而用户态的函数又通过系统调用得到内核态的服务(通过网络查询所需信息,可找老师咨询。如果完成,且有兴趣做代替考试的实验,可找老师商量)。需写出详细的设计和分析报告。完成出色的可获得适当加分。 提示: 规范一下 challenge 的流程。 kern_init 调用 switch_test,该函数如下: static void switch_test(void) { print_cur_status(); // print 当前 cs/ss/ds 等寄存器状态 cprintf("+++ switch to user mode +++\n"); switch_to_user(); // switch to user mode print_cur_status(); cprintf("+++ switch to kernel mode +++\n"); switch_to_kernel(); // switch to kernel mode print_cur_status(); } switch_to_* 函数建议通过 中断处理的方式实现。主要要完成的代码是在 trap 里面处理 T_SWITCH_TO* 中断,并设置好返回的状态。 在 lab1 里面完成代码以后,执行 make grade 应该能够评测结果是否正确。 2.2 项目组成 lab1的整体目录结构如下所示: . ├── boot │ ├── asm.h │ ├── bootasm.S │ └── bootmain.c ├── kern │ ├── debug │ │ ├── assert.h │ │ ├── kdebug.c │ │ ├── kdebug.h │ │ ├── kmonitor.c │ │ ├── kmonitor.h │ │ ├── panic.c │ │ └── stab.h │ ├── driver │ │ ├── clock.c │ │ ├── clock.h │ │ ├── console.c │ │ ├── console.h │ │ ├── intr.c │ │ ├── intr.h │ │ ├── kbdreg.h │ │ ├── picirq.c │ │ └── picirq.h │ ├── init │ │ └── init.c │ ├── libs │ │ ├── readline.c │ │ └── stdio.c │ ├── mm │ │ ├── memlayout.h │ │ ├── mmu.h │ │ ├── pmm.c │ │ └── pmm.h │ └── trap │ ├── trap.c │ ├── trapentry.S │ ├── trap.h │ └── vectors.S ├── libs │ ├── defs.h │ ├── elf.h │ ├── error.h │ ├── printfmt.c │ ├── stdarg.h │ ├── stdio.h │ ├── string.c │ ├── string.h │ └── x86.h ├── Makefile └── tools ├── function.mk ├── gdbinit ├── grade.sh ├── kernel.ld ├── sign.c └── vector.c 10 directories, 48 files 其中一些比较重要的文件说明如下: bootloader部分  boot/bootasm.S :定义并实现了bootloader最先执行的函数start,此函数进行了一定的初始化,完成了从实模式到保护模式的转换,并调用bootmain.c中的bootmain函数。  boot/bootmain.c:定义并实现了bootmain函数实现了通过屏幕、串口和并口显示字符串。bootmain函数加载ucore操作系统到内存,然后跳转到ucore的入口处执行。  boot/asm.h:是bootasm.S汇编文件所需要的头文件,主要是一些与X86保护模式的段访问方式相关的宏定义。 ucore操作系统部分: 系统初始化部分:  kern/init/init.c:ucore操作系统的初始化启动代码 内存管理部分:  kern/mm/memlayout.h:ucore操作系统有关段管理(段描述符编号、段号等)的一些宏定义  kern/mm/mmu.h:ucore操作系统有关X86 MMU等硬件相关的定义,包括EFLAGS寄存器中各位的含义,应用/系统段类型,中断门描述符定义,段描述符定义,任务状态段定义,NULL段声明的宏SEG_NULL, 特定段声明的宏SEG,设置中断门描述符的宏SETGATE(在练习6中会用到)  kern/mm/pmm.[ch]:设定了ucore操作系统在段机制中要用到的全局变量:任务状态段ts,全局描述符表 gdt[],加载全局描述符表寄存器的函数lgdt,临时的内核栈stack0;以及对全局描述符表和任务状态段的初始化函数gdt_init 外设驱动部分  kern/driver/intr.[ch]:实现了通过设置CPU的eflags来屏蔽和使能中断的函数;  kern/driver/picirq.[ch]:实现了对中断控制器8259A的初始化和使能操作;  kern/driver/clock.[ch]:实现了对时钟控制器8253的初始化操作;  kern/driver/console.[ch]:实现了对串口和键盘的中断方式的处理操作; 中断处理部分:  kern/trap/vectors.S:包括256个中断服务例程的入口地址和第一步初步处理实现。注意,此文件是由tools/vector.c在编译ucore期间动态生成的;  kern/trap/trapentry.S:紧接着第一步初步处理后,进一步完成第二步初步处理;并且有恢复中断上下文的处理,即中断处理完毕后的返回准备工作;  kern/trap/trap.[ch]:紧接着第二步初步处理后,继续完成具体的各种中断处理操作; 内核调试部分:  kern/debug/kdebug.[ch]:提供源码和二进制对应关系的查询功能,用于显示调用栈关系。其中补全print_stackframe函数是需要完成的练习。其他实现部分不必深究。  kern/debug/kmonitor.[ch]:实现提供动态分析命令的kernel monitor,便于在ucore出现bug或问题后,能够进入kernel monitor中,查看当前调用关系。实现部分不必深究。  kern/debug/panic.c | assert.h:提供了panic函数和assert宏,便于在发现错误后,调用kernel monitor。大家可在编程实验中充分利用assert宏和panic函数,提高查找错误的效率。 公共库部分  libs/defs.h:包含一些无符号整型的缩写定义。  Libs/x86.h:一些用GNU C嵌入式汇编实现的C函数(由于使用了inline关键字,所以可以理解为宏)。 工具部分  Makefile和function.mk:指导make完成整个软件项目的编译,清除等工作。  sign.c:一个C语言小程序,是辅助工具,用于生成一个符合规范的硬盘主引导扇区。  tools/vector.c:生成vectors.S,此文件包含了中断向量处理的统一实现。 编译方法 首先下载lab1.tar.bz2,然后解压lab1.tar.bz2。在lab1目录下执行make,可以生成ucore.img(生成于bin目录下)。ucore.img是一个包含了bootloader或OS的硬盘镜像,通过执行如下命令可在硬件虚拟环境 qemu中运行bootloader或OS: $ make qemu 3 从机器启动到操作系统运行的过程 3.1 BIOS启动过程 当计算机加电后,一般不直接执行操作系统,而是执行系统初始化软件完成基本IO初始化和引导加载功能。简单地说,系统初始化软件就是在操作系统内核运行之前运行的一段小软件。通过这段小软件,我们可以初始化硬件设备、建立系统的内存空间映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。最终引导加载程序把操作系统内核映像加载到RAM中,并将系统控制权传递给它。 对于绝大多数计算机系统而言,操作系统和应用软件是存放在磁盘(硬盘/软盘)、光盘、EPROM、ROM、Flash等可在掉电后继续保存数据的存储介质上。计算机启动后,CPU一开始会到一个特定的地址开始执行指令,这个特定的地址存放了系统初始化软件,负责完成计算机基本的IO初始化,这是系统加电后运行的第一段软件代码。对于Intel 80386的体系结构而言,PC机中的系统初始化软件由BIOS (Basic Input Output System,即基本输入/输出系统,其本质是一个固化在主板Flash/CMOS上的软件)和位于软盘/硬盘引导扇区中的OS Boot Loader(在ucore中的bootasm.S和bootmain.c)一起组成。BIOS实际上是被固化在计算机ROM(只读存储器)芯片上的一个特殊的软件,为上层软件提供最底层的、最直接的硬件控制与支持。更形象地说,BIOS就是PC计算机硬件与上层软件程序之间的一个"桥梁",负责访问和控制硬件。 以Intel 80386为例,计算机加电后,CPU从物理地址0xFFFFFFF0(由初始化的CS:EIP确定,此时CS和IP的值分别是0xF000和0xFFF0))开始执行。在0xFFFFFFF0这里只是存放了一条跳转指令,通过跳转指令跳到BIOS例行程序起始点。BIOS做完计算机硬件自检和初始化后,会选择一个启动设备(例如软盘、硬盘、光盘等),并且读取该设备的第一扇区(即主引导扇区或启动扇区)到内存一个特定的地址0x7c00处,然后CPU控制权会转移到那个地址继续执行。至此BIOS的初始化工作做完了,进一步的工作交给了ucore的bootloader。 3.2 bootloader启动过程 BIOS将通过读取硬盘主引导扇区到内存,并转跳到对应内存中的位置执行bootloader。bootloader完成的工作包括: ● 切换到保护模式,启用分段机制 ● 读磁盘中ELF执行文件格式的ucore操作系统到内存 ● 显示字符串信息 ● 把控制权交给ucore操作系统 对应其工作的实现文件在lab1中的boot目录下的三个文件asm.h、bootasm.S和bootmain.c。下面从原理上介绍完成上述工作的计算机系统硬件和软件背景知识。 3.2.1 保护模式和分段机制 为何要了解Intel 80386的保护模式和分段机制?首先,我们知道Intel 80386只有在进入保护模式后,才能充分发挥其强大的功能,提供更好的保护机制和更大的寻址空间,否则仅仅是一个快速的8086而已。没有一定的保护机制,任何一个应用软件都可以任意访问所有的计算机资源,这样也就无从谈起操作系统设计了。且Intel 80386的分段机制一直存在,无法屏蔽或避免。其次,在我们的bootloader设计中,涉及到了从实模式到保护模式的处理,我们的操作系统功能(比如分页机制)是建立在Intel 80386的保护模式上来设计的。如果我们不了解保护模式和分段机制,则我们面向Intel 80386体系结构的操作系统设计实际上是建立在一个空中楼阁之上。 (1) 实模式 在bootloader接手BIOS的工作后,当前的PC系统处于实模式(16位模式)运行状态,在这种状态下软件可访问的物理内存空间不能超过1MB,且无法发挥Intel 80386以上级别的32位CPU的4GB内存管理能力。 实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,操作系统和用户程序并没有区别对待,而且每一个指针都是指向实际的物理地址。这样,用户程序的一个指针如果指向了操作系统区域或其他用户程序区域,并修改了内容,那么其后果就很可能是灾难性的。通过修改A20地址线可以完成从实模式到保护模式的转换。有关A20的进一步信息可参考附录“关于A20 Gate”。 (2) 保护模式 只有在保护模式下,80386的全部32根地址线有效,可寻址高达4G字节的线性地址空间和物理地址空间,可访问64TB(有2^14个段,每个段最大空间为2^32字节)的逻辑地址空间,可采用分段存储管理机制和分页存储管理机制。这不仅为存储共享和保护提供了硬件支持,而且为实现虚拟存储提供了硬件支持。通过提供4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码数据的安全及任务的隔离。 (3) 分段存储管理机制 只有在保护模式下才能使用分段存储管理机制。分段机制将内存划分成以起始地址和长度限制这两个二维参数表示的内存块,这些内存块就称之为段(Segment)。编译器把源程序编译成执行程序时用到的代码段、数据段、堆和栈等概念在这里可以与段联系起来,二者在含义上是一致的。 分段机涉及4个关键内容:逻辑地址、段描述符(描述段的属性)、段描述符表(包含多个段描述符的“数组”)、段选择子(段寄存器,用于定位段描述符表中表项的索引)。转换逻辑地址(Logical Address,应用程序员看到的地址)到物理地址(Physical Address, 实际的物理内存地址)分以下两步: 1. 分段地址转换:CPU把逻辑地址(由段选择子selector和段偏移offset组成)中的段选择子的内容作为段描述符表的索引,找到表中对应的段描述符,然后把段描述符中保存的段基址加上段偏移值,形成线性地址(Linear Address)。如果不启动分页存储管理机制,则线性地址等于物理地址。 2. 分页地址转换,这一步中把线性地址转换为物理地址。(注意:这一步是可选的,由操作系统决定是否需要。在后续试验中会涉及。 上述转换过程对于应用程序员来说是不可见的。线性地址空间由一维的线性地址构成,线性地址空间和物理地址空间对等。线性地址32位长,线性地址空间容量为4G字节。分段地址转换的基本过程如下图所示。 图1 分段地址转换基本过程 分段存储管理机制需要在启动保护模式的前提下建立。从上图可以看出,为了使得分段存储管理机制正常运行,需要建立好段描述符和段描述符表(参看bootasm.S,mmu.h,pmm.c)。 段描述符 在分段存储管理机制的保护模式下,每个段由如下三个参数进行定义:段基地址(Base Address)、段界限(Limit)和段属性(Attributes)。在ucore中的kern/mm/mmu.h中的struct segdesc 数据结构中有具体的定义。  段基地址:规定线性地址空间中段的起始地址。在80386保护模式下,段基地址长32位。因为基地址长度与寻址地址的长度相同,所以任何一个段都可以从32位线性地址空间中的任何一个字节开始,而不象实方式下规定的边界必须被16整除。  段界限:规定段的大小。在80386保护模式下,段界限用20位表示,而且段界限可以是以字节为单位或以4K字节为单位。  段属性:确定段的各种性质。  段属性中的粒度位(Granularity),用符号G标记。G=0表示段界限以字节位位单位,20位的界限可表示的范围是1字节至1M字节,增量为1字节;G=1表示段界限以4K字节为单位,于是20位的界限可表示的范围是4K字节至4G字节,增量为4K字节。  类型(TYPE):用于区别不同类型的描述符。可表示所描述的段是代码段还是数据段,所描述的段是否可读/写/执行,段的扩展方向等。  描述符特权级(Descriptor Privilege Level)(DPL):用来实现保护机制。  段存在位(Segment-Present bit):如果这一位为0,则此描述符为非法的,不能被用来实现地址转换。如果一个非法描述符被加载进一个段寄存器,处理器会立即产生异常。图5-4显示了当存在位为0时,描述符的格式。操作系统可以任意的使用被标识为可用(AVAILABLE)的位。  已访问位(Accessed bit):当处理器访问该段(当一个指向该段描述符的选择子被加载进一个段寄存器)时,将自动设置访问位。操作系统可清除该位。 上述参数通过段描述符来表示,段描述符的结构如下图所示: 图2 段描述符结构 全局描述符表 全局描述符表的是一个保存多个段描述符的“数组”,其起始地址保存在全局描述符表寄存器GDTR中。GDTR长48位,其中高32位为基地址,低16位为段界限。由于GDT 不能有GDT本身之内的描述符进行描述定义,所以处理器采用GDTR为GDT这一特殊的系统段。注意,全部描述符表中第一个段描述符设定为空段描述符。GDTR中的段界限以字节为单位。对于含有N个描述符的描述符表的段界限通常可设为8*N-1。在ucore中的boot/bootasm.S中的gdt地址处和kern/mm/pmm.c中的全局变量数组gdt[]分别有基于汇编语言和C语言的全局描述符表的具体实现。 选择子 线性地址部分的选择子是用来选择哪个描述符表和在该表中索引一个描述符的。选择子可以做为指针变量的一部分,从而对应用程序员是可见的,但是一般是由连接加载器来设置的。选择子的格式如下图所示: 图3 段选择子结构  索引(Index):在描述符表中从8192个描述符中选择一个描述符。处理器自动将这个索引值乘以8(描述符的长度),再加上描述符表的基址来索引描述符表,从而选出一个合适的描述符。  表指示位(Table Indicator,TI):选择应该访问哪一个描述符表。0代表应该访问全局描述符表(GDT),1代表应该访问局部描述符表(LDT)。  请求特权级(Requested Privilege Level,RPL):保护机制,在后续试验中会进一步讲解。 全局描述符表的第一项是不能被CPU使用,所以当一个段选择子的索引(Index)部分和表指示位(Table Indicator)都为0的时(即段选择子指向全局描述符表的第一项时),可以当做一个空的选择子(见mmu.h中的SEG_NULL)。当一个段寄存器被加载一个空选择子时,处理器并不会产生一个异常。但是,当用一个空选择子去访问内存时,则会产生异常。 (4) 保护模式下的特权级 在保护模式下,特权级总共有4个,编号从0(最高特权)到3(最低特权)。有3种主要的资源受到保护:内存,I/O端口以及执行特殊机器指令的能力。在任一时刻,x86 CPU都是在一个特定的特权级下运行的,从而决定了代码可以做什么,不可以做什么。这些特权级经常被称为为保护环(protection ring),最内的环(ring 0)对应于最高特权0,最外面的环(ring 3)一般给应用程序使用,对应最低特权3。在ucore中,CPU只用到其中的2个特权级:0(内核态)和3(用户态)。 有大约15条机器指令被CPU限制只能在内核态执行,这些机器指令如果被用户模式的程序所使用,就会颠覆保护模式的保护机制并引起混乱,所以它们被保留给操作系统内核使用。如果企图在ring 0以外运行这些指令,就会导致一个一般保护异常(general-protection exception)。对内存和I/O端口的访问也受类似的特权级限制。 数据段选择子的整个内容可由程序直接加载到各个段寄存器(如SS或DS等)当中。这些内容里包含了请求特权级(Requested Privilege Level,简称RPL)字段。然而,代码段寄存器(CS)的内容不能由装载指令(如MOV)直接设置,而只能被那些会改变程序执行顺序的指令(如JMP、INT、CALL)间接地设置。而且CS拥有一个由CPU维护的当前特权级字段(Current Privilege Level,简称CPL)。二者结构如下图所示: 图4 DS和CS的结构图 代码段寄存器中的CPL字段(2位)的值总是等于CPU的当前特权级,所以只要看一眼CS中的CPL,你就可以知道此刻的特权级了。 CPU会在两个关键点上保护内存:当一个段选择符被加载时,以及,当通过线性地址访问一个内存页时。因此,保护也反映在内存地址转换的过程之中,既包括分段又包括分页。当一个数据段选择符被加载时,就会发生下述的检测过程: 图5 内存访问特权级检查过程 因为越高的数值代表越低的特权,上图中的MAX()用于选择CPL和RPL中特权最低的一个,并与描述符特权级(Descriptor Privilege Level,简称DPL)比较。如果DPL的值大于等于它,那么这个访问可正常进行了。RPL背后的设计思想是:允许内核代码加载特权较低的段。比如,你可以使用RPL=3的段描述符来确保给定的操作所使用的段可以在用户模式中访问。但堆栈段寄存器是个例外,它要求CPL,RPL和DPL这3个值必须完全一致,才可以被加载。下面再总结一下CPL、RPL和DPL:  CPL:当前特权级(Current Privilege Level) 保存在CS段寄存器(选择子)的最低两位,CPL就是当前活动代码段的特权级,并且它定义了当前所执行程序的特权级别)  DPL:描述符特权(Descriptor Privilege Level) 存储在段描述符中的权限位,用于描述对应段所属的特权等级,也就是段本身真正的特权级。  RPL:请求特权级RPL(Request Privilege Level) RPL保存在选择子的最低两位。RPL说明的是进程对段访问的请求权限,意思是当前进程想要的请求权限。RPL的值由程序员自己来自由的设置,并不一定RPL>=CPL,但是当RPL (分段地址转换) -->线性地址==物理地址 ● 启动分段和分页机制:逻辑地址--> (分段地址转换) -->线性地址-->分页地址转换) -->物理地址 在操作系统的管理下,采用灵活的内存管理机制,在只有一个物理地址空间的情况下,可以存在多个线性地址空间。一个典型的线性地址空间 3.2.3 硬盘访问概述 bootloader让CPU进入保护模式后,下一步的工作就是从硬盘上加载并运行OS。考虑到实现的简单性,bootloader的访问硬盘都是LBA模式的PIO(Program IO)方式,即所有的IO操作是通过CPU访问硬盘的IO地址寄存器完成。 一般主板有2个IDE通道,每个通道可以接2个IDE硬盘。访问第一个硬盘的扇区可设置IO地址寄存器0x1f0-0x1f7实现的,具体参数见下表。一般第一个IDE通道通过访问IO地址0x1f0-0x1f7来实现,第二个IDE通道通过访问0x170-0x17f实现。每个通道的主从盘的选择通过第6个IO偏移地址寄存器来设置。 表一 磁盘IO地址和对应功能 IO地址 功能 0x1f0 读数据,当0x1f7不为忙状态时,可以读。 0x1f2 要读写的扇区数,每次读写前,你需要表明你要读写几个扇区。最小是1个扇区 0x1f3 如果是LBA模式,就是LBA参数的0-7位 0x1f4 如果是LBA模式,就是LBA参数的8-15位 0x1f5 如果是LBA模式,就是LBA参数的16-23位 0x1f6 第0~3位:如果是LBA模式就是24-27位 第4位:为0主盘;为1从盘 第6位:为1=LBA模式;0 = CHS模式 第7位和第5位必须为1 0x1f7 状态和命令寄存器。操作时先给命令,再读取,如果不是忙状态就从0x1f0端口读数据 当前 硬盘数据是储存到硬盘扇区中,一个扇区大小为512字节。读一个扇区的流程(可参看boot/bootmain.c中的readsect函数实现)大致如下: 1. 等待磁盘准备好 2. 发出读取扇区的命令 3. 等待磁盘准备好 4. 把磁盘扇区数据读到指定内存 3.2.4 ELF文件格式概述 ELF(Executable and linking format)文件格式是Linux系统下的一种常用目标文件(object file)格式,有三种主要类型:  用于执行的可执行文件(executable file),用于提供程序的进程映像,加载的内存执行。 这也是本实验的OS文件类型。  用于连接的可重定位文件(relocatable file),可与其它目标文件一起创建可执行文件和共享目标文件。  共享目标文件(shared object file),连接器可将它与其它可重定位文件和共享目标文件连接成其它的目标文件,动态连接器又可将它与可执行文件和其它共享目标文件结合起来创建一个进程映像。 这里只分析与本实验相关的ELF可执行文件类型。ELF header在文件开始处描述了整个文件的组织。ELF的文件头包含整个执行文件的控制结构,其定义在elf.h中: struct elfhdr { uint magic; // must equal ELF_MAGIC uchar elf[12]; ushort type; ushort machine; uint version; uint entry; // 程序入口的虚拟地址 uint phoff; // program header 表的位置偏移 uint shoff; uint flags; ushort ehsize; ushort phentsize; ushort phnum; //program header表中的入口数目 ushort shentsize; ushort shnum; ushort shstrndx; }; program header描述与程序执行直接相关的目标文件结构信息,用来在文件中定位各个段的映像,同时包含其他一些用来为程序创建进程映像所必需的信息。可执行文件的程序头部是一个program header结构的数组, 每个结构描述了一个段或者系统准备程序执行所必需的其它信息。目标文件的 “段” 包含一个或者多个 “节区”(section) ,也就是“段内容(Segment Contents)” 。程序头部仅对于可执行文件和共享目标文件有意义。可执行目标文件在ELF头部的e_phentsize和e_phnum成员中给出其自身程序头部的大小。程序头部的数据结构如下表所示: struct proghdr { uint type; // 段类型 uint offset; // 段相对文件头的偏移值 uint va; // 段的第一个字节将被放到内存中的虚拟地址 uint pa; uint filesz; uint memsz; // 段在内存映像中占用的字节数 uint flags; uint align; }; 根据elfhdr和proghdr的结构描述,bootloader就可以完成对ELF格式的ucore操作系统的加载过程(参见boot/bootmain.c中的bootmain函数)。 [补充材料] Link addr& Load addr Link Address是指编译器指定代码和数据所需要放置的内存地址,由链接器配置。Load Address是指程序被实际加载到内存的位置(由程序加载器ld配置)。一般由可执行文件结构信息和加载器可保证这两个地址相同。Link Addr和LoadAddr不同会导致:  直接跳转位置错误  直接内存访问(只读数据区或bss等直接地址访问)错误  堆和栈等的使用不受影响,但是可能会覆盖程序、数据区域 注意:也存在Link地址和Load地址不一样的情况(例如:动态链接库)。 3.3 操作系统启动过程 当bootloader通过读取硬盘扇区把ucore在系统加载到内存后,就转跳到ucore操作系统在内存中的入口位置(kern/init.c中的kern_init函数的起始地址),这样ucore就接管了整个控制权。当前的ucore功能很简单,只完成基本的内存管理和外设中断管理。ucore主要完成的工作包括: ● 初始化终端; ● 显示字符串; ● 显示堆栈中的多层函数调用关系; ● 切换到保护模式,启用分段机制; ● 初始化中断控制器,设置中断描述符表,初始化时钟中断,使能整个系统的中断机制; ● 执行while(1)死循环。 以后的实验中会大量涉及各个函数直接的调用关系,以及由于中断处理导致的异步现象,可能对大家实现操作系统和改正其中的错误有很大影响。而理解好函数调用关系的建立机制和中断处理机制,对后续实验会有很大帮助。下面就练习5涉及的函数栈调用关系和练习6中的中断机制的建立进行阐述。 3.3.1 函数堆栈 栈是一个很重要的编程概念(编译课和程序设计课都讲过相关内容),与编译器和编程语言有紧密的联系。理解调用栈最重要的两点是:栈的结构,EBP寄存器的作用。一个函数调用动作可分解为:零到多个PUSH指令(用于参数入栈),一个CALL指令。CALL指令内部其实还暗含了一个将返回地址(即CALL指令下一条指令的地址)压栈的动作(由硬件完成)。几乎所有本地编译器都会在每个函数体之前插入类似如下的汇编指令: pushl %ebp movl %esp , %ebp 这样在程序执行到一个函数的实际指令前,已经有以下数据顺序入栈:参数、返回地址、ebp寄存器。由此得到类似如下的栈结构(参数入栈顺序跟调用方式有关,这里以C语言默认的CDECL为例): +| (栈底方向 | 高位地址 | .................... | | .................... | | 参数3 | | 参数2 | | 参数1 | | 返回地址 | | 上一层[ebp] | <-------- [ebp] |局部变量 | 低位地址 图7 函数调用栈结构 这两条汇编指令的含义是:首先将ebp寄存器入栈,然后将栈顶指针esp赋值给ebp。“mov ebp esp”这条指令表面上看是用esp覆盖ebp原来的值,其实不然。因为给ebp赋值之前,原ebp值已经被压栈(位于栈顶),而新的ebp又恰恰指向栈顶。此时ebp寄存器就已经处于一个非常重要的地位,该寄存器中存储着栈中的一个地址(原ebp入栈后的栈顶),从该地址为基准,向上(栈底方向)能获取返回地址、参数值,向下(栈顶方向)能获取函数局部变量值,而该地址处又存储着上一层函数调用时的ebp值。 一般而言,ss:[ebp+4]处为返回地址,ss:[ebp+8]处为第一个参数值(最后一个入栈的参数值,此处假设其占用4字节内存),ss:[ebp-4]处为第一个局部变量,ss:[ebp]处为上一层ebp值。由于ebp中的地址处总是“上一层函数调用时的ebp值”,而在每一层函数调用中,都能通过当时的ebp值“向上(栈底方向)”能获取返回地址、参数值,“向下(栈顶方向)”能获取函数局部变量值。如此形成递归,直至到达栈底。这就是函数调用栈。 提示:练习5的正确实现取决于对这一小节的正确理解和掌握。 3.3.2中断与异常 操作系统需要对计算机系统中的各种外设进行管理,这就需要CPU和外设能够相互通信才行。一般外设的速度远慢于CPU的速度。如果让操作系统通过CPU“主动关心”外设的事件,即采用通常的轮询(polling)机制,则太浪费CPU资源了。所以需要操作系统和CPU能够一起提供某种机制,让外设在需要操作系统处理外设相关事件的时候,能够“主动通知”操作系统,即打断操作系统和应用的正常执行,让操作系统完成外设的相关处理,然后在恢复操作系统和应用的正常执行。在操作系统中,这种机制称为中断机制。中断机制给操作系统提供了处理意外情况的能力,同时它也是实现进程/线程抢占式调度的一个重要基石。但中断的引入导致了对操作系统的理解更加困难。 在操作系统中,有三种特殊的中断事件。由CPU外部设备引起的外部事件如I/O中断、时钟中断、控制台中断等是异步产生的(即产生的时刻不确定),与CPU的执行无关,我们称之为异步中断(asynchronous interrupt)也称外部中断,简称中断(interrupt)。而把在CPU执行指令期间检测到不正常的或非法的条件(如除零错、地址访问越界)所引起的内部事件称作同步中断(synchronous interrupt),也称内部中断,简称异常(exception)。把在程序中使用请求系统服务的系统调用而引发的事件,称作陷入中断(trap interrupt),也称软中断(soft interrupt),系统调用(system call)简称trap。在后续试验中会进一步讲解系统调用。 本实验只描述保护模式下的处理过程。当CPU收到中断(通过8259A完成,有关8259A的信息请看附录A)或者异常的事件时,它会暂停执行当前的程序或任务,通过一定的机制跳转到负责处理这个信号的相关处理例程中,在完成对这个事件的处理后再跳回到刚才被打断的程序或任务中。中断向量和中断服务例程的对应关系主要是由IDT(中断描述符表)负责。操作系统在IDT中设置好各种中断向量对应的中断描述符,留待CPU在产生中断后查询对应中断服务例程的起始地址。而IDT本身的起始地址保存在idtr寄存器中。 (1) 中断描述符表(Interrupt Descriptor Table) 中断描述符表把每个中断或异常编号和一个指向中断服务例程的描述符联系起来。同GDT一样,IDT是一个8字节的描述符数组,但IDT的第一项可以包含一个描述符。CPU把中断(异常)号乘以8做为IDT的索引。IDT可以位于内存的任意位置,CPU通过IDT寄存器(IDTR)的内容来寻址IDT的起始地址。指令LIDT和SIDT用来操作IDTR。两条指令都有一个显示的操作数:一个6字节表示的内存地址。指令的含义如下:  LIDT(Load IDT Register)指令:使用一个包含线性地址基址和界限的内存操作数来加载IDT。操作系统创建IDT时需要执行它来设定IDT的起始地址。这条指令只能在特权级0执行。(可参见libs/x86.h中的lidt函数实现,其实就是一条汇编指令)  SIDT(Store IDT Register)指令:拷贝IDTR的基址和界限部分到一个内存地址。这条指令可以在任意特权级执行。 IDT和IDTR寄存器的结构和关系如下图所示: 图8 IDT和IDTR寄存器的结构和关系图 在保护模式下,最多会存在256个Interrupt/Exception Vectors。范围[0,31]内的32个向量被异常Exception和NMI使用,但当前并非所有这32个向量都已经被使用,有几个当前没有被使用的,请不要擅自使用它们,它们被保留,以备将来可能增加新的Exception。范围[32,255]内的向量被保留给用户定义的Interrupts。Intel没有定义,也没有保留这些Interrupts。用户可以将它们用作外部I/O设备中断(8259A IRQ),或者系统调用(System Call 、Software Interrupts)等。 (2) IDT gate descriptors Interrupts/Exceptions应该使用Interrupt Gate和Trap Gate,它们之间的唯一区别就是:当调用Interrupt Gate时,Interrupt会被CPU自动禁止;而调用Trap Gate时,CPU则不会去禁止或打开中断,而是保留它原来的样子。在IDT中,可以包含如下3种类型的Descriptor: • Task-gate descriptor (这里没有使用) • Interrupt-gate descriptor (中断方式用到) • Trap-gate descriptor(系统调用用到) 下图图显示了80386的任务门描述符、中断门描述符、陷阱门描述符的格式: 图9 X86的各种门的格式 可参见kern/mm/mmu.h中的struct gatedesc数据结构对中断描述符的具体定义。 (3) 中断处理中硬件负责完成的工作 中断服务例程包括具体负责处理中断(异常)的代码是操作系统的重要组成部分。需要注意区别的是,有两个过程由硬件完成:  硬件中断处理过程1(起始):从CPU收到中断事件后,打断当前程序或任务的执行,根据某种机制跳转到中断服务例程去执行的过程。其具体流程如下: 1) CPU在执行完当前程序的每一条指令后,都会去确认在执行刚才的指令过程中中断控制器(如:8259A)是否发送中断请求过来,如果有那么CPU就会在相应的时钟脉冲到来时从总线上读取中断请求对应的中断向量; 2) CPU根据得到的中断向量(以此为索引)到IDT中找到该向量对应的中断描述符,中断描述符里保存着中断服务例程的段选择子; 3) CPU使用IDT查到的中断服务例程的段选择子从GDT中取得相应的段描述符,段描述符里保存了中断服务例程的段基址和属性信息,此时CPU就得到了中断服务例程的起始地址,并跳转到该地址; 4) CPU会根据CPL和中断服务例程的段描述符的DPL信息确认是否发生了特权级的转换。比如当前程序正运行在用户态,而中断程序是运行在内核态的,则意味着发生了特权级的转换,这时CPU会从当前程序的TSS信息(该信息在内存中的起始地址存在TR寄存器中)里取得该程序的内核栈地址,即包括内核态的ss和esp的值,并立即将系统当前使用的栈切换成新的内核栈。这个栈就是即将运行的中断服务程序要使用的栈。紧接着就将当前程序使用的用户态的ss和esp压到新的内核栈中保存起来; 5) CPU需要开始保存当前被打断的程序的现场(即一些寄存器的值),以便于将来恢复被打断的程序继续执行。这需要利用内核栈来保存相关现场信息,即依次压入当前被打断程序使用的eflags,cs,eip,errorCode(如果是有错误码的异常)信息; 6) CPU利用中断服务例程的段描述符将其第一条指令的地址加载到cs和eip寄存器中,开始执行中断服务例程。这意味着先前的程序被暂停执行,中断服务程序正式开始工作。  硬件中断处理过程2(结束):每个中断服务例程在有中断处理工作完成后需要通过iret(或iretd)指令恢复被打断的程序的执行。CPU执行IRET指令的具体过程如下: 1) 程序执行这条iret指令时,首先会从内核栈里弹出先前保存的被打断的程序的现场信息,即eflags,cs,eip重新开始执行; 2) 如果存在特权级转换(从内核态转换到用户态),则还需要从内核栈中弹出用户态栈的ss和esp,这样也意味着栈也被切换回原先使用的用户态的栈了; 3) 如果此次处理的是带有错误码(errorCode)的异常,CPU在恢复先前程序的现场时,并不会弹出errorCode。这一步需要通过软件完成,即要求相关的中断服务例程在调用iret返回之前添加出栈代码主动弹出errorCode。 下图显示了从中断向量到GDT中相应中断服务程序起始位置的定位方式: 图10 中断向量与中断服务例程起始地址的关系 (4) 中断产生后的堆栈栈变化 下图显示了给出相同特权级和不同特权级情况下中断产生后的堆栈栈变化示意图: 图11 相同特权级和不同特权级情况下中断产生后的堆栈栈变化示意图 (5) 中断处理的特权级转换 中断处理得特权级转换是通过门描述符(gate descriptor)和相关指令来完成的。一个门描述符就是一个系统类型的段描述符,一共有4个子类型:调用门描述符(call-gate descriptor),中断门描述符(interrupt-gate descriptor),陷阱门描述符(trap-gate descriptor)和任务门描述符(task-gate descriptor)。与中断处理相关的是中断门描述符和陷阱门描述符。这些门描述符被存储在中断描述符表(Interrupt Descriptor Table,简称IDT)当中。CPU把中断向量作为IDT表项的索引,用来指出当中断发生时使用哪一个门描述符来处理中断。中断门描述符和陷阱门描述符几乎是一样的。中断发生时实施特权检查的过程如下图所示: 图12 中断发生时实施特权检查的过程 门中的DPL和段选择符一起控制着访问,同时,段选择符结合偏移量(Offset)指出了中断处理例程的入口点。内核一般在门描述符中填入内核代码段的段选择子。产生中断后,CPU一定不会将运行控制从高特权环转向低特权环,特权级必须要么保持不变(当操作系统内核自己被中断的时候),或被提升(当用户态程序被中断的时候)。无论哪一种情况,作为结果的CPL必须等于目的代码段的DPL。如果CPL发生了改变,一个堆栈切换操作(通过TSS完成)就会发生。如果中断是被用户态程序中的指令所触发的(比如软件执行INT n生产的中断),还会增加一个额外的检查:门的DPL必须具有与CPL相同或更低的特权。这就防止了用户代码随意触发中断。如果这些检查失败,会产生一个一般保护异常(general-protection exception)。 3.3.3 lab1中对中断的处理实现 (1) 外设基本初始化设置 Lab1实现了中断初始化和对键盘、串口、时钟外设进行中断处理。串口的初始化函数serial_init(位于/kern/driver/console.c)中涉及中断初始化工作的很简单: ...... // 使能串口1接收字符后产生中断 outb(COM1 + COM_IER, COM_IER_RDI); ...... // 通过中断控制器使能串口1中断 pic_enable(IRQ_COM1); 键盘的初始化函数kbd_init(位于kern/driver/console.c中)完成了对键盘的中断初始化工作,具体操作更加简单: ...... // 通过中断控制器使能键盘输入中断 pic_enable(IRQ_KBD); 时钟是一种有着特殊作用的外设,其作用并不仅仅是计时。在后续章节中将讲到,正是由于有了规律的时钟中断,才使得无论当前CPU运行在哪里,操作系统都可以在预先确定的时间点上获得CPU控制权。这样当一个应用程序运行了一定时间后,操作系统会通过时钟中断获得CPU控制权,并可把CPU资源让给更需要CPU的其他应用程序。时钟的初始化函数clock_init(位于kern/driver/clock.c中)完成了对时钟控制器8253的初始化: ...... //设置时钟每秒中断100次 outb(IO_TIMER1, TIMER_DIV(100) % 256); outb(IO_TIMER1, TIMER_DIV(100) / 256); // 通过中断控制器使能时钟中断 pic_enable(IRQ_TIMER); (2) 中断初始化设置 操作系统如果要正确处理各种不同的中断事件,就需要安排应该由哪个中断服务例程负责处理特定的中断事件。系统将所有的中断事件统一进行了编号(0~255),这个编号称为中断向量。以ucore为例,操作系统内核启动以后,会通过 idt_init 函数初始化 idt 表 (参见trap.c),而其中 vectors 中存储了中断处理程序的入口地址。vectors 定义在 vector.S 文件中,通过一个工具程序 vector.c 生成。其中仅有 System call 中断的权限为用户权限 (DPL_USER),即仅能够使用 int 0x30 指令。此外还有对 tickslock 的初始化,该锁用于处理时钟中断。 vector.S 文件通过 vectors.c 自动生成,其中定义了每个中断的入口程序和入口地址 (保存在 vectors 数组中)。其中,中断可以分成两类:一类是压入错误编码的 (error code),另一类不压入错误编码。对于第二类, vector.S 自动压入一个 0。此外,还会压入相应中断的中断号。在压入两个必要的参数之后,中断处理函数跳转到统一的入口 alltraps 处。 (3) 中断的处理过程 trap函数(定义在trap.c中)是对中断进行处理的过程,所有的中断在经过中断入口函数__alltraps预处理后 (定义在 trapasm.S中) ,都会跳转到这里。在处理过程中,根据不同的中断类型,进行相应的处理。在相应的处理过程结束以后,trap将会返回,被中断的程序会继续运行。整个中断处理流程大致如下: trapasm.S 1)产生中断后,CPU 跳转到相应的中断处理入口 (vectors),并在桟中压入相应的 error_code(是否存在与异常号相关) 以及 trap_no,然后跳转到 alltraps 函数入口: 注意:此处的跳转是 jmp 过程 (high) ... 产生中断时的 eip → eip error_code esp → trap_no (low) ... 在栈中保存当前被打断程序的 trapframe 结构(参见过程trapasm.S)。设置 kernel (内核) 的数据段寄存器,最后压入 esp,作为 trap 函数参数(struct trapframe * tf) 并跳转到中断处理函数 trap 处: 注意:此时的跳转是 call 调用,会压入返回地址 eip,注意区分此处eip与trapframe中eip: trapframe的结构为: Struct trapframe { uint edi; uint esi; uint ebp; … ushort es; ushort padding1; ushort ds; ushort padding2; uint trapno; uint err; uint eip; ... } 观察 trapframe 结构与中断产生过程的压桟顺序。 需要明确 pushal 指令都保存了哪些寄存器,按照什么顺序? ← trap_no ← trap_error ← 产生中断处的 eip 进入 trap 函数,对中断进行相应的处理: 3)结束 trap 函数的执行后,通过 ret 指令返回到 alltraps 执行过程。 从栈中恢复所有寄存器的值。 调整 esp 的值:跳过栈中的 trap_no 与 error_code,使esp指向中断返回 eip,通过 iret 调用恢复 cs、eflag以及 eip,继续执行。 trap.c 2)详细的中断分类以及处理流程如下: 根据中断号对不同的中断进行处理。其中,若中断号是IRQ_OFFSET + IRQ_TIMER 为时钟中断,则把ticks 将增加一。 若中断号是IRQ_OFFSET + IRQ_COM1 为串口中断,则显示收到的字符。 若中断号是IRQ_OFFSET + IRQ_KBD 为键盘中断,则显示收到的字符。 若为其他中断且产生在内核状态,则挂起系统; 图13 ucore中断处理流程 至此,对整个lab1中的主要部分的背景知识和实现进行了阐述。请大家能够根据前面的练习要求完成所有的练习。 ## 4 实验报告要求 从网站上下载lab1.tar.bz2后,解压得到代码目录lab1,完成实验。在实践中完成实验的各个练习。在报告中回答所有练习中提出的问题。实验报告文档命名为lab1-学生ID.odt or lab1-学生ID.txt。推荐用txt格式,即基本文本格式。对于lab1中编程任务,完成编写之后,在lab1目录下执行make handin任务,即会自动生成lab1-handin.tar.gz文件。建立一个目录,名字为lab1_result,将实验报告文档和之前生成的handin文件放在该目录下。然后用tar软件压缩打包此目录,并命名为lab1-学生ID.tar.bz2(在lab1_result的上层目录下执行“tar jcf lab1-学生ID.tar.bz2 lab1_result “即可)。最后请一定提前或按时提交到网络学堂上。 注意有“LAB1”的注释,代码中所有需要完成的地方(challenge除外)都有“LAB1”和“YOUR CODE”的注释,请在提交时特别注意保持注释,并将“YOUR CODE”替换为自己的学号,并且将所有标有对应注释的部分填上正确的代码。 ## 附录“关于A20 Gate” 【参考“关于A20 Gate” http://hengch.blog.163.com/blog/static/107800672009013104623747/ 】 【参考“百度文库 激活A20地址线详解” http://wenku.baidu.com/view/d6efe68fcc22bcd126ff0c00.html】 Intel早期的8086 CPU提供了20根地址线,可寻址空间范围即0~2^20(00000H~FFFFFH)的 1MB内存空间。但8086的数据处理位宽位16位,无法直接寻址1MB内存空间,所以8086提供了段地址加偏移地址的地址转换机制。PC机的寻址结构是segment:offset,segment和offset都是16位的寄存器,最大值是0ffffh,换算成物理地址的计算方法是把segment左移4位,再加上offset,所以segment:offset所能表达的寻址空间最大应为0ffff0h + 0ffffh = 10ffefh(前面的0ffffh是segment=0ffffh并向左移动4位的结果,后面的0ffffh是可能的最大offset),这个计算出的10ffefh是多大呢?大约是1088KB,就是说,segment:offset的地址表示能力,超过了20位地址线的物理寻址能力。所以当寻址到超过1MB的内存时,会发生“回卷”(不会发生异常)。但下一代的基于Intel 80286 CPU的PC AT计算机系统提供了24根地址线,这样CPU的寻址范围变为 2^24=16M,同时也提供了保护模式,可以访问到1MB以上的内存了,此时如果遇到“寻址超过1MB”的情况,系统不会再“回卷”了,这就造成了向下不兼容。为了保持完全的向下兼容性,IBM决定在PC AT计算机系统上加个硬件逻辑,来模仿以上的回绕特征,于是出现了A20 Gate。他们的方法就是把A20地址线控制和键盘控制器的一个输出进行AND操作,这样来控制A20地址线的打开(使能)和关闭(屏蔽\禁止)。一开始时A20地址线控制是被屏蔽的(总为0),直到系统软件通过一定的IO操作去打开它(参看bootasm.S)。很显然,在实模式下要访问高端内存区,这个开关必须打开,在保护模式下,由于使用32位地址线,如果A20恒等于0,那么系统只能访问奇数兆的内存,即只能访问0--1M、2-3M、4-5M......,这显然是不行的,所以在保护模式下,这个开关也必须打开。 当A20 地址线控制禁止时,则程序就像在8086中运行,1MB以上的地是不可访问的。在保护模式下A20地址线控制是要打开的。为了使能所有地址位的寻址能力,必须向键盘控制器8042发送一个命令。键盘控制器8042将会将它的的某个输出引脚的输出置高电平,作为 A20 地址线控制的输入。一旦设置成功之后,内存将不会再被绕回(memory wrapping),这样我们就可以寻址整个 286 的 16M 内存,或者是寻址 80386级别机器的所有 4G 内存了。 键盘控制器8042的逻辑结构图如下所示。从软件的角度来看,如何控制8042呢?早期的PC机,控制键盘有一个单独的单片机8042,现如今这个芯片已经给集成到了其它大片子中,但其功能和使用方法还是一样,当PC机刚刚出现A20 Gate的时候,估计为节省硬件设计成本,工程师使用这个8042键盘控制器来控制A20 Gate,但A20 Gate与键盘管理没有一点关系。下面先从软件的角度简单介绍一下8042这个芯片。 图 键盘控制器8042的逻辑结构图 8042键盘控制器的IO端口是0x60~0x6f,实际上IBM PC/AT使用的只有0x60和0x64两个端口(0x61、0x62和0x63用于与XT兼容目的)。8042通过这些端口给键盘控制器或键盘发送命令或读取状态。输出端口P2用于特定目的。位0(P20引脚)用于实现CPU复位操作,位1(P21引脚)用户控制A20信号线的开启与否。系统向输入缓冲(端口0x64)写入一个字节,即发送一个键盘控制器命令。可以带一个参数。参数是通过0x60端口发送的。 命令的返回值也从端口 0x60去读。8042有4个寄存器:  1个8-bit长的Input buffer;Write-Only;  1个8-bit长的Output buffer; Read-Only;  1个8-bit长的Status Register;Read-Only;  1个8-bit长的Control Register;Read/Write。 有两个端口地址:60h和64h,有关对它们的读写操作描述如下:  读60h端口,读output buffer  写60h端口,写input buffer  读64h端口,读Status Register  操作Control Register,首先要向64h端口写一个命令(20h为读命令,60h为写命令),然后根据命令从60h端口读出Control Register的数据或者向60h端口写入Control Register的数据(64h端口还可以接受许多其它的命令)。 Status Register的定义(要用bit 0和bit 1): bit meaning ----------------------------------------------------------------------- 0 output register (60h) 中有数据 1 input register (60h/64h) 有数据 2 系统标志(上电复位后被置为0) 3 data in input register is command (1) or data (0) 4 1=keyboard enabled, 0=keyboard disabled (via switch) 5 1=transmit timeout (data transmit not complete) 6 1=receive timeout (data transmit not complete) 7 1=even parity rec'd, 0=odd parity rec'd (should be odd) 除了这些资源外,8042还有3个内部端口:Input Port、Outport Port和Test Port,这三个端口的操作都是通过向64h发送命令,然后在60h进行读写的方式完成,其中本文要操作的A20 Gate被定义在Output Port的bit 1上,所以有必要对Outport Port的操作及端口定义做一个说明。  读Output Port:向64h发送0d0h命令,然后从60h读取Output Port的内容  写Output Port:向64h发送0d1h命令,然后向60h写入Output Port的数据  禁止键盘操作命令:向64h发送0adh  打开键盘操作命令:向64h发送0aeh 有了这些命令和知识,就可以实现操作A20 Gate来从实模式切换到保护模式了。 理论上讲,我们只要操作8042芯片的输出端口(64h)的bit 1,就可以控制A20 Gate,但实际上,当你准备向8042的输入缓冲区里写数据时,可能里面还有其它数据没有处理,所以,我们要首先禁止键盘操作,同时等待数据缓冲区中没有数据以后,才能真正地去操作8042打开或者关闭A20 Gate。打开A20 Gate的具体步骤大致如下(参考bootasm.S): 1.等待8042 Input buffer为空; 2.发送Write 8042 Output Port (P2)命令到8042 Input buffer; 3.等待8042 Input buffer为空; 4.将8042 Output Port(P2)得到字节的第2位置1,然后写入8042 Input buffer; 附录“启动后第一条执行的指令” 【参考IA-32 Intel Architecture Software Developer’s Manual Volume 3: System Programming Guide Section 9.1.4】 9.1.4 First Instruction Executed The first instruction that is fetched and executed following a hardware reset is located at physical address FFFFFFF0H. This address is 16 bytes below the processor’s uppermost physical address. The EPROM containing the softwareinitialization code must be located at this address. The address FFFFFFF0H is beyond the 1-MByte addressable range of the processor while in real-address mode. The processor is initialized to this starting address as follows. The CS register has two parts: the visible segment selector part and the hidden base address part. In real-address mode, the base address is normally formed by shifting the 16-bit segment selector value 4 bits to the left to produce a 20-bit base address. However, during a hardware reset, the segment selector in the CS register is loaded with F000H and the base address is loaded with FFFF0000H. The starting address is thus formed by adding the base address to the value in the EIP register (that is, FFFF0000 + FFF0H = FFFFFFF0H). The first time the CS register is loaded with a new value after a hardware reset, the processor will follow the normal rule for address translation in real-address mode (that is, [CS base address = CS segment selector * 16]). To insure that the base address in the CS register remains unchanged until the EPROM based softwareinitialization code is completed, the code must not contain a far jump or far call or allow an interrupt to occur (which would cause the CS selector value to be changed). \ No newline at end of file diff --git a/lab1/.DS_Store b/lab1/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..68766d52acd8c655aa32b7b20a63f85117755f23 GIT binary patch literal 6148 zcmeH~Jx;?w5QS$F7ZIdLNx3Bz!u-=&Q9z<4J%Rv=K!MOe?PG8#4!{9805>piW=AN| z+HnO!XeOF{>-B!N{5Ib85)ludZ*rmm5%rLw*&2$Pkn@sBbgZQhWxd8NZR3~I7Cj}s zy}=!D2mYD^^6vKOjvnZWrnLC}KGO7THou>fx3Ju2op>T(=sZ~AULAXh_Y=lIO1pz)~_%vqeh(AHXm$vX4|2#-W}Hu z+MT$F>ZLp24lFy+jfVqS|4*9t|I3gcxdZONzjA=H(Reh(BiY)TJe;hx0eOj(kbY%U kMNrsstQA>`H;@`Q7o-9$Ov|WfLHLJ&+Tevd@T(4d0UPMCMgRZ+ literal 0 HcmV?d00001 diff --git a/lab1/image001.png b/lab1/image001.png new file mode 100644 index 0000000000000000000000000000000000000000..10234954b1473189847d2faa7cb157588dfd68a2 GIT binary patch literal 15818 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 literal 0 HcmV?d00001 diff --git a/lab1/image002.png b/lab1/image002.png new file mode 100644 index 0000000000000000000000000000000000000000..22b441555a1930341a699ccb1eb25549ba1d600a GIT binary patch literal 16583 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 McK`qY literal 0 HcmV?d00001 diff --git a/lab1/image005.png b/lab1/image005.png new file mode 100644 index 0000000000000000000000000000000000000000..11fa126efcae223eb46b496cb17a952522580a87 GIT binary patch literal 23088 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 P00000NkvXXu0mjf354?Q literal 0 HcmV?d00001 diff --git a/lab1/image006.png b/lab1/image006.png new file mode 100644 index 0000000000000000000000000000000000000000..495b47e8e26fffb5da1fb5c896b252076f364307 GIT binary patch literal 51963 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 literal 0 HcmV?d00001 diff --git a/lab1/image007.png b/lab1/image007.png new file mode 100644 index 0000000000000000000000000000000000000000..82e23be84f5d0ca2d7dcb4323bfb1f76ed8723e3 GIT binary patch literal 13513 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 literal 0 HcmV?d00001 diff --git a/lab1/image008.png b/lab1/image008.png new file mode 100644 index 0000000000000000000000000000000000000000..f3ab540eac4bec1926562e8c365a61c38a15073c GIT binary patch literal 27879 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

{d+)@LrCgeSp_ z85mpqRIZ(6+=OS%@*L5OloQ7MkT|5UM?l!++M#YUN!f4m%?l=(GX`0QWI23^8hNb) zBD%nV2!r!H#z#vESgS+^)ILL&uf4|OPrV;nip4kCm@>w<*0GxOe=fKTRP{XbPFShw zPt-I>bwj3$+ERHz9*e+g6hj7WPZC%Foi@0(9c)}(mKz&YnxN!b{~vKa9#3u-=uqp# zZoygmy!HiYW1%>_dSCAK{>mRyoOYhF_>P3h9sv0IP6F4pfJvwr>yrnE(1rtW5#6nb zE3pCO1A9op6n<0>9SPbA6=71#N={Xl;ls@g1)sFU!UX#E_#I%vQht*pYQqZ4E7RHm zepITTmfa2VZ*_4IP*5pT$(OA+p6M>%XoLoi7O!}Wn>XKFlTMP#e1)I*^MH_Sk}S9k z2d}tmP^qluBe4FC8s)eo)Uh}quDU@glZ09=8+1D=eaXx%#^7nrq`+&4j zO}`6w@STyQ0+F(VG&08`ek6X=9{{15Jo}~WOhd9S=9@HUL!9wl_$C-SRoz@f_d%(Qc`}vwPLoSOF z1M23g-DJ@Imxa+BFXRm`9_kbA&uy~suBydTJ(oVFR17k-=d}g6{xX4*rQ6}JeN4#m zss+eON)%b&I8kwhl>NI>b`2Q?V~wV)jgJPk+C6Jop- zq%f>|&$<8OWd5_nPNSB)%l%tIcRF&zyFJYYU>{w9(-Cl(6NE?kX?k?q6+xF|(Pysxp1wJhB1cc0-Vy7_p15k3@uu>I2>D-8v7c-Lx^{2J# zFUhKRw(>Ld+AXx^bibI=WDyQJCg5$y7^wYk`9I`+W@&`Fuqwq+2e%lt! z$J-N6de~9hmr7Z!HCLoMB1>|=`cgy+OmKvpn7#XC>HezsZ)WT+R>n`7yPX#!<)4$h zpMVkRa`=o8vO*~dd}m4rrI&gO8b~g>t>mMn5Ozqhy0FtrIf##jfO(@=vOi@Q&N_s> zMXu|$uaO*>5IY=0^0G2!v#Ywcag%cqPwaOr-=UJ5g~%j>8VQs8!okb0&qXooaguS@ z4HU_?suzLINENjj@1^AU%jz5! zt)J7iy&W5^W~Ry&lA?tS31E|0)Y%r_-rFcbnJ|{EJE-cR>Z3aA;I5mX%7oMfSX2v1 zYP@m?k3Y!v+WVr73e#k%c zHUR%_IBHgUdAR@^IRuI?+X;eG$aAy$C!D{^8501&rL6*Z#?qs=Z_4G1`kV%9u8|(P zuzW{=o$_e1gw_y-S_Vg}2b&uJ&v|P=uP^6xG?qxH5pvnyfzH3+S6~(J18;!bzX27% z)xd<_nnPj`s4ygFpYt6?RwRi68nSnhyY4|_CjO}cv@?oklDDh)+ndTJ14zcs-l8J( zt6<*ysAUIA15p2HbQDH}ei=o#CDBDUOOf* zB8h2zCSrbp2`P&07tF=nVjOM>PG5h#nXq2n#(NJuSFO*CRpa@l{u<`9`+6v~sbEMw zAu##Ae1jm*YHrd-0k3E|MXc6A>Jl-m+N(-GUo15M3c$%B0fmP@VfT3vT(8!1$$+BV zdU;tfXgZAx<)~&t)$`=%_WQr0Cg2?YGt$f`gvvJrFftb)MaQcI8jaGwah6r5al2yz zfWP*yVynT#-G*-ral5a28Di}AOYynaZ$xa*EYLQ}4N56BJ9O%5js07=kAdEQ)gl`L zm&x=Ff26f*cK0?f>IdOKiIamniqC5zxD@KxeZhW~nH1*KW;^qGl9J2sYNAXEk}FL5 z67{svdjR~Fa3B1F^GKJnePZ+!oR|Z8pZ*Q}a9oxQd%qa6nOEhivij0ljFWB(hP-{a z?w@_B)yYOs@*4P9^K`S(2{MO1MF zz;->|8BIElV)*cYuPbsjTf*amQ=qV>#CLCF)SlMh2O7vap z8Q20qnf6d`q@m@1l~qFG+WP=}A0x9TA`12H9qApc($pD9Ob9hOz>cS79+Cac@Et=Q zauA+&6K!(4{T5VQaX1$F37TzBwPoiPdSM6DT`NR8WNwiEz)G@k&@?~su`R<%-?39) z5m23OCh_NOl|AqJLut9*M4dxf$DwYxJvhdp9@L{>9{xgIVRH49ZCRRHYi>t-t`4je zw^g?c5##e+05MTb}%-VUmLs@h-W5(>51>wx~Uw+*Y7oZin}!=31#)$ z3y%a|IF-*kw)lF@tSp5agjM(Ll1u~6EKL{5{sG?zzOaDnJK+4~I>(wLc%-~Nt32WS z<_8c5B?M23-bj6mq70nhoHb64DWsD{_bJf+8q`XD!Wxq^WL8!N^F#AoS@8`T$i)?! zrJeavRVH^+09YOQW|je&WcGd*4KLBN>!`01IW&-;8)TmwN=5+JDqEGQmN_?XsB7gC z+j58zY%rtMQ(}uZrVquhdp7G`(8;R$MpwuPCfxnPzAV|yG(VNF(}Z)X zS{Q(TljM0zn6PB9^WK=eO-iw1%A-!2jfE=v6RpJ%EhvO{shPY@I1W}bxU5R9`>oUd zN@70vc{Q(22>tTQYL|fUizCd%FXX6!=)UchogR}OqU`fh3~j6k%}^aes%q}< z5~j>b|6#+C!P@B9UymP0G8M0a5yO6EmsQ)SdLU=6TpYI3^T2Bw%pxC>bp1=FHQhvb zR+=qKWQ4!{25z@8(15c%d! z7;HHRo&ZWsdc zXC(+qFi5281Py-CE7^22Rjx`sCDBe@eZTtap78OV-dAUGwrMUss}~-lN97KQ%d09< z`*`J?3Wh6%vJjpj_se=`>6J~P6zf$tr=;h(m86xZ7isCy=2dFlnGr|BFEmGEpnO)~!_VMv@C5Q{KN>FjV1W^R}ND@t&K zt&(8_%bLxxt8#0@?D-s)Ht|}jDVRwk>50ahu9OQo?%X&@)kRMy9(PlPWGve0?7|f2 zR&8Z%96lP1zfo;NhPC}AJ~U~>J^|1U-1Q^9h1L^vRk^O*&TAvr%jt;ZQLALh2cRs> zY7B|nFwLzMKn3t3ZDNs8@U1YPVsePp3>bC`p}+Ep);Z*9kty+)C^$^T<{M4PrBi%j6XTO!LgE>K#L2%coI; zP+T~FDWp&0F~@V-pGMiSfT#P7!!$?;+Ih;{I*&2G`-#=Q^lcOd=GNh7xj+cNlG zYM;!8M*Mh^;V*{vWi}_z`@MlC?UZx$*Qg0p{553zcsfNjVQ_W@Hk^Ldk#pHKw_2hp zRhI2X`(fHL&f=nn^0bU*gK3yvl(-3bue;rPy1~#)Ka4z7X|gF&Aw?A=iNC1e&-T;I zpV^Dwg}(Ehz;hc$A7n6*GU29wy{}ValEXo!bj=tMq&$odYlGdx#rF;W&8_b$Pge^TxB`fr}&KZyi@llD5R$H*14~BpcXq zxMaLlneezu){XJRVa({kRIaFer*2%jC88Vg{@i4`rb`DK}+b z=O59SORbqvJ26Zbi3Io3Qgf+m;166<{l#qjB~@k)aaQXL4@OksNN5mA|NVS92eWv* zmCjB~C;Izx&bEB;r^{x4sztV2y@lI!5MKs%1b-ZRmj~S={%d7%;?8!KLnDc*Wxv0h z8%E(K#_5C1K?O*YXO$Ss!xg;CHZvs$hYEmXGgPd(Nwu>b%zKD;_I%y%; zCKN*!yA`F@2xE3+EfcbTKvn0m>JmU&d;Uo8jWCs6gHi;~Ua>+A@Bs{jpe#0o z1dkX`s|LZ`>y-LzJ1TlJErzH@2GQh~Jy`z&laO@LmjqwVv#e~dfd+?t)@=(5jp&hoy)6E0&%YjaJS0Xe>T! zPUxN8jtt+?!AtNYt^B!BXG#$PHDEzXr(3%2X zg7o_u4a@2SA3LqDTA4#a4>{)mD-K#JR~hk&LS_DSSfBjf)L&`3iNFn)ACw}mOHj@% zO2v-t81gS?1v1qwK*om;D)smTaUoGtAemqbx73Z{v#qNhYM348RyW-HGks!U=Rx7- zZS(Pk{-N?f`k4)%Oz)fhgN0O$*>OQIhXq)z7fpDQ&2k%uF70IqpTc3u^kWGWg_Dy0 zbVr))`0PZA#a5tS+2{C>=bG)hc-A(fcQ)?L$ylHW&v0Ol%K2kpnd$bHqWhq8HH;>! z|1fpqf4CR~R*QT)?Q*he(8KC);+eqWJ}|Y+T37Jq9L8nNVP>c(!3EoWC^&_rRQ!R( zx^QEz8V>?dd!1B+hd@)5$dQL7 z9KO06CGK%+lQ5taeNL{mb1lv-TdfYty~zKUHv5nRUarcLu&VG*XLYn!_(dvG1&carz1z$re?=|nvH|Z+ ziSV&V&Cd`xMPp@-2ui|@TuT*WanM|lb%**9q|8hQen|Q2uzKdOdMUQXsE9km&yU&} z((%q#rD@@Cr-L>Ii=WMrtx%@3u3=SkM5`^1cNNbPXo#*;$TX?Ui=&lAf3F^q^zL80 z>Q7{!_=Zql#k7A8AmyK~BOifKIdO$YgDsf-bj9J6BKdG3KVpK83ro!cvdKYM!=az( zP3BiL&QvE#4|zw}5G3}Y_M42|v)!9?-M`1Ui6e6@ySzL$BPbIyKPw#9rQ=thcP8;| zuhnE9UYf#25KtYK$lw&{DviC3AC4}e>T`aJcyblJ-#x~~=W-$yRR6q zk<0cZblzuBVZ!g-W3BC2(j<~BVv>XO$8TKtKe-XPYPMnz?T)bp!Z{UP6LrE#GFtzr zueBx9@Ha=5N-?qwJeDWAFP$-p#=SOLqm6&f$RfN6%#6XWGTKg%I#UDiarKMyi;@=- z&*cEgIT63}Y;Wo0?q%uM?|YDu4PBg+lfOj_4YnDO`@R zz4jpzCyloi&I2`5R1aZda&aOAYcZ0N@=7y-o8G%DDNQoro`kq&;63Ur=&uqXkXHi* zxSl@B_R}?MZDKLO$*Tq;&>$Y8VGU{U;L|fWzsgddOy=uGa#(@&yEXK;THstJNY;h2 zC@d>TXEn^z40K^+?tq5|d&;|mp=$kfw2V#F@GHydlE8$oW|1K28=-i($S4whUs9{e zN8#Q=JR*S}8U>++e(0Jn=?jzA3=rq@R~iu-9;i$9o*frUG}nUol?mTTTu4QJxx)v> z^S}OK6o*XwLP%TjLglvQlJv=NzxSwIMsPPnHn+v0>{Q$Gn4Jv2?Z|fEqvM~nJIPn> zYWK8v&h1WJc}P09lIq}Mm?WntwEMRp2=i|`gb3OzGj5s%!eZzOo+vq9lgg6ao zNfW<45_8ZwEBhOhJdSX?8tUXw-2KbUC!LwR+ZVad>UWep-)R;R`vlGNpoE<_U?J`v zHFsmIvwP}s8We1PQnTiF=c^#c(51iOOG(JhB4!~_QGY|W`L)Zgjab3yf`-nt0RS%o zWIt#5Vt~WjyWBo|gu=*9Yu}sBPD=JpdU~B4c;N!9KazZ%LJsXkHGL#eXq}f~!H(Tf z8VZPjG}!-wT=Vb3)Ot}lusq8UYmzx;-E`*9jmWS`g?__R%4?rOwvhko$2#z#8je3l=Wx5qUU0_0MlPLWEPaS?%c zvnT6R#lfr)ZDBwz+4(J(U6++iAS$0?c{aMh?00i~p2rcgVMGb~5H9Vld_%=y4<3vd zRmWHzR~&1h2};p8a&|zo z0o+W5=`NE6h|r2MZ)L@7sg`~eo`7U5>GwW7Kn@m?K|i;aaf+H9>Z<)rdXc$St4!60 zQVsj{Z}!(ocs&TpP?^KYx^>qMTw!H&y2`LFE>Z#<8%6fVZ;TH*-?nvqwRjGRbAI*C zifRQigwHY&-(`q%NGRjDFlg5OX?E~(!aLcLPmp^=XJsBkFR21J91qFI^4Q9n%2vE) z;j=B?5088UEKgcQfGl&aZ~!}J!I!mYjg(=y2pET~43qP30>%)N#wS0R)N zR^<--aNrVH@Z0)W3Pha;pj2qp<6{7?u2~ZN$Brq{ tf#{h2_aOfNKZJkK9r+c|;ylpE2!R=o^gsInA7F-}q@XJQUDhb@{{beyg*yNM literal 0 HcmV?d00001 diff --git a/lab1/image009.png b/lab1/image009.png new file mode 100644 index 0000000000000000000000000000000000000000..556d17392a09e22a2f2923b46815f52147888448 GIT binary patch literal 13993 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 literal 0 HcmV?d00001 diff --git a/lab1/image011.png b/lab1/image011.png new file mode 100644 index 0000000000000000000000000000000000000000..016de79dbb483edcefe69d3efe0840584ea1e5f7 GIT binary patch literal 55970 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 z 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 y0uljua;L2epf6n=egU3{f6-f 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 z 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 literal 0 HcmV?d00001 diff --git a/lab2.files/image002.png b/lab2.files/image002.png new file mode 100644 index 0000000000000000000000000000000000000000..39f8866037092409f2803dc6937fc552f13868fb GIT binary patch literal 12994 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 X=!D#+km3LSru>i+lNYTOHVFEEsC=Kw literal 0 HcmV?d00001 diff --git a/lab2.files/image003.png b/lab2.files/image003.png new file mode 100644 index 0000000000000000000000000000000000000000..b436cb4d2dbc32b01789648cb05cad7477779d8a GIT binary patch literal 48307 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

?dQ)ijzu4eNmFxF0zCBZvUfj-g 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

N5wh36uc9#$BMHJ z1sujVnKgPO!F-y=>YAXRW#!!=`}V82aaEI*g2$WvEWY4}R15mWmzifcSqAL7+UCOC zH_r8*`rL#MNXV+T7K+ymAkOoqYIpQ+QtYyV;>v3j6dS-y3;M~!z}&r+bt`0EbM$mY zY!=z*^>Vy-ddypiRf3$B@om+fZ-^3_gIwwEeu(gv$!49C(8bynczD~W`N6@}F~%2S z4me)hdSt~_;S8GeP^x}5F-+-^uy}nRS_3Irp_EkMpCYf?68v#M#*O6GRu#RT)I4bsuG0r>AM;I8rhcnN2R57DBBkI`+D$3AlQ}m zkC>BQia*V<{AFp^X;rLz07$gwHKC;jW_sR;Iqu1_UDRmnMANUSl=K*7H>S)^Vvq9(X+Pdnw6`Mxp<5d5G-l;K&@ zBEQfkf6pa(F~Zc_q9jZf1St+75{=!6BRM-pDcM{H&B)j1M!K14>EeYZ^J|2YrQ()5 zBY(8YtxU-|{(-JHOvL_@7!qjV{=*Cy!ilc`&HPyelW(n05Xt<@RY)prhCg@)puAiE z-%PSOO$#5vr>jic1G}+SH(34Tf0%~kmsR@~;&}|*_9kg;$tfrTNY^RIP(Cm;{0nxJ znI2SLMx)V$n+7!SrrRugK%UU^(*UeuNSws`Cx2wh|MDNw`?_G(d1faC1On#;d!fSh zUGS5mZ9i=CUxxJ;64fy246bP+))$S1+vmp!OMG2nVV@uM5B|%C{#|lw=<-(&7x-SP mMB#s1|DS2`|A*jv5f^04rN>|Dmc|g5NROr(QndnRiT*zb$TgS% literal 0 HcmV?d00001 diff --git a/lab2.files/image007.png b/lab2.files/image007.png new file mode 100644 index 0000000000000000000000000000000000000000..5d092fb3ffbc9c741a7adde7c0c9ed5655734d90 GIT binary patch literal 27244 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 KUj4%;@P7fmG7Ogh literal 0 HcmV?d00001 diff --git a/lab2.files/image008.png b/lab2.files/image008.png new file mode 100644 index 0000000000000000000000000000000000000000..5fac4105cfbe488fa0c80f8027c4d98735546df8 GIT binary patch literal 31949 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 aohRr+EV@Ad^K(r3F9{J@;VMD>fd2<0OO7Z2 literal 0 HcmV?d00001 diff --git a/lab2.files/image009.png b/lab2.files/image009.png new file mode 100644 index 0000000000000000000000000000000000000000..357b503b00543e6f2491f412469b9d05786a9f3a GIT binary patch literal 1155 zcmV-}1bq96P)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER0000QNkl4CA9zm literal 0 HcmV?d00001 diff --git a/lab2.files/image010.png b/lab2.files/image010.png new file mode 100644 index 0000000000000000000000000000000000000000..357b503b00543e6f2491f412469b9d05786a9f3a GIT binary patch literal 1155 zcmV-}1bq96P)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER0000QNkl4CA9zm literal 0 HcmV?d00001 diff --git a/lab2.files/image011.png b/lab2.files/image011.png new file mode 100644 index 0000000000000000000000000000000000000000..357b503b00543e6f2491f412469b9d05786a9f3a GIT binary patch literal 1155 zcmV-}1bq96P)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER0000QNkl4CA9zm literal 0 HcmV?d00001 diff --git a/lab2.files/image012.png b/lab2.files/image012.png new file mode 100644 index 0000000000000000000000000000000000000000..357b503b00543e6f2491f412469b9d05786a9f3a GIT binary patch literal 1155 zcmV-}1bq96P)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER0000QNkl4CA9zm literal 0 HcmV?d00001 diff --git a/lab2.files/image013.png b/lab2.files/image013.png new file mode 100644 index 0000000000000000000000000000000000000000..4c639332aed15e7c8471676953b6bdb657e1713d GIT binary patch literal 1155 zcmV-}1bq96P)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER0000QNkl + + + + + +实验二:内存管理 + + + + + + +

+ +

验二:物理内存管

+ +

1    实验目

+ +

       理解基于段页式内存地址的转换机制

+ +

       理解页表的建立和使用方法

+ +

       理解物理内存的管理方法

+ +

2    实验内

+ +

实验一过后大家做出来了一个可以启动的系统,实验二主要涉及操作系统的物理内存管理。操作系统为了使用内存,还需高效地管理内存资源。在实验二中大家会了解并且自己动手完成一个简单的物理内存管理系统。

+ +

本次实验包含三个部分。首先了解如何发现系统中的物理内存;然后了解如何建立对物理内存的初步管理,即了解连续物理内存管理;最后了解页表相关的操作,即如何建立页表来实现虚拟内存到物理内存之间的映射,对段页式内存管理机制有一个比较全面的了解。本实验里面实现的内存管理还是非常基本的,并没有涉及到对实际机器的优化,比如 针对 cache 的优化等。实际操作系统(如Linux等)中的内存管理是相当复杂的。 +如果大家有余力,尝试完成扩展练习。

+ +

2.1 练习

+ +

练习0 :填写已有实验

+ +

本实验依赖实验1。请把你做的实验1的代码填入本实验中代码中有“LAB1”的注释相应部分。提示:可采用merge工具,比如kdiff3eclipse中的diff/merge工具,understand中的diff/merge工具等。

+ +

练习 1:实现first-fit连续物理内存分配算法(需要编程)

+ +

在实现first fit 内存分配算法的回收函数时,要考虑地址连续的空闲块之间的合并操作。提示:在建立空闲页块链表时,需要按照空闲页块起始地址来排序,形成一个有序的链表。可能会修改default_pmm.c中的default_initdefault_init_memmapdefault_alloc_pages default_free_pages等相关函数。请仔细查看和理解default_pmm.c中的注释。

+ +

练习 2:实现寻找虚拟地址对应的页表项(需要编程)

+ +

通过设置页表和对应的页表项,可建立虚拟内存地址和物理内存地址的对应关系。其中的get_pte函数是设置页表项环节中的一个重要步骤。此函数找到一个虚地址对应的二级页表项的内核虚地址,如果此二级页表项不存在,则分配一个包含此项的二级页表。本练习需要补全get_pte函数 in kern/mm/pmm.c,实现其功能。请仔细查看和理解get_pte函数中的注释。get_pte函数的调用关系图如下所示:

+ +

+ + + + + + + + + +
+ + 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +
+ +

1  +get_pte函数的调用关系图

+ +

练习 3:释放某虚地址所在的页并取消对应二级页表项的映射(需要编程)

+ +

当释放一个包含某虚地址的物理内存页时,需要让对应此物理内存页的管理数据结构Page做相关的清除处理,使得此物理内存页成为空闲;另外还需把表示虚地址与物理地址对应关系的二级页表项清除。请仔细查看和理解page_remove_pte函数中的注释。为此,需要补全在 kern/mm/pmm.c中的page_remove_pte函数。page_remove_pte函数的调用关系图如下所示:

+ +

+ + + + + + + + + +
+ + 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +
+ +

2  +page_remove_pte函数的调用关系图

+ +

扩展练习Challenge :任意大小的内存单元slub分配算法(需要编程)

+ +

如果觉得上诉练习难度不够,可考虑完成此扩展练习。实现两层架构的高效内存单元分配,第一层是基于页大小的内存分配,第二层是在第一层基础上实现基于任意大小的内存分配。比如,如果连续分配816字节的内存块,当分配完毕后,实际只消耗了一个空闲物理页。要求时空都高效,可参考slub算法来实现,可简化实现,能够体现其主体思想即可。要求有设计文档。slub相关网页在http://www.ibm.com/developerworks/cn/linux/l-cn-slub/ 。完成challenge的同学可单独提交challenge。完成得好的同学可获得最终考试成绩的加分。

+ +

2.2 项目组成

+ +

1 实验二文件列表

+ +
+ + + + + +
+

     |-- boot

+

|   |-- asm.h

+

|   |-- bootasm.S

+

|   `-- bootmain.c

+

|-- kern

+

|   |-- init

+

|   |   |-- entry.S

+

|   |   `-- init.c

+

|   |-- mm

+

|   |   |-- default_pmm.c

+

|   |   |-- default_pmm.h

+

|   |   |-- memlayout.h

+

|   |   |-- mmu.h

+

|   |   |-- pmm.c

+

|   |   `-- pmm.h

+

|   |-- sync

+

|   |   `-- sync.h

+

|   `-- trap

+

|       |-- trap.c

+

|       |-- trapentry.S

+

|       |-- trap.h

+

|       `-- vectors.S

+

|-- libs

+

|   |-- atomic.h

+

|   |-- list.h

+

`-- tools

+

    |-- kernel.ld

+

 

+
+ +
+ +

 

+ +

相对与实验一,实验二主要增加和修改的文件如上表红色部分所示。主要改动如下:

+ +

       boot/bootasm.S:增加了对计算机系统中物理内存布局的探测功能;

+ +

       kern/init/entry.S:根据临时段表重新暂时建立好新的段空间,为进行分页做好准备。

+ +

       kern/mm/default_pmm.[ch]:提供基本的基于链表方法的物理内存管理(分配单位为页,即4096字节);

+ +

       kern/mm/pmm.[ch]pmm.h定义物理内存管理类框架struct pmm_manager,基于此通用框架可以实现不同的物理内存管理策略和算法(default_pmm.[ch] 实现了一个基于此框架的简单物理内存管理策略) pmm.c包含了对此物理内存管理类框架的访问,以及与建立、修改、访问页表相关的各种函数实现。

+ +

       kern/sync/sync.h:为确保内存管理修改相关数据时不被中断打断,提供两个功能,一个是保存eflag寄存器中的中断屏蔽位信息并屏蔽中断的功能,另一个是根据保存的中断屏蔽位信息来使能中断的功能;(可不用细看)

+ +

       libs/list.h:定义了通用双向链表结构以及相关的查找、插入等基本操作,这是建立基于链表方法的物理内存管理(以及其他内核功能)的基础。其他有类似双向链表需求的内核功能模块可直接使用list.h中定义的函数。

+ +

       libs/atomic.h:定义了对一个变量进行读写的原子操作,确保相关操作不被中断打断。(可不用细看)

+ +

       tools/kernel.ldld形成执行文件的地址所用到的链接脚本。修改了ucore的起始入口和代码段的起始地址。相关细节可参看附录C

+ +

 

+ +

编译方法

+ +

 

+ +

编译并运行代码的命令如下:

+ +

make

+ +

make qemu

+ +

则可以得到如下显示界面(仅供参考)

+ + + + + +
+

chenyu$ make qemu

+

(THU.CST) os is loading ...

+

 

+

Special kernel symbols:

+

  entry  0xc010002c (phys)

+

  etext  0xc010537f (phys)

+

  edata  0xc01169b8 (phys)

+

  end    0xc01178dc (phys)

+

Kernel executable memory + footprint: 95KB

+

memory managment: default_pmm_manager

+

e820map:

+

  memory: 0009f400, + [00000000, 0009f3ff], type = 1.

+

  memory: 00000c00, + [0009f400, 0009ffff], type = 2.

+

  memory: 00010000, + [000f0000, 000fffff], type = 2.

+

  memory: 07efd000, + [00100000, 07ffcfff], type = 1.

+

  memory: 00003000, + [07ffd000, 07ffffff], type = 2.

+

  memory: 00040000, + [fffc0000, ffffffff], type = 2.

+

check_alloc_page() + succeeded!

+

check_pgdir() succeeded!

+

check_boot_pgdir() + succeeded!

+

-------------------- BEGIN + --------------------

+

PDE(0e0) c0000000-f8000000 + 38000000 urw

+

  |-- PTE(38000) + c0000000-f8000000 38000000 -rw

+

PDE(001) fac00000-fb000000 + 00400000 -rw

+

  |-- PTE(000e0) + faf00000-fafe0000 000e0000 urw

+

  |-- PTE(00001) + fafeb000-fafec000 00001000 -rw

+

--------------------- END + ---------------------

+

++ setup timer interrupts

+

100 ticks

+

100 ticks

+

……

+
+ +

 

+ +

通过上图,我们可以看到ucore在显示其entry(入口地址)、etext(代码段截止处地址)、edata(数据段截止处地址)、和enducore截止处地址)的值后,探测出计算机系统中的物理内存的布局(e820map下的显示内容)。接下来ucore会以页为最小分配单位实现一个简单的内存分配管理,完成二级页表的建立,进入分页模式,执行各种我们设置的检查,最后显示ucore建立好的二级页表内容,并在分页模式下响应时钟中断。

+ +

 

+ +

3    物理内存管理

+ +

 

+ +

3.1 实验执行流程概述

+ +

本次实验主要完成ucore内核对物理内存的管理工作。参考ucore总控函数kern_init的代码,可以清楚地看到在调用完成物理内存初始化的pmm_init函数之前和之后,是已有lab1实验的工作,好像没啥修改。其实不然,ucore有两个方面的扩展。首先,bootloader的工作有增加,在bootloader中,完成了对物理内存资源的探测工作(可进一步参阅附录A和附录B),让ucore kernel在后续执行中能够基于bootloader探测出的物理内存情况进行物理内存管理初始化工作。其次,bootloader不像lab1那样,直接调用kern_init函数,而是先调用位于lab2/kern/init/entry.S中的kern_entry函数。kern_entry函数的主要任务是为执行kern_init建立一个良好的C语言运行环境(设置堆栈),而且临时建立了一个段映射关系,为之后建立分页机制的过程做一个准备(细节在3.5小节有进一步阐述)。完成这些工作后,才调用kern_init函数。

+ +

kern_init函数在完成一些输出并对lab1实验结果的检查后,将进入物理内存管理初始化的工作,即调用pmm_init函数完成物理内存的管理,这也是我们lab2的内容。接着是执行中断和异常相关的初始化工作,即调用pic_init函数和idt_init函数等,这些工作与lab1的中断异常初始化工作的内容是相同的。

+ +

为了完成物理内存管理,这里首先需要探测可用的物理内存资源;了解到物理内存位于什么地方,有多大之后,就以固定页面大小来划分整个物理内存空间,并准备以此为最小内存分配单位来管理整个物理内存,管理在内核运行过程中每页内存,设定其可用状态(free的,used的,还是reserved的),这其实就对应了我们在课本上讲到的连续内存分配概念和原理的具体实现;接着ucore kernel就要建立页表, +启动分页机制,让CPUMMU把预先建立好的页表中的页表项读入到TLB中,根据页表项描述的虚拟页(Page)与物理页帧(Page Frame)的对应关系完成CPU对内存的读、写和执行操作。这一部分其实就对应了我们在课本上讲到内存映射、页表、多级页表等概念和原理的具体实现。

+ +

在代码分析上,建议根据执行流程来直接看源代码,并可采用GDB源码调试的手段来动态地分析ucore的执行过程。内存管理相关的总体控制函数是pmm_init函数,它完成的主要工作包括:

+ +

1.      初始化物理内存页管理器框架pmm_manager

+ +

2.      建立空闲的page链表,这样就可以分配以页(4KB)为单位的空闲内存了;

+ +

3.      检查物理内存页分配算法;

+ +

4.      为确保切换到分页机制后,代码能够正常执行,先建立一个临时二级页表;

+ +

5.      建立一一映射关系的二级页表;

+ +

6.      使能分页机制;

+ +

7.      从新设置全局段描述符表;

+ +

8.      取消临时二级页表;

+ +

9.      检查页表建立是否正确;

+ +

10.   通过自映射机制完成页表的打印输出(这部分是扩展知识)

+ +

 

+ +

另外,主要注意的相关代码内容包括:

+ +

l  boot/bootasm.S中探测内存部分(从probe_memoryfinish_probe的代码);

+ +

l  管理每个物理页的Page数据结构(在mm/memlayout.h中),这个数据结构也是实现连续物理内存分配算法的关键数据结构,可通过此数据结构来完成空闲块的链接和信息存储,而基于这个数据结构的管理物理页数组起始地址就是全局变量pages,具体初始化此数组的函数位于page_init函数中;

+ +

l  用于实现连续物理内存分配算法的物理内存页管理器框架pmm_manager,这个数据结构定义了实现内存分配算法的关键函数指针,而同学需要完成这些函数的具体实现;

+ +

l  设定二级页表和建立页表项以完成虚实地址映射关系,这与硬件相关,且用到不少内联函数,源代码相对难懂一些。具体完成页表和页表项建立的重要函数是boot_map_segment函数,而get_pte函数是完成虚实映射关键的关键。

+ +

 

+ +

3.2 探测系统物理内存布局

+ +

ucore 被启动之后,最重要的事情就是知道还有多少内存可用,一般来说,获取内存大小的方法由 BIOS 中断调用和直接探测两种。但BIOS 中断调用方法是一般只能在实模式下完成,而直接探测方法必须在保护模式下完成。通过 BIOS 中断获取内存布局有三种方式,都是基于INT  +15h中断,分别为88h e801h   e820h。但是 并非在所有情况下这三种方式都能工作。在 Linux +kernel 里,采用的方法是依次尝试这三 种方法。而在本实验中,我们通过e820h中断获取内存信息。因为e820h中断必须在实模式下使用,所以我们在 +bootloader 进入保护模式之前调用这个 BIOS 中断,并且把 e820 射结构保存在物理地址0x8000处。具体实现详见boot/bootasm.S。有关探测系统物理内存方法和具体实现的 信息参见附录A和附录B

+ +

 

+ +

3.3 以页为单位管理物理内存

+ +

在获得可用物理内存范围后,系统需要建立相应的数据结构来管理以物理页(按4KB对齐,且大小为4KB的物理内存单元)为最小单位的整个物理内存,以配合后续涉及的分页管理机制。每个物理页可以用一个 Page数据结构来表示。由于一个物理页需要占用一个Page结构的空间,Page结构在设计时须尽可能小,以减少对内存的占用。Page的定义在kern/mm/memlayout.h中。以页为单位的物理内存分配管理的实现在kern/default_pmm.[ch]

+ +

为了与以后的分页机制配合,我们首先需要建立对整个计算机的每一个物理页的属性用结构Page来表示,它包含了映射此物理页的虚拟页个数,描述物理页属性的flags和双向链接各个Page结构的page_link双向链表。

+ +

 

+ +
+ + + + + +
+

struct Page {
+     
int ref;        // page frame's reference counter
+
    uint32_t flags; // array of flags that describe the status of the page frame
+
    unsigned int property;// the num of free block, used in first fit pm manager
+
    list_entry_t page_link;// free list link
+
};

+
+ +
+ +

 

+ +

这里看看Page数据结构的各个成员变量有何具体含义。ref表示这样页被页表的引用记数(在“实现分页机制”一节会讲到)。如果这个页被页表引用了,即在某页表中有一个页表项设置了一个虚拟页到这个Page管理的物理页的映射关系,就会把Pageref加一;反之,若页表项取消,即映射关系解除,就会把Pageref减一。flags表示此物理页的状态标记,进一步查看kern/mm/memlayout.h中的定义,可以看到:

+ + + + + +
+

/* Flags describing the status of a page frame */
+
#define PG_reserved                 0       // the page descriptor is reserved for kernel or unusable
+
#define PG_property                 1       // the member 'property' is valid

+
+ +

这表示flags目前用到了两个bit表示页目前具有的两种属性,bit 0表示此页是否被保留(reserved),如果是被保留的页,则bit 0会设置为1,且不能放到空闲页链表中,即这样的页不是空闲页,不能动态分配与释放。比如目前内核代码占用的空间就属于这样“被保留”的页。在本实验中,bit 1表示此页是否是free的,如果设置为1,表示这页是free的,可以被分配;如果设置为0,表示这页已经被分配出去了,不能被再二次分配。另外,本实验这里取的名字PG_property比较不直观 ,主要是我们可以设计不同的页分配算法(best fit, buddy system等),那么这个PG_property就有不同的含义了。

+ +

在本实验中,Page数据结构的成员变量property用来记录某连续内存空闲块的大小(即地址连续的空闲页的个数)。这里需要注意的是用到此成员变量的这个Page比较特殊,是这个连续内存空闲块地址最小的一页(即头一页, +Head Page)。连续内存空闲块利用这个页的成员变量property来记录在此块内的空闲页的个数。这里去的名字property也不是很直观,原因与上面类似,在不同的页分配算法中,property有不同的含义。

+ +

Page数据结构的成员变量page_link是便于把多个连续内存空闲块链接在一起的双向链表指针(可回顾在lab0实验指导书中有关双向链表数据结构的介绍)。这里需要注意的是用到此成员变量的这个Page比较特殊,是这个连续内存空闲块地址最小的一页(即头一页, +Head Page)。连续内存空闲块利用这个页的成员变量page_link来链接比它地址小和大的其他连续内存空闲块。

+ +

在初始情况下,也许这个物理内存的空闲物理页都是连续的,这样就形成了一个大的连续内存空闲块。但随着物理页的分配与释放,这个大的连续内存空闲块会分裂为一系列地址不连续的多个小连续内存空闲块,且每个连续内存空闲块内部的物理页是连续的。那么为了有效地管理这些小连续内存空闲块。所有的连续内存空闲块可用一个双向链表管理起来,便于分配和释放,为此定义了一个free_area_t数据结构,包含了一个list_entry结构的双向链表指针和记录当前空闲页的个数的无符号整型变量nr_free。其中的链表指针指向了空闲的物理页。

+ +

 

+ +
+ + + + + +
+

/* free_area_t - maintains a doubly linked list to + record free (unused) pages */

+

typedef struct {

+

            list_entry_t free_list;                                // + the list header

+

            unsigned int nr_free;                                 // + # of free pages in this free list

+

} free_area_t;

+
+ +
+ +

 

+ +

有了这两个数据结构,ucore就可以管理起来整个以页为单位的物理内存空间。接下来需要解决两个问题:

+ +

       管理页级物理内存空间所需的Page结构的内存空间从哪里开始,占多大空间?

+ +

       空闲内存空间的起始地址在哪里?

+ +

对于这两个问题,我们首先根据bootloader给出的内存布局信息找出最大的物理内存地址maxpa(定义在page_init函数中的局部变量),由于x86的起始物理内存地址为0,所以可以得知需要管理的物理页个数为

+ + + + + +
+

npage = maxpa / PGSIZE

+
+ +

这样,我们就可以预估出管理页级物理内存空间所需的Page结构的内存空间所需的内存大小为:

+ + + + + +
+

  sizeof(struct Page) * npage)

+
+ +

由于bootloader加载ucore的结束地址(用全局指针变量end记录)以上的空间没有被使用,所以我们可以把end按页大小为边界去整后,作为管理页级物理内存空间所需的Page结构的内存空间,记为:

+ + + + + +
+

pages = (struct Page *)ROUNDUP((void *)end, PGSIZE);

+
+ +

为了简化起见,从地址0到地址pages+ sizeof(struct +Page) * npage)结束的物理内存空间设定为已占用物理内存空间(起始0~640KB的空间是空闲的),地址pages+ +sizeof(struct Page) * npage)以上的空间为空闲物理内存空间,这时的空闲空间起始地址为

+ + + + + +
+

uintptr_t freemem = PADDR((uintptr_t)pages + + sizeof(struct Page) * npage);

+
+ +

为此我们需要把这两部分空间给标识出来。首先,对于所有物理空间,通过如下语句即可实现占用标记:

+ + + + + +
+

for (i = 0; i < npage; i ++) {

+

            SetPageReserved(pages + + i);

+

}

+
+ +

然后,根据探测到的空闲物理空间,通过如下语句即可实现空闲标记:

+ + + + + +
+

//获得空闲空间的起始地址begin和结束地址end

+

……

+

init_memmap(pa2page(begin), (end - begin) / PGSIZE);

+
+ +

                         

+ +

其实SetPageReserved只需把物理地址对应的Page结构中的flags标志设置为PG_reserved ,表示这些页已经被使用了,将来不能被用于分配。而init_memmap函数则是把空闲物理页对应的Page结构中的flags和引用计数ref清零,并加到free_area.free_list指向的双向列表中,为将来的空闲页管理做好初始化准备工作。

+ +

关于内存分配的操作系统原理方面的知识有很多,但在本实验中只实现了最简单的内存页分配算法。相应的实现在default_pmm.c中的default_alloc_pages函数和default_free_pages函数,相关实现很简单,这里就不具体分析了,直接看源码,应该很好理解。

+ +

其实实验二在内存分配和释放方面最主要的作用是建立了一个物理内存页管理器框架,这实际上是一个函数指针列表,定义如下:

+ + + + + +
+

struct pmm_manager {

+

            const char *name; //物理内存页管理器的名字

+

            void (*init)(void); //初始化内存管理器

+

            void (*init_memmap)(struct Page *base, + size_t n); //初始化管理空闲内存页的数据结构

+

            struct Page *(*alloc_pages)(size_t n); + //分配n个物理内存页

+

            void (*free_pages)(struct Page *base, + size_t n); //释放n个物理内存页

+

            size_t (*nr_free_pages)(void); //返回当前剩余的空闲页数

+

            void (*check)(void); //用于检测分配/释放实现是否正确的辅助函数

+

};

+
+ +

重点是实现init_memmap/ alloc_pages/ free_pages这三个函数。当完成物理内存页管理初始化工作后,计算机系统的内存布局如下图所示:

+ +

+ +

计算机系统的内存布局

+ +

3.4 物理内存页分配算法实现

+ +

如果要在ucore中实现连续物理内存分配算法,则需要考虑的事情比较多,相对课本上的物理内存分配算法描述要复杂不少。下面介绍一下如果要实现一个FirstFit内存分配算法的大致流程。

+ +

lab2的第一部分是完成first_fit的分配算法。原理FirstFit内存分配算法上很简单,但要在ucore中实现,需要充分了解和利用ucore已有的数据结构和相关操作、关键的一些全局变量等。

+ +

 

+ +

关键数据结构和变量

+ +

first_fit分配算法需要维护一个查找有序(地址按从小到大排列)空闲块(以页为最小单位的连续地址空间)的数据结构,而双向链表是一个很好的选择。

+ +

libs/list.h定义了可挂接任意元素的通用双向链表结构和对应的操作,所以需要了解如何使用这个文件提供的各种函数,从而可以完成对双向链表的初始化/插入/删除等。

+ +

kern/mm/memlayout.h中定义了一个 free_area_t 数据结构,包含成员结构

+ + + + + +
+

  list_entry_t free_list;         // the + list header   空闲块双向链表的头

+

  unsigned int nr_free;           // # + of free pages in this free list  空闲块的总数(以页为单位)

+
+ +

 

+ +

显然,我们可以通过此数据结构来完成对空闲块的管理。而default_pmm.c中定义的free_area变量就是干这个事情的。

+ +

 

+ +

kern/mm/pmm.h中定义了一个通用的分配算法的函数列表,用pmm_manager 表示。其中init函数就是用来初始化free_area变量的, first_fit分配算法可直接重用default_init函数的实现。init_memmap函数需要根据现有的内存情况构建空闲块列表的初始状态。何时应该执行这个函数呢?

+ +

通过分析代码,可以知道:

+ +

kern_init --> +pmm_init-->page_init-->init_memmap--> pmm_manager->init_memmap

+ +

 

+ +

所以,default_init_memmap需要根据page_init函数中传递过来的参数(某个连续地址的空闲块的起始页,页个数)来建立一个连续内存空闲块的双向链表。这里有一个假定page_init函数是按地址从小到大的顺序传来的连续内存空闲块的。链表头是free_area.free_list,链表项是Page数据结构的base->page_link。这样我们就依靠Page数据结构中的成员变量page_link形成了连续内存空闲块列表。

+ +

 

+ +

设计实现

+ +

default_init_memmap函数讲根据每个物理页帧的情况来建立空闲页链表,且空闲页块应该是根据地址高低形成一个有序链表。根据上述变量的定义,default_init_memmap可大致实现如下:

+ + + + + +
+

default_init_memmap(struct + Page *base, size_t n) {

+

    struct Page *p + = base;

+

    for (; p != + base + n; p ++) {

+

        + p->flags = p->property = 0;

+

        + set_page_ref(p, 0);

+

    }

+

    + base->property = n;

+

    + SetPageProperty(base);

+

    nr_free += n;

+

    + list_add(&free_list, &(base->page_link));

+

}

+
+ +

 

+ +

如果要分配一个页,那要考虑哪些呢?这里就需要考虑实现default_alloc_pages函数,注意参数n表示要分配n个页。另外,需要注意实现时尽量多考虑一些边界情况,这样确保软件的鲁棒性。比如

+ +

    if (n > nr_free) {

+ +

        return NULL;

+ +

    }

+ +

这样可以确保分配不会超出范围。也可加一些 assert函数,在有错误出现时,能够迅速发现。比如 n应该大于0,我们就可以加上

+ +

   assert(n > 0);

+ +

这样在n<=0的情况下,ucore会迅速报错。firstfit需要从空闲链表头开始查找最小的地址,通过list_next找到下一个空闲块元素,通过le2page宏可以更加链表元素获得对应的Page指针p。通过p->property可以了解此空闲块的大小。如果>=n,这就找到了!如果<n,则list_next,继续查找。直到list_next== +&free_list,这表示找完了一遍了。找到后,就要从新组织空闲块,然后把找到的page返回。所以default_alloc_pages可大致实现如下:

+ + + + + +
+

static struct Page + *

+

default_alloc_pages(size_t + n) {

+

    if (n > + nr_free) {

+

        return + NULL;

+

    }

+

    struct Page + *page = NULL;

+

    list_entry_t + *le = &free_list;

+

    while ((le = + list_next(le)) != &free_list) {

+

        struct + Page *p = le2page(le, page_link);

+

        if + (p->property >= n) {

+

            page = + p;

+

            break;

+

        }

+

    }

+

    if (page != + NULL) {

+

        + list_del(&(page->page_link));

+

        if + (page->property > n) {

+

            struct + Page *p = page + n;

+

            + p->property = page->property - n;

+

            + list_add(&free_list, &(p->page_link));

+

        }

+

        nr_free -= + n;

+

        + ClearPageProperty(page);

+

    }

+

    return page;

+

}

+
+ +

 

+ +

default_free_pages函数的实现其实是default_alloc_pages的逆过程,不过需要考虑空闲块的合并问题。这里就不再细讲了。注意,上诉代码只是参考设计,不是完整的正确设计。更详细的说明位于lab2/kernel/mm/default_pmm.c的注释中。希望同学能够顺利完成本实验的第一部分。

+ +

 

+ +

3.5 实现分页机制

+ +

3.5.1 段页式管理基本概念

+ +

如图4在保护模式中,x86 体系结构将内存地址分成三种:逻辑地址(也称虚地址)、线性地址和物理地址。逻辑地址即是程序指令中使用的地址,物理地址是实际访问内存的地址。逻 辑地址通过段式管理的地址映射可以得到线性地址,线性地址通过页式管理的地址映射得到物理地址。

+ +

+ + + + + + + + + +
+ +
+ 4  段页式管理总体框架图

+ +

 

+ +

段式管理前一个实验已经讨论过。在 ucore 中段式管理只起到了一个过渡作用,它将逻辑地址不加转换直接映射成线性地址,所以我们在下面的讨论中可以对这两个地址不加区分(目前的 OS 实现也是不加区分的)。对段式管理有兴趣的同学可以参照《Intel®  64 and +IA-32Architectures Software Developer ’s Manual – Volume 3A3.2 节。

+ +

如图5所示,页式管理将线性地址分成三部分(图中的 Linear Address +Directory 部分、 Table 部分和 Offset 部分)。ucore 的页式管理通过一个二级的页表实现。一级页表的起始物理地址存放在 cr3 寄存器中,这个地址必须是一个页对齐的地址,也就是低 12 位必须为 0。目前,ucore boot_cr3mm/pmm.c)记录这个值。

+ +

 

+ +

 

+ +

5 分页机制

+ +

 

+ +

3.5.2建立段页式管理中需要考虑的关键问题

+ +

为了实现分页机制,需要建立好虚拟内存和物理内存的页映射关系,即正确建立二级页表。此过程涉及硬件细节,不同的地址映射关系组合,相对比较复杂。总体而言,我们需要思考如下问题:

+ +

l  +如何在建立页表的过程中维护全局段描述符表(GDT)和页表的关系,确保ucore能够在各个时间段上都能正常寻址?

+ +

l  +对于哪些物理内存空间需要建立页映射关系?

+ +

l  +具体的页映射关系是什么?

+ +

l  +页目录表的起始地址设置在哪里?

+ +

l  +页表的起始地址设置在哪里,需要多大空间?

+ +

l  +如何设置页目录表项的内容?

+ +

l  +如何设置页表项的内容?

+ +

3.5.3建立虚拟页和物理页帧的地址映射关系

+ +

    从链接脚本分析ucore执行时的地址

+ +

首先观察一下tools/kernel.ld文件在lab1lab2中的区别。在lab1中:

+ + + + + +
+

ENTRY(kern_init)

+

 

+

SECTIONS {

+

            /* Load the + kernel at this address: "." means the current address */

+

            . = 0x100000;

+

 

+

            .text : {

+

                        *(.text + .stub .text.* .gnu.linkonce.t.*)

+

            }

+
+ +

 

+ +

这意味着在lab1中通过ld工具形成的ucore的起始虚拟地址从0x100000开始,注意:这个地址是虚拟地址。但由于lab1中建立的段地址映射关系为对等关系,所以ucore的物理地址也是0x100000。而入口函数为kern_init函数。在lab2中:

+ + + + + +
+

ENTRY(kern_entry)

+

 

+

SECTIONS {

+

            /* Load the + kernel at this address: "." means the current address */

+

            . = 0xC0100000;

+

 

+

            .text : {

+

                        *(.text + .stub .text.* .gnu.linkonce.t.*)

+

            }

+
+ +

   这意味着lab2中通过ld工具形成的ucore的起始虚拟地址从0xC0100000开始,注意:这个地址也是虚拟地址。入口函数为kern_entry函数。这与lab1有很大差别。但其实在lab1lab2中,bootloaderucore都放在了起始物理地址为0x100000的物理内存空间。这实际上说明了ucorelab1lab2中采用的地址映射不同:

+ +

lab1  virtual addr = linear addr = phy addr

+ +

lab2  virtual addr = linear +addr = phy addr + 0xC0000000

+ +

lab1只采用了段映射机制,但在lab2中,启动好分页管理机制后,形成的是段页式映射机制,从而使得虚拟地址空间和物理地址空间之间存在如下的映射关系:

+ +

   Virtual Address=LinearAddress=0xC0000000+Physical +Address

+ +

   另外,ucore的入口地址也改为了kern_entry函数,这个函数位于init/entry.S中,分析代码可以看出,entry.S重新建立了段映射关系,从以前的

+ +

   Virtual Address= Linear Address

+ +

改为

+ +

   Virtual Address=Linear Address-0xC0000000

+ +

由于gcc编译出的虚拟起始地址从0xC0100000开始,ucorebootloader放置在从物理地址0x100000处开始的物理内存中。所以当kern_entry函数完成新的段映射关系后,且ucore在没有建立好页映射机制前,CPU按照ucore中的虚拟地址执行,能够被分段机制映射到正确的物理地址上,确保ucore运行正确。

+ +

由于物理内存页管理器管理了从0到实际可用物理内存大小的物理内存空间,所以对于这些物理内存空间都需要建立好页映射关系。由于目前ucore只运行在内核空间,所以可以建立一个一一映射关系。假定内核虚拟地址空间的起始地址为0xC0000000,则虚拟内存和物理内存的具体页映射关系为:

+ + + + + +
+

Virtual Address=Physical Address+0xC0000000

+
+ +

 

+ +

建立二级页表

+ +

由于我们已经具有了一个物理内存页管理器default_pmm_manager,我们就可以用它来获得所需的空闲物理页。在二级页表结构中,页目录表占4KB空间,ucore就可通过default_pmm_managerdefault_alloc_pages函数获得一个空闲物理页,这个页的起始物理地址就是页目录表的起始地址。同理,ucore也通过这种方式获得各个页表所需的空间。页表的空间大小取决与页表要管理的物理页数n,一个页表项(32位,即4字节)可管理一个物理页,页表需要占n/256个物理页空间。这样页目录表和页表所占的总大小为4096+1024*n字节。

+ +

为把0~KERNSIZE(明确ucore设定实际物理内存不能超过KERNSIZE值,即0x38000000字节,896MB3670016个物理页)的物理地址一一映射到页目录表项和页表项的内容,其大致流程如下:

+ +

1.      +先通过default_pmm_manager获得一个空闲物理页,用于页目录表;

+ +

2.      +调用boot_map_segment函数建立一一映射关系,具体处理过程以页为单位进行设置,即

+ +

Virtual Address=Physical Address+0xC0000000

+ +

Ø  +设一个逻辑地址la(按页对齐,故低12位为零)对应的物理地址pa(按页对齐,故低12位为零),如果在页目录表项(la的高10位为索引值)中的存在位(PTE_P)为0,表示缺少对应的页表空间,则可通过default_pmm_manager获得一个空闲物理页给页表,页表起始物理地址是按4096字节对齐的,这样填写页目录表项的内容为

+ +

页目录表项内容 = 页表起始物理地址| PTE_U | PTE_W | PTE_P

+ +

    +进一步对于页表中对应页表项(la的中10位为索引值)的内容为

+ +

           +        页表项内容 =  pa | PTE_P | PTE_W

+ +

        +其中:

+ +

l  +PTE_U:位3,表示用户态的软件可以读取对应地址的物理内存页内容

+ +

l  +PTE_W:位2,表示物理内存页内容可写

+ +

l  +PTE_P:位1,表示物理内存页存在

+ +

 

+ +

ucore 的内存管理经常需要查找页表:给定一个虚拟地址,找出这个虚拟地址在二级页表中对应的项。通过更改此项的值可以方便地将虚拟地址映射到另外的页上。可完成此功能的这个函数是get_pte函数。它的原型为

+ + + + + +
+

pte_t  *get_pte (pde_t *pgdir,  + uintptr_t la, bool  create)

+
+ +

下面的调用关系图可以比较好地看出get_pte在实现上诉流程中的位置:

+ +

 

+ +

+ +

6  get_pte调用关系图

+ +

 

+ +

这里涉及到三个类型pte tpde tuintptr t。通过参见mm/mmlayout.hlibs/types.h,可知它们其实都是unsigned  +int类型。在此做区分,是为了分清概念。

+ +

pde_t全称为 page directory entry,也就是一级页表的表项(注意:pgdir实际不是表 项,而是一级页表本身。实际上应该新定义一个类型pgd_t来表示一级页表本身)。pte t 称为 page table entry,表示二级页表的表项。uintptr t表示为线性地址,由于段式管理只做直接映射,所以它也是逻辑地址。

+ +

pgdir给出页表起始地址。通过查找这个页表,我们需要给出二级页表中对应项的地址。 虽然目前我们只有boot_pgdir一个页表,但是引入进程的概念之后每个进程都会有自己的页 表。

+ +

有可能根本就没有对应的二级页表的情况,所以二级页表不必要一开始就分配,而是等到需要的时候再添加对应的二级页表。如果在查找二级页表项时,发现对应的二级页表不存在,则需要根据create参数的值来处理是否创建新的二级页表。如果create参数为0,则get_pte返回NULL;如果create参数不为0,则get_pte需要申请一个新的物理页(通过alloc_page来实现,可在mm/pmm.h中找到它的定义),再在一级页表中添加页目录表项指向表示二级页表的新物理页。注意,新申请的页必须全部设定为零,因为这个页所代表的虚拟地址都没有被映射。

+ +

当建立从一级页表到二级页表的映射时,需要注意设置控制位。这里应该设置同时设置 PTE_UPTE_WPTE_P(定义可在mm/mmu.h)。如果原来就有二级页表,或者新建立了页表,则只需返回对应项的地址即可。

+ +

虚拟地址只有映射上了物理页才可以正常的读写。在完成映射物理页的过程中,除了要象上面那样在页表的对应表项上填上相应的物理地址外,还要设置正确的控制位。有关 x86 中页表控制位的详细信息,请参照《Intel® 64 and IA-32 +Architectures Software Developer ’s Manual – Volume 3A4.11 +节。

+ +

只有当一级二级页表的项都设置了用户写权限后,用户才能对对应的物理地址进行读写。 所以我们可以在一级页表先给用户写权限,再在二级页表上面根据需要限制用户的权限,对物理页进行保护。由于一个物理页可能被映射到不同的虚拟地址上去(譬如一块内存在不同进程 间共享),当这个页需要在一个地址上解除映射时,操作系统不能直接把这个页回收,而是要先看看它还有没有映射到别的虚拟地址上。这是通过查找管理该物理页的Page数据结构的成员变量ref(用来表示虚拟页到物理页的映射关系的个数)来实现的,如果ref0了,表示没有虚拟页到物理页的映射关系了,就可以把这个物理页给回收了,从而这个物理页是free的了,可以再被分配。page_insert函数将物理页映射在了页表上。可参看page_insert函数的实现来了解ucore内核是如何维护这个变量的。当不需要再访问这块虚拟地址时,可以把这块物理页回收并在将来用在其他地方。取消映射由page_remove来做,这其实是page insert的逆操作。

+ +

建立好一一映射的二级页表结构后,接下来就要使能分页机制了,这主要是通过enable_paging函数实现的,这个函数主要做了两件事:

+ +

1.           +通过lcr3指令把页目录表的起始地址存入CR3寄存器中;

+ +

2.           +通过lcr0指令把cr0中的CR0_PG标志位设置上。

+ +

执行完enable_paging函数后,计算机系统进入了分页模式!但到这一步还不够,还记得ucore在最开始通过kern_entry函数设置了临时的新段映射机制吗?这个临时的新段映射机制不是最简单的对等映射,导致虚拟地址和线性地址不相等。而刚才建立的页映射关系是建立在简单的段对等映射,即虚拟地址=线性地址的假设基础之上的。所以我们需要进一步调整段映射关系,即重新设置新的GDT,建立对等段映射。

+ +

这里需要注意:在进入分页模式到重新设置新GDT的过程是一个过渡过程。在这个过渡过程中,已经建立了页表机制,所以通过现在的段机制和页机制实现的地址映射关系为:

+ +

 

+ + + + + +
+

Virtual Address=Linear Address + 0xC0000000 = + Physical Address +0xC0000000+0xC0000000

+
+ +

 

+ +

在这个特殊的阶段,如果不把段映射关系改为Virtual Address = Linear Address,则通过段页式两次地址转换后,无法得到正确的物理地址。为此我们需要进一步调用gdt_init函数,根据新的gdt全局段描述符表内容(gdt定义位于pmm.c中),恢复以前的段映射关系,即使得Virtual Address = Linear Address。这样在执行完gdt_init后,通过的段机制和页机制实现的地址映射关系为:

+ + + + + +
+

Virtual Address=Linear Address = Physical Address + +0xC0000000

+
+ +

这里存在的一个问题是,在调用enable_page函数使能分页机制后到执行完毕gdt_init函数重新建立好段页式映射机制的过程中,内核使用的还是旧的段表映射,也就是说,enable paging 之后,内核使用的是页表的低地址 entry 如何保证此时内核依然能够正常工作呢?其实只需让低地址目录表项的内容等于以KERNBASE开始的高地址目录表项的内容即可。目前内核大小不超过 +4M (实际上是3M,因为内核从 0x100000 开始编址),这样就只需要让页表在0~4MB的线性地址与KERNBASE ~ +KERNBASE+4MB的线性地址获得相同的映射即可,都映射到 0~4MB 的物理地址空间,具体实现在pmm.cpmm_init函数的语句:

+ + + + + +
+

boot_pgdir[0] = boot_pgdir[PDX(KERNBASE)];

+
+ +

            实际上这种映射也限制了内核的大小。当内核大小超过预期的3MB 就可能导致打开分页之后内核 crash,在后面的试验中,也的确出现了这种情况。解决方法同样简单,就是拷贝更多的高地址项到低地址。

+ +

当执行完毕gdt_init函数后,新的段页式映射已经建立好了,上面的0~4MB的线性地址与0~4MB的物理地址一一映射关系已经没有用了。所以可以通过如下语句解除这个老的映射关系。

+ + + + + +
+

boot_pgdir[0] = 0;

+
+ +

 

+ +

page_init函数建立完实现物理内存一一映射和页目录表自映射的页目录表和页表后,一旦使能分页机制,则ucore看到的内核虚拟地址空间如下图所示:

+ +

说明: proj5-vm-map

+ +

使能分页机制后的虚拟地址空间图

+ +

 

+ +

3.5.4不同运行阶段的地址映射关系

+ +

在大多数课本中,描述了基于段的映射关系,基于页的映射关系以及基于段页式的映射关系和CPU访存时对应的地址转换过程。但很少涉及操作系统如何一步一步建立这个映射关系的。其实,在lab1lab2中都会涉及如何建立映射关系的操作。在lab1中,我们已经碰到到了简单的段映射,即对等映射关系,保证了物理地址和虚拟地址相等,也就是通过建立全局段描述符表,让每个段的基址为0,从而确定了对等映射关系。

+ +

lab2中,由于在段地址映射的基础上进一步引入了页地址映射,形成了组合式的段页式地址映射。这种方式虽然更加灵活了,但实现的复杂性也增加了。在lab2中,ucore从计算机加电,启动段式管理机制,启动段页式管理机制,在段页式管理机制下运行这整个过程中,虚地址到物理地址的映射产生了多次变化,接下来我们会逐一进行说明。

+ +

1.      +首先是bootloader地址映射阶段,bootloader完成了与lab1一样的工作,即建立了基于段的对等映射(请查看lab2/boot/bootasm.S中的finish_probe地址处);

+ +

2.      +接着进入了ucore启动页机制前的地址映射阶段,ucore建立了一个一一段映射关系,其中虚拟地址 = 物理地址 + 0xC0000000(请查看lab2/kern/init/entry.S中的kern_entry函数);

+ +

3.      +再接下来是建立并使能页表的临时段页式地址映射阶段,页表要表示的是线性地址与物理地址的对应关系为:线性地址 = 物理地址 + 0xC0000000;然后这里有一个小技巧,让在0~4MB的线性地址区域空间的 线性地址 0~4MB)对应的物理地址 = 线性地址 0xC0000000~0xC0000000 + 4MB)对应的物理地址,这是通过lab2/kern/mm/pmm.c中第321行的代码实现的:

+ + + + + +
+

boot_pgdir[0] = boot_pgdir[PDX(KERNBASE)];

+
+ +

 

+ +

注意此时CPU在寻址时还是只采用了分段机制。最后后并使能分页映射机制(请查看lab2/kern/mm/pmm.c中的enable_paging函数),一旦执行完enable_paging函数中的加载cr0指令(即让CPU使能分页机制),则接下来的访问是基于段页式的映射关系了。对于(0xC0000000~0xC0000000 + 4MB)这块虚拟地址空间,最终会映射到哪些物理地址空间中呢?

+ +

由于段映射关系没有改变,使得经过段映射机制,虚拟地址范围(0xC0000000~0xC0000000 + 4MB)对应的线性地址 = 0~4MB)。而根据页表建立过程的描述,我们可知道线性地址空间(0~4MB)与线性地址空间 0xC0000000~0xC0000000 ++ 4MB)对应同样的物理地址,而线性地址空间(0xC0000000~0xC0000000 + 4MB)对应的物理地址空间为(04MB)。这样对于(0xC0000000~0xC0000000 + 4MB)这块虚拟地址空间,段页式的地址映射关系为 虚拟地址 = 线性地址 + 0xC0000000 =物理地址 ++ 0xC0000000

+ +

注意,这只是针对(0xC0000000~0xC0000000 + 4MB)这块虚拟地址空间。如果是(0xD0000000~0xD0000000 + 4MB)这块虚拟地址空间,则段页式的地址映射关系为虚拟地址 = 线性地址 + 0xC0000000 =物理地址 + 0xC0000000 + 0xC0000000。这不是我们需要的映射关系,所以0xC0000000 + 4MB以上的虚拟地址访问会出页错误异常。

+ +

4.      +最后一步完成收尾工作的正常段页式地址映射阶段,即首先调整段映射关系,这是通过加载新的全局段描述符表(pmm_init函数调用gdt_init函数来完成)实现,这时的段映射关系为:虚拟地址 = 线性地址。然后通过执行语句“boot_pgdir[0] = 0;”把boot_pgdir[0]的第一个页目录表项(0~4MB)清零来取消临时的页映射关系。至此,新的段页式的地址映射关系为虚拟地址 = 线性地址 =物理地址 + 0xC0000000。这也形成了ucore操作系统的内核虚拟地址空间的段页式映射关系,即虚拟地址空间(KERNBASE, KERNBASE + KMEMSIZE= +线性地址空间(KERNBASE, KERNBASE + KMEMSIZE += 物理地址空间(0KMEMSIZE)。

+ +

 

+ +

3.6 自映射机制

+ +

   这是扩展知识。 上一小节讲述了通过boot_map_segment函数建立了基于一一映射关系的页目录表项和页表项,这里的映射关系为:

+ +

virtual +addr (KERNBASE~KERNBASE+KMEMSIZE) = physical_addr (0~KMEMSIZE)

+ +

    这样只要给出一个虚地址和一个物理地址,就可以设置相应PDEPTE,就可完成正确的映射关系。

+ +

如果我们这时需要按虚拟地址的地址顺序显示整个页目录表和页表的内容,则要查找页目录表的页目录表项内容,根据页目录表项内容找到页表的物理地址,再转换成对应的虚地址,然后访问页表的虚地址,搜索整个页表的每个页目录项。这样过程比较繁琐。

+ +

我们需要有一个简洁的方法来实现这个查找。ucore做了一个很巧妙的地址自映射设计,把页目录表和页表放在一个连续的4MB虚拟地址空间中,并设置页目录表自身的虚地址<-->物理地址映射关系。这样在已知页目录表起始虚地址的情况下,通过连续扫描这特定的4MB虚拟地址空间,就很容易访问每个页目录表项和页表项内容。

+ +

具体而言,ucore是这样设计的,首先设置了一个常量(memlayout.h):

+ +

VPT=0xFAC00000 这个地址的二进制表示为:

+ +

1111 +1010 1100 0000 0000 0000 0000 0000

+ +

10位为1111 1010 11,即10进制的1003,中间10位为0,低12位也为0。在pmm.c中有两个全局初始化变量

+ +

pte_t +* const vpt = (pte_t *)VPT;

+ +

pde_t +* const vpd = (pde_t *)PGADDR(PDX(VPT), PDX(VPT), 0);

+ +

并在pmm_init函数执行了如下语句:

+ +

boot_pgdir[PDX(VPT)] += PADDR(boot_pgdir) | PTE_P | PTE_W;

+ +

这些变量和语句有何特殊含义呢?其实vpd变量的值就是页目录表的起始虚地址0xFAFEB000,且它的高10位和中10位是相等的,都是10进制的1003。当执行了上述语句,就确保了vpd变量的值就是页目录表的起始虚地址,且vpt是页目录表中第一个目录表项指向的页表的起始虚地址。此时描述内核虚拟空间的页目录表的虚地址为0xFAFEB000,大小为4KB。页表的理论连续虚拟地址空间0xFAC00000~0xFB000000,大小为4MB。因为这个连续地址空间的大小为4MB,可有1MPTE,即可映射4GB的地址空间。

+ +

ucore实际上不会用完这么多项,在memlayout.h中定义了常量

+ +

#define +KMEMSIZE            0x38000000

+ +

表示ucore只支持896MB的物理内存空间,这个896MB只是一个设定,可以根据情况改变。则最大的内核虚地址为常量

+ +

#define +KERNTOP             (KERNBASE + KMEMSIZE)=0xF8000000

+ +

所以最大内核虚地址KERNTOP的页目录项虚地址为

+ +

vpd+0xF8000000/0x400000=0xFAFEB000+0x3E0=0xFAFEB3E0

+ +

最大内核虚地址KERNTOP的页表项虚地址为:

+ +

vpt+0xF8000000/0x1000=0xFAC00000+0xF8000=0xFACF8000

+ +

pmm.c中的函数print_pgdir就是基于ucore的页表自映射方式完成了对整个页目录表和页表的内容扫描和打印。注意,这里不会出现某个页表的虚地址与页目录表虚地址相同的情况。

+ +

print pgdir函数使得 ucore 具备和 +qemu info  pg相同的功能,即print pgdir 够从内存中,将当前页表内有效数据(PTE_P)印出来。拷贝出的格式如下所示:

+ + + + + +
+

PDE(0e0)  c0000000-f8000000  38000000  urw

+

|-- PTE(38000) c0000000-f8000000  38000000 + -rw

+

PDE(001)  fac00000-fb000000  00400000  -rw

+

|-- PTE(000e0)  faf00000-fafe0000  + 000e0000  urw

+

|-- PTE(00001)  fafeb000-fafec000  + 00001000  -rw

+
+ +

 

+ +

上面中的数字包括括号里的,都是十六进制。

+ +

主要的功能是从页表中将具备相同权限的 PDE PTE 项目组织起来。比如上表中:

+ + + + + +
+

PDE(0e0)  + c0000000-f8000000  38000000  urw

+
+ +

 

+ +

       PDE(0e0)0e0表示 PDE 表中相邻的 224 项具有相同的权限;

+ +

       c0000000-f8000000:表示 +PDE 表中,这相邻的两项所映射的线性地址的范围;

+ +

       38000000:同样表示范围,即f8000000减去c0000000的结果;

+ +

       urwPDE 表中所给出的权限位,u表示用户可读,即PTE_Ur表示PTE_Pw表示用 户可写,即PTE_W

+ + + + + +
+

PDE(001)  fac00000-fb000000  00400000  -rw

+
+ +

表示 1 连续的 PDE 表项具备相同的属性。相应的,在这条表项中遍历找 2 PTE 项,输出如下:

+ + + + + +
+

|-- PTE(000e0)  + faf00000-fafe0000  000e0000  urw

+

|-- + PTE(00001)  fafeb000-fafec000  00001000  -rw

+
+ +

注意:

+ +

1.     PTE 中输出的权限是 PTE 表中的数据给出的,并没有和 PDE 表中权限做与运算。

+ +

2.     整个print_pgdir函数强调两点:第一是相同权限,第二是连续。

+ +

3.     print_pgdir中用到了vptvpd两个变量。可以参 VPTPGADDR两个宏。

+ +

 

+ +

自映射机制还可方便用户态程序访问页表。因为页表是内核维护的,用户程序很难知道自己页表的映射结构。VPT 实际上在内核地址空间的,我们可以用同样的方式实现一个用户地址空间的映射(比如 pgdir[UVPT] = PADDR(pgdir) | PTE_P | PTE_U,注意,这里不能给写权限,并且 pgdir 是每个进程的 page table,不是 boot_pgdir),这样,用户程序就可以用和内核一样的 +print_pgdir 函数遍历自己的页表结构了。

+ +
+ +
+
+ +
+ +
+
+ +
+ +

 

+ +

4 实验报告要求

+ +

 

+ +

从网站上下载lab2.zip后,解压得到本文档和代码目录 lab2,完成实验中的各个练习。完成代码编写并检查无误后,在对应目录下执行 make handin 任务,即会自动生成 lab2-handin.tar.gz。最后请一定提前或按时提交到网络学堂上。

+ +

注意有LAB2的注释,代码中所有需要完成的地方challenge除外)都有LAB2”和“YOUR CODE的注释,请在提交时特别注意保持注释,并将YOUR CODE替换为自己的学号,并且将所有标有对应注释的部分填上正确的代码。

+ +
+
+ +

 

+ +

附录

+ +

A.    探测物理内存分布和大小的方法

+ +

操作系统需要知道了解整个计算机系统中的物理内存如何分布的,哪些被可用,哪些不可用。其基本方法是通过BIOS中断调用来帮助完成的。其中BIOS中断调用必须在实模式下进行,所以在bootloader进入保护模式前完成这部分工作相对比较合适。这些部分由boot/bootasm.S中从probe_memory处到finish_probe处的代码部分完成完成。通过BIOS中断获取内存可调用参数为e820hINT 15h BIOS中断。BIOS通过系统内存映射地址描述符(Address +Range Descriptor)格式来表示系统物理内存布局,其具体表示如下:

+ + + + + +
+

Offset  Size    Description     

+

00h    8字节   base address                                                         #系统内存块基地址

+

08h    8字节   length in bytes                                                    #系统内存大小

+

10h    4字节   type of address range     #内存类型

+
+ +

看下面的(Values for System +Memory Map address type)

+ + + + + +
+

Values for + System Memory Map address type:

+

01h    memory, + available to OS

+

02h    reserved, + not available (e.g. system ROM, memory-mapped device)

+

03h    ACPI + Reclaim Memory (usable by OS after reading ACPI tables)

+

04h    ACPI NVS + Memory (OS is required to save this memory between NVS sessions)

+

other  not + defined yet -- treat as Reserved

+

 

+
+ +

 

+ +

INT15h BIOS中断的详细调用参数:

+ + + + + +
+

eaxe820hINT 15的中断调用参数;

+

edx534D4150h (4ASCII字符“SMAP”) ,这只是一个签名而已;

+

ebx如果是第一次调用或内存区域扫描完毕,则为0 如果不是,则存放上次调用之后的计数值

+

ecx:保存地址范围描述符的内存大小,应该大于等于20字节;

+

es:di指向保存地址范围描述符结构的缓冲区,BIOS把信息写入这个结构的起始地址。

+

 

+
+ +

 

+ +

此中断的返回值为:

+ + + + + +
+

cflagsCF位:若INT 15中断执行成功,则不置位,否则置位;

+

eax534D4150h ('SMAP')

+

es:di:指向保存地址范围描述符的缓冲区,此时缓冲区内的数据已由BIOS填写完毕

+

ebx:下一个地址范围描述符的计数地址

+

ecx            :返回BIOSES:DI处写的地址范围描述符的字节大小

+

ah:失败时保存出错代码

+
+ +

 

+ +

这样,我们通过调用INT 15h BIOS中断,递增di的值(20的倍数),让BIOS帮我们查找出一个一个的内存布局entry,并放入到一个保存地址范围描述符结构的缓冲区中,供后续的ucore进一步进行物理内存管理。这个缓冲区结构定义在memlayout.h中:

+ + + + + +
+

struct e820map {

+

                  int + nr_map;

+

                  struct {

+

                                    long + long addr;

+

                                    long + long size;

+

                                    long + type;

+

                  } + map[E820MAX];

+

};

+
+ +

 

+ +

 

+ +

B.    +实现物理内存探测

+ +

物理内存探测是在bootasm.S中实现的,相关代码很短,如下所示:

+ + + + + +
+

probe_memory:

+

//0x8000处的32位单元清零,即给位于0x8000处的

+

//struct e820map成员变量nr_map清零

+

           movl $0, + 0x8000         

+

                  xorl %ebx, + %ebx   

+

//表示设置调用INT 15h BIOS中断后,BIOS返回的映射地址描述符的起始地址

+

                  movw + $0x8004, %di

+

start_probe:

+

                  movl + $0xE820, %eax // INT 15的中断调用参数

+

//设置地址范围描述符的大小为20字节,其大小等于struct e820map成员变量map的大小

+

                  movl $20, + %ecx 

+

//设置edx534D4150h + (4ASCII字符“SMAP”),这是一个约定

+

                  movl + $SMAP, %edx

+

//调用int + 0x15中断,要求BIOS返回一个用地址范围描述符表示的内存段信息

+

                  int $0x15

+

//如果eflagsCF位为0,则表示还有内存段需要探测

+

                  jnc cont

+

//探测有问题,结束探测

+

                  movw + $12345, 0x8000

+

                  jmp + finish_probe

+

cont:

+

//设置下一个BIOS返回的映射地址描述符的起始地址

+

                  addw $20, + %di

+

//递增struct + e820map成员变量nr_map

+

                  incl + 0x8000

+

//如果INT0x15返回的ebx为零,表示探测结束,否则继续探测

+

                  cmpl $0, + %ebx

+

                  jnz + start_probe

+

finish_probe:

+
+ +

 

+ +

上述代码正常执行完毕后,在0x8000地址处保存了从BIOS中获得的内存分布信息,此信息按照struct +e820map的设置来进行填充。这部分信息将在bootloader启动ucore后,由ucorepage_init函数来根据struct e820mapmemmap(定义了起始地址为0x8000)来完成对整个机器中的物理内存的总体管理。

+ +

 

+ +

C.   链接地址/虚地址/物理地址/加载地址以及edata/end/text的含义

+ +

链接脚本简介

+ +

ucore kernel各个部分由组成kernel各个.o.a文件构成,且各个部分在内存中地址位置由ld工具根据kernel.ld链接脚本(linker script)来设定。ld工具使用命令-T指定链接脚本。链接脚本主要用于规定如何把输入文件(各个.o.a文件)内的section放入输出文件(lab2/bin/kernel,即ELF格式的ucore内核)内, 并控制输出文件内各部分在程序地址空间内的布局。下面简单分析一下/lab2/tools/kernel.ld,来了解一下ucore内核的地址布局情况。kernel.ld的内容如下所示:

+ + + + + +
+

/* Simple linker script for + the ucore kernel.

+

   See the GNU ld 'info' + manual ("info ld") to learn the syntax. */

+

 

+

OUTPUT_FORMAT("elf32-i386", + "elf32-i386", "elf32-i386")

+

OUTPUT_ARCH(i386)

+

ENTRY(kern_entry)

+

 

+

SECTIONS {

+

    /* Load the kernel at + this address: "." means the current address */

+

    . = 0xC0100000;

+

 

+

    .text : {

+

        *(.text .stub + .text.* .gnu.linkonce.t.*)

+

    }

+

 

+

    PROVIDE(etext = .); /* + Define the 'etext' symbol to this value */

+

 

+

    .rodata : {

+

        *(.rodata .rodata.* + .gnu.linkonce.r.*)

+

    }

+

 

+

    /* Include debugging + information in kernel memory */

+

    .stab : {

+

        + PROVIDE(__STAB_BEGIN__ = .);

+

        *(.stab);

+

        + PROVIDE(__STAB_END__ = .);

+

        BYTE(0)     /* + Force the linker to allocate space

+

                   for this + section */

+

    }

+

 

+

    .stabstr : {

+

        + PROVIDE(__STABSTR_BEGIN__ = .);

+

        *(.stabstr);

+

        + PROVIDE(__STABSTR_END__ = .);

+

        BYTE(0)     /* + Force the linker to allocate space

+

                   for this + section */

+

    }

+

 

+

    /* Adjust the address + for the data segment to the next page */

+

    . = ALIGN(0x1000);

+

 

+

    /* The data segment */

+

    .data : {

+

        *(.data)

+

    }

+

 

+

    PROVIDE(edata = .);

+

 

+

    .bss : {

+

        *(.bss)

+

    }

+

 

+

    PROVIDE(end = .);

+

 

+

    /DISCARD/ : {

+

        *(.eh_frame + .note.GNU-stack)

+

    }

+

}

+
+ +

其实从链接脚本的内容,可以大致猜出它指定告诉链接器的各种信息:

+ +

l  +内核加载地址:0xC0100000

+ +

l  +入口(起始代码)地址: ENTRY(kern_entry)

+ +

l  +cpu机器类型:i386

+ +

其最主要的信息是告诉链接器各输入文件的各section应该怎么组合:应该从哪个地址开始放,各个section以什么顺序放,分别怎么对齐等等,最终组成输出文件的各section。除此之外,linker script还可以定义各种符号(如.text.data.bss等),形成最终生成的一堆符号的列表(符号表),每个符号包含了符号名字,符号所引用的内存地址,以及其他一些属性信息。符号实际上就是一个地址的符号表示,其本身不占用的程序运行的内存空间。

+ +

 

+ +

链接地址/加载地址/虚地址/物理地址

+ +

ucore 设定了ucore运行中的虚地址空间,具体设置可看 +lab2/kern/mm/memlayout.h 中描述的"Virtual memory map "图,可以了解虚地址和物理地址的对应关系。lab2/tools/kernel.ld描述的是执行代码的链接地址(link_addr),比如内核起始地址是0xC0100000,这是一个虚地址。所以我们可以认为链接地址等于虚地址。在ucore建立内核页表时,设定了物理地址和虚地址的虚实映射关系是:

+ +

phy addr + +0xC0000000 = virtual addr

+ +

即虚地址和物理地址之间有一个偏移。但boot loaderucore kernel加载到内存时,采用的是加载地址(load +addr),这是由于ucore还没有运行,即还没有启动页表映射,导致这时采用的寻址方式是段寻址方式,用的是boot loader在初始化阶段设置的段映射关系,其映射关系(可参看bootasm.S的末尾处有关段描述符表的内容)是:

+ +

            linear +addr = phy addr = virtual addr

+ +

查看 bootloader的实现代码 bootmain::bootmain.c

+ +

    + readseg(ph->p_va & 0xFFFFFF, ph->p_memsz, ph->p_offset);

+ +

  这里的ph->p_va=0xC0XXXXXX,就是ld工具根据kernel.ld设置的链接地址,且链接地址等于虚地址。考虑到ph->p_va & 0xFFFFFF == 0x0XXXXXX,所以bootloader加载ucore kernel的加载地址是0x0XXXXXX, + 这实际上是ucore内核所在的物理地址。简言之: OS的链接地址(link addr tools/kernel.ld中设置好了,是一个虚地址(virtual addr);而ucore kernel的加载地址(load addr)在boot loader中的bootmain函数中指定,是一个物理地址。

+ +

         小结一下,ucore内核的链接地址==ucore内核的虚拟地址;boot loader加载ucore内核用到的加载地址==ucore内核的物理地址。

+ +

 

+ +

edata/end/text的含义

+ +

在基于ELF执行文件格式的代码中,存在一些对代码和数据的表述,基本概念如下:

+ +

l  BSS段(bss segment):指用来存放程序中未初始化的全局变量的内存区域。BSS是英文Block Started by +Symbol的简称。BSS段属于静态内存分配。

+ +

l  数据段(data +segment):指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。

+ +

l  代码段(code +segment/text segment):指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

+ +

lab2/kern/init/init.ckern_init函数中,声明了外部全局变量:

+ + + + + +
+

extern char edata[], end[];

+
+ +

 但搜寻所有源码文件*.[ch],没有发现有这两个变量的定义。那这两个变量从哪里来的呢?其实在lab2/tools/kernel.ld中,可以看到如下内容:

+ + + + + +
+

…   

+

.text : {

+

        *(.text .stub + .text.* .gnu.linkonce.t.*)

+

}

+

+

    .data : {

+

        *(.data)

+

}

+

+

PROVIDE(edata + = .);

+

+

    .bss : {

+

        *(.bss)

+

}

+

+

PROVIDE(end + = .);

+

+
+ +

这里的.”表示当前地址,“.text表示代码段起始地址,“.data”也是一个地址,可以看出,它即代表了代码段的结束地址,也是数据段的起始地址。类推下去,“edata”表示数据段的结束地址,“.bss”表示数据段的结束地址和BSS段的起始地址,而“end”表示BSS的结束地址。

+ +

这样回头看kerne_init中的外部全局变量,可知edata[] end[]这些变量是ld根据kernel.ld链接脚本生成的全局变量,表示相应段的起始地址或结束地址等,它们不在任何一个.S.c.h文件中定义。

+ +

 

+ +

 

+ +
+ + + + diff --git a/lab3.files/image001.png b/lab3.files/image001.png new file mode 100644 index 0000000000000000000000000000000000000000..992062275d3d6faea2fdc7ddec08a2e308b67845 GIT binary patch literal 44760 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 literal 0 HcmV?d00001 diff --git a/lab3.files/image002.png b/lab3.files/image002.png new file mode 100644 index 0000000000000000000000000000000000000000..6d647608cccb53e116c37061af84a28578dce149 GIT binary patch literal 30671 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 literal 0 HcmV?d00001 diff --git a/lab3.htm b/lab3.htm new file mode 100644 index 0000000..18fe827 --- /dev/null +++ b/lab3.htm @@ -0,0 +1,2046 @@ + + + + + + +实验二:内存管理 + + + + + + +
+ +

验三虚拟内存管

+ +

1    实验目

+ +

       +了解虚拟内存的Page Fault异常处理实现

+ +

       +了解页替换算法在操作系统中的实现

+ +

 

+ +

2    实验内

+ +

做完实验二后,大家可以了解并掌握物理内存管理中的连续空间分配算法的具体实现以及如何建立二级页表。本次实验是在实验二的基础上,借助于页表机制和实验一中涉及的中断异常处理机制,完成Page Fault异常处理和FIFO页替换算法的实现,结合磁盘提供的缓存空间,从而能够支持虚存管理,提供一个比实际物理内存空间更大的虚拟内存空间给系统使用。实际操作系统系统中的虚拟内存管理设计与实现是相当复杂的,涉及到与进程管理系统、文件系统等的交叉访问。如果大家有余力,可以尝试完成扩展练习,实现extended  clock页替换算法。

+ +

 

+ +

2.1 练习

+ +

练习0 :填写已有实验

+ +

本实验依赖实验1/2。请把你做的实验1/2的代码填入本实验中代码中有“LAB1”,“LAB2”的注释相应部分。

+ +

练习1:给未被映射的地址映射上物理页(需要编程)

+ +

完成do_pgfaultmm/vmm.c)函数,给未被映射的地址映射上物理页。设置访问权限 的时候需要参考页面所在 VMA 的权限,同时需要注意映射物理页时需要操作内存控制 结构所指定的页表,而不是内核的页表。注意:在LAB2 EXERCISE 1处填写代码。执行“make qemu”后,如果通过check_pgfault函数的测试后,会有“check_pgfault() +succeeded!”的输出,表示练习1基本正确。

+ +

 

+ +

练习2:补充完成基于FIFO的页面替换算法(需要编程)

+ +

完成vmm.c中的do_pgfault函数,并且在实现FIFO算法的swap_fifo.c中完成map_swappableswap_out_vistim函数。通过对swap的测试。注意:在LAB2 EXERCISE 2处填写代码。执行“make qemu”后,如果通过check_swap函数的测试后,会有“check_swap() succeeded!”的输出,表示练习2基本正确。

+ +

扩展练习Challenge:实现识别dirty bitextended clock页替换算法(需要编程)

+ +

challenge部分不是必做部分,不过在正确最后会酌情加分需写出有详细设计、分析和测试的实验报告。完成出色的可获得适当加分基本实验完成后一周内完成,单独提交)。

+ +

   

+ +

2.2 项目组成

+ +

1 实验三文件列表

+ +
+ + + + + +
+

     |-- boot

+

|-- kern

+

|   |-- driver

+

|   |   |-- …

+

|   |   |-- ide.c

+

|   |   `-- ide.h

+

|   |-- fs

+

|   |   |-- fs.h

+

|   |   |-- swapfs.c

+

|   |   `-- swapfs.h

+

|   |-- init

+

|   |   |-- …

+

|   |   `-- init.c

+

|   |-- mm

+

|   |   |-- default_pmm.c

+

|   |   |-- default_pmm.h

+

|   |   |-- memlayout.h

+

|   |   |-- mmu.h

+

|   |   |-- pmm.c

+

|   |   |-- pmm.h

+

|   |   |-- swap.c

+

|   |   |-- swap.h

+

|   |   |-- swap_fifo.c

+

|   |   |-- swap_fifo.h

+

|   |   |-- vmm.c

+

|   |   `-- vmm.h

+

|   |-- sync

+

|   `-- trap

+

|       |-- trap.c

+

|       `-- …

+

|-- libs

+

|       |-- list.h

+

|       `-- …

+

`-- tools

+
+ +
+ +

 

+ +

相对与实验二,实验三主要增加的文件如上表红色部分所示,主要修改的文件如上表紫色部分所示,其他需要用到的重要文件用黑色表示。主要改动如下:

+ +

       kern/mm/default_pmm.[ch]:实现基于struct pmm_manager类框架的Fist-Fit物理内存分配参考实现(分配最小单位为页,即4096字节),相关分配页和释放页等实现会间接被kmalloc/kfree等函数使用。

+ +

       kern/mm/pmm.[ch]pmm.h定义物理内存分配类框架struct pmm_manager pmm.c包含了对此物理内存分配类框架的访问,以及与建立、修改、访问页表相关的各种函数实现。在本实验中会用到kmalloc/kfree等函数。

+ +

       libs/list.h:定义了通用双向链表结构以及相关的查找、插入等基本操作,这是建立基于链表方法的物理内存管理(以及其他内核功能)的基础。在lab0文档中有相关描述。其他有类似双向链表需求的内核功能模块可直接使用list.h中定义的函数。在本实验中会多次用到插入,删除等操作函数。

+ +

       kern/driver/ide.[ch]:定义和实现了内存页swap机制所需的磁盘扇区的读写操作支持;在本实验中会涉及通过swapfs_*函数间接使用文件中的函数。故了解即可。

+ +

       kern/fs/*:定义和实现了内存页swap机制所需从磁盘读数据到内存页和写内存数据到磁盘上去的函数 swapfs_read/swapfs_write。在本实验中会涉及使用这两个函数。

+ +

       kern/mm/memlayout.h:修改了struct +Page,增加了两项pra_*成员结构,其中pra_page_link可以用来建立描述各个页访问情况(比如根据访问先后)的链表。在本实验中会涉及使用这两个成员结构,以及le2page等宏。

+ +

       kern/mm/vmm.[ch]vmm.h描述了mm_structvma_struct等表述可访问的虚存地址访问的一些信息,下面会进一步详细讲解。vmm.c涉及mm,vma结构数据的创建/销毁/查找/插入等函数,这些函数在check_vmacheck_vmm等中被使用,理解即可。而page +fault处理相关的do_pgfault函数是本次实验需要涉及完成的。

+ +

       kern/mm/swap.[ch]:定义了实现页替换算法的类框架struct swap_managerswap.c包含了对此页替换算法类框架的初始化、页换入/换出等各种函数实现。重点是要理解何时调用swap_outswap_in函数。和如何在此框架下连接具体的页替换算法实现。check_swap函数以及被此函数调用的_fifo_check_swap函数完成了对本次实验中的练习2FIFO页替换算法基本正确性的检查,可了解,便于知道为何产生错误。

+ +

       kern/mm/swap_fifo.[ch]FIFO页替换算法的基于类框架struct swap_manager简化实现,主要被swap.c的相关函数调用。重点是_fifo_map_swappable函数(可用于建立页访问属性和关系,比如访问时间的先后顺序)和_fifo_swap_out_victim函数(可用于实现挑选出要换出的页),当然换出哪个页需要借助于fifo_map_swappable函数建立的某种属性关系,已选出合适的页。

+ +

       kern/mm/mmu.h:其中定义额也页表项的各种属性位,比如PTE_P\PET_D\PET_A等,对于实现扩展实验的clock算法会有帮助。

+ +

 

+ +

本次实验的主要练习集中在vmm.c中的do_pgfault函数和swap_fifo.c中的_fifo_map_swappable函数、_fifo_swap_out_victim函数。

+ +

 

+ +

编译执行

+ +

 

+ +

编译并运行代码的命令如下:

+ +

make

+ +

make qemu

+ +

则可以得到如附录所示的显示内容(仅供参考,不是标准答案输出)

+ +

 

+ +

3 虚拟内存管理

+ +

 

+ +

3.1 基本原理概述

+ +

什么是虚拟内存?简单地说,是指程序员或CPU “需要和直接看到的内存,这其实暗示了两点:1、虚拟内存单元不一定有实际的物理内存单元对应,即实际的物理内存单元可能不存在;2、如果虚拟内存单元对应有实际的物理内存单元,那二者的地址一般不是相等的。通过操作系统的某种内存管理和映射技术可建立虚拟内存与实际的物理内存的对应关系,使得程序员或CPU访问的虚拟内存地址会转换为另外一个物理内存地址。

+ +

那么这个虚拟的作用或意义在哪里体现呢?在操作系统中,虚拟内存其实包含多个虚拟层次,在不同的层次体现了不同的作用。首先,在有了分页机制后,程序员或CPU直接看到的地址已经不是实际的物理地址了,这已经有一层虚拟化,我们可简称为内存地址虚拟化。有了内存地址虚拟化,我们就可以通过设置页表项来限定软件运行时的访问空间,确保软件运行不越界,完成内存访问保护的功能。

+ +

通过内存地址虚拟化,可以使得软件在没有访问某虚拟内存地址时不分配具体的物理内存,而只有在实际访问某虚拟内存地址时,操作系统再动态地分配物理内存,建立虚拟内存到物理内存的页映射关系,这种技术属于lazy load技术,简称按需分页(demand +paging)。把不经常访问的数据所占的内存空间临时写到硬盘上,这样可以腾出更多的空闲内存空间给经常访问的数据;当CPU访问到不经常访问的数据时,再把这些数据从硬盘读入到内存中,这种技术称为页换入换出(page swap in/out)。这种内存管理技术给了程序员更大的内存空间,我们称为内存空间虚拟化。

+ +

 

+ +

3.2 实验执行流程概述

+ +

本次实验主要完成ucore内核对虚拟内存的管理工作。其总体设计思路还是比较简单,即首先完成初始化虚拟内存管理机制,即需要设置好哪些页需要放在物理内存中,哪些页不需要放在物理内存中,而是可被换出到硬盘上,并涉及完善建立页表映射、页错误异常处理操作等函数实现。然后就执行一组访存测试,看看我们建立的页表项是否能够正确完成虚实地址映射,是否正确描述了虚拟内存页在物理内存中还是在硬盘上,是否能够正确把虚拟内存页在物理内存和硬盘之间进行传递,是否正确实现了页面替换算法等。lab3的总体执行流程如下。

+ +

首先是初始化过程。参考ucore总控函数init的代码,可以看到在调用完成虚拟内存初始化的vmm_init函数之前,需要首先调用pmm_init函数完成物理内存的管理,这也是我们lab2已经完成的内容。接着是执行中断和异常相关的初始化工作,即调用pic_init函数和idt_init函数等,这些工作与lab1的中断异常初始化工作的内容是相同的。

+ +

在调用完idt_init函数之后,将进一步调用三个lab3中才有的新函数vmm_initide_initswap_init。这三个函数设计了本次实验中的两个练习。第一个函数vmm_init是检查我们的练习1是否正确实现了。为了表述不在物理内存中的“合法”虚拟页,需要有数据结构来描述这样的页,为此ucore建立了mm_structvma_struct数据结构(在3.3小节中有进一步详细描述),假定我们已经描述好了这样的“合法”虚拟页,当ucore访问这些“合法”虚拟页时,会由于没有虚实地址映射而产生页错误异常。如果我们正确实现了练习1,则do_pgfault函数会申请一个空闲物理页,并建立好虚实映射关系,从而使得这样的“合法”虚拟页有实际的物理页帧对应。这样练习1就算完成了。

+ +

ide_initswap_init是为练习2准备的。由于页面置换算法的实现存在对硬盘数据块的读写,所以ide_init就是完成对用于页换入换出的硬盘(简称swap硬盘)的初始化工作。完成ide_init函数后,ucore就可以对这个swap硬盘进行读写操作了。swap_init函数首先建立swap_managerswap_manager是完成页面替换过程的主要功能模块,其中包含了页面置换算法的实现(具体内容可参考5小节)。然后会进一步调用执行check_swap函数在内核中分配一些页,模拟对这些页的访问,这会产生页错误异常。如果我们正确实现了练习2,就可通过do_pgfault来调用swap_map_swappable函数来查询这些页的访问情况并间接调用实现页面置换算法的相关函数,把不常用的页换出到磁盘上。

+ +

ucore在实现上述技术时,需要解决三个关键问题:

+ +

1、  当程序运行中访问内存产生page fault异常时,如何判定这个引起异常的虚拟地址内存访问是越界、写只读页的非法地址访问还是由于数据被临时换出到磁盘上或还没有分配内存的合法地址访问?

+ +

2、  何时进行请求调页/页换入换出处理?

+ +

3、  如何在现有ucore的基础上实现页替换算法?

+ +

接下来将进一步分析完成lab3主要注意的关键问题和涉及的关键数据结构。

+ +

 

+ +

3.3 关键数据结构和相关函数分析

+ +

对于第一个问题的出现,在于实验二中有关内存的数据结构和相关操作都是直接针对实际存在的资源--物理内存空间的管理,没有从一般应用程序对内存的需求考虑,即需要有相关的数据结构和操作来体现一般应用程序对虚拟内存的需求。一般应用程序的对虚拟内存的需求与物理内存空间的供给没有直接的对应关系,ucore是通过page fault异常处理来间接完成这二者之间的衔接。

+ +

page_fault函数不知道哪些是“合法”的虚拟页,原因是ucore还缺少一定的数据结构来描述这种不在物理内存中的“合法”虚拟页。为此ucore通过建立mm_structvma_struct数据结构,描述了ucore模拟应用程序运行所需的合法内存空间。当访问内存产生page +fault异常时,可获得访问的内存的方式(读或写)以及具体的虚拟内存地址,这样ucore就可以查询此地址,看是否属于vma_struct数据结构中描述的合法地址范围中,如果在,则可根据具体情况进行请求调页/页换入换出处理(这就是练习2涉及的部分);如果不在,则报错。mm_structvma_struct数据结构结合页表表示虚拟地址空间和物理地址空间的示意图如下所示:

+ +

  +虚拟地址空间和物理地址空间的示意图

+ +

 

+ +

ucore中描述应用程序对虚拟内存需求的数据结构是vma_struct (定义在vmm.h中),以及针对vma_struct的函数操作。这里把一个vma_struct结构的变量简称为vma变量。vma_struct的定义如下:

+ + + + + +
+

struct vma_struct {

+

      // the set of vma using the same PDT

+

struct mm_struct *vm_mm; +

+

          uintptr_t vm_start;                          // + start addr of vma        

+

          uintptr_t vm_end;                           // + end addr of vma

+

uint32_t vm_flags;       +                   // flags of vma

+

//linear list link which + sorted by start addr of vma

+

list_entry_t list_link;  +

+

};

+
+ +

vm_startvm_end描述了一个连续地址的虚拟内存空间的起始位置和结束位置,这两个值都应该是 PGSIZE 对齐的,而且描述的是一个合理的地址空间范围(即严格确保 +vm_start < vm_end 的关系);list_link是一个双向链表,按照从小到大的顺序把一系列用vma_struct表示的虚拟内存空间链接起来,并且还要求这些链起来的 vma_struct 应该是不相交的,即vma之间的地址空间无交集;vm_flags表示了这个虚拟内存空间的属性,目前的属性包括:

+ + + + + +
+

#define VM_READ          0x00000001 //只读

+

#define VM_WRITE        0x00000002 //可读写

+

#define VM_EXEC          0x00000004 //可执行

+
+ +

vm_mm是一个指针,指向一个比vma_struct更高的抽象层次的数据结构mm_struct,这里把一个mm_struct结构的变量简称为mm变量。这个数据结构表示了包含所有虚拟内存空间的共同属性,具体定义如下

+ + + + + +
+

struct mm_struct {

+

     // linear list link which sorted by start addr + of vma

+

            list_entry_t mmap_list;

+

// current accessed vma, + used for speed purpose

+

            struct vma_struct *mmap_cache;

+

            pde_t *pgdir;  // the PDT of these vma

+

            int map_count; // the count of these vma

+

            void *sm_priv;   // the private data for + swap manager

+

};

+
+ +

mmap_list是双向链表头,链接了所有属于同一页目录表的虚拟内存空间,mmap_cache是指向当前正在使用的虚拟内存空间,由于操作系统执行的局部性原理,当前正在用到的虚拟内存空间在接下来的操作中可能还会用到,这时就不需要查链表,而是直接使用此指针就可找到下一次要用到的虚拟内存空间。由于 mmap_cache 的引入,可使得 mm_struct 数据结构的查询加速 30% 以上。pgdir 所指向的就是 mm_struct 数据结构所维护的页表。通过访问pgdir可以查找某虚拟地址对应的页表项是否存在以及页表项的属性等。map_count记录 mmap_list 里面链接的 vma_struct 的个数。sm_priv指向用来链接记录页访问情况的链表头,这建立了mm_struct和后续要讲到的swap_manager之间的联系。

+ +

涉及vma_struct的操作函数也比较简单,主要包括三个:

+ +

l  +vma_create--创建vma

+ +

l  +insert_vma_struct--插入一个vma

+ +

l  +find_vma--查询vma

+ +

vma_create函数根据输入参数vm_startvm_endvm_flags来创建并初始化描述一个虚拟内存空间的vma_struct结构变量。insert_vma_struct函数完成把一个vma变量按照其空间位置[vma->vm_start,vma->vm_end]从小到大的顺序插入到所属的mm变量中的mmap_list双向链表中。find_vma根据输入参数addrmm变量,查找在mm变量中的mmap_list双向链表中某个vma包含此addr,即vma->vm_start<= +addr <vma->end。这三个函数与后续讲到的page fault异常处理有紧密联系。

+ +

涉及mm_struct的操作函数比较简单,只有mm_createmm_destroy两个函数,从字面意思就可以看出是是完成mm_struct结构的变量创建和删除。在mm_create中用kmalloc分配了一块空间,所以在mm_destroy中也要对应进行释放。在ucore运行过程中,会产生描述虚拟内存空间的vma_struct结构,所以在mm_destroy中也要进对这些mmap_list中的vma进行释放。

+ +

 

+ +

4  Page Fault异常处理

+ +

对于第三节提到的第二个关键问题,解决的关键是page +fault异常处理过程中主要涉及的函数 -- do_pgfault。在程序的执行过程中由于某种原因(页框不存在/写只读页等)而使 CPU 无法最终访问到相应的物理内存单元,即无法完成从虚拟地址到物理地址映射时,CPU 会产生一次页错误异常,从而需要进行相应的页错误异常服务例程。这个页错误异常处理的时机就是求调页/页换入换出/处理的执行时机。当相关处理完成后,页错误异常服务例程会返回到产生异常的指令处重新执行,使得软件可以继续正常运行下去。

+ +

具体而言,当启动分页机制以后,如果一条指令或数据的虚拟地址所对应的物理页框不在内存中或者访问的类型有错误(比如写一个只读页或用户态程序访问内核态的数据等),就会发生页错误异常。产生页面异常的原因主要有:

+ +

l  目标页面不存在(页表项全为0,即该线性地址与物理地址尚未建立映射或者已经撤销)

+ +

l  相应的物理页面不在内存中(页表项非空,但Present标志位=0,比如在swap分区或磁盘文件上),这将在下面介绍换页机制实现时进一步讲解如何处理;

+ +

l  访问权限不符合(此时页表项P标志=1,比如企图写只读页面).

+ +

当出现上面情况之一,那么就会产生页面page +fault#PF)异常。产生异常的线性地址存储在CR2中,并且将是page fault的产生类型保存在 error +code 中,比如 bit 0 表示是否 PTE_P0bit 1 表示是否 write 操作。

+ +

产生页错误异常后,CPU硬件和软件都会做一些事情来应对此事。首先页错误异常也是一种异常,所以针对一般异常的硬件处理操作是必须要做的,即CPU在当前内核栈保存当前被打断的程序现场,即依次压入当前被打断程序使用的eflagscseiperrorCode;由于页错误异常的中断号是0xE CPU把异常中断号0xE对应的中断异常服务例程的地址(vectors.S中的标号vector14处)加载到cseip寄存器中,开始执行中断服务例程。这时ucore开始处理异常中断,首先需要保存硬件没有保存的寄存器。在vectors.S中的标号vector14处先把中断号压入内核栈,然后再在trapentry.S中的标号__alltraps处把dses和其他通用寄存器都压栈。自此,被打断的程序现场被保存在内核栈中。接下来,在trap.ctrap函数开始了中断服务例程的处理流程,大致调用关系为:

+ +

trap--> +trap_dispatch-->pgfault_handler-->do_pgfault

+ +

下面需要具体分析一下do_pgfault函数。do_pgfault的调用关系如下图所示:

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

+ +

+do_pgfault的调用关系图

+ +

 

+ +

产生页错误异常后,CPU把引起页错误异常的虚拟地址装到寄存器CR2中,并给出了出错码(tf->tf_err),指示引起页错误异常的存储器访问的类型。而中断服务例程会调用页错误异常处理函数do_pgfault进行具体处理。页错误异常处理是实现按需分页、swap in/out的关键之处。

+ +

ucoredo_pgfault函数是完成页错误异常处理的主要函数,它根据从CPU的控制寄存器CR2中获取的页错误异常的虚拟地址以及根据 error +code的错误类型来查找此虚拟地址是否在某个VMA的地址范围内以及是否满足正确的读写权限,如果在此范围内并且权限也正确,这认为这是一次合法访问,但没有建立虚实对应关系。所以需要分配一个空闲的内存页,并修改页表完成虚地址到物理地址的映射,刷新TLB,然后调用iret中断,返回到产生页错误异常的指令处重新执行此指令。如果该虚地址不再某VMA范围内,这认为是一次非法访问。

+ +

 

+ +

页面置换机制的实现

+ +

5.1 页替换算法

+ +

操作系统为何要进行页面置换呢?这是由于操作系统给用户态的应用程序提供了一个虚拟的大容量内存空间,而实际的物理内存空间又没有那么大。所以操作系统就就瞒着应用程序,只把应用程序中常用的数据和代码放在物理内存中,而不常用的数据和代码放在了硬盘这样的存储介质上。如果应用程序访问的是常用的数据和代码,那么操作系统已经放置在内存中了,不会出现什么问题。但当应用程序访问它认为应该在内存中的的数据或代码时,如果这些数据或代码不在内存中,则根据上一小节的介绍,会产生页错误异常。这时,操作系统必须能够应对这种页错误异常,即尽快把应用程序当前需要的数据或代码放到内存中来,然后重新执行应用程序产生异常的访存指令。如果在把硬盘中对应的数据或代码调入内存前,操作系统发现物理内存已经没有空闲空间了,这时操作系统必须把它认为不常用的页换出到磁盘上去,以腾出内存空闲空间给应用程序所需的数据或代码。

+ +

操作系统迟早会碰到没有内存空闲空间而必须要置换出内存中某个不常用的页的情况。如何判断内存中哪些是常用的页,哪些是不常用的页,把常用的页保持在内存中,在物理内存空闲空间不够的情况下,把不常用的页置换到硬盘上就是页替换算法着重考虑的问题。容易理解,一个好的页替换算法会导致页错误异常次数少,也就意味着访问硬盘的次数也少,从而使得应用程序执行的效率就高。本次实验涉及的页替换算法(包括扩展练习):

+ +

l  先进先出(First +In First Out, FIFO)页替换算法:该算法总是淘汰最先进入内存的页,即选择在内存中驻留时间最久的页予以淘汰。只需把一个应用程序在执行过程中已调入内存的页按先后次序链接成一个队列,队列头指向内存中驻留时间最久的页,队列尾指向最近被调入内存的页。这样需要淘汰页时,从队列头很容易查找到需要淘汰的页。FIFO算法只是在应用程序按线性顺序访问地址空间时效果才好,否则效率不高。因为那些常被访问的页,往往在内存中也停留得最久,结果它们因变而不得不被置换出去。FIFO算法的另一个缺点是,它有一种异常现象(Belady现象),即在增加放置页的页帧的情况下,反而使页错误异常次数增多。

+ +

l  时钟(Clock)页替换算法:也称最近未使用 (Not Used Recently, NUR) 页替换算法。虽然二次机会算法是一个较合理的算法,但它经常需要在链表中移动页面,这样做既降低了效率,又是不必要的。一个更好的办法是把各个页面组织成环形链表的形式,类似于一个钟的表面。然后把一个指针指向最古老的那个页面,或者说,最先进来的那个页面。时钟算法和第二次机会算法的功能是完全一样的,只是在具体实现上有所不同。时钟算法需要在页表项(PTE)中设置了一位访问位来表示此页表项对应的页当前是否被访问过。当该页被访问时,CPU中的MMU硬件将把访问位置“1”。然后将内存中所有的页都通过指针链接起来并形成一个循环队列。初始时,设置一个当前指针指向某页(比如最古老的那个页面)。操作系统需要淘汰页时,对当前指针指向的页所对应的页表项进行查询,如果访问位为“0”,则淘汰该页,把它换出到硬盘上;如果访问位为“1”,这将该页表项的此位置“0”,继续访问下一个页。该算法近似地体现了LRU的思想,且易于实现,开销少。但该算法需要硬件支持来设置访问位,且该算法在本质上与FIFO算法是类似的,惟一不同的是在clock算法中跳过了访问位为1的页。

+ +

l  改进的时钟(Enhanced Clock)页替换算法:在时钟置换算法中,淘汰一个页面时只考虑了页面是否被访问过,但在实际情况中,还应考虑被淘汰的页面是否被修改过。因为淘汰修改过的页面还需要写回硬盘,使得其置换代价大于未修改过的页面。改进的时钟置换算法除了考虑页面的访问情况,还需考虑页面的修改情况。即该算法不但希望淘汰的页面是最近未使用的页,而且还希望被淘汰的页是在主存驻留期间其页面内容未被修改过的。这需要为每一页的对应页表项内容中增加一位引用位和一位修改位。当该页被访问时,CPU中的MMU硬件将把访问位置“1”。当该页被时,CPU中的MMU硬件将把修改位置“1”。这样这两位就存在四种可能的组合情况:(00)表示最近未被引用也未被修改,首先选择此页淘汰;(01)最近未被使用,但被修改,其次选择;(10)最近使用而未修改,再次选择;(11)最近使用且修改,最后选择。该算法与时钟算法相比,可进一步减少磁盘的I/O操作次数,但为了查找到一个尽可能适合淘汰的页面,可能需要经过多次扫描,增加了算法本身的执行开销。

+ +

 

+ +

5.2 页面置换机制

+ +

如果要实现页面置换机制,只考虑页替换算法的设计与实现是远远不够的,还需考虑其他问题:

+ +

l  哪些页可以被换出?

+ +

l  一个虚拟的页如何与硬盘上的扇区建立对应关系?

+ +

l  何时进行换入和换出操作?

+ +

l  如何设计数据结构已支持页替换算法?

+ +

l  如何完成页的换入换出操作?

+ +

这些问题在下面会逐一进行分析。注意,在实验三中仅实现了简单的页面置换机制,但现在还没有涉及实验四和实验五才实现的内核线程和用户进程,所以还无法通过内核线程机制实现一个完整意义上的虚拟内存页面置换功能。

+ +

 

+ +

1.     +可以被换出的页

+ +

在操作系统的设计中,一个基本的原则是:并非所有的物理页都可以交换出去的,只有映射到用户空间且被用户程序直接访问的页面才能被交换,而被内核直接使用的内核空间的页面不能被换出。这里面的原因是什么呢?操作系统是执行的关键代码,需要保证运行的高效性和实时性,如果在操作系统执行过程中,发生了缺页现象,则操作系统不得不等很长时间(硬盘的访问速度比内存的访问速度慢2~3个数量级),这将导致整个系统运行低效。而且,不难想象,处理缺页过程所用到的内核代码或者数据如果被换出,整个内核都面临崩溃的危险。

+ +

但在实验三实现的ucore中,我们只是实现了换入换出机制,还没有设计用户态执行的程序,所以我们在实验三中仅仅通过执行check_swap函数在内核中分配一些页,模拟对这些页的访问,然后通过do_pgfault来调用swap_map_swappable函数来查询这些页的访问情况并间接调用相关函数,换出不常用的页到磁盘上。

+ +

 

+ +

2.     +虚存中的页与硬盘上的扇区之间的映射关系

+ +

如果一个页被置换到了硬盘上,那操作系统如何能简捷来表示这种情况呢?在ucore的设计上,充分利用了页表中的PTE来表示这种情况:当一个 PTE 用来描述一般意义上的物理页时,显然它应该维护各种权限和映射关系,以及应该有 PTE_P 标记;但当它用来描述一个被置换出去的物理页时,它被用来维护该物理页与 swap 磁盘上扇区的映射关系,并且该 PTE 不应该由 MMU 将它解释成物理页映射(即没有 PTE_P 标记),与此同时对应的权限则交由 mm_struct 来维护,当对位于该页的内存地址进行访问的时候,必然导致 page fault,然后ucore能够根据 PTE 描述的 swap 项将相应的物理页重新建立起来,并根据虚存所描述的权限重新设置好 PTE 使得内存访问能够继续正常进行。

+ +

如果一个页(4KB/页)被置换到了硬盘某8个扇区(0.5KB/扇区),该 PTE的最低位--present位应该为0 (即 PTE_P 标记为空,表示虚实地址映射关系不存在),接下来的7位暂时保留,可以用作各种扩展;而原来用来表示页帧号的高24位地址,恰好可以用来表示此页在硬盘上的起始扇区的位置(其从第几个扇区开始)。为了在页表项中区别 0 swap 分区的映射,将 swap 分区的一个 page 空出来不用,也就是说一个高24位不为0,而最低位为0PTE表示了一个放在硬盘上的页的起始扇区号(见swap.h中对swap_entry_t的描述):

+ + + + + +
+

swap_entry_t

+

  --------------------------------------------

+

  |         offset        |   reserved   | 0  |

+

  --------------------------------------------

+

            24 bits            7 bits    1 bit

+
+ +

考虑到硬盘的最小访问单位是一个扇区,而一个扇区的大小为5122^8)字节,所以需要8个连续扇区才能放置一个4KB的页。在ucore中,用了第二个IDE硬盘来保存被换出的扇区,根据实验三的输出信息

+ +

“ide +1:     262144(sectors), 'QEMU HARDDISK'.”

+ +

我们可以知道实验三可以保存262144/8=32768个页,即128MB的内存空间。swap 分区的大小是 swapfs_init 里面根据磁盘驱动的接口计算出来的,目前 +ucore 里面要求 swap 磁盘至少包含 1000 page,并且至多能使用 1<<24 page

+ +

 

+ +

3.     +执行换入换出的时机

+ +

在实验三中, check_mm_struct变量这个数据结构表示了目前 ucore认为合法的所有虚拟内存空间集合,而mm中的每个vma表示了一段地址连续的合法虚拟空间。当ucore或应用程序访问地址所在的页不在内存时,就会产生 page fault异常,引起调用do_pgfault函数,此函数会判断产生访问异常的地址属于check_mm_struct某个vma表示的合法虚拟地址空间,且保存在硬盘swap文件中(即对应的PTE的高24位不为0,而最低位为0),则是执行页换入的时机,将调用swap_in函数完成页面换入。

+ +

换出页面的时机相对复杂一些,针对不同的策略有不同的时机。ucore目前大致有两种策略,即积极换出策略和消极换出策略。积极换出策略是指操作系统周期性地(或在系统不忙的时候)主动把某些认为不常用的页换出到硬盘上,从而确保系统中总有一定数量的空闲页存在,这样当需要空闲页时,基本上能够及时满足需求;消极换出策略是指,只是当试图得到空闲页时,发现当前没有空闲的物理页可供分配,这时才开始查找不常用页面,并把一个或多个这样的页换出到硬盘上。

+ +

在实验三中的基本练习中,支持上述第二种情况。对于第一种积极换出策略,即每隔1秒执行一次的实现积极的换出策略,可考虑在扩展练习中实现。对于第二种消极的换出策略,则是在ucore调用alloc_pages函数获取空闲页时,此函数如果发现无法从物理内存页分配器(比如first fit)获得空闲页,就会进一步调用swap_out函数换出某页,实现一种消极的换出策略。

+ +

 

+ +

4.     +页替换算法的数据结构设计

+ +

到实验二为止,我们知道目前表示内存中物理页使用情况的变量是基于数据结构Page的全局变量pages数组,pages的每一项表示了计算机系统中一个物理页的使用情况。为了表示物理页可被换出或已被换出的情况,可对Page数据结构进行扩展:

+ + + + + +
+

struct Page {

+

……

+

list_entry_t        pra_page_link;    

+

uintptr_t            + pra_vaddr;

+

};

+
+ +

pra_page_link可用来构造按页的第一次访问时间进行排序的一个链表,这个链表的开始表示第一次访问时间最近的页,链表结尾表示第一次访问时间最远的页。当然链表头可以就可设置为pra_list_head(定义在swap_fifo.c中),构造的时机实在page fault发生后,进行do_pgfault函数时。pra_vaddr可以用来记录此物理页对应的虚拟页起始地址。

+ +

当一个物理页 struct Page 需要被 swap 出去的时候,首先需要确保它已经分配了一个位于磁盘上的swap +page(由连续的8个扇区组成)。这里为了简化设计,在swap_check函数中建立了每个虚拟页唯一对应的swap page,其对应关系设定为:虚拟页对应的PTE的索引值 = swap page的扇区起始位置*8

+ +

为了实现各种页替换算法,我们设计了一个页替换算法的类框架swap_manager:

+ + + + + +
+

struct swap_manager
+ {
+
     const char *name;
+
     /* Global initialization for the swap manager */
+
     int (*init)            (void);
+
     /* Initialize the priv data inside mm_struct */
+
     int (*init_mm)         (struct mm_struct *mm);
+
     /* Called when tick interrupt occured */
+
     int (*tick_event)      (struct mm_struct *mm);
+
     /* Called when map a swappable page into the mm_struct */
+
     int (*map_swappable)   (struct mm_struct *mm, uintptr_t addr, struct Page *page, int swap_in);
+
     /* When a page is marked as shared, this routine is called to delete the addr entry from the swap manager */
+
     int (*set_unswappable) (struct mm_struct *mm, uintptr_t addr);
+
     /* Try to swap out a page, return then victim */
+
     int (*swap_out_victim) (struct mm_struct *mm, struct Page **ptr_page, int in_tick);
+
     /* check the page relpacement algorithm */
+
     int (*check_swap)(void);    
+ };

+
+ +

这里关键的两个函数指针是map_swappableswap_out_vistim,前一个函数用于记录页访问情况相关属性,后一个函数用于挑选需要换出的页。显然第二个函数依赖与第一个函数记录的页访问情况。tick_event函数指针也很重要,结合定时产生的中断,可以实现一种积极的换页策略。

+ +

 

+ +

5.     +swap_check的检查实现

+ +

下面具体讲述一下实验三中实现置换算法的页面置换的检查执行逻辑,便于大家实现练习2。实验三页面置换的检查过程在函数swap_check +kern/mm/swap.c中)中,其大致流程如下。

+ +

1.      调用mm_create建立mm变量,并调用vma_create创建vma变量,设置合法的访问范围为4KB~24KB

+ +

2.      调用free_page等操作,模拟形成一个只有4个空闲 physical page;并设置了从4KB~24KB的连续5个虚拟页的访问操作;

+ +

3.      设置记录缺页次数的变量pgfault_num=0,执行check_content_set函数,使得起始地址分别对起始地址为0x1000, 0x2000, 0x3000, 0x4000的虚拟页按时间顺序先后写操作访问,由于之前没有建立页表,所以会产生page fault异常,如果完成练习1,则这些从4KB~20KB4虚拟页会与ucore保存的4个物理页帧建立映射关系;

+ +

4.      然后对虚页对应的新产生的页表项进行合法性检查;

+ +

5.      然后进入测试页替换算法的主体,执行函数check_content_access,并进一步调用到_fifo_check_swap函数,如果通过了所有的assert。这进一步表示FIFO页替换算法基本正确实现;

+ +

6.      最后恢复ucore环境。

+ +

 

+ +

6  实验报告要求

+ +

从网站上下载lab3.zip后,解压得到本文档和代码目录 lab3,完成实验中的各个练习。完成代码编写并检查无误后,在对应目录下执行 make handin 任务,即会自动生成 +lab3-handin.tar.gz。最后请一定提前或按时提交到网络学堂上。

+ +

注意有“LAB3”的注释,代码中所有需要完成的地方challenge除外)都有“LAB3”“YOUR CODE”的注释,请在提交时特别注意保持注释,并将“YOUR CODE”替换为自己的学号,并且将所有标有对应注释的部分填上正确的代码。所有扩展实验的加分总和不超过10分。

+ +

附录:正确输出的参考:

+ + + + + +
+

yuchen@yuchen-PAI4:~/oscourse/2012spring/lab3/lab3-code-2012$ + make qemu

+

(THU.CST) os is loading ...

+

 

+

Special kernel symbols:

+

  entry  0xc010002c (phys)

+

  etext  0xc010962b (phys)

+

  edata  0xc0122ac8 (phys)

+

  end    0xc0123c10 (phys)

+

Kernel executable memory footprint: 143KB

+

memory management: default_pmm_manager

+

e820map:

+

  memory: 0009f400, [00000000, 0009f3ff], type = 1.

+

  memory: 00000c00, [0009f400, 0009ffff], type = 2.

+

  memory: 00010000, [000f0000, 000fffff], type = 2.

+

  memory: 07efd000, [00100000, 07ffcfff], type = 1.

+

  memory: 00003000, [07ffd000, 07ffffff], type = 2.

+

  memory: 00040000, [fffc0000, ffffffff], type = 2.

+

check_alloc_page() succeeded!

+

check_pgdir() succeeded!

+

check_boot_pgdir() succeeded!

+

-------------------- BEGIN --------------------

+

PDE(0e0) c0000000-f8000000 38000000 urw

+

  |-- PTE(38000) c0000000-f8000000 38000000 -rw

+

PDE(001) fac00000-fb000000 00400000 -rw

+

  |-- PTE(000e0) faf00000-fafe0000 000e0000 urw

+

  |-- PTE(00001) fafeb000-fafec000 00001000 -rw

+

--------------------- END ---------------------

+

check_vma_struct() succeeded!

+

page fault at 0x00000100: K/W [no page found].

+

check_pgfault() succeeded!

+

check_vmm() succeeded.

+

ide 0:      10000(sectors), 'QEMU HARDDISK'.

+

ide 1:     262144(sectors), 'QEMU HARDDISK'.

+

SWAP: manager = fifo swap manager

+

BEGIN check_swap: count 1, total 31992

+

 mm->sm_priv c0123c04 in fifo_init_mm

+

setup Page Table for vaddr 0X1000, so alloc a page

+

setup Page Table vaddr 0~4MB OVER!

+

set up init env for check_swap begin!

+

page fault at 0x00001000: K/W [no page found].

+

page fault at 0x00002000: K/W [no page found].

+

page fault at 0x00003000: K/W [no page found].

+

page fault at 0x00004000: K/W [no page found].

+

set up init env for check_swap over!

+

write Virt Page c in fifo_check_swap

+

write Virt Page a in fifo_check_swap

+

write Virt Page d in fifo_check_swap

+

write Virt Page b in fifo_check_swap

+

write Virt Page e in fifo_check_swap

+

page fault at 0x00005000: K/W [no page found].

+

swap_out: i 0, store page in vaddr 0x1000 to disk + swap entry 2

+

write Virt Page b in fifo_check_swap

+

write Virt Page a in fifo_check_swap

+

page fault at 0x00001000: K/W [no page found].

+

swap_out: i 0, store page in vaddr 0x2000 to disk + swap entry 3

+

swap_in: load disk swap entry 2 with swap_page in vadr + 0x1000

+

write Virt Page b in fifo_check_swap

+

page fault at 0x00002000: K/W [no page found].

+

swap_out: i 0, store page in vaddr 0x3000 to disk + swap entry 4

+

swap_in: load disk swap entry 3 with swap_page in + vadr 0x2000

+

write Virt Page c in fifo_check_swap

+

page fault at 0x00003000: K/W [no page found].

+

swap_out: i 0, store page in vaddr 0x4000 to disk + swap entry 5

+

swap_in: load disk swap entry 4 with swap_page in + vadr 0x3000

+

write Virt Page d in fifo_check_swap

+

page fault at 0x00004000: K/W [no page found].

+

swap_out: i 0, store page in vaddr 0x5000 to disk + swap entry 6

+

swap_in: load disk swap entry 5 with swap_page in + vadr 0x4000

+

check_swap() succeeded!

+

++ setup timer interrupts

+

100 ticks

+

End of Test.

+

kernel panic at kern/trap/trap.c:20:

+

    EOT: kernel seems ok.

+

Welcome to the kernel debug monitor!!

+

Type 'help' for a list of commands.

+
+ +

 

+ +
+ + + + diff --git a/lab4.htm b/lab4.htm new file mode 100644 index 0000000..b607855 --- /dev/null +++ b/lab4.htm @@ -0,0 +1,2166 @@ + + + + + + + + + + + +
+ +

 

+ +

实验四:内核线程管理

+ +

1 实验目的

+ +

l  了解内核线程创建/执行的管理过程

+ +

l  了解内核线程的切换和基本调度过程

+ +

2    实验内容

+ +

实验2/3完成了物理和虚拟内存管理,这给创建内核线程(内核线程是一种特殊的进程)打下了提供内存管理的基础。当一个程序加载到内存中运行时,首先通过ucore的内存管理分配合适的空间,然后就需要考虑如何使用CPU并发执行多个程序。

+ +

本次实验将首先接触的是内核线程的管理。内核线程是一种特殊的进程,内核线程与用户进程的区别有两个:内核线程只运行在内核态而用户进程会在在用户态和内核态交替运行;所有内核线程直接使用共同的ucore内核内存空间,不需为每个内核线程维护单独的内存空间而用户进程需要维护各自的用户内存空间。相关原理介绍可看附录B:【原理】进程/线程的属性与特征解析。

+ +

2.1 练习

+ +

练习0:填写已有实验

+ +

本实验依赖实验1/2/3。请把你做的实验1/2/3的代码填入本实验中代码中有“LAB1”,“LAB2”, +“LAB3”的注释相应部分。

+ +

练习1:分配并初始化一个进程控制块(需要编码)

+ +

alloc_proc函数(位于kern/process/proc.c)负责分配并返回一个新的struct proc_struct结构,用于存储新建立的内核线程的管理信息。ucore需要对这个结构进行最基本的初始化,你需要完成这个初始化过程。【提示】在alloc_proc函数的实现中,需要初始化的proc_struct结构中的成员变量至少包括:state/pid/runs/kstack/need_resched/parent/mm/context/tf/cr3/flags/name

+ +

练习2:为新创建的内核线程分配资源(需要编码)

+ +

创建一个内核线程需要分配和设置好很多资源。kernel_thread函数通过调用do_fork函数完成具体内核线程的创建工作。do_kernel函数会调用alloc_proc函数来分配并初始化一个进程控制块,但alloc_proc只是找到了一小块内存用以记录进程的必要信息,并没有实际分配这些资源。ucore一般通过do_fork实际创建新的内核线程。do_fork的作用是,创建当前内核线程的一个副本,它们的执行上下文、代码、数据都一样,但是存储位置不同。在这个过程中,需要给新内核线程分配资源,并且复制原进程的状态。你需要完成kern/process/proc.c中的do_fork函数中的处理过程。它的大致执行步骤包括:

+ +

-       +调用alloc_proc,首先获得一块用户信息块。

+ +

-       +为进程分配一个内核栈。

+ +

-       +复制原进程的内存管理信息到新进程(但内核线程不必做此事)

+ +

-       +复制原进程上下文到新进程

+ +

-       +将新进程添加到进程列表

+ +

-       +唤醒新进程

+ +

-       +返回新进程号

+ +

练习3:阅读代码,理解proc_run和它调用的函数如何完成进程切换的。(无编码工作)

+ +

完成代码编写后,编译并运行代码:make +qemu

+ +

如果可以得到如附录A所示的显示内容(仅供参考,不是标准答案输出),则基本正确。

+ +

 

+ +

扩展练习Challenge:实现支持任意大小的内存分配算法

+ +

这不是本实验的内容,其实是上一次实验内存的扩展,但考虑到现在的slab算法比较复杂,有必要实现一个比较简单的任意大小内存分配算法。可参考本实验中的slab如何调用基于页的内存分配算法(注意,不是要你关注slab的具体实现)来实现first-fit/best-fit/worst-fit/buddy等支持任意大小的内存分配算法。。

+ +

【注意】下面是相关的Linux实现文档,供参考

+ +

SLOB

+ +

http://en.wikipedia.org/wiki/SLOB  +http://lwn.net/Articles/157944/

+ +

SLAB

+ +

https://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/

+ +

 

+ +

2.2 项目组成

+ + + + + +
+

├── boot

+

├── kern

+

   ├── + debug

+

   ├── + driver

+

   ├── + fs

+

   ├── + init

+

     ├── + init.c

+

     └── + ...

+

   ├── + libs

+

     ├── + rb_tree.c

+

     ├── + rb_tree.h

+

     └── + ...

+

   ├── + mm

+

     ├── kmalloc.c

+

     ├── + kmalloc.h

+

     ├── + memlayout.h

+

     ├── + pmm.c

+

     ├── + pmm.h

+

     ├── + swap.c

+

     ├── + vmm.c

+

     └── + ...

+

   ├── process

+

     ├── + entry.S

+

     ├── + proc.c

+

     ├── + proc.h

+

     └── + switch.S

+

   ├── + schedule

+

     ├── + sched.c

+

     └── + sched.h

+

   ├── + sync

+

     └── + sync.h

+

   └── + trap

+

       + ├── trapentry.S

+

       + └── ...

+

├── libs

+

   ├── + hash.c

+

   ├── + stdlib.h

+

   ├── + unistd.h

+

   └── + ...

+

├── Makefile

+

└── tools

+
+ +

       相对与实验三,实验四主要增加的文件如上表红色部分所示,主要修改的文件如上表紫色部分所示。主要改动如下:

+ +

       +kern/process/  (新增进程管理相关文件)

+ +

proc.[ch]:新增:实现进程、线程相关功能,包括:创建进程/线程,初始化进程/线程,处理进程/线程退出等功能

+ +

              entry.S:新增:内核线程入口函数kernel_thread_entry的实现

+ +

              switch.S:新增:上下文切换,利用堆栈保存、恢复进程上下文 +

+ +

       +kern/init/

+ +

              init.c:修改:完成进程系统初始化,并在内核初始化后切入idle进程

+ +

       +kern/mm/ (基本上与本次实验没有太直接的联系,了解kmallockfree如何使用即可)

+ +

kmalloc.[ch]:新增:定义和实现了新的kmalloc/kfree函数。具体实现是基于slab分配的简化算法 只要求会调用这两个函数即可)

+ +

memlayout.h:增加slab物理内存分配相关的定义与宏  (可不用理会)。

+ +

pmm.[ch]:修改:pmm.c中添加了调用kmalloc_init函数,取消了老的kmalloc/kfree的实现;在pmm.h中取消了老的kmalloc/kfree的定义

+ +

      swap.c:修改:取消了用于checkLine 185的执行

+ +

              vmm.c:修改:调用新的kmalloc/kfree

+ +

       +kern/trap/

+ +

              trapentry.S增加了汇编写的函数forkrets,用于do_fork调用的返回处理。

+ +

       +kern/schedule/

+ +

              sched.[ch]:新增:实现FIFO策略的进程调度

+ +

       +kern/libs

+ +

     rb_tree.[ch]:新增:实现红黑树,被slab分配的简化算法使用(可不用理会)

+ +

编译执行

+ +

 

+ +

编译并运行代码的命令如下:

+ +

make

+ +

make qemu

+ +

则可以得到如附录A所示的显示内容(仅供参考,不是标准答案输出)

+ +

 

+ +

3 内核线程管理

+ +

3.1 实验执行流程概述

+ +

     lab2lab3完成了对内存的虚拟化,但整个控制流还是一条线串行执行。lab4将在此基础上进行CPU的虚拟化,即让ucore实现分时共享CPU,实现多条控制流能够并发执行。从某种程度上,我们可以把控制流看作是一个内核线程。本次实验将首先接触的是内核线程的管理。内核线程是一种特殊的进程,内核线程与用户进程的区别有两个:内核线程只运行在内核态而用户进程会在在用户态和内核态交替运行;所有内核线程直接使用共同的ucore内核内存空间,不需为每个内核线程维护单独的内存空间而用户进程需要维护各自的用户内存空间。从内存空间占用情况这个角度上看,我们可以把线程看作是一种共享内存空间的轻量级进程。

+ +

为了实现内核线程,需要设计管理线程的数据结构,即进程控制块(在这里也可叫做线程控制块)。如果要让内核线程运行,我们首先要创建内核线程对应的进程控制块,还需把这些进程控制块通过链表连在一起,便于随时进行插入,删除和查找操作等进程管理事务。这个链表就是进程控制块链表。然后在通过调度器(scheduler)来让不同的内核线程在不同的时间段占用CPU执行,实现对CPU的分时共享。那lab4中是如何一步一步实现这个过程的呢?

+ +

我们还是从lab4/kern/init/init.c中的kern_init函数入手分析。在kern_init函数中,当完成虚拟内存的初始化工作后,就调用了proc_init函数,这个函数完成了idleproc内核线程和initproc内核线程的创建或复制工作,这也是本次实验要完成的练习。idleproc内核线程的工作就是不停地查询,看是否有其他内核线程可以执行了,如果有,马上让调度器选择那个内核线程执行(请参考cpu_idle函数的实现)。所以idleproc内核线程是在ucore操作系统没有其他内核线程可执行的情况下才会被调用。接着就是调用kernel_thread函数来创建initproc内核线程。initproc内核线程的工作就是显示“Hello World”,表明自己存在且能正常工作了。

+ +

调度器会在特定的调度点上执行调度,完成进程切换。在lab4中,这个调度点就一处,即在cpu_idle函数中,此函数如果发现当前进程(也就是idleproc)的need_resched置为1(在初始化idleproc的进程控制块时就置为1了),则调用schedule函数,完成进程调度和进程切换。进程调度的过程其实比较简单,就是在进程控制块链表中查找到一个“合适”的内核线程,所谓“合适”就是指内核线程处于“PROC_RUNNABLE”状态。在接下来的switch_to函数(在后续有详细分析,有一定难度,需深入了解一下)完成具体的进程切换过程。一旦切换成功,那么initproc内核线程就可以通过显示字符串来表明本次实验成功。

+ +

接下来将主要介绍了进程创建所需的重要数据结构--进程控制块 +proc_struct,以及ucore创建并执行内核线程idleprocinitproc的两种不同方式,特别是创建initproc的方式将被延续到实验五中,扩展为创建用户进程的主要方式。另外,还初步涉及了进程调度(实验六涉及并会扩展)和进程切换内容。

+ +

 

+ +

3.2 设计关键数据结构--进程控制块

+ +

在实验四中,进程管理信息用struct proc_struct表示,在kern/process/proc.h中定义如下:

+ + + + + +
+

struct proc_struct {

+

    enum proc_state + state;        // Process state

+

    int + pid;                        // Process ID

+

    int + runs;                       // the running times of Proces

+

    uintptr_t + kstack;             // Process kernel stack

+

    volatile bool + need_resched; // need to be rescheduled to release CPU?

+

    struct proc_struct + *parent; // the parent process

+

    struct mm_struct + *mm;        // Process's memory management field

+

    struct context + context;     // Switch here to run process

+

    struct trapframe + *tf;       // Trap frame for current interrupt

+

    uintptr_t + cr3;               // the base addr of Page Directroy Table(PDT)

+

    uint32_t + flags;              // Process flag

+

    char + name[PROC_NAME_LEN + 1];  // Process name

+

    list_entry_t + list_link;    // Process link list

+

    list_entry_t + hash_link;    // Process hash list

+

};

+
+ +

 

+ +

下面重点解释一下几个比较重要的成员变量:

+ +

       mm :内存管理的信息,包括内存映射列表、页表指针等。mm成员变量lab3中用于虚存管理。但在实际OS中,内核线程常驻内存,不需要考虑swap +page问题,lab5中涉及到了用户进程,才考虑进程用户内存空间的swap page问题mm才会发挥作用。所以lab4mm对于内核线程就没有用了,这样内核线程proc_struct的成员变量*mm=0是合理的。mm里有个很重要的项pgdir,记录的是该进程使用的一级页表的物理地址。由于*mm=NULL,所以在proc_struct数据结构中需要有一个代替pgdir项来记录页表起始地址,这就是proc_struct数据结构中的cr3成员变量。

+ +

       state:进程所处的状态。

+ +

       +parent :用户进程的父进程(创建它的进程)。在所有进程中,只有一个进程没有父进程,就是内核创建的第一个内核线程idleproc。内核根据这个父子关系建立一个树形结构,用于维护一些特殊的操作,例如确定某个进程是否可以对另外一进程进行某种操作等等。

+ +

       +context:进程的上下文,用于进程切换(参见switch.S)。 ucore 中,所有的进程在内核中也是相对独立的(例如独立的内核堆栈以及上下文等等)。使用 context 保存寄存器的目的就在于在内核态中能够进行上下文之间的切换。实际利用context进行上下文切换的函数是在kern/process/switch.S中定义switch_to

+ +

       tf:中断帧的指针,总是指向内核栈的某个位置:当进程从用户空间跳到内核空间时,中断帧记录了进程在被中断前的状态。当内核需要跳回用户空间时,需要调整中断帧以恢复让进程继续执行的各寄存器值。除此之外,ucore +内核允许嵌套中断。因此为了保证嵌套中断发生时tf +总是能够指向当前的 trapframeucore 在内核栈上维护了 tf 的链,可以参考 trap.c::trap函数做进一步的了解。

+ +

l  cr3: cr3 保存页表的物理地址,目的就是进程切换的时候方便直接使用 lcr3 +实现页表切换,避免每次都根据 mm 来计算 cr3mm 数据结构是用来实现用户空间的虚存管理的,但是内核线程没有用户空间,它执行的只是内核中的一小段代码(通常是一小段函数),所以它没有 +mm 结构,也就是NULL。当某个进程是一个普通用户态进程的时候,PCB 中的 cr3 就是 mm 中页表(pgdir)的物理地址;而当它是内核线程的时候,cr3 等于 boot_cr3 boot_cr3指向了ucore启动时建立好的饿内核虚拟空间的页目录表首地址。

+ +

       kstack: +每个线程都有一个内核,并且位于内核地址空间的不同位置。对于内核线程,该栈就是运行时的程序使用的栈;而对于普通进程,该栈是发生特权级改变的时候使保存被打断的硬件信息用的栈。Ucore在创建进程时分配了 2 个连续的物理页(参见 memlayout.hKSTACKSIZE的定义)作为内核栈的空间。这个栈很小,所以内核中的代码应该尽可能的紧凑,并且避免在栈上分配大的数据结构,以免栈溢出,导致系统崩溃。kstack记录了分配给该进程/线程的内核栈的位置。主要作用有以下几点。首先,当内核准备从一个进程切换到另一个的时候,需要根据 +kstack 的值正确的设置好 tss +(可以回顾一下在实验一中讲述的 +tss 在中断处理过程中的作用),以便在进程切换以后再发生中断时能够使用正确的栈。其次,内核栈位于内核地址空间,并且是不共享的(每个线程都拥有自己的内核栈),因此不受到 +mm 的管理,当进程退出的时候,内核能够根据 +kstack 的值快速定位栈的位置并进行回收。ucore +的这种内核栈的设计借鉴的是 linux +的方法(但由于内存管理实现的差异,它实现的远不如 +linux 的灵活),它使得每个线程的内核栈在不同的位置,这样从某种程度上方便调试,但同时也使得内核对栈溢出变得十分不敏感,因为一旦发生溢出,它极可能污染内核中其它的数据使得内核崩溃。如果能够通过页表,将所有进程的内核栈映射到固定的地址上去,能够避免这种问题,但又会使得进程切换过程中对栈的修改变得相当繁琐。感兴趣的同学可以参考 +linux kernel 的代码对此进行尝试。

+ +

 

+ +

为了管理系统中所有的进程控制块,ucore维护了如下全局变量(位于kern/process/proc.c):

+ +

 

+ +

       static +struct proc *current当前占用CPU处于运行状态进程控制块指针。通常这个变量是只读的,只有在进程切换的时候才进行修改,并且整个切换和修改过程需要保证操作的原子性,目前至少需要屏蔽中断可以参考 switch_to 的实现。

+ +

       static +struct proc *initproc:本实验中,指向一个内核线程。本实验以后,此指针将指向第一个用户态进程

+ +

       static +list_entry_t hash_list[HASH_LIST_SIZE]所有进程控制块的哈希表,proc_struct中的成员变量hash_link将基于pid链接入这个哈希表中。

+ +

       list_entry_t +proc_list所有进程控制块的双向线性列表,proc_struct中的成员变量list_link将链接入这个链表中。

+ +

3.3 创建并执行内核线程

+ +

建立进程控制块(proc.c中的alloc_proc函数)后,现在就可以通过进程控制块来创建具体的进程了。首先,考虑最简单的内核线程,它通常只是内核中的一小段代码或者函数,没有用户空间。而由于在操作系统启动后,已经对整个核心内存空间进行了管理,通过设置页表建立了核心虚拟空间(即boot_cr3指向的二级页表描述的空间)。所以内核中的所有线程都不需要再建立各自的页表,只需共享这个核心虚拟空间就可以访问整个物理内存了。

+ +

 

+ +

1.     创建第0个内核线程idleproc

+ +

init.c::kern_init函数调用了proc.c::proc_init函数。proc_init函数启动了创建内核线程的步骤。首先当前的执行上下文(从kern_init 启动至今)就可以看成是ucore内核(也可看做是内核进程)中的一个内核线程的上下文。为此, ucore 通过给当前执行的上下文分配一个进程控制块以及对它进行相应初始化,将其打造成第0个内核线程 -- idleproc。具体步骤如下:

+ +

首先调用alloc_proc函数来通过kmalloc函数获得proc_struct结构的一块内存—proc,这就是第0个进程控制块了,并把proc进行初步初始化(即把proc_struct中的各个成员变量清零)。但有些成员变量设置了特殊的值:

+ + + + + +
+

 练习1     //设置进程为初始

+

 练习1     //进程的pid还没设置好

+

 练习1     //进程在内核中使用的内核页表的起始地址

+
+ +

述三条语句中,第一条设置了进程的状态为初始态,这表示进程已经出生了,正在获取资源茁壮成长中;第二条语句设置了进程的pid-1,这表示进程的身份证号还没有办好;第三条语句表明由于该内核线程在内核中运行,故采用为ucore内核已经建立的页表,即设置为在ucore内核页表的起始地址boot_cr3。后续实验中可进一步看出所有进程的内核虚地址空间(也包括物理地址空间)是相同的。既然内核线程共用一个映射内核空间的页表,这表示所有这些内核空间对所有内核线程都是可见的,所以更精确地说,这些内核线程都应该是从属于同一个唯一的内核进程—ucore内核。

+ +

接下来,proc_init函数对idleproc内核线程进行进一步初始化:

+ + + + + +
+

idleproc->pid = 0;

+

idleproc->state = + PROC_RUNNABLE;

+

idleproc->kstack = (uintptr_t)bootstack;

+

idleproc->need_resched + = 1;

+

set_proc_name(idleproc, + "idle");

+
+ +

需要注意前4条语句。第一条语句给了idleproc合法的身份证号--0,这名正言顺地表明了idleproc是第0个内核线程。通常可以通过pid的赋值来表示线程的创建和身份确定。“0”是第一个的表示方法是计算机领域所特有的,比如C语言定义的第一个数组元素的小标也是“0”。第二条语句改变了idleproc的状态,使得它从出生转到了准备工作,就差ucore调度它执行了。第三条语句设置了idleproc所使用的内核栈的起始地址。需要注意以后的其他线程的内核栈都需要通过分配获得,因为ucore启动时设置的内核栈直接分配给idleproc使用了。第四条很重要,因为ucore希望当前CPU应该做更有用的工作,而不是运行idleproc这个无所事事的内核线程,所以把idleproc->need_resched设置为“1”,结合idleproc的执行主体--cpu_idle函数的实现,可以清楚看出如果当前idleproc在执行,则只要此标志为1,马上就调用schedule函数要求调度器切换其他进程执行。

+ +

 

+ +

2.     创建第1个内核线程initproc

+ +

0个内核线程主要工作是完成内核中各个子系统的初始化,然后就通过执行cpu_idle函数开始过退休生活了。所以ucore接下来还需创建其他进程来完成各种工作,但idleproc内核子线程自己不想做,于是就通过调用kernel_thread函数创建了一个内核线程init_main。在实验四中,这个子内核线程的工作就是输出一些字符串,然后就返回了(参看init_main函数)。但在后续的实验中,init_main的工作就是创建特定的其他内核线程或用户进程(实验五涉及)。下面我们来分析一下创建内核线程的函数kernel_thread

+ + + + + +
+

kernel_thread(int + (*fn)(void *), void *arg, uint32_t clone_flags) {

+

    struct trapframe tf;

+

    memset(&tf, 0, + sizeof(struct trapframe));

+

    tf.tf_cs = KERNEL_CS;

+

    tf.tf_ds = + tf_struct.tf_es = tf_struct.tf_ss = KERNEL_DS;

+

    tf.tf_regs.reg_ebx = + (uint32_t)fn;

+

    tf.tf_regs.reg_edx = + (uint32_t)arg;

+

    tf.tf_eip = + (uint32_t)kernel_thread_entry;

+

    return + do_fork(clone_flags | CLONE_VM, 0, &tf);

+

}

+
+ +

注意,kernel_thread函数采用了局部变量tf来放置保存内核线程的临时中断帧,并把中断帧的指针传递给do_fork函数,而do_fork函数会调用copy_thread函数来在新创建的进程内核栈上专门给进程的中断帧分配一块空间。

+ +

给中断帧分配完空间后,就需要构造新进程的中断帧,具体过程是:首先给tf进行清零初始化,并设置中断帧的代码段(tf.tf_cs)和数据段(tf.tf_ds/tf_es/tf_ss)为内核空间的段(KERNEL_CS/ KERNEL_DS),这实际上也说明了initproc内核线程在内核空间中执行。而initproc内核线程从哪里开始执行呢?tf.tf_eip的指出了是kernel_thread_entry(位于kern/process/entry.S中),kernel_thread_entryentry.S中实现的汇编函数,它做的事情很简单:

+ + + + + +
+

kernel_thread_entry:        + # void kernel_thread(void)

+

    pushl %edx              + # push arg

+

    call *%ebx              + # call fn

+

    pushl %eax              + # save the return value of fn(arg)

+

    call do_exit            + # call do_exit to terminate current thread

+
+ +

从上可以看出,kernel_thread_entry函数主要为内核线程的主体fn函数做了一个准备开始和结束运行的,并把函数fn的参数arg(保存在edx寄存器中)压栈,然后调用fn函数,把函数返回值eax寄存器内容压栈,调用do_exit函数退出线程执行。

+ +

do_fork是创建线程的主要函数。kernel_thread函数通过调用do_fork函数最终完成了内核线程的创建工作。下面我们来分析一下do_fork函数的实现(练习2)。do_fork函数主要做了以下6件事情:

+ +

1.         +分配并初始化进程控制块(alloc_proc函数);

+ +

2.         +分配并初始化内核栈(setup_stack函数);

+ +

3.         +根据clone_flag标志复制或共享进程内存管理结构(copy_mm函数);

+ +

4.         +设置进程在内核(将来也包括用户态)正常运行和调度所需的中断帧和执行上下文(copy_thread函数);

+ +

5.         +把设置好的进程控制块放入hash_listproc_list两个全局进程链表中;

+ +

6.         +自此,进程已经准备好执行了,把进程状态设置为就绪态;

+ +

7.         +设置返回码为子进程的id号。

+ +

这里需要注意的是,如果上述前3步执行没有成功,则需要做对应的出错处理,把相关已经占有的内存释放掉。copy_mm函数目前只是把current->mm设置为NULL,这是由于目前在实验四中只能创建内核线程,proc->mm描述的是进程用户态空间的情况,所以目前mm还用不上。copy_thread函数做的事情比较多,代码如下:

+ + + + + +
+

static void

+

copy_thread(struct + proc_struct *proc, uintptr_t esp, struct trapframe *tf) {

+

   //在内核堆栈的顶部设置中断帧大小的一块栈空间

+

    proc->tf = (struct + trapframe *)(proc->kstack + KSTACKSIZE) - 1;

+

    *(proc->tf) = *tf;  + //拷贝在kernel_thread函数建立的临时中断帧的初始值

+

    proc->tf->tf_regs.reg_eax + = 0;  //设置子进程/线程执行完do_fork后的返回值

+

    proc->tf->tf_esp + = esp;  //设置中断帧中的栈指针esp

+

    + proc->tf->tf_eflags |= FL_IF; //使能中断

+

    proc->context.eip = + (uintptr_t)forkret;

+

    proc->context.esp = + (uintptr_t)(proc->tf);

+

}

+
+ +

此函数首先在内核堆栈的顶部设置中断帧大小的一块栈空间,并在此空间中拷贝在kernel_thread函数建立的临时中断帧的初始值,并进一步设置中断帧中的栈指针esp和标志寄存器eflags,特别是eflags设置了FL_IF标志,这表示此内核线程在执行过程中,能响应中断,打断当前的执行。执行到这步后,此进程的中断帧就建立好了,对于initproc而言,它的中断帧如下所示:

+ + + + + +
+

//所在地址位置

+

initproc->tf= + (proc->kstack+KSTACKSIZE) – sizeof (struct trapframe);  

+

//具体内容

+

initproc->tf.tf_cs = + KERNEL_CS;

+

initproc->tf.tf_ds = + initproc->tf.tf_es = initproc->tf.tf_ss = KERNEL_DS;

+

initproc->tf.tf_regs.reg_ebx + = (uint32_t)init_main;

+

initproc->tf.tf_regs.reg_edx + = (uint32_t) ADDRESS of "Hello world!!";

+

initproc->tf.tf_eip = + (uint32_t)kernel_thread_entry;

+

initproc->tf.tf_regs.reg_eax + = 0;

+

initproc->tf.tf_esp = + esp;

+

initproc->tf.tf_eflags + |= FL_IF;

+
+ +

设置好中断帧后,最后就是设置initproc的进程上下文,(process context,也称执行现场)了。只有设置好执行现场后,一旦ucore调度器选择了initproc执行,就需要根据initproc->context中保存的执行现场来恢复initproc的执行。这里设置了initproc的执行现场中主要的两个信息:上次停止执行时的下一条指令地址context.eip和上次停止执行时的堆栈地址context.esp。其实initproc还没有执行过,所以这其实就是initproc实际执行的第一条指令地址和堆栈指针。可以看出,由于initproc的中断帧占用了实际给initproc分配的栈空间的顶部,所以initproc就只能把栈顶指针context.esp设置在initproc的中断帧的起始位置。根据context.eip的赋值,可以知道initproc实际开始执行的地方在forkret函数(主要完成do_fork函数返回的处理工作)处。至此,initproc内核线程已经做好准备执行了。

+ +

 

+ +

3.     调度并执行内核线程initproc

+ +

ucore执行完proc_init函数后,就创建好了两个内核线程:idleprocinitproc,这时ucore当前的执行现场就是idleproc,等到执行到init函数的最后一个函数cpu_idle之前,ucore的所有初始化工作就结束了,idleproc将通过执行cpu_idle函数让出CPU,给其它内核线程执行,具体过程如下:

+ + + + + +
+

void
+ cpu_idle(void)
 {
+
    while (1) {
+
        if (current->need_resched) {
+
            schedule();
+
     ……

+
+ +

首先,判断当前内核线程idleprocneed_resched是否不为0,回顾前面创建第一个内核线程idleproc”中的描述,proc_init函数在初始化idleproc中,就把idleproc->need_resched置为1了,所以会马上调用schedule函数找其他处于就绪态的进程执行。

+ +

ucore在实验四中只实现了一个最简单的FIFO调度器,其核心就是schedule函数。它的执行逻辑很简单:

+ +

1.         +设置当前内核线程current->need_resched0

+ +

2.         +proc_list队列中查找下一个处于就绪态的线程或进程next

+ +

3.         +找到这样的进程后,就调用proc_run函数,保存当前进程current的执行现场(进程上下文),恢复新进程的执行现场,完成进程切换。

+ +

至此,新的进程next就开始执行了。由于在proc10中只有两个内核线程,且idleproc要让出CPUinitproc执行,我们可以看到schedule函数通过查找proc_list进程队列,只能找到一个处于就绪态的initproc内核线程。并通过proc_run和进一步的switch_to函数完成两个执行现场的切换,具体流程如下:

+ +

1.         +current指向next内核线程initproc

+ +

2.         +设置任务状态段ts中特权态0下的栈顶指针esp0next内核线程initproc的内核栈的栈顶,即next->kstack + KSTACKSIZE +

+ +

3.         +设置CR3寄存器的值为next内核线程initproc的页目录表起始地址next->cr3,这实际上是完成进程间的页表切换;

+ +

4.         +switch_to函数完成具体的两个线程的执行现场切换,即切换各个寄存器,当switch_to函数执行完“ret”指令后,就切换到initproc执行了。

+ +

注意,在第二步设置任务状态段ts中特权态0下的栈顶指针esp0的目的是建立好内核线程或将来用户线程在执行特权态切换(从特权态0<-->特权态3,或从特权态3<-->特权态3)时能够正确定位处于特权态0时进程的内核栈的栈顶,而这个栈顶其实放了一个trapframe结构的内存空间。如果是在特权态3发生了中断/异常/系统调用,则CPU会从特权态3-->特权态0,且CPU从此栈顶(当前被打断进程的内核栈顶)开始压栈来保存被中断/异常/系统调用打断的用户态执行现场;如果是在特权态0发生了中断/异常/系统调用,则CPU会从从当前内核栈指针esp所指的位置开始压栈保存被中断/异常/系统调用打断的内核态执行现场。反之,当执行完对中断/异常/系统调用打断的处理后,最后会执行一个“iret”指令。在执行此指令之前,CPU的当前栈指针esp一定指向上次产生中断/异常/系统调用时CPU保存的被打断的指令地址CSEIP“iret”指令会根据ESP所指的保存的址CSEIP恢复到上次被打断的地方继续执行。

+ +

在页表设置方面,由于idleprocinitproc都是共用一个内核页表boot_cr3,所以此时第三步其实没用,但考虑到以后的进程有各自的页表,其起始地址各不相同,只有完成页表切换,才能确保新的进程能够正常执行。

+ +

第四步proc_run函数调用switch_to函数,参数是前一个进程和后一个进程的执行现场:process context。在上一节设计进程控制块中,描述了context结构包含的要保存和恢复的寄存器。我们再看看switch.S中的switch_to函数的执行流程:

+ + + + + +
+

.globl switch_to

+

switch_to:                # + switch_to(from, to)

+

 

+

    # save from's registers

+

    movl 4(%esp), %eax   # + eax points to from

+

    popl 0(%eax)         # esp--> + return address,  so save return addr in FROM’s context

+

    movl %esp, 4(%eax)

+

    ……

+

    movl %ebp, 28(%eax)

+

    # restore to's + registers

+

    movl 4(%esp), + %eax          # not 8(%esp): popped return address already

+

                             +   # eax now points to to

+

    movl 28(%eax), %ebp

+

    ……

+

    movl 4(%eax), %esp

+

    pushl + 0(%eax)               # push TO’s context’s eip, so return addr = TO’s eip

+

    ret                        + # after ret, eip= TO’s eip

+
+ +

首先,保存前一个进程的执行现场,前两条汇编指令(如下所示)保存了进程在返回switch_to函数后的指令地址到context.eip

+ + + + + +
+

   movl + 4(%esp), %eax  # eax points to from

+

    popl 0(%eax)       # esp--> + return address,  so save return addr in FROM’s context

+
+ +

 

+ +

在接下来的7条汇编指令完成了保存前一个进程的其他7个寄存器到context中的相应成员变量中。至此前一个进程的执行现场保存完毕。再往后是恢复向一个进程的执行现场,这其实就是上述保存过程的逆执行过程,即从context的高地址的成员变量ebp开始,逐一把相关成员变量的值赋值给对应的寄存器,倒数第二条汇编指令“pushl 0(%eax)”其实把context中保存的下一个进程要执行的指令地址context.eip放到了堆栈顶,这样接下来执行最后一条指令“ret”时,会把栈顶的内容赋值给EIP寄存器,这样就切换到下一个进程执行了,即当前进程已经是下一个进程了。

+ +

ucore会执行进程切换,让initproc执行。在对initproc进行初始化时,设置了initproc->context.eip = (uintptr_t)forkret,这样,当执行switch_to函数并返回后,initproc将执行其实际上的执行入口地址forkret。而forkret会调用位于kern/trap/trapentry.S中的forkrets函数执行,具体代码如下:

+ + + + + +
+

.globl __trapret
+ __trapret:
+
    # restore registers from stack
+
    popal
+
    # restore %ds and %es
+
    popl %es
+
    popl %ds
+
    # get rid of the trap number and error code
+
    addl $0x8, %esp
+
    iret
+ .globl
 forkrets
+ forkrets:
+
    # set stack to this new process's trapframe
+
    movl 4(%esp), %esp       //esp指向当前进程的中断帧
+
    jmp __trapret

+
+ +

可以看出,forkrets函数首先把esp指向当前进程的中断帧,从_trapret开始执行到iret前,esp指向了current->tf.tf_eip,而如果此时执行的是initproc,则current->tf.tf_eip= +kernel_thread_entryinitproc->tf.tf_cs = KERNEL_CS,所以当执行完iret后,就开始在内核中执行kernel_thread_entry函数了,而initproc->tf.tf_regs.reg_ebx = init_main,所以在kernl_thread_entry中执行“call +%ebx”后,就开始执行initproc的主体了。Initprocde的主体函数很简单就是输出一段字符串,然后就返回到kernel_tread_entry函数,并进一步调用do_exit执行退出操作了。本来do_exit应该完成一些资源回收工作等,但这些不是实验四涉及的,而是由后续的实验来完成。至此,实验四中的主要工作描述完毕。

+ +

实验报告要求

+ +

从网站上下载lab4.zip后,解压得到本文档和代码目录 lab4,完成实验中的各个练习。完成代码编写并检查无误后,在对应目录下执行 make handin 任务,即会自动生成 +lab4-handin.tar.gz。最后请一定提前或按时提交到网络学堂上。

+ +

注意有“LAB4”的注释,代码中所有需要完成的地方(challenge除外)都有“LAB4”“YOUR CODE”的注释,请在提交时特别注意保持注释,并将“YOUR +CODE”替换为自己的学号,并且将所有标有对应注释的部分填上正确的代码。

+ +

 

+ +

附录A:实验四的参考输出如下:

+ + + + + +
+

make qemu
+ (THU.CST) os is loading ...
+
+ Special kernel symbols:
+
 entry  0xc010002c + (phys)
+
 etext  0xc010d0f7 + (phys)
+
 edata  0xc012dad0 + (phys)
+
 end    0xc0130e78 (phys)
+ Kernel executable memory footprint: 196KB
+ memory management: default_pmm_manager
+ e820map:
+
 memory: 0009f400, [00000000, 0009f3ff], + type = 1.
+
 memory: 00000c00, [0009f400, 0009ffff], + type = 2.
+
 memory: 00010000, [000f0000, 000fffff], + type = 2.
+
 memory: 07efd000, [00100000, 07ffcfff], + type = 1.
+
 memory: 00003000, [07ffd000, 07ffffff], + type = 2.
+
 memory: 00040000, [fffc0000, ffffffff], + type = 2.
+ check_alloc_page() succeeded!
+ check_pgdir() succeeded!
+ check_boot_pgdir() succeeded!
+ -------------------- BEGIN --------------------
+ PDE(0e0) c0000000-f8000000 38000000 urw
+
 |-- PTE(38000) c0000000-f8000000 + 38000000 -rw
+ PDE(001) fac00000-fb000000 00400000 -rw
+
 |-- PTE(000e0) faf00000-fafe0000 + 000e0000 urw
+
 |-- PTE(00001) fafeb000-fafec000 + 00001000 -rw
+ --------------------- END ---------------------
+ check_slab() succeeded!
+ kmalloc_init() succeeded!
+ check_vma_struct() succeeded!
+ page fault at 0x00000100: K/W [no page found].
+ check_pgfault() succeeded!
+ check_vmm() succeeded.
+ ide 0:
     10000(sectors), 'QEMU HARDDISK'.
+ ide 1:
    + 262144(sectors), 'QEMU HARDDISK'.
+ SWAP: manager = fifo swap manager
+ BEGIN check_swap: count 1, total 31944
+
 mm->sm_priv c0130e64 in fifo_init_mm
+ setup Page Table for vaddr 0X1000, so alloc a page
+ setup Page Table vaddr 0~4MB OVER!
+ set up init env for check_swap begin!
+ page fault at 0x00001000: K/W [no page found].
+ page fault at 0x00002000: K/W [no page found].
+ page fault at 0x00003000: K/W [no page found].
+ page fault at 0x00004000: K/W [no page found].
+ set up init env for check_swap over!
+ write Virt Page c in fifo_check_swap
+ write Virt Page a in fifo_check_swap
+ write Virt Page d in fifo_check_swap
+ write Virt Page b in fifo_check_swap
+ write Virt Page e in fifo_check_swap
+ page fault at 0x00005000: K/W [no page found].
+ swap_out: i 0, store page in vaddr 0x1000 to disk swap entry 2
+ write Virt Page b in fifo_check_swap
+ write Virt Page a in fifo_check_swap
+ page fault at 0x00001000: K/W [no page found].
+ swap_out: i 0, store page in vaddr 0x2000 to disk swap entry 3
+ swap_in: load disk swap entry 2 with swap_page in vadr 0x1000
+ write Virt Page b in fifo_check_swap
+ page fault at 0x00002000: K/W [no page found].
+ swap_out: i 0, store page in vaddr 0x3000 to disk swap entry 4
+ swap_in: load disk swap entry 3 with swap_page in vadr 0x2000
+ write Virt Page c in fifo_check_swap
+ page fault at 0x00003000: K/W [no page found].
+ swap_out: i 0, store page in vaddr 0x4000 to disk swap entry 5
+ swap_in: load disk swap entry 4 with swap_page in vadr 0x3000
+ write Virt Page d in fifo_check_swap
+ page fault at 0x00004000: K/W [no page found].
+ swap_out: i 0, store page in vaddr 0x5000 to disk swap entry 6
+ swap_in: load disk swap entry 5 with swap_page in vadr 0x4000
+ check_swap() succeeded!
+ ++ setup timer interrupts
+ this initproc, pid = 1, name = "init"
+ To U: "Hello world!!".
+ To U: "en.., Bye, Bye. :)"
+ kernel panic at kern/process/proc.c:316:
+
   process + exit!!.
+
+ Welcome to the kernel debug monitor!!
+ Type 'help' for a list of commands.
+ K>

+
+ +

附录B 【原理】进程的属性与特征解析

+ +

操作系统负责进程管理,即从程序加载到运行结束的全过程,这个程序运行过程将经历从出生死亡的完整生命历程。所谓进程就是指这个程序运行的整个执行过程。为了记录、描述和管理程序执行的动态变化过程,需要有一个数据结构,这就是进程控制块。进程与进程控制块是一一对应的。为此,ucore需要建立合适的进程控制块数据结构,并基于进程控制块来完成对进程的管理。

+ +

为了让多个程序能够使用CPU执行任务,需要设计用于进程管理的内核数据结构进程控制块。但到底如何设计进程控制块,如何管理进程?如果对进程的属性和特征了解不够,则无法有效地设计进程控制块和实现进程管理。

+ +

再一次回到进程的定义:一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。这里有四个关键词:程序、数据集合、执行和动态执行过程。从CPU的角度来看,所谓程序就是一段特定的指令机器码序列而已。CPU会一条一条地取出在内存中程序的指令并按照指令的含义执行各种功能;所谓数据集合就是使用的内存;所谓执行就是让CPU工作。这个数据集合和执行其实体现了进程对资源的占用。动态执行过程体现了程序执行的不同生命阶段:诞生、工作、休息/等待、死亡。如果这一段指令执行完毕,也就意味着进程结束了。从开始执行到执行结束是一个进程的全过程。那么操作系统需要管理进程的什么?如果计算机系统中只有一个进程,那操作系统的工作就简单了。进程管理就是管理进程执行的指令,进程占用的资源,进程执行的状态。这可归结为对一个进程内的管理工作。但实际上在计算机系统的内存中,可以放很多程序,这也就意味着操作系统需要管理多个进程,那么,为了协调各进程对系统资源的使用,进程管理还需要做一些与进程协调有关的其他管理工作,包括进程调度、进程间的数据共享、进程间执行的同步互斥关系(后续相关实验涉及)等。下面逐一进行解析。

+ +

1.      +资源管理

+ +

在计算机系统中,进程会占用内存和CPU,这都是有限的资源,如果不进行合理的管理,资源会耗尽或无法高效公平地使用,从而会导致计算机系统中的多个进程执行效率很低,甚至由于资源不够而无法正常执行。

+ +

对于用户进程而言,操作系统是它的上帝,操作系统给了用户进程可以运行所需的资源,最基本的资源就是内存和CPU。在实验二/三中涉及的内存管理方法和机制可直接应用到进程的内存资源管理中来。在有多个进程存在的情况下,对于CPU这种资源,则需要通过进程调度来合理选择一个进程,并进一步通过进程分派和进程切换让不同的进程分时复用CPU,执行各自的工作。对于无法剥夺的共享资源,如果资源管理不当,多个进程会出现死锁或饥饿现象。

+ +

2.      +进程状态管理

+ +

用户进程有不同的状态(可理解为生命的不同阶段),当操作系统把程序的放到内存中后,这个进程就诞生了,不过还没有开始执行,但已经消耗了内存资源,处于创建状态;当进程准备好各种资源,就等能够使用CPU时,进程处于就绪状态;当进程终于占用CPU,程序的指令被CPU一条一条执行的时候,这个进程就进入了运行状态,这时除了继续占用内存资源外,还占用了CPU资源;当进程由于等待某个资源而无法继续执行时,进程可放弃CPU使用,即释放CPU资源,进入等待状态;当程序指令执行完毕,由操作系统回收进程所占用的资源时,进程进入了死亡状态。

+ +

这些进程状态的转换时机需要操作系统管理起来,而且进程的创建和清除等服务必须由操作系统提供,而且在运行就绪”/“等待状态之间的转换,涉及到保存和恢复进程的执行现场,也就是进程上下文,这是确保进程即使断断续续地执行,也能正确完成工作的必要保证。

+ +

3.       进程与线程

+ +

一个进程拥有一个存放程序和数据的的虚拟地址空间以及其他资源。一个进程基于程序的指令流执行,其执行过程可能与其它进程的执行过程交替进行。因此,一个具有执行状态(运行态、就绪态等)的进程是一个被操作系统分配资源(比如分配内存)并调度(比如分时使用CPU)的单位。在大多数操作系统中,这两个特点是进程的主要本质特征。但这两个特征相对独立,操作系统可以把这两个特征分别进行管理。

+ +

这样可以把拥有资源所有权的单位通常仍称作进程,对资源的管理成为进程管理;把指令执行流的单位称为线程,对线程的管理就是线程调度和线程分派。对属于同一进程的所有线程而言,这些线程共享进程的虚拟地址空间和其他资源,但每个线程都有一个独立的栈,还有独立的线程运行上下文,用于包含表示线程执行现场的寄存器值等信息。

+ +

在多线程环境中,进程被定义成资源分配与保护的单位,与进程相关联的信息主要有存放进程映像的虚拟地址空间等。在一个进程中,可能有一个或多个线程,每个线程有线程执行状态(运行、就绪、等待等),保存上次运行时的线程上下文、线程的执行栈等。考虑到CPU有不同的特权模式,参照进程的分类,线程又可进一步细化为用户线程和内核线程。

+ +

到目前为止,我们就可以明确用户进程、内核进程(可把ucore看成一个内核进程)、用户线程、内核线程的区别了。从本质上看,线程就是一个特殊的不用拥有资源的轻量级进程,在ucore的调度和执行管理中,并没有区分线程和进程。且由于ucore内核中的所有内核线程共享一个内核地址空间和其他资源,所以这些内核线程从属于同一个唯一的内核进程,即ucore内核本身。理解了进程或线程的上述属性和特征,就可以进行进程/线程管理的设计与实现了。但是为了叙述上的简便,以下用户态的进程/线程统称为用户进程。

+ +
+ + + + diff --git a/lab5.files/image001.png b/lab5.files/image001.png new file mode 100644 index 0000000000000000000000000000000000000000..7d1fedbe328520185b067542104c321e51a5452c GIT binary patch literal 27351 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

KWde=VI--(jnD6=&r85{cd|`olbi$NhHu8gNU! ze_+$OK;-6Jt@q4Xcsxa2o8%YAzVGpe?h+QZ7D*Rz1S8Ha&8)mKPT=S{m}fup=?8-L z0PSHH)rwM~als$-KL=us_6=tjfzCd8qJ({t0O|ISjjb(WW0Me>&>h2+i>oR?#$GGq z)Uzxdu9Z#1&+i|Xm#B*ch%ror+ki4>Bx6ODs6LYVU16YnU?;X_g^D%P zGfLCd%V;{=b{rgQv?bXUOa3~cs>>1EnW3T2CBYmaWoDnHPo5t#*E#2&yvO(YeO85_ zR0Wh6eeWsO&r=L@lV20=7Gj7QdM}Sq#4&i z>GaD9RC#ACX-}-a6;(BoSK%zlE%yf-?g_?4^1IDQt$6o0iISHY0yJBKehrX9nJCwP zva`AJ+n(dTes9$KjrXC3x;L);BSYA2vA@%hALrXkg#^a*yPGa9m`k3`#xvwNYM10>eG0LcnWDEXi8Wj!o*;)FBp=vwn zW^U;39KjjCj#Nr~0z$t%W2>)In}2R)V11izf{}7ARpb0Bp#67~t;%Mrz9d%ohRvLP zRKS + + + + + + + + + + +

+ +

实验五:用户进程管理

+ +

1 实验目

+ +

l  了解第一个用户进程创建过程

+ +

l  了解系统调用框架的实现机制

+ +

l  了解ucore如何实现系统调用sys_fork/sys_exec/sys_exit/sys_wait来进行进程管理

+ +

实验内容

+ +

实验4完成了内核线程,但到目前为止,所有的运行都在内核态执行。实验5将创建用户进程,让用户进程在用户态执行,且在需要ucore支持时,可通过系统调用来让ucore提供服务。为此需要构造出第一个用户进程,并通过系统调用sys_fork/sys_exec/sys_exit/sys_wait来支持运行不同的应用程序,完成对用户进程的执行过程的基本管理。相关原理介绍可看附录B

+ +

2.1 练习

+ +

练习0:填写已有实验

+ +

本实验依赖实验1/2/3/4。请把你做的实验1/2/3/4的代码填入本实验中代码中有“LAB1”/“LAB2”/“LAB3”/“LAB4”的注释相应部分。注意:为了能够正确执行lab5的测试应用程序,可能需对已完成的实验1/2/3/4的代码进行进一步改进。

+ +

练习1 加载应用程序并执行(需要编码)

+ +

do_execv函数调用load_icode(位于kern/process/proc.c)来加载并解析一个处于内存中的ELF执行文件格式的应用程序,建立相应的用户内存空间来放置应用程序的代码段、数据段等,且要设置好proc_struct结构中的成员变量trapframe中的内容,确保在执行此进程后,能够从应用程序设定的起始执行地址开始执行。需设置正确的trapframe内容。

+ +

练习2 父进程复制自己的内存空间给子进程(需要编码)

+ +

创建子进程的函数do_fork在执行中将拷贝当前进程(即父进程)的用户内存地址空间中的合法内容到新进程中(子进程),完成内存资源的复制。具体是通过copy_range函数(位于kern/mm/pmm.c实现的,请补充copy_range的实现,确保能够正确执行。

+ +

练习3 阅读分析源代码,理解进程执行fork/exec/wait/exit的实现,以及系统调用的实现(不需要编码)

+ +

执行:make grade 如果所显示的应用程序检测都输出ok,则基本正确。(使用的是qemu-1.0.1

+ +

扩展练习Challenge:实现Copy on Write机制

+ +

个扩展练习涉及到本实验和上一个实验“虚拟内存管理”。Copy-on-write(简称COW)的基本概念是如果有多个使用对一个资源A(比如内存块)进行读操作,则每个使用者只需获得一个指向同一个资源A的指针,就可以该资源若某使用者需要对这个资源A进行写操作,系统会对该资源进行拷贝操作,从而使得该“写操作”使用者获得一个该资源A私有拷贝资源B可对资源B进行写操作。该“写操作”使用者对资源B的改变对于其他的使用而言是不可见的,因为其他使用者看到的还是资源A

+ +

ucore操作系统中,当一个用户父进程创建自己的进程时,父进程会把其申请的用户空间设置为只读,子进程可共享父进程占用的用户内存空间中的页面(这就是一个共享的资源)。当其中任何一个进程修改此用户内存空间中的页面时,ucore会通过page fault异常获知该操作,并完成拷贝内存页面,使得两个进程都有各自的内存页面。这样一个进程所做的修改不会被另外一个进程可见请在ucore中实现这样的COW机制。

+ +

 

+ +

2.2 项目组成

+ + + + + +
+

.

+

├── boot

+

├── kern

+

   ├── debug

+

      ├── kdebug.c

+

      └── ……

+

   ├── mm

+

      ├── memlayout.h

+

      ├── pmm.c

+

      ├── pmm.h

+

      ├── ......

+

      ├── vmm.c

+

      └── vmm.h

+

   ├── process

+

      ├── proc.c

+

      ├── proc.h

+

      └── ......

+

   ├── schedule

+

      ├── sched.c

+

      └── ......

+

   ├── sync

+

      └── sync.h

+

   ├── syscall

+

      ├── syscall.c

+

      └── syscall.h

+

   └── trap

+

       ├── trap.c

+

       ├── trapentry.S

+

       ├── trap.h

+

       └── vectors.S

+

├── libs

+

   ├── elf.h

+

   ├── error.h

+

   ├── printfmt.c

+

   ├── unistd.h

+

   └── ......

+

├── tools

+

   ├── user.ld

+

   └── ......

+

└── user

+

    + ├── hello.c

+

    + ├── libs

+

    + │   ├── initcode.S

+

    + │   ├── syscall.c

+

    + │   ├── syscall.h

+

    │   └── ......

+

    └── + ......

+
+ +

    相对与实验四,实验五主要增加的文件如上表红色部分所示,主要修改的文件如上表紫色部分所示。主要改动如下:

+ +

       +kern/debug/

+ +

kdebug.c:修改:解析用户进程的符号信息表示(可不用理会)

+ +

       +kern/mm/   (与本次实验有较大关系)

+ +

memlayout.h修改:增加了用户虚存地址空间的图形表示和宏定义  +(需仔细理解)。

+ +

pmm.[ch]:修改:添加了用于进程退出(do_exit)的内存资源回收的page_remove_pteunmap_rangeexit_range函数和用于创建子进程(do_fork)中拷贝父进程内存空间的copy_range函数,修改了pgdir_alloc_page函数

+ +

       vmm.[ch]:修改:扩展了mm_struct数据结构,增加了一系列函数

+ +

      +mm_map/dup_mmap/exit_mmap:设定/取消/复制/删除用户进程的合法内存空间

+ +

      +copy_from_user/copy_to_user:用户内存空间内容与内核内存空间内容的相互拷贝的实现

+ +

      +user_mem_check:搜索vma链表,检查是否是一个合法的用户空间范围

+ +

       +kern/process/ (与本次实验有较大关系)

+ +

       proc.[ch]修改:扩展了proc_struct数据结构增加或修改了一系列函数

+ +

      +setup_pgdir/put_pgdir:创建并设置/释放页目录表

+ +

      +copy_mm:复制用户进程的内存空间和设置相关内存管理(如页表等)信息

+ +

      +do_exit:释放进程自身所占内存空间和相关内存管理(如页表等)信息所占空间,唤醒父进程,好让父进程收了自己,让调度器切换到其他进程

+ +

      +load_icode:被do_execve调用,完成加载放在内存中的执行程序到进程空间,这涉及到对页表等的修改,分配用户栈

+ +

      +do_execve:先回收自身所占用户空间,然后调用load_icode,用新的程序覆盖内存空间,形成一个执行新程序的新进程

+ +

      +do_yield:让调度器执行一次选择新进程的过程

+ +

      +do_wait:父进程等待子进程,并在得到子进程的退出消息后,彻底回收子进程所占的资源(比如子进程的内核栈和进程控制块)

+ +

      +do_kill:给一个进程设置PF_EXITING标志(“kill”信息,即要它死掉),这样在trap函数中,将根据此标志,让进程退出

+ +

      +KERNEL_EXECVE/__KERNEL_EXECVE/__KERNEL_EXECVE2:被user_main调用,执行一用户进程

+ +

       +kern/trap/ 

+ +

       trap.c:修改:idt_init函数中,对IDT初始化时,设置好了用于系统调用的中断门(idt[T_SYSCALL])信息。这主要与syscall的实现相关

+ +

       +user/*

+ +

     新增的用户程序和用户库

+ +

3 用户进程管理

+ +

3.1实验执行流程概述

+ +

实验四为止,ucore还一直在核心态打转,没有到用户态执行。提供各种操作系统功能的内核线程只能在CPU核心态运行是操作系统自身的要求,操作系统就要呆在核心态,才能管理整个计算机系统。但应用程序员也需要编写各种应用软件,且要在计算机系统上运行。如果把这些应用软件都作为内核线程来执行,那系统的安全性就无法得到保证了。所以,ucore要提供用户态进程的创建和执行机制,给应用程序执行提供一个用户态运行环境。接下来我们就简要分析本实验的执行过程,以及分析用户进程的整个生命周期来阐述用户进程管理的设计与实现。

+ +

  显然,由于进程的执行空间扩展到了用户态空间,且出现了创建子进程执行应用程序等与lab4有较大不同的地方,所以具体实现的不同主要集中在进程管理和内存管理部分。首先,我们从ucore的初始化部分来看,会发现初始化的总控函数kern_init没有任何变化。但这并不意味着lab4lab5差别不大。其实kern_init调用的物理内存初始化,进程管理初始化等都有一定的变化。

+ +

在内存管理部分,与lab4最大的区别就是增加用户态虚拟内存的管理。为了管理用户态的虚拟内存,需要对页表的内容进行扩展,能够把部分物理内存映射为用户态虚拟内存。如果某进程执行过程中,CPU在用户态下执行(在CS段寄存器最低两位包含有一个2位的优先级域,如果为0,表示CPU运行在特权态;如果为3,表示CPU运行在用户态。),则可以访问本进程页表描述的用户态虚拟内存,但由于权限不够,不能访问内核态虚拟内存。另一方面,不同的进程有各自的页表,所以即使不同进程的用户态虚拟地址相同,但由于页表把虚拟页映射到了不同的物理页帧,所以不同进程的虚拟内存空间是被隔离开的,相互之间无法直接访问。在用户态内存空间和内核态内核空间之间需要拷贝数据,让CPU处在内核态才能完成对用户空间的读或写,为此需要设计专门的拷贝函数(copy_from_usercopy_to_user)完成。但反之则会导致违反CPU的权限管理,导致内存访问异常。

+ +

在进程管理方面,主要涉及到的是进程控制块中与内存管理相关的部分,包括建立进程的页表和维护进程可访问空间(可能还没有建立虚实映射关系)的信息;加载一个ELF格式的程序到进程控制块管理的内存中的方法;在进程复制(fork)过程中,把父进程的内存空间拷贝到子进程内存空间的技术。另外一部分与用户态进程生命周期管理相关,包括让进程放弃CPU而睡眠等待某事件;让父进程等待子进程结束;一个进程杀死另一个进程;给进程发消息;建立进程的血缘关系链表。

+ +

当实现了上述内存管理和进程管理的需求后,接下来ucore的用户进程管理工作就比较简单了。首先,“硬”构造出第一个进程(lab4中已有描述),它是后续所有进程的祖先;然后,在proc_init函数中,通过alloc把当前ucore的执行环境转变成idle内核线程的执行现场;然后调用kernl_thread来创建第二个内核线程init_main,而init_main内核线程有创建了user_main内核线程.。到此,内核线程创建完毕,应该开始用户进程的创建过程,这第一步实际上是通过user_main函数调用kernel_tread创建子进程,通过kernel_execve调用来把某一具体程序的执行内容放入内存。具体的放置方式是根据ld在此文件上的地址分配为基本原则,把程序的不同部分放到某进程的用户空间中,从而通过此进程来完成程序描述的任务。一旦执行了这一程序对应的进程,就会从内核态切换到用户态继续执行。以此类推,CPU在用户空间执行的用户进程,其地址空间不会被其他用户的进程影响,但由于系统调用(用户进程直接获得操作系统服务的唯一通道)、外设中断和异常中断的会随时产生,从而间接推动了用户进程实现用户态到到内核态的切换工作。ucoreCPU内核态与用户态的切换过程需要比较仔细地分析(这其实是实验一的扩展练习)。当进程执行结束后,需回收进程占用和没消耗完毕的设备整个过程,且为新的创建进程请求提供服务。在本实验中,当系统中存在多个进程或内核线程时, +ucore采用了一种FIFO的很简单的调度方法来管理每个进程占用CPU的时间和频度等。在ucore运行过程中,由于调度、时间中断、系统调用等原因,使得进程会进行切换、创建、睡眠、等待、发消息等各种不同的操作,周而复始,生生不息。

+ +

 

+ +

3.2创建用户进程

+ +

在实验四中,我们已经完成了对内核线程的创建,但与用户进程的创建过程相比,创建内核线程的过程还远远不够。而这两个创建过程的差异本质上就是用户进程和内核线程的差异决定的。

+ +

1.      +应用程序的组成和编译

+ +

我们首先来看一个应用程序,这里我们假定是hello应用程序,在user/hello.c中实现,代码如下:

+ + + + + +
+

#include <stdio.h>
+
#include <ulib.h>
+
+
int
+
main(void) {
+
    cprintf("Hello world!!.\n");
+
    cprintf("I am process %d.\n", getpid());
+
    cprintf("hello pass.\n");
+
    return 0;
+
}

+
+ +

 hello应用程序只是输出一些字符串,并通过系统调用sys_getpid(在getpid函数中调用)输出代表hello应用程序执行的用户进程的进程标识--pid

+ +

首先,我们需要了解ucore操作系统如何能够找到hello应用程序。这需要分析ucorehello是如何编译的。修改Makefile,把第六行注释掉。然后在本实验源码目录下执行make,可得到如下输出:

+ +
+ + + + + +
+

……

+

+ cc user/hello.c

+

 

+

gcc -Iuser/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc  + -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/hello.c -o + obj/user/hello.o

+

 

+

ld -m    elf_i386 -nostdlib -T tools/user.ld -o + obj/__user_hello.out  obj/user/libs/initcode.o obj/user/libs/panic.o + obj/user/libs/stdio.o obj/user/libs/syscall.o obj/user/libs/ulib.o + obj/user/libs/umain.o  obj/libs/hash.o obj/libs/printfmt.o obj/libs/rand.o + obj/libs/string.o obj/user/hello.o

+

……

+

ld -m    elf_i386 -nostdlib -T tools/kernel.ld -o bin/kernel  + obj/kern/init/entry.o obj/kern/init/init.o …… -b binary …… + obj/__user_hello.out

+

……

+
+ +
+ +

从中可以看出,hello应用程序不仅仅是hello.c,还包含了支持hello应用程序的用户态库:

+ +

l  +user/libs/initcode.S:所有应用程序的起始用户态执行地址“_start”,调整了EBPESP后,调用umain函数。

+ +

l  +user/libs/umain.c:实现了umain函数,这是所有应用程序执行的第一个C函数,它将调用应用程序的main函数,并在main函数结束后调用exit函数,而exit函数最终将调用sys_exit系统调用,让操作系统回收进程资源。

+ +

l  +user/libs/ulib.[ch]:实现了最小的C函数库,除了一些与系统调用无关的函数,其他函数是对访问系统调用的包装。

+ +

l  +user/libs/syscall.[ch]:用户层发出系统调用的具体实现。

+ +

l  +user/libs/stdio.c:实现cprintf函数,通过系统调用sys_putc来完成字符输出。

+ +

l  +user/libs/panic.c:实现__panic/__warn函数,通过系统调用sys_exit完成用户进程退出。

+ +

除了这些用户态库函数实现外,还有一些libs/*.[ch]是操作系统内核和应用程序共用的函数实现。这些用户库函数其实在本质上与UNIX系统中的标准libc没有区别,只是实现得很简单,但hello应用程序的正确执行离不开这些库函数。

+ +

【注意】libs/*.[ch]user/libs/*.[ch]user/*.[ch]的源码中没有任何特权指令。

+ +

make的最后一步执行了一个ld命令,把hello应用程序的执行码obj/__user_hello.out连接在了ucore +kernel的末尾。且ld命令会在kernel中会把__user_hello.out的位置和大小记录在全局变量_binary_obj___user_hello_out_start_binary_obj___user_hello_out_size中,这样这个hello用户程序就能够和ucore内核一起被 bootloader 加载到内存里中,并且通过这两个全局变量定位hello用户程序执行码的起始位置和大小。而到了与文件系统相关的实验后,ucore会提供一个简单的文件系统,那时所有的用户程序就都不再用这种方法进行加载了,而可以用大家熟悉的文件方式进行加载了。

+ +

2.      +用户进程的虚拟地址空间

+ +

tools/user.ld描述了用户程序的用户虚拟空间的执行入口虚拟地址:

+ + + + + +
+

SECTIONS {

+

    /* Load + programs at this address: "." means the current address */

+

    . = + 0x800020;

+
+ +

tools/kernel.ld描述了操作系统的内核虚拟空间的起始入口虚拟地址:

+ + + + + +
+

SECTIONS {

+

    /* Load + the kernel at this address: "." means the current address */

+

    . = + 0xC0100000;

+
+ +

这样ucore把用户进程的虚拟地址空间分了两块,一块与内核线程一样,是所有用户进程都共享的内核虚拟地址空间,映射到同样的物理内存空间中,这样在物理内存中只需放置一份内核代码,使得用户进程从用户态进入核心态时,内核代码可以统一应对不同的内核程序;另外一块是用户虚拟地址空间,虽然虚拟地址范围一样,但映射到不同且没有交集的物理内存空间中。这样当ucore把用户进程的执行代码(即应用程序的执行代码)和数据(即应用程序的全局变量等)放到用户虚拟地址空间中时,确保了各个进程不会非法访问到其他进程的物理内存空间。

+ +

这样ucore给一个用户进程具体设定的虚拟内存空间(kern/mm/memlayout.h)如下所示:

+ +

                                                                  

+ +

+ +

3.      +创建并执行用户进程

+ +

   在确定了用户进程的执行代码和数据,以及用户进程的虚拟空间布局后,我们可以来创建用户进程了。在本实验中第一个用户进程是由第二个内核线程initproc通过把hello应用程序执行码覆盖到initproc的用户虚拟内存空间来创建的,相关代码如下所示:

+ + + + + +
+

// kernel_execve - do SYS_exec syscall to exec a user program called by user_main kernel_thread
+
static int
+
kernel_execve(const char *name, unsigned char *binary, size_t size) {
+
    int ret, len = strlen(name);
+
    asm volatile (
+
        "int %1;"
+
        : "=a" (ret)
+
        : "i" (T_SYSCALL), "0" (SYS_exec), "d" (name), "c" (len), "b" (binary), "D" (size)
+
        : "memory");
+
    return ret;
+
}
+
+
#define
 __KERNEL_EXECVE(name, binary, size) ({                          \
+
            cprintf("kernel_execve: pid = %d, name = \"%s\".\n",        \
+
                    current->pid, name);                                \
+
            kernel_execve(name, binary, (size_t)(size));                \
+
        })
+
+
#define KERNEL_EXECVE(x) ({                                             \
+
            extern unsigned char _binary_obj___user_##x##_out_start[],  \
+
                _binary_obj___user_##x##_out_size[];                    \
+
            __KERNEL_EXECVE(#x, _binary_obj___user_##x##_out_start,     \
+
                            _binary_obj___user_##x##_out_size);         \
+
        })
+ ……
+
// init_main - the second kernel thread used to create kswapd_main & user_main kernel threads
+
static int
+
init_main(void *arg) {
+
#ifdef TEST
+
    KERNEL_EXECVE2(TEST, TESTSTART, TESTSIZE);
+
#else
+
    KERNEL_EXECVE(hello);
+
#endif
+
    panic("kernel_execve failed.\n");
+
    return 0;
+
}

+
+ +

对于上述代码,我们需要从后向前按照函数/宏的实现一个一个来分析。Initproc的执行主体是init_main函数,这个函数在缺省情况下是执行宏KERNEL_EXECVE(hello),而这个宏最终是调用kernel_execve函数来调用SYS_exec系统调用,由于ld在链接hello应用程序执行码时定义了两全局变量:

+ +

l  +_binary_obj___user_hello_out_starthello执行码的起始位置

+ +

l  +_binary_obj___user_hello_out_size中:hello执行码的大小

+ +

kernel_execve把这两个变量作为SYS_exec系统调用的参数,让ucore来创建此用户进程。当ucore收到此系统调用后,将依次调用如下函数

+ +

vector128(vectors.S)--> +__alltraps(trapentry.S)-->trap(trap.c)-->trap_dispatch(trap.c)--

+ +

-->syscall(syscall.c)-->sys_execsyscall.c-->do_execve(proc.c)

+ +

最终通过do_execve函数来完成用户进程的创建工作。此函数的主要工作流程如下:

+ +

l  +首先为加载新的执行码做好用户态内存空间清空准备。如果mm不为NULL,则设置页表为内核空间页表,且进一步判断mm的引用计数减1后是否为0,如果为0,则表明没有进程再需要此进程所占用的内存空间,为此将根据mm中的记录,释放进程所占用户空间内存和进程页表本身所占空间。最后把当前进程的mm内存管理指针为空。由于此处的initproc是内核线程,所以mmNULL,整个处理都不会做。

+ +

l  +接下来的一步是加载应用程序执行码到当前进程的新创建的用户态虚拟空间中。这里涉及到读ELF格式的文件,申请内存空间,建立用户态虚存空间,加载应用程序执行码等。load_icode函数完成了整个复杂的工作。

+ +

load_icode函数的主要工作就是给用户进程建立一个能够让用户进程正常运行的用户环境。此函数有一百多行,完成了如下重要工作:

+ +

1.   +调用mm_create函数来申请进程的内存管理数据结构mm所需内存空间,并对mm进行初始化;

+ +

2.   +调用setup_pgdir来申请一个页目录表所需的一个页大小的内存空间,并把描述ucore内核虚空间映射的内核页表(boot_pgdir所指)的内容拷贝到此新目录表中,最后让mm->pgdir指向此页目录表,这就是进程新的页目录表了,且能够正确映射内核虚空间;

+ +

3.   +根据应用程序执行码的起始位置来解析此ELF格式的执行程序,并调用mm_map函数根据ELF格式的执行程序说明的各个段(代码段、数据段、BSS段等)的起始位置和大小建立对应的vma结构,并把vma插入到mm结构中,从而表明了用户进程的合法用户态虚拟地址空间;

+ +

4.   +调用根据执行程序各个段的大小分配物理内存空间,并根据执行程序各个段的起始位置确定虚拟地址,并在页表中建立好物理地址和虚拟地址的映射关系,然后把执行程序各个段的内容拷贝到相应的内核虚拟地址中,至此应用程序执行码和数据已经根据编译时设定地址放置到虚拟内存中了;

+ +

5.   +需要给用户进程设置用户栈,为此调用mm_mmap函数建立用户栈的vma结构,明确用户栈的位置在用户虚空间的顶端,大小为256个页,即1MB,并分配一定数量的物理内存且建立好栈的虚地址<-->物理地址映射关系;

+ +

6.   +至此,进程内的内存管理vmamm数据结构已经建立完成,于是把mm->pgdir赋值到cr3寄存器中,即更新了用户进程的虚拟内存空间,此时的initproc已经被hello的代码和数据覆盖,成为了第一个用户进程,但此时这个用户进程的执行现场还没建立好;

+ +

7.   +先清空进程的中断帧,再重新设置进程的中断帧,使得在执行中断返回指令“iret”后,能够让CPU转到用户态特权级,并回到用户态内存空间,使用用户态的代码段、数据段和堆栈,且能够跳转到用户进程的第一条指令执行,并确保在用户态能够响应中断;

+ +

 

+ +

至此,用户进程的用户环境已经搭建完毕。此时initproc将按产生系统调用的函数调用路径原路返回,执行中断返回指令“iret”(位于trapentry.S的最后一句)后,将切换到用户进程hello的第一条语句位置_start处(位于user/libs/initcode.S的第三句)开始执行。

+ +

 

+ +

3.3 进程退出和等待进程

+ +

当进程执行完它的工作后,就需要执行退出操作,释放进程占用的资源。ucore分了两步来完成这个工作,首先由进程本身完成大部分资源的占用内存回收工作,然后由此进程的父进程完成剩余资源占用内存的回收工作。为何不让进程本身完成所有的资源回收工作呢?这是因为进程要执行回收操作,就表明此进程还存在,还在执行指令,这就需要内核栈的空间不能释放,且表示进程存在的进程控制块不能释放。所以需要父进程来帮忙释放子进程无法完成的这两个资源回收工作。

+ +

为此在用户态的函数库中提供了exit函数,此函数最终访问sys_exit系统调用接口让操作系统来帮助当前进程执行退出过程中的部分资源回收。我们来看看ucore是如何做进程退出工作的。

+ +

首先,exit函数会把一个退出码error_code传递给ucoreucore通过执行内核函数do_exit来完成对当前进程的退出处理,主要工作简单地说就是回收当前进程所占的大部分内存资源,并通知父进程完成最后的回收工作,具体流程如下:

+ +

1.   +如果current->mm != NULL,表示是用户进程,则开始回收此用户进程所占用的用户态虚拟内存空间;

+ +

a)   +首先执行“lcr3(boot_cr3)”,切换到内核态的页表上,这样当前用户进程目前只能在内核虚拟地址空间执行了,这是为了确保后续释放用户态内存和进程页表的工作能够正常执行;

+ +

b)   +如果当前进程控制块的成员变量mm的成员变量mm_count1后为0(表明这个mm没有再被其他进程共享,可以彻底释放进程所占的用户虚拟空间了。),则开始回收用户进程所占的内存资源:

+ +

              +i.      +调用exit_mmap函数释放current->mm->vma链表中每个vma描述的进程合法空间中实际分配的内存,然后把对应的页表项内容清空,最后还把页表所占用的空间释放并把对应的页目录表项清空;

+ +

            +ii.      +调用put_pgdir函数释放当前进程的页目录所占的内存;

+ +

           +iii.      +调用mm_destroy函数释放mm中的vma所占内存,最后释放mm所占内存;

+ +

c)   +此时设置current->mmNULL,表示与当前进程相关的用户虚拟内存空间和对应的内存管理成员变量所占的内核虚拟内存空间已经回收完毕;

+ +

2.   +这时,设置当前进程的执行状态current->state=PROC_ZOMBIE,当前进程的退出码current->exit_code=error_code。此时当前进程已经不能被调度了,需要此进程的父进程来做最后的回收工作(即回收描述此进程的内核栈和进程控制块);

+ +

3.   +如果当前进程的父进程current->parent处于等待子进程状态:

+ +

current->parent->wait_state==WT_CHILD

+ +

则唤醒父进程(即执行“wakup_proc(current->parent)”),让父进程帮助自己完成最后的资源回收;

+ +

4.   +如果当前进程还有子进程,则需要把这些子进程的父进程指针设置为内核线程initproc,且各个子进程指针需要插入到initproc的子进程链表中。如果某个子进程的执行状态是PROC_ZOMBIE,则需要唤醒initproc来完成对此子进程的最后回收工作。

+ +

5.   +执行schedule()函数,选择新的进程执行。

+ +

 

+ +

 那么父进程如何完成对子进程的最后回收工作呢?这要求父进程要执行wait用户函数或wait_pid用户函数,这两个函数的区别是,wait函数等待任意子进程的结束通知,而wait_pid函数等待进程id号为pid的子进程结束通知。这两个函数最终访问sys_wait系统调用接口让ucore来完成对子进程的最后回收工作,即回收子进程的内核栈和进程控制块所占内存空间,具体流程如下:

+ +

1.   +如果pid!=0,表示只找一个进程id号为pid的退出状态的子进程,否则找任意一个处于退出状态的子进程;

+ +

2.   +如果此子进程的执行状态不为PROC_ZOMBIE,表明此子进程还没有退出,则当前进程只好设置自己的执行状态为PROC_SLEEPING,睡眠原因为WT_CHILD(即等待子进程退出),调用schedule()函数选择新的进程执行,自己睡眠等待,如果被唤醒,则重复跳回步骤1处执行;

+ +

3.   +如果此子进程的执行状态为PROC_ZOMBIE,表明此子进程处于退出状态,需要当前进程(即子进程的父进程)完成对子进程的最终回收工作,即首先把子进程控制块从两个进程队列proc_listhash_list中删除,并释放子进程的内核堆栈和进程控制块。自此,子进程才彻底地结束了它的执行过程,消除了它所占用的所有资源。

+ +

 

+ +

3.4 系统调用实现

+ +

系统调用的英文名字是System Call。操作系统为什么需要实现系统调用呢?其实这是实现了用户进程后,自然引申出来需要实现的操作系统功能。用户进程只能在操作系统给它圈定好的用户环境中执行,但用户环境限制了用户进程能够执行的指令,即用户进程只能执行一般的指令,无法执行特权指令。如果用户进程想执行一些需要特权指令的任务,比如通过网卡发网络包等,只能让操作系统来代劳了。于是就需要一种机制来确保用户进程不能执行特权指令,但能够请操作系统帮忙完成需要特权指令的任务,这种机制就是系统调用。

+ +

采用系统调用机制为用户进程提供一个获得操作系统服务的统一接口层,这样一来可简化用户进程的实现,把一些共性的、繁琐的、与硬件相关、与特权指令相关的任务放到操作系统层来实现,但提供一个简洁的接口给用户进程调用;二来这层接口事先可规定好,且严格检查用户进程传递进来的参数和操作系统要返回的数据,使得让操作系统给用户进程服务的同时,保护操作系统不会被用户进程破坏。

+ +

从硬件层面上看,需要硬件能够支持在用户态的用户进程通过某种机制切换到内核态。试验一讲述中断硬件支持和软件处理过程其实就可以用来完成系统调用所需的软硬件支持。下面我们来看看如何在ucore中实现系统调用。

+ +

1.      +初始化系统调用对应的中断描述符

+ +

ucore初始化函数kern_init中调用了idt_init函数来初始化中断描述符表,并设置一个特定中断号的中断门,专门用于用户进程访问系统调用。此事由ide_init函数完成:

+ + + + + +
+

void
+
idt_init(void) {
+
    extern uintptr_t __vectors[];
+
    int i;
+
    for (i = 0; i < sizeof(idt) / sizeof(struct gatedesc); i ++) {
+
        SETGATE(idt[i], 1, GD_KTEXT, __vectors[i], DPL_KERNEL);
+
    }
+
    SETGATE(idt[T_SYSCALL], 1, GD_KTEXT, __vectors[T_SYSCALL], DPL_USER);
+
    lidt(&idt_pd);
+
}

+
+ +

在上述代码中,可以看到在执行加载中断描述符表lidt指令前,专门设置了一个特殊的中断描述符idt[T_SYSCALL],它的特权级设置为DPL_USER,中断向量处理地址在__vectors[T_SYSCALL]处。这样建立好这个中断描述符后,一旦用户进程执行 “INT T_SYSCALL”后,由于此中断允许用户态进程产生(注意它的特权级设置为DPL_USER),所以CPU就会从用户态切换到内核态,保存相关寄存器,并跳转到__vectors[T_SYSCALL]处开始执行,形成如下执行路径:

+ +

vector128(vectors.S)--> +__alltraps(trapentry.S)-->trap(trap.c)-->trap_dispatch(trap.c)---->syscall(syscall.c)-

+ +

syscall中,根据系统调用号来完成不同的系统调用服务。

+ +

2.      +建立系统调用的用户库准备

+ +

在操作系统中初始化好系统调用相关的中断描述符、中断处理起始地址等后,还需在用户态的应用程序中初始化好相关工作,简化应用程序访问系统调用的复杂性。为此在用户态建立了一个中间层,即简化的libc实现,在user/libs/ulib.[ch]user/libs/syscall.[ch]中完成了对访问系统调用的封装。用户态最终的访问系统调用函数是syscall,实现如下:

+ + + + + +
+

static inline int
+
syscall(int num, ...) {
+
    va_list ap;
+
    va_start(ap, num);
+
    uint32_t a[MAX_ARGS];
+
    int i, ret;
+
    for (i = 0; i < MAX_ARGS; i ++) {
+
        a[i] = va_arg(ap, uint32_t);
+
    }
+
    va_end(ap);
+
+
    asm volatile (
+
        "int %1;"
+
        : "=a" (ret)
+
        : "i" (T_SYSCALL),
+
          "a" (num),
+
          "d" (a[0]),
+
          "c" (a[1]),
+
          "b" (a[2]),
+
          "D" (a[3]),
+
          "S" (a[4])
+
        : "cc", "memory");
+
    return ret;
+
}

+
+ +

从中可以看出,应用程序调用的exit/fork/wait/getpid等库函数最终都会调用syscall函数,只是调用的参数不同而已,如果看最终的汇编代码会更清楚:

+ + + + + +
+

……

+

  34:    8b 55 d4               mov    -0x2c(%ebp),%edx

+

  37:    8b 4d d8               mov    -0x28(%ebp),%ecx

+

  3a:    8b 5d dc                mov    + -0x24(%ebp),%ebx

+

  3d:    8b 7d e0                mov    + -0x20(%ebp),%edi

+

  40:    8b 75 e4                mov    + -0x1c(%ebp),%esi

+

  43:    8b 45 08               mov    0x8(%ebp),%eax

+

  46:    cd 80                   int    $0x80

+

      48: 89 45 f0                mov    %eax,-0x10(%ebp)

+

……

+
+ +

可以看到其实是把系统调用号放到EAX,其他5个参数a[0]~a[4]分别保存到EDX/ECX/EBX/EDI/ESI五个寄存器中,及最多用6个寄存器来传递系统调用的参数,且系统调用的返回结果是EAX。比如对于getpid库函数而言,系统调用号(SYS_getpid=18)是保存在EAX中,返回值(调用此库函数的的当前进程号pid)也在EAX中。

+ +

3.      +与用户进程相关的系统调用

+ +

在本实验中,与进程相关的各个系统调用属性如下所示:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

系统调用名

+
+

含义

+
+

具体完成服务的函数

+
+

SYS_exit

+
+

process exit

+
+

do_exit

+
+

SYS_fork

+
+

create child + process, dup mm 

+
+

do_fork-->wakeup_proc

+
+

SYS_wait

+
+

wait child + process

+
+

do_wait

+
+

SYS_exec

+
+

after fork, + process execute a new program

+
+

load a + program and refresh the mm

+
+

SYS_yield

+
+

process flag + itself need resecheduling

+
+

proc->need_sched=1, + then scheduler will rescheule this process

+
+

SYS_kill

+
+

kill process

+
+

do_kill-->proc->flags + |= PF_EXITING,                                                          + -->wakeup_proc-->do_wait-->do_exit

+
+

SYS_getpid

+
+

get the + process's pid

+
+

 

+
+ +

 通过这些系统调用,可方便地完成从进程/线程创建到退出的整个运行过程。

+ +

4.      +系统调用的执行过程

+ +

与用户态的函数库调用执行过程相比,系统调用执行过程的有四点主要的不同:

+ +

l  +不是通过“CALL”指令而是通过“INT”指令发起调用;

+ +

l  +不是通过“RET”指令,而是通过“IRET”指令完成调用返回;

+ +

l  +当到达内核态后,操作系统需要严格检查系统调用传递的参数,确保不破坏整个系统的安全性;

+ +

l  +执行系统调用可导致进程等待某事件发生,从而可引起进程切换;

+ +

下面我们以getpid系统调用的执行过程大致看看操作系统是如何完成整个执行过程的。当用户进程调用getpid函数,最终执行到“INT T_SYSCALL”指令后,CPU根据操作系统建立的系统调用中断描述符,转入内核态,并跳转到vector128处(kern/trap/vectors.S),开始了操作系统的系统调用执行过程,函数调用和返回操作的关系如下所示:

+ +

vector128(vectors.S)--> +__alltraps(trapentry.S)-->trap(trap.c)-->trap_dispatch(trap.c)--

+ +

-->syscall(syscall.c)-->sys_getpid(syscall.c)-->……-->__trapret(trapentry.S)

+ +

在执行trap函数前,软件还需进一步保存执行系统调用前的执行现场,即把与用户进程继续执行所需的相关寄存器等当前内容保存到当前进程的中断帧trapframe中(注意,在创建进程是,把进程的trapframe放在给进程的内核栈分配的空间的顶部)。软件做的工作在vector128__alltraps的起始部分:

+ + + + + +
+

vectors.S::vector128起始处:

+

  pushl $0
+
  pushl $128

+

......

+

trapentry.S::__alltraps起始处:

+

pushl %ds
+
  pushl %es
+
  pushal

+

……

+
+ +

自此,用于保存用户态的用户进程执行现场的trapframe的内容填写完毕,操作系统可开始完成具体的系统调用服务。在sys_getpid函数中,简单地把当前进程的pid成员变量做为函数返回值就是一个具体的系统调用服务。完成服务后,操作系统按调用关系的路径原路返回到__alltraps中。然后操作系统开始根据当前进程的中断帧内容做恢复执行现场操作。其实就是把trapframe的一部分内容保存到寄存器内容。恢复寄存器内容结束后,调整内核堆栈指针到中断帧的tf_eip处,这是内核栈的结构如下:

+ + + + + +
+

/* below here defined by x86 hardware */

+

    uintptr_t tf_eip;
+
    uint16_t tf_cs;
+
    uint16_t tf_padding3;
+
    uint32_t tf_eflags;
+ /*
 below here only when crossing rings */
+
    uintptr_t tf_esp;
+
    uint16_t tf_ss;
+
    uint16_t tf_padding4;

+
+ +

 这时执行“IRET”指令后,CPU根据内核栈的情况回复到用户态,并把EIP指向tf_eip的值,即“INT T_SYSCALL”后的那条指令。这样整个系统调用就执行完毕了。

+ +

至此,实验五中的主要工作描述完毕。

+ +

实验报告要求

+ +

从网站上下载lab5.zip后,解压得到本文档和代码目录 lab5,完成实验中的各个练习。完成代码编写并检查无误后,在对应目录下执行 make handin 任务,即会自动生成 lab5-handin.tar.gz。最后请一定提前或按时提交到网络学堂上。

+ +

注意有“LAB5”的注释,代码中所有需要完成的地方(challenge除外)都有“LAB5”“YOUR CODE”的注释,请在提交时特别注意保持注释,并将“YOUR CODE”替换为自己的学号,并且将所有标有对应注释的部分填上正确的代码。

+ +

 

+ +

附录A: +【原理】用户进程的特征

+ +

从内核线程到用户进程

+ +

在实验四中设计实现了进程控制块,并实现了内核线程的创建和简单的调度执行。但实验四中没有在用户态执行用户进程的管理机制,既无法体现用户进程的地址空间,以及用户进程间地址空间隔离的保护机制,不支持进程执行过程的用户态和核心态之间的切换,且没有用户进程的完整状态变化的生命周期。其实没有实现的原因是内核线程不需要这些功能。那内核线程相对于用户态线程有何特点呢?

+ +

但其实我们已经在实验四中看到了内核线程,内核线程的管理实现相对是简单的,其特点是直接使用操作系统(比如ucore)在初始化中建立的内核虚拟内存地址空间,不同的内核线程之间可以通过调度器实现线程间的切换,达到分时使用CPU的目的。由于内核虚拟内存空间是一一映射计算机系统的物理空间的,这使得可用空间的大小不会超过物理空间大小,所以操作系统程序员编写内核线程时,需要考虑到有限的地址空间,需要保证各个内核线程在执行过程中不会破坏操作系统的正常运行。这样在实现内核线程管理时,不必考虑涉及与进程相关的虚拟内存管理中的缺页处理、按需分页、写时复制、页换入换出等功能。如果在内核线程执行过程中出现了访存错误异常或内存不够的情况,就认为操作系统出现错误了,操作系统将直接宕机。在ucore中,就是调用panic函数,进入内核调试监控器kernel_debug_monitor

+ +

内核线程管理思想相对简单,但编写内核线程对程序员的要求很高。从理论上讲(理想情况),如果程序员都是能够编写操作系统级别的高手,能够勤俭和高效地使用计算机系统中的资源,且这些高手都为他人着想,具有奉献精神,在别的应用需要计算机资源的时候,能够从大局出发,从整个系统的执行效率出发,让出自己占用的资源,那这些高手编写出来的程序直接作为内核线程运行即可,也就没有用户进程存在的必要了。

+ +

但现实与理论的差距是巨大的,能编写操作系统的程序员是极少数的,与当前的应用程序员相比,估计大约差了3~4个数量级。如果还要求编写操作系统的程序员考虑其他未知程序员的未知需求,那这样的程序员估计可以成为是编程界的上帝了。

+ +

从应用程序编写和运行的角度看,既然程序员都不是上帝,操作系统程序员就需要给应用程序员编写的程序提供一个既宽松严格的执行环境,让对内存大小和CPU使用时间等资源的限制没有仔细考虑的应用程序都能在操作系统中正常运行,且即使程序太可靠,也只能破坏自己,而不能破坏其他运行程序和整个系统。严格就是安全性保证,即应用程序执行不会破坏在内存中存在的其他应用程序和操作系统的内存空间等独占的资源;宽松就算是方便性支持,即提供给应用程序尽量丰富的服务功能和一个远大于物理内存空间的虚拟地址空间,使得应用程序在执行过程中不必考虑很多繁琐的细节(比如如何初始化PCI总线和外设等,如果管理物理内存等)。

+ +

让用户进程正常运行的用户环境

+ +

在操作系统原理的介绍中,一般提到进程的概念其实主要是指用户进程。从操作系统的设计和实现的角度看,其实用户进程是指一个应用程序在操作系统提供的一个用户环境中的一次执行过程。这里的重点是用户环境。用户环境有啥功能?用户环境指的是什么? +

+ +

从功能上看,操作系统提供的这个用户环境有两方面的特点。一方面与存储空间相关,即限制用户进程可以访问的物理地址空间,且让各个用户进程之间的物理内存空间访问不重叠,这样可以保证不同用户进程之间不能相互破坏各自的内存空间,利用虚拟内存的功能(页换入换出)。给用户进程提供了远大于实际物理内存空间的虚拟内存空间。

+ +

另一方面与执行指令相关,即限制用户进程可执行的指令,不能让用户进程执行特权指令(比如修改页表起始地址),从而保证用户进程无法破坏系统。但如果不能执行特权指令,则很多功能(比如访问磁盘等)无法实现,所以需要提供某种机制,让操作系统完成需要特权指令才能做的各种服务功能,给用户进程一个服务窗口”,用户进程可以通过这个窗口向操作系统提出服务请求,由操作系统来帮助用户进程完成需要特权指令才能做的各种服务。另外,还要有一个中断窗口,让用户进程不主动放弃使用CPU时,操作系统能够通过这个中断窗口强制让用户进程放弃使用CPU,从而让其他用户进程有机会执行。

+ +

基于功能分析,我们就可以把这个用户环境定义为如下组成部分:

+ +

l  +建立用户虚拟空间的页表和支持页换入换出机制的用户内存访存错误异常服务例程:提供地址隔离和超过物理空间大小的虚存空间。

+ +

l  +应用程序执行的用户态CPU特权级:在用户态CPU特权级,应用程序只能执行一般指令,如果特权指令,结果不是无效就是产生执行非法指令异常;

+ +

l  +系统调用机制:给用户进程提供服务窗口

+ +

l  +中断响应机制:给用户进程设置中断窗口,这样产生中断后,当前执行的用户进程将被强制打断,CPU控制权将被操作系统的中断服务例程使用。

+ +

用户态进程的执行过程分析

+ +

在这个环境下运行的进程就是用户进程。那如果用户进程由于某种原因下面进入内核态后,那在内核态执行的是什么呢?还是用户进程吗?首先分析一下用户进程这样会进入内核态呢?回顾一下lab1,就可以知道当产生外设中断、CPU执行异常(比如访存错误)、陷入(系统调用),用户进程就会切换到内核中的操作系统中来。表面上看,到内核态后,操作系统取得了CPU控制权,所以现在执行的应该是操作系统代码,由于此时CPU处于核心态特权级,所以操作系统的执行过程就就应该是内核进程了。这样理解忽略了操作系统的具体实现。如果考虑操作系统的具体实现,应该如果来理解进程呢?

+ +

从进程控制块的角度看,如果执行了进程执行现场(上下文)的切换,就认为到另外一个进程执行了,及进程的分界点设定在执行进程切换的前后。到底切换了什么呢?其实只是切换了进程的页表和相关硬件寄存器,这些信息都保存在进程控制块中的相关域中。所以,我们可以把执行应用程序的代码一直到执行操作系统中的进程切换处为止都认为是一个应用程序的执行过程(其中有操作系统的部分代码执行过过程)即进程。因为在这个过程中,没有更换到另外一个进程控制块的进程的页表和相关硬件寄存器。

+ +

从指令执行的角度看,如果再仔细分析一下操作系统这个软件的特点并细化一下进入内核原因,就可以看出进一步进行划分。操作系统的主要功能是给上层应用提供服务,管理整个计算机系统中的资源。所以操作系统虽然是一个软件,但其实是一个基于事件的软件,这里操作系统需要响应的事件包括三类:外设中断、CPU执行异常(比如访存错误)、陷入(系统调用)。如果用户进程通过系统调用要求操作系统提供服务,那么用户进程的角度看,操作系统就是一个特殊的软件库(比如相对于用户态的libc库,操作系统可看作是内核态的libc库),完成用户进程的需求,从执行逻辑上看,是用户进程主观执行的一部分,即用户进程知道操作系统要做的事情。那么在这种情况下,进程的代码空间包括用户态的执行程序和内核态响应用户进程通过系统调用而在核心特权态执行服务请求的操作系统代码,为此这种情况下的进程的内存虚拟空间也包括两部分:用户态的虚地址空间和核心态的虚地址空间。但如果此时发生的事件是外设中断和CPU执行异常,虽然CPU控制权也转入到操作系统中的中断服务例程,但这些内核执行代码执行过程是用户进程不知道的,是另外一段执行逻辑。那么在这种情况下,实际上是执行了两段目标不同的执行程序,一个是代表应用程序的用户进程,一个是代表中断服务例程处理外设中断和CPU执行异常的内核线程。这个用户进程和内核线程在产生中断或异常的时候,CPU硬件就完成了它们之间的指令流切换。

+ +

用户进程的运行状态分析

+ +

   用户进程在其执行过程中会存在很多种不同的执行状态,根据操作系统原理,一个用户进程一般的运行状态有五种:创建(new)态、就绪(ready)态、运行(running)态、等待(blocked)态、退出(exit)态。各个状态之间会由于发生了某事件而进行状态转换。

+ +

但在用户进程的执行过程中,具体在哪个时间段处于上述状态的呢?上述状态是如何转变的呢?首先,我们看创建(new)态,操作系统完成进程的创建工作,而体现进程存在的就是进程控制块,所以一旦操作系统创建了进程控制块,则可以认为此时进程就已经存在了,但由于进程能够运行的各种资源还没准备好,所以此时的进程处于创建(new)态。创建了进程控制块后,进程并不能就执行了,还需准备好各种资源,如果把进程执行所需要的虚拟内存空间,执行代码,要处理的数据等都准备好了,则此时进程已经可以执行了,但还没有被操作系统调度,需要等待操作系统选择这个进程执行,于是把这个做好执行准备的进程放入到一个队列中,并可以认为此时进程处于就绪(ready)态。当操作系统的调度器从就绪进程队列中选择了一个就绪进程后,通过执行进程切换,就让这个被选上的就绪进程执行了,此时进程就处于运行(running)态了。到了运行态后,会出现三种事件。如果进程需要等待某个事件(比如主动睡眠10秒钟,或进程访问某个内存空间,但此内存空间被换出到硬盘swap分区中了,进程不得不等待操作系统把缓慢的硬盘上的数据重新读回到内存中),那么操作系统会把CPU给其他进程执行,并把进程状态从运行(running)态转换为等待(blocked)态。如果用户进程的应用程序逻辑流程执行结束了,那么操作系统会把CPU给其他进程执行,并把进程状态从运行(running)态转换为退出(exit)态,并准备回收用户进程占用的各种资源,当把表示整个进程存在的进程控制块也回收了,这进程就不存在了。在这整个回收过程中,进程都处于退出(exit)态。2考虑到在内存中存在多个处于就绪态的用户进程,但只有一个CPU,所以为了公平起见,每个就绪态进程都只有有限的时间片段,当一个运行态的进程用完了它的时间片段后,操作系统会剥夺此进程的CPU使用权,并把此进程状态从运行(running)态转换为就绪(ready)态,最后把CPU给其他进程执行。如果某个处于等待(blocked)态的进程所等待的事件产生了(比如睡眠时间到,或需要访问的数据已经从硬盘换入到内存中),则操作系统会通过把等待此事件的进程状态从等待(blocked)态转到就绪(ready)态。这样进程的整个状态转换形成了一个有限状态自动机。

+ +
+ + + + diff --git a/lab6.files/.DS_Store b/lab6.files/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a75e15562e1f89396eadcc5859f67947bd14f88c GIT binary patch literal 6148 zcmeHKyG}wu5IrLlBwA2fZfRx2FW3+?vGxZPHN*tOhW>W^9RH+e9vUu-t%c5znX@}P z=PvgYcXk2Dbn`p`#sEfiMQk;+rt9jBokT`a>=`e(;%|aWyf@Xy6UsfqD^_^K0{i?o zEbf-;r}=U{XN~^BTl&R^8AmPe+V*XEy91t)Go%8kKq`<5qyqm`0rqUQ(Wzs`R3H^d z1-=!~??a(0*1*ouJ{=5teAo4%q8i6`mmrpy*TBw^D>QK`(Ww$w3~@U1CF*Km=je2Z z?ab%I&Js5ivE7+3Rt~9-8B>8&ps&Edr(^B^H}oIw|9w)uO-XMcU{DuOb?#3ui literal 0 HcmV?d00001 diff --git a/lab6.files/image001.png b/lab6.files/image001.png new file mode 100644 index 0000000000000000000000000000000000000000..7c03f8688f8abc835523163eb4a89722c89366fb GIT binary patch literal 15833 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≪v=Ro;Iz_`RMaKtdgYThiY7;7(Dv#K8Pt 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
qKcC zVvhZi@mjGw+Rm?75v}0M7Jn&h*)FmsBamdk=bzPMc374vLma6Mh;k*T4U>Mil6vh| zw!v1dTG#~tUO|L7Kw&^8B_&(^xPx;Yk;J5cC@&R(8qhd3kxrpow+k#6@}Jcg|9egr z@aezqOn(3No5}KJ*=mG`)Tl_7Q>RTc(fxqL_X}h=CM1Ex^hAzBxVv==hIWv0l;B8G zlys1-0b?_`#o3JOdiCmI&pVUtPwLqx3;0axo{V%H#yMZvDVfitn&{QDm)YCMl7Nc> zbGK_3614?$Qe~vJC#Nlu0zNYo(V-II+hvx7T)F%qT_8zhhLQSJ9QW^ zTS(U4a_W$n#NFl&k;J*I!|9I!rah(`KP1Z93?8b@IAw^7ByIR_%KDx%46xOV2lWJ1 zZ^(kQ#Q^CZur2LTM!YP@SQvoVkS?QkonVGTuXTww9q#~yCkxUR0}ynioh;m@EnazA z7H-oXr)l}bZ~;c+rPUy?t*f+rQ`WPxFp!0TEDS`z05m7WrW4_stV3BC$ihGt2C^`a jg@G&#WMLrlV&MM)5afY?nVzSi00000NkvXXu0mjfONRSI literal 0 HcmV?d00001 diff --git a/lab6.files/image002.png b/lab6.files/image002.png new file mode 100644 index 0000000000000000000000000000000000000000..91d5fdfe4bb90d727e165f2d01cd40616e572fd2 GIT binary patch literal 15385 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 + + + + + + + + + + +
+ +

实验六: 调度器

+ +

 

+ +

1 实验目的

+ +

理解操作系统的调度管理机制

+ +

熟悉 ucore 的系统调度器框架,以及缺省的Round-Robin 调度算法

+ +

基于调度器框架实现一个(Stride Scheduling)调度算法来替换缺省的调度算法

+ +

 

+ +

2 实验内容

+ +

实验五完成了用户进程的管理,可在用户态运行多个进程。但到目前为止,采用的调度策略是很简单的FIFO调度策略。本次实验,主要是熟悉ucore的系统调度器框架,以及基于此框架的 Round-RobinRR) 调度算法。然后参考RR调度算法的实现,完成Stride +Scheduling调度算法。

+ +

2.1 练习

+ +

练习0:填写已有实验

+ +

本实验依赖实验1/2/3/4/5。请把你做的实验2/3/4/5的代码填入本实验中代码中有“LAB1/ LAB2/LAB3/LAB4/LAB5”的注释相应部分。并确保编译通过。注意:为了能够正确执行lab6的测试应用程序,可能需对已完成的实验1/2/3/4/5的代码进行进一步改进。

+ +

 

+ +

练习1 使用Round Robin调度算法(不需要编码)

+ +

完成练习0后,建议大家比较一下(可用kdiff3等文件比较软件)个人完成的lab5和练习0完成后的刚修改的lab6之间的区别,分析了解lab6采用RR调度算法后的执行过程。执行make grade,大部分测试用例应该通过。但执行priority.c应该过不去。

+ +

 

+ +

练习2 实现Stride Scheduling调度算法(需要编码)

+ +

首先需要换掉RR调度器的实现,即用default_sched_stride_c覆盖default_sched.c。然后根据此文件和后续文档对Stride度器的相关描述,完成Stride调度算法的实现。

+ +

后面的实验文档部分给出了Stride调度算法的大体描述。这里给出Stride调度算法的一些相关的资料(目前网上中文的资料比较欠缺)。

+ +

http://wwwagss.informatik.uni-kl.de/Projekte/Squirrel/stride/node3.html

+ +

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.138.3502&rank=1

+ +

也可GOOGLE  Stride  Scheduling来查找相关资料

+ +

  

+ +

执行:make grade 如果所显示的应用程序检测都输出ok,则基本正确。如果只是priority.c过不去,可执行 +make run-priority 命令来单独调试它。大致执行结果可看附录。使用的是qemu-1.0.1)。

+ +

 

+ +

扩展练习Challenge:实现LinuxCFS调度算法

+ +

ucore 的调度器框架下实现下LinuxCFS调度算法。可阅读相关Linux内核书籍或查询网上资料,可了解CFS的细节,然后大致实现在ucore中。

+ +

2.2 项目组成

+ + + + + +
+

├── + boot

+

├── + kern

+

   ├── debug

+

   ├── driver

+

   ├── fs

+

   ├── init

+

   ├── libs

+

   ├── mm

+

   ├── process

+

      ├── .....

+

      ├── proc.c

+

      ├── proc.h

+

      └── switch.S

+

   ├── schedule

+

      ├── default_sched.c

+

      ├── default_sched.h

+

      ├── default_sched_stride_c

+

      ├── sched.c

+

      └── sched.h

+

   ├── syscall

+

      ├── syscall.c

+

      └── syscall.h

+

+
+ +

相对与实验五,实验六主要增加的文件如上表红色部分所示,主要修改的文件如上表紫色部分所示。主要改动如下:

+ +

简单说明如下:

+ +

 

+ +

libs/skew_heap.h:  提供了基本的优先队列数据结构,为本次实验提供了抽象数据结构方面的支持。

+ +

kern/process/proc.[ch]proc.h中扩展了proc_struct的成员变量,用于RRstride调度算法。proc.c中实现了lab6_set_priority,用于设置进程的优先级。

+ +

kern/schedule/{sched.h,sched.c}:  定义了 ucore 的调度器框架,其中包括相关的数 据结构(包括调度器的接口和运行队列的结构),和具体的运行时机制。

+ +

+kern/schedule/{default_sched.h,default_sched.c}:   具体的 +round-robin 算法,在本次实验中你需要了解其实现。

+ +

kern/schedule/default_sched_stride_c: +Stride Scheduling调度器的基本框架,在此次 实验中你需要填充其中的空白部分以实现一个完整的 +Stride  调度器。

+ +

kern/syscall/syscall.[ch]: 增加了sys_gettime系统调用,便于用户进程获取当前时钟值;增加了sys_lab6_set_priority系统调用,便于用户进程设置进程优先级(给priority.c用)

+ +

user/{matrix.c,priority.c,. . . }:  相关的一些测试用户程序,测试调度算法的正确性,user 目录下包含但不限于这些程序。在完成实验过程中,建议阅读这些测试程序,以了解这些程序的行为,便于进行调试。

+ +

 

+ +

3   调度框架和调度算法设计与实现

+ +

3.1实验执行流程概述

+ +

在实验五,创建了用户进程,并让它们正确运行。这中间也实现了FIFO调度策略。可通过阅读实验五下的 kern/schedule/sched.c schedule +函数的实现来了解其FIFO调度策略。与实验五相比,实验六专门需要针对处理器调度框架和各种算法进行设计与实现,为此对ucore的调度部分进行了适当的修改,使得kern/schedule/sched.c 只实现调度器框架,而不再涉及具体的调度算法实现。而调度算法在单独的文件(default_sched.[ch])中实现。

+ +

除此之外,实验中还涉及了idle进程的概念。当cpu没有进程可以执行的时候,系统应该如何工作?在实验五的scheduler实现中,ucore内核不断的遍历进程池,直到找到第一个runnable状态的 process,调用并执行它。也就是说,当系统没有进程可以执行的时候,它会把所有 +cpu 时间用在搜索进程池,以实现 idle的目的。但是这样的设计不被大多数操作系统所采用,原因在于它将进程调度和 idle 进程两种不同的概念混在了一起,而且,当调度器比较复杂时,schedule 函数本身也会比较复杂,这样的设计结构很不清晰而且难免会出现错误。所以在此次实验中,ucore 建立了一个单独的进程(kern/process/proc.c 中的 idleproc)作为 cpu 空闲时的 idle 进程,这个程序是通常一个死循环。你需要了解这个程序的实现。

+ +

接下来可看看实验六的大致执行过程,在init.c中的kern_init函数增加了对sched_init函数的调用。sched_init函数主要完成了对实现特定调度算法的调度类(sched_class)的绑定,使得ucore在后续的执行中,能够通过调度框架找到实现特定调度算法的调度类并完成进程调度相关工作。为了更好地理解实验六整个运行过程,这里需要关注的重点问题包括:

+ +

1.   何时或何事件发生后需要调度?

+ +

2.   何时或何事件发生后需要调整实现调度算法所涉及的参数?

+ +

3.   如果基于调度框架设计具体的调度算法?

+ +

4.   如果灵活应用链表等数据结构管理进程调度?

+ +

大家可带着这些问题进一步阅读后续的内容。

+ +

 

+ +

3.2计时器的原理和实现

+ +

 

+ +

在传统的操作系统中,计时器是其中一个基础而重要的功能.它提供了基于时间事件的调度机制。在 +ucore 中,timer  中断(irq0) 给操作系统提供了有一定间隔的时间事件, 操作系统将其作为基本的调度和计时单位(我们记两次时间中断之间的时间间隔为一个 时间片,timer +splice)。

+ +

基于此时间单位,操作系统得以向上提供基于时间点的事件,并实现基于时间长度的等待和唤醒机制。在每个时钟中断发生时,操作系统产生对应的时间事件。应用程序或者操作系统的其他组件可以以此来构建更复杂和高级的调度。

+ +

sched.h,  sched.c 定义了有关timer的各种相关接口来使用 timer  服务,其中主要包括:

+ +

typedef struct {……} +timer_t:  定义了 timer_t 的基本结构,其可以用 +sched.h  中的timer_init函数对其进行初始化。

+ +

void timer_init(timer t *timer,  +struct proc_struct *proc, int expires):  对某计时器 进行初始化,让它在 +expires 时间片之后唤醒 proc 进程。

+ +

void add_timer(timer t *timer):  向系统添加某个初始化过的 timer_t,该计时器在 指定时间后被激活,并将对应的进程唤醒至 +runnable(如果当前进程处在等待状态)。

+ +

void del_timer(timer_t *time):  向系统删除(或者说取消)某一个计时器。该计时 器在取消后不会被系统激活并唤醒进程。

+ +

void run_timer_list(void):  更新当前系统时间点,遍历当前所有处在系统管理内的 计时器,找出所有应该激活的计数器,并激活它们。该过程在且只在每次计时器中断时被调用。在 +ucore 中,其还会调用调度器事件处理程序。

+ +

 

+ +

一个 timer_t 在系统中的存活周期可以被描述如下:

+ +

1.  timer_t 在某个位置被创建和初始化,并通过 add_timer加入系统管理列表中

+ +

2.  系统时间被不断累加,直到 +run_timer_list 发现该 timer_t到期。

+ +

3.  run_timer_list 更改对应的进程状态,并从系统管理列表中移除该timer_t。 尽管本次实验并不需要填充计时器相关的代码,但是作为系统重要的组件(同时计时器也是调度器的一个部分),你应该了解其相关机制和在 +ucore 中的实现方法。接下来的实验描述将会在一定程度上忽略计时器对调度带来的影响,即不考虑基于固定时间点的调度。

+ +

 

+ +

3.3 进程状态

+ +

 

+ +

在此次实验中,进程的状态之间的转换需要有一个更为清晰的表述,在 ucore 中,runnable的进程会被放在运行队列中。值得注意的是,在具体实现中,ucore定义的进程控制块struct +proc_struct包含了成员变量state,用于描述进程的运行状态,而runningrunnable共享同一个状态(state)(PROC_RUNNABLE)。不同之处在于处于running态的进程不会放在运行队列中。进程的正常生命周期如下:

+ +

进程首先在 cpu 初始化或者 +sys_fork 的时候被创建,当为该进程分配了一个进程描 述符之后,该进程进入 uninit( proc.c +alloc_proc)

+ +

当进程完全完成初始化之后,该进程转为runnable态。

+ +

当到达调度点时,由调度器 sched_class 根据运行队列rq的内容来判断一个进程是否应该被运行,即把处于runnable态的进程转换成 +running状态,从而占用CPU执行。

+ +

running态的进程通过wait等系统调用被阻塞,进入sleeping态。

+ +

sleeping态的进程被wakeup变成runnable态的进程。

+ +

running态的进程主动 +exit 变成 zombie态,然后由其父进程完成对其资源的最后释放,子进程的进程控制块成为unused

+ +

所有从runnable态变成其他状态的进程都要出运行队列,反之,被放入某个运行队列中。

+ +

 

+ +

3.4   进程调度实现

+ +

 

+ +

3.4.1 内核抢占点

+ +

调度本质上体现了对CPU资源的抢占。对于用户进程而言,由于有中断的产生,可以随时打断用户进程的执行,转到操作系统内部,从而给了操作系统以调度控制权,让操作系统可以根据具体情况(比如用户进程时间片已经用完了)选择其他用户进程执行。这体现了用户进程的可抢占性(preemptive)。但如果把ucore操作系统也看成是一个特殊的内核进程或多个内核线程的集合,那ucore是否也是可抢占的呢?其实ucore 内核执行是不可抢占的(non-preemptive),即在执行“任意”内核代码时,CPU控制权可被强制剥夺。这里需要注意,不是在所有情况下ucore内核执行都是不可抢占的,有以下几种“固定”情况是例外:

+ +

1.   +进行同步互斥操作,比如争抢一个信号量、锁(lab7中会详细分析);

+ +

2.   +进行磁盘读写等耗时的异步操作,由于等待完成的耗时太长,ucore会调用shcedule让其他就绪进程执行。

+ +

这几种情况其实都是由于当前进程所需的某个资源(也可称为事件)无法得到满足,无法继续执行下去,从而不得不主动放弃对CPU的控制权。如果参照用户进程任何位置都可被内核打断并放弃CPU控制权的情况,这些在内核中放弃CPU控制权的执行地点是“固定”而不是“任意”的,不能体现内核任意位置都可抢占性的特点。我们搜寻一下实验五的代码,可发现在如下几处地方调用了shedule函数:

+ +

 

+ +

表一:调用进程调度函数schedule的位置和原因

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

编号

+
+

位置

+
+

原因

+
+

1

+
+

proc.c::do_exit

+
+

用户线程执行结束,主动放弃CPU控制权。

+
+

2

+
+

proc.c::do_wait

+
+

用户线程等待子进程结束,主动放弃CPU控制权。

+
+

3

+
+

proc.c::init_main

+
+

1.  initproc内核线程等待所有用户进程结束,如果没有结束,就主动放弃CPU控制权;

+

2.  initproc内核线程在所有用户进程结束后,让kswapd内核线程执行10次,用于回收空闲内存资源

+
+

4

+
+

proc.c::cpu_idle

+
+

idleproc内核线程的工作就是等待有处于就绪态的进程或线程,如果有就调用schedule函数

+
+

5

+
+

sync.h::lock

+
+

在获取锁的过程中,如果无法得到锁,则主动放弃CPU控制权

+
+

6

+
+

trap.c::trap

+
+

如果在当前进程在用户态被打断去,且当前进程控制块的成员变量need_resched设置为1,则当前线程会放弃CPU控制权

+
+ +

仔细分析上述位置,第125处的执行位置体现了由于获取某种资源一时等不到满足、进程要退出、进程要睡眠等原因而不得不主动放弃CPU。第34处的执行位置比较特殊,initproc内核线程等待用户进程结束而执行schedule函数;idle内核线程在没有进程处于就绪态时才执行,一旦有了就绪态的进程,它将执行schedule函数完成进程调度。这里只有第6处的位置比较特殊:

+ + + + + +
+

       if (!in_kernel) {
+             ……

+

           if (current->need_resched) {
+
                schedule();
+
            }
+
        }

+
+ +

这里表明了只有当进程在用户态执行到“任意”某处用户代码位置时发生了中断,且当前进程控制块成员变量need_resched1(表示需要调度了)时,才会执行shedule函数。这实际上体现了对用户进程的可抢占性。如果没有第一行的if语句,那么就可以体现对内核代码的可抢占性。但如果要把这一行if语句去掉,我们就不得不实现对ucore中的所有全局变量的互斥访问操作,以防止所谓的race condition现象,这样ucore的实现复杂度会增加不少。

+ +

3.4.2 进程切换过程

+ +

进程调度函数schedule选择了下一个将占用CPU执行的进程后,将调用进程切换,从而让新的进程得以执行。通过实验四和实验五的理解,应该已经对进程调度和上下文切换有了初步的认识。在实验五中,结合调度器框架的设计,可对 +ucore 中的进程切换以及堆栈的维护和使用等有更加深刻的认识。假定有两个用户进程,在二者进行进程切换的过程中,具体的步骤如下:

+ +

首先在执行某进程A的用户代码时,出现了一个 +trap  (例如是一个外设产生的中断),这 个时候就会从进程A的用户态切换到内核态(过程(1)),并且保存好进程Atrapframe; 当内核态处理中断时发现需要进行进程切换时,ucore要通过schedule函数选择下一个将占用CPU执行的进程(即进程B),然后会调用proc_run函数,proc_run函数进一步调用switch_to函数,切换到进程B的内核态(过程(2)),继续进程B上一次在内核态的操作,并通过iret指令,最终将执行权转交给进程B的用户空间(过程(3))

+ +

当进程B由于某种原因发生中断之后(过程(4)),会从进程B的用户态切换到内核态,并且保存好进程Btrapframe;当内核态处理中断时发现需要进行进程切换时,即需要切换到进程Aucore再次切换到进程A(过程(5)),会执行进程A上一次在内核调用 schedule (具体还要跟踪到 switch_to 函数) 函数返回后的下一行代码,这行代码当然还是在进程A的上一次中断处理流程中。最后当进程 +A的中断处理完毕的时候,执行权又会反交给进程A的用户代码(过程(6))。这就是在只有两个进程的情况下,进程切换间的大体流程。

+ +

几点需要强调的是:

+ +

a) 需要透彻理解进程切换以后,程序是从哪里开始执行?需要注意到虽然指令还是同一cpu上执行,但是此时已经是另外一个进程在执行了,且使用的资源已经完全不同了。

+ +

b)  内核在第一个程序运行的时候,需要进行哪些操作?有了实验四和实验五的经验,可以确定,内核启动第一个用户进程的过程,实际上是从进程启动时的内核状态切换到该用户进程的内核状态的过程,而且该用户进程在用户态的起始入口应该是forkret

+ +

3.5   调度框架和调度算法

+ +

3.5.1 设计思路

+ +

实行一个进程调度策略,到底需要实现哪些基本功能对应的数据结构?首先考虑到一个无论哪种调度算法都需要选择一个就绪进程来占用CPU运行。为此我们可把就绪进程组织起来,可用队列(双向链表)、二叉树、红黑树、数组…等不同的组织方式。

+ +

在操作方面,如果需要选择一个就绪进程,就可以从基于某种组织方式的就绪进程集合中选择出一个进程执行。需要注意,这里“选择”和“出”是两个操作,选择是在集合中挑选一个“合适”的进程,“出”意味着离开就绪进程集合。另外考虑到一个处于运行态的进程还会由于某种原因(比如时间片用完了)回到就绪态而不能继续占用CPU执行,这就会重新进入到就绪进程集合中。这两种情况就形成了调度器相关的三个基本操作:在就绪进程集合中选择、进入就绪进程集合和离开就绪进程集合。这三个操作属于调度器的基本操作。

+ +

在进程的执行过程中,就绪进程的等待时间和执行进程的执行时间是影响调度选择的重要因素,这两个因素随着时间的流逝和各种事件的发生在不停地变化,比如处于就绪态的进程等待调度的时间在增长,处于运行态的进程所消耗的时间片在减少等。这些进程状态变化的情况需要及时让进程调度器知道,便于选择更合适的进程执行。所以这种进程变化的情况就形成了调度器相关的一个变化感知操作: timer时间事件感知操作。这样在进程运行或等待的过程中,调度器可以调整进程控制块中与进程调度相关的属性值(比如消耗的时间片、进程优先级等),并可能导致对进程组织形式的调整(比如以时间片大小的顺序来重排双向链表等),并最终可能导致调选择新的进程占用CPU运行。这个操作属于调度器的进程调度属性调整操作。

+ +

3.5.2 数据结构

+ +

在理解框架之前,需要先了解一下调度器框架所需要的数据结构。

+ +

通常的操作系统中,进程池是很大的(虽然在 ucore 中,MAX_PROCESS +很小)。 在 ucore 中,调度器引入 run-queue(简称rq, 即运行队列)的概念,通过链表结构管理进程。

+ +

由于目前 ucore 设计运行在单 +CPU上,其内部只有一个全局的运行队列,用来管理系统内全部的进程。

+ +

运行队列通过链表的形式进行组织。链表的每一个节点是一个list_entry_t, 每个list_entry_t +又对应到了 struct proc_struct *, 这其间的转换是通过宏 +le2proc 来完成 的。具体来说,我们知道在 struct proc_struct 中有一个叫 run_link list_entry_t, 因此可以通过偏移量逆向找到对因某个 run_list struct +proc_struct。即 进程结构指针 proc = le2proc(链表节点指针, run_link)

+ +

为了保证调度器接口的通用性,ucore 调度框架定义了如下接口,该接口中,几乎全部成员变量均为函数指针。具体的功能会在后面的框架说明中介绍。

+ +

 

+ + + + + +
+

1   struct sched_class {

+

2   // 调度器的名字

+

3   const char *name;

+

4   // 初始化运行队列

+

5   void (*init) (struct run_queue *rq);

+

6   // 将进程 p 插入队列 + rq

+

7   void (*enqueue) (struct run_queue *rq, struct proc_struct + *p);

+

8   // 将进程 p 从队列 + rq 中删除

+

9   void (*dequeue) (struct run_queue *rq, struct proc_struct + *p);

+

10 // 返回 运行队列 中下一个可执行的进程

+

11 struct proc_struct* (*pick_next) (struct run_queue *rq);

+

12 // timetick 处理函数

+

13 void (*proc_tick)(struct  run_queue* rq, struct + proc_struct* p);

+

14 };

+
+ +

 

+ +

此外,proc.h 中的 struct proc_struct 中也记录了一些调度相关的信息:

+ + + + + +
+

1   struct proc_struct {

+

2   // . . .

+

3   // 该进程是否需要调度,只对当前进程有效

+

4   volatile bool need_resched;

+

5   // 该进程的调度链表结构,该结构内部的连接组成了 运行队列 列表

+

6   list_entry_t run_link;

+

7   // 该进程剩余的时间片,只对当前进程有效

+

8   int time_slice;

+

9   // round-robin 调度器并不会用到以下成员

+

10 // 该进程在优先队列中的节点,仅在 LAB6 使用

+

11 skew_heap_entry_t  lab6_run_pool;

+

12 // 该进程的调度优先级,仅在 LAB6 使用

+

13 uint32_t lab6_priority;

+

14 // 该进程的调度步进值,仅在 LAB6 使用

+

15 uint32_t lab6_stride;

+

16 };

+
+ +

 

+ +

在此次实验中,你需要了解 default_sched.c 中的实现RR调度算法的函数。在该文件中,你可以看到ucore 已经为 RR 调度算法创建好了一个名为 RR_sched_class 的调度策略类。

+ +

通过数据结构 struct run_queue 来描述完整的 +run_queue(运行队列)。它的主要结构如下:

+ + + + + +
+

1   struct run_queue {

+

2   //其运行队列的哨兵结构,可以看作是队列头和尾

+

3   list_entry_t run_list;

+

4   //优先队列形式的进程容器,只在 LAB6 中使用

+

5   skew_heap_entry_t  *lab6_run_pool;

+

6   //表示其内部的进程总数

+

7   unsigned int proc_num;

+

8   //每个进程一轮占用的最多时间片

+

9   int max_time_slice;

+

10 };

+
+ +

 

+ +

ucore 框架中,运行队列存储的是当前可以调度的进程,所以,只有状态为 +runnable的进程才能够进入运行队列。当前正在运行的进程并不会在运行队列中,这一点需要注意。

+ +

3.5.3 调度点的相关关键函数

+ +

虽然进程各种状态变化的原因和导致的调度处理各异,但其实仔细观察各个流程的共性部分,会发现其中只涉及了三个关键调度相关函数:wakup_procshedulerun_timer_list。如果我们能够让这三个调度相关函数的实现与具体调度算法无关,那么就可以认为ucore实现了一个与调度算法无关的调度框架。

+ +

wakeup_proc函数其实完成了把一个就绪进程放入到就绪进程队列中的工作,为此还调用了一个调度类接口函数sched_class_enqueue,这使得wakeup_proc的实现与具体调度算法无关。schedule函数完成了与调度框架和调度算法相关三件事情:把当前继续占用CPU执行的运行进程放放入到就绪进程队列中,从就绪进程队列中选择一个“合适”就绪进程,把这个“合适”的就绪进程从就绪进程队列中摘除。通过调用三个调度类接口函数sched_class_enqueuesched_class_pick_nextsched_class_enqueue来使得完成这三件事情与具体的调度算法无关。run_timer_list函数在每次timer中断处理过程中被调用,从而可用来调用调度算法所需的timer时间事件感知操作,调整相关进程的进程调度相关的属性值。通过调用调度类接口函数sched_class_proc_tick使得此操作与具体调度算法无关。

+ +

这里涉及了一系列调度类接口函数:

+ +

l  +sched_class_enqueue

+ +

l  +sched_class_dequeue

+ +

l  +sched_class_pick_next

+ +

l  +sched_class_proc_tick

+ +

4个函数的实现其实就是调用某基于sched_class数据结构的特定调度算法实现的4个指针函数。采用这样的调度类框架后,如果我们需要实现一个新的调度算法,则我们需要定义一个针对此算法的调度类的实例,一个就绪进程队列的组织结构描述就行了,其他的事情都可交给调度类框架来完成。

+ +

3.5.4 RR调度算法实现

+ +

RR调度算法的调度思想 是让所有 runnable态的进程分时轮流使用CPU时间。RR调度器维护当前runnable进程的有序运行队列。当前进程的时间片用完之后,调度器将当前进程放置到运行队列的尾部,再从其头部取出进程进行调度。RR调度算法的就绪队列在组织结构上也是一个双向链表,只是增加了一个成员变量,表明在此就绪进程队列中的最大执行时间片。而且在进程控制块proc_struct中增加了一个成员变量time_slice,用来记录进程当前的可运行时间片段。这是由于RR调度算法需要考虑执行进程的运行时间不能太长。在每个timer到时的时候,操作系统会递减当前执行进程的time_slice,当time_slice0时,就意味着这个进程运行了一段时间(这个时间片段称为进程的时间片),需要把CPU让给其他进程执行,于是操作系统就需要让此进程重新回到rq的队列尾,且重置此进程的时间片为就绪队列的成员变量最大时间片max_time_slice值,然后再从rq的队列头取出一个新的进程执行。下面来分析一下其调度算法的实现。

+ +

RR_enqueue的函数实现如下表所示。即把某进程的进程控制块指针放入到rq队列末尾,且如果进程控制块的时间片为0,则需要把它重置为rq成员变量max_time_slice。这表示如果进程在当前的执行时间片已经用完,需要等到下一次有机会运行时,才能再执行一段时间。

+ + + + + +
+

static void
+
RR_enqueue(struct run_queue *rq, struct proc_struct *proc) {
+
    assert(list_empty(&(proc->run_link)));
+
    list_add_before(&(rq->run_list), &(proc->run_link));
+
    if (proc->time_slice == 0 || proc->time_slice > rq->max_time_slice) {
+
        proc->time_slice = rq->max_time_slice;
+
    }
+
    proc->rq = rq;
+
    rq->proc_num ++;
+
}

+
+ +

 

+ +

RR_pick_next的函数实现如下表所示。即选取就绪进程队列rq中的队头队列元素,并把队列元素转换成进程控制块指针。

+ + + + + +
+

static struct proc_struct *
+
FCFS_pick_next(struct run_queue *rq) {
+
    list_entry_t *le = list_next(&(rq->run_list));
+
    if (le != &(rq->run_list)) {
+
        return le2proc(le, run_link);
+
    }
+
    return NULL;
+
}

+
+ +

 

+ +

RR_dequeue的函数实现如下表所示。即把就绪进程队列rq的进程控制块指针的队列元素删除,并把表示就绪进程个数的proc_num减一。

+ + + + + +
+

static void
+
FCFS_dequeue(struct run_queue *rq, struct proc_struct *proc) {
+
    assert(!list_empty(&(proc->run_link)) && proc->rq == rq);
+
    list_del_init(&(proc->run_link));
+
    rq->proc_num --;
+
}

+
+ +

 

+ +

RR_proc_tick的函数实现如下表所示。即每次timer到时后,trap函数将会间接调用此函数来把当前执行进程的时间片time_slice减一。如果time_slice降到零,则设置此进程成员变量need_resched标识为1,这样在下一次中断来后执行trap函数时,会由于当前进程程成员变量need_resched标识为1而执行schedule函数,从而把当前执行进程放回就绪队列末尾,而从就绪队列头取出在就绪队列上等待时间最久的那个就绪进程执行。

+ + + + + +
+

static void
+
RR_proc_tick(struct run_queue *rq, struct proc_struct *proc) {
+
    if (proc->time_slice > 0) {
+
        proc->time_slice --;
+
    }
+
    if (proc->time_slice == 0) {
+
        proc->need_resched = 1;
+
    }
+
}

+
+ +

 

+ +

3.6   Stride Scheduling

+ +

3.6.1 基本思路

+ +

【提示】请先看练习2中提到的论文。理解后在看下面的内容。

+ +

考察 round-robin 调度器,在假设所有进程都充分使用了其拥有的 CPU 时间资源的情况下,所有进程得到的 CPU 时间应该是相等的。但是有时候我们希望调度器能够更智能地为每个进程分配合理的 +CPU 资源。假设我们为不同的进程分配不同的优先级,则我们有可能希望每个进程得到的时间资源与他们的优先级成正比关系。Stride调度是基于这种想法的一个较为典型和简单的算法。除了简单易于实现以外,它还有如下的特点:

+ +

可控性:如我们之前所希望的,可以证明 Stride  Scheduling 对进程的调度次数正比于其优先级。

+ +

确定性:在不考虑计时器事件的情况下,整个调度机制都是可预知和重现的。 该算法的基本思想可以考虑如下:

+ +

1.  为每个runnable的进程设置一个当前状态 stride,表示该进程当前的调度权。另外定义其对应的pass +值,表示对应进程在调度后,stride 需要进行的累加值。

+ +

2.  每次需要调度时,从当前 +runnable 态的进程中选择 stride  最小的进程调度。

+ +

3.  对于获得调度的进程P,将对应的stride加上其对应的步长 pass(只与进程的优先权有关系)。

+ +

4.  在一段固定的时间之后,回到 +2.步骤,重新调度当前stride最小的进程。 可以证明,如果令

+ +

P.pass +=BigStride / P.priority

+ +

其中 P.priority 表示进程的优先权(大于 1),而 BigStride 表示一个预先定义的大常数,则该调度方案为每个进程分配的时间将与其优先级成正比。证明过程我们在这里略去,有兴趣的同学可以在网上查找相关资料。将该调度器应用到 +ucore 的调度器框架中来,则需要将调度器接口实现如下:

+ +

init:

+ +

 初始化调度器类的信息(如果有的话

+ +

 初始化当前运行队列为一个空的容器结比如RR调度算法一样,初始化为一个有序列表)

+ +

enqueue

+ +

 初始化刚进入运行队列的进程 procstride属性。

+ +

  proc插入放入运行队列中去(注意:这里并不要求放置在队列头部

+ +

dequeue

+ +

 运行队列中删除相应的元素。

+ +

pick next

+ +

 扫描整个运行队列,返回其中stride值最小的对应进程。

+ +

 更新对应进程stride

+ +

pass = BIG_STRIDE / P->priority; P->stride += pass

+ +

proc tick:

+ +

  +检测当前进程是否已用完分配的时间片。如果时间片用完,应该正确设置进程 结构的相关标记来引起进程切换。

+ +

  +一个 process 最多可以连续运行 +rq.max_time_slice个时间片。

+ +

在具体实现时,有一个需要注意的地方:stride属性的溢出问题,在之前的实现里面 +我们并没有考虑 stride  的数值范围,而这个值在理论上是不断增加的,在 stride溢出以后,基于 stride的比较可能会出现错误。比如假设当前存在两个进程ABstride属性采用16位无符号整数进行存储。当前队列中元素如下(假设当前运行的进程已经被重新放置进运行队列

+ +

+ + + + + + + + + +
+ +
+

+ +

此时应该选择 A 作为调度的进程,而在一轮调度后,队列将如下:

+ +

+ + + + + + + + + +
+ +
+

+ +

可以看到由于溢出的出现,进程间stride的理论比较和实际比较结果出现了偏差。我们首先在理论上分析这个问题:令PASS_MAX为当前所有进程里最大的步进值。则我们可以证明如下结论:对每次 Stride 调度器的调度步骤中,有其最大的步进值STRIDE_MAX和最小的步进值STRIDE_MIN 之差:

+ +

STRIDE_MAX +STRIDE_MIN <= PASS_MAX

+ +

提问 1:如何证明该结论? 有了该结论,在加上之前对优先级有Priority +> 1 限制,我们有

+ +

STRIDE_MAX +STRIDE_MIN <= BIG_STRIDE

+ +

于是我们只要将BigStride取在某个范围之内,即可保证对于任意两个 +Stride 之差都会在机器整数表示的范围之内。而我们可以通过其与0的比较结构,来得到两个 +Stride的大小关系。在上例中,虽然在直接的数值表示上 98 < 65535,但是 98 - 65535 的结果用带符号的 16位整数表示的结果为99, 与理论值之差相等。所以在这个意义下 98 +> 65535。 基于这种特殊考虑的比较方法,即便 Stride有可能溢出,我们仍能够得到理论上的当前最小Stride,并做出正确的调度决定。

+ +

提问 2:在 ucore 中,目前 +Stride是采用无符号的32位整数表示。则BigStride应该取多少,才能保证比较的正确性?

+ +

 

+ +

3.6.2  使用优先队列实现 Stride Scheduling

+ +

 

+ +

在上述的实现描述中,对于每一次pick_next函数,我们都需要完整地扫描来获得当前最小的stride及其进程。这在进程非常多的时候是非常耗时和低效的,有兴趣的同学可以在实 现了基于列表扫描的Stride调度器之后比较一下priority程序在Round-RobinStride调度器下各自的运行时间。考虑到其调度选择于优先队列的抽象逻辑一致,我们考虑使用优化的优先队列数据结构实现该调度。

+ +

优先队列是这样一种数据结构:使用者可以快速的插入和删除队列中的元素,并且在预先指定的顺序下快速取得当前在队列中的最小(或者最大)值及其对应元素。可以看到,这样的数据结构非常符合 Stride  调度器的实现。

+ +

本次实验提供了libs/skew_heap.h  作为优先队列的一个实现,该实现定义相关的结构和接口,其中主要包括:

+ + + + + +
+

1   // 优先队列节点的结构

+

2   typedef + struct skew_heap_entry  skew_heap_entry_t;

+

3   // 初始化一个队列节点

+

4   void + skew_heap_init(skew_heap_entry_t *a);

+

5   // 将节点 b 插入至以节点 a 为队列头的队列中去,返回插入后的队列

+

6   skew_heap_entry_t  + *skew_heap_insert(skew_heap_entry_t  *a,

+

7                                        skew_heap_entry_t  + *b,

+

8                                        compare_f + comp);

+

9   // 将节点 b 插入从以节点 a 为队列头的队列中去,返回删除后的队列

+

10      skew_heap_entry_t  + *skew_heap_remove(skew_heap_entry_t  *a,

+

11                                           + skew_heap_entry_t  *b,

+

12                                           + compare_f comp);

+
+ +

 

+ +

其中优先队列的顺序是由比较函数comp决定的,sched_stride.c中提供了proc_stride_comp_f比较器用来比较两个stride的大小,你可以直接使用它。当使用优先队列作为Stride调度器的实现方式之后,运行队列结构也需要作相关改变,其中包括:

+ +

struct run_queue中的lab6_run_pool指针,在使用优先队列的实现中表示当前优先队列 的头元素,如果优先队列为空,则其指向空指针(NULL)。

+ +

struct proc_struct中的lab6_run_pool结构,表示当前进程对应的优先队列节点。 本次实验已经修改了系统相关部分的代码,使得其能够很好地适应LAB6 新加入的数据结构和接口。而在实验中我们需要做的是用优先队列实现一个正确和高效的Stride度器,如果用较简略的伪代码描述,则有:

+ +

 

+ +

init(rq):

+ +

 

+ +

 Initialize rq->run_list

+ +

 Set rq->lab6_run_pool to NULL

+ +

 Set rq->proc_num to 0

+ +

 

+ +

enqueue(rq, proc)

+ +

 

+ +

 Initialize proc->time_slice

+ +

 Insert proc->lab6_run_pool into rq->lab6_run_pool

+ +

 rq->proc_num ++

+ +

 

+ +

dequeue(rq, proc)

+ +

 

+ +

 Remove proc->lab6_run_pool from rq->lab6_run_pool

+ +

 rq->proc_num --

+ +

 

+ +

pick_next(rq)

+ +

 

+ +

 If rq->lab6_run_pool == NULL, return NULL

+ +

 Find the proc corresponding to the pointer rq->lab6_run_pool

+ +

 proc->lab6_stride += BIG_STRIDE / proc->lab6_priority

+ +

 Return proc

+ +

 

+ +

proc_tick(rq, proc):

+ +

 

+ +

 If proc->time_slice > 0, proc->time_slice --

+ +

 If proc->time_slice == 0, set the flag proc->need_resched

+ +

 

+ +

4 实验报告要求

+ +

从网站上下载lab6.zip后,解压得到本文档和代码目录 lab6,完成实验中的各个练习。完成代码编写并检查无误后,在对应目录下执行 make handin 任务,即会自动生成 lab6-handin.tar.gz。最后请一定提前或按时提交到网络学堂上。

+ +

注意有“LAB6”的注释,主要是修改default_sched_swide_c中的内容。代码中所有需要完成的地方challenge除外)都有“LAB6”和“YOUR CODE”的注释,请在提交时特别注意保持注释,并将“YOUR +CODE”替换为自己的学号,并且将所有标有对应注释的部分填上正确的代码。

+ +

 

+ +

附录:执行priority大致的显示输出

+ + + + + +
+

$ make run-priority

+

......

+

check_swap() succeeded!

+

++ setup timer interrupts

+

kernel_execve: pid = 2, name = "priority".

+

main: fork ok,now need to wait pids.

+

child pid 7, acc 2492000, time 2001

+

child pid 6, acc 1944000, time 2001

+

child pid 4, acc 960000, time 2002

+

child pid 5, acc 1488000, time 2003

+

child pid 3, acc 540000, time 2004

+

main: pid 3, acc 540000, time 2004

+

main: pid 4, acc 960000, time 2004

+

main: pid 5, acc 1488000, time 2004

+

main: pid 6, acc 1944000, time 2004

+

main: pid 7, acc 2492000, time 2004

+

main: wait pids over

+

stride sched correct result: 1 2 3 4 5

+

all user-mode processes have quit.

+

init check memory pass.

+

kernel panic at kern/process/proc.c:426:

+

    initproc exit.

+

 

+

Welcome to the kernel debug monitor!!

+

Type 'help' for a list of commands.

+

K>

+
+ +

 

+ +
+ + + + diff --git a/lab7.files/image001.png b/lab7.files/image001.png new file mode 100644 index 0000000000000000000000000000000000000000..7806b0c40762aced4aec05c4681a4d967371cef1 GIT binary patch literal 47000 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 + + + + + + + + + + +

+ +

实验七:同步互斥

+ +

1. 实验目的

+ +

       +熟悉ucore中的进程同步机制,了解操作系统为进程同步提供的底层支持;

+ +

       +ucore中理解信号量(semaphore)机制的具体实现;

+ +

       +理解管程机制,在ucore内核中增加基于管程(monitor)的条件变量(condition variable)的支持;

+ +

       +了解经典进程同步问题,并能使用同步机制解决进程同步问题。

+ +

2 实验内容

+ +

实验六完成了用户进程的调度框架和具体的调度算法,可调度运行多个进程。如果多个进程需要协同操作或访问共享资源,则存在如何同步和有序竞争的问题。本次实验,主要是熟悉ucore的进程同步机制信号量(semaphore)机制,以及基于信号量的哲学家就餐问题解决方案。然后掌握管程的概念和原理,并参考信号量机制,实现基于管程的条件变量机制和基于条件变量来解决哲学家就餐问题。

+ +

在本次实验中,在kern/sync/check_sync.c中提供了一个基于信号量的哲学家就餐问题解法。同时还需完成练习,即实现基于管程(主要是灵活运用条件变量和互斥信号量)的哲学家就餐问题解法。哲学家就餐问题描述如下:有五个哲学家,他们的生活方式是交替地进行思考和进餐。哲学家们公用一张圆桌,周围放有五把椅子,每人坐一把。在圆桌上有五个碗和五根筷子,当一个哲学家思考时,他不与其他人交谈,饥饿时便试图取用其左、右最靠近他的筷子,但他可能一根都拿不到。只有在他拿到两根筷子时,方能进餐,进餐完后,放下筷子又继续思考。

+ +

2.1 练习

+ +

练习0:填写已有实验

+ +

本实验依赖实验1/2/3/4/5/6。请把你做的实验1/2/3/4/5/6的代码填入本实验中代码中有“LAB1”/“LAB2”/“LAB3”/“LAB4”/“LAB5”/“LAB6”的注释相应部分。并确保编译通过。注意:为了能够正确执行lab7的测试应用程序,可能需对已完成的实验1/2/3/4/5/6的代码进行进一步改进。

+ +

练习1 理解内核级信号量的实现和基于内核级信号量的哲学家就餐问题(不需要编码)

+ +

完成练习0后,建议大家比较一下(可用kdiff3等文件比较软件)个人完成的lab6和练习0完成后的刚修改的lab7之间的区别,分析了解lab7采用信号量的执行过程。执行make grade,大部分测试用例应该通过。

+ +

 

+ +

练习2 完成内核级条件变量和基于内核级条件变量的哲学家就餐问题(需要编码)

+ +

首先掌握管程机制,然后基于信号量实现完成条件变量实现,然后用管程机制实现哲学家就餐问题的解决方案(基于条件变量)。

+ +

执行:make +grade 。如果所显示的应用程序检测都输出ok,则基本正确。如果只是某程序过不去,比如matrix.c,则可执行 make run-matrix 命令来单独调试它。大致执行结果可看附录。(使用的是qemu-1.0.1)。

+ +

扩展练习Challenge:实现LinuxRCU

+ +

ucore +下实现下LinuxRCU同步互斥机制。可阅读相关Linux内核书籍或查询网上资料,可了解RCU的细节,然后大致实现在ucore中。下面是一些参考资料:

+ +

       +http://www.ibm.com/developerworks/cn/linux/l-rcu/

+ +

       +http://www.diybl.com/course/6_system/linux/Linuxjs/20081117/151814.html

+ +

2.2 项目组成

+ +

此次实验中,主要有如下一些需要关注的文件:

+ + + + + +
+

.

+

├── boot

+

├── kern

+

   + ├── driver

+

   + ├── fs

+

   + ├── init

+

   + ├── libs

+

   + ├── mm

+

     + ├── ......

+

     + ├── vmm.c

+

     + └── vmm.h

+

   + ├── process

+

     + ├── proc.c

+

     + ├── proc.h

+

     + └──......

+

   + ├── schedule

+

   + ├── sync

+

     + ├── check_sync.c

+

     + ├── monitor.c

+

     + ├── monitor.h

+

     + ├── sem.c

+

     + ├── sem.h

+

     + ├── sync.h

+

     + ├── wait.c

+

     + └── wait.h

+

   + ├── syscall

+

     + ├── syscall.c

+

     + └──......

+

   + └── trap

+

├── libs

+

└── user

+

    ├── forktree.c

+

    ├── libs

+

    │   + ├── syscall.c

+

    │   + ├── syscall.h

+

    │   + ├── ulib.c

+

    │   + ├── ulib.h

+

    │   + └── ......

+

    ├── priority.c

+

    ├── sleep.c

+

    ├── sleepkill.c

+

    ├── softint.c

+

    ├── spin.c

+

    └── ......

+
+ +

 

+ +

简单说明如下:

+ +

       +kern/sync/sync.h: 去除了lock实现(这对于不抢占内核没用)。

+ +

       +kern/sync/wait.[ch]: 定了为wait结构和waitqueue结构以及在此之上的函数,这是ucore中的信号量semophore机制和条件变量机制的基础,在本次实验中你需要了解其实现。

+ +

       +kern/sync/sem.[ch]:定义并实现了ucore中内核级信号量相关的数据结构和函数,本次试验中你需要了解其中的实现,并基于此完成内核级条件变量的设计与实现。

+ +

       +user/ libs/ {syscall.[ch],ulib.[ch] }kern/sync/syscall.c:实现了进程sleep相关的系统调用的参数传递和调用关系。

+ +

       +user/{ sleep.c,sleepkill.c}: 进程睡眠相关的一些测试用户程序。

+ +

       +kern/sync/monitor.[ch]: 基于管程的条件变量的实现程序,在本次实验中是练习的一部分,要求完成。

+ +

       +kern/sync/check_sync.c:实现了基于管程的哲学家就餐问题,在本次实验中是练习的一部分,要求完成基于管程的哲学家就餐问题。

+ +

       +kern/mm/vmm.[ch]:用信号量mm_sem取代mm_struct中原有的mm_lock。(本次实验不用管)

+ +

 

+ +

3   同步互斥的设计与实现

+ +

3.1实验执行流程概述

+ +

互斥是指某一资源同时只允许一个进程对其进行访问,具有唯一性和排它性,但互斥不用限制进程对资源的访问顺序,即访问可以是无序的。同步是指在进程间的执行必须严格按照规定的某种先后次序来运行,即访问是有序的,这种先后次序取决于要系统完成的任务需求。在进程写资源情况下,进程间要求满足互斥条件。在进程读资源情况下,可允许多个进程同时访问资源。

+ +

实验七提供了多种同步互斥手段,包括中断控制、等待队列、信号量、管程机制(包含条件变量设计)等,并基于信号量实现了哲学家问题的执行过程。而练习是要求用管程机制实现哲学家问题的执行过程。在实现信号量机制和管程机制时,需要让无法进入临界区的进程睡眠,为此在ucore中设计了等待队列。当进程无法进入临界区(即无法获得信号量)时,可让进程进入等待队列,这时的进程处于等待状态(也可称为阻塞状态),从而会让实验六中的调度器选择一个处于就绪状态(即RUNNABLE +STATE)的进程,进行进程切换,让新进程有机会占用CPU执行,从而让整个系统的运行更加高效。

+ +

在实验七中的ucore初始化过程,开始的执行流程都与实验六相同,直到执行到创建第二个内核线程init_main时,修改了init_main的具体执行内容,即增加了check_sync函数的调用,而位于lab7/kern/sync/check_sync.c中的check_sync函数可以理解为是实验七的起始执行点,是实验七的总控函数。进一步分析此函数,可以看到这个函数主要分为了两个部分,第一部分是实现基于信号量的哲学家问题,第二部分是实现基于管程的哲学家问题。

+ +

对于check_sync函数的第一部分,首先实现初始化了一个互斥信号量,然后创建了对应5个哲学家行为的5个信号量,并创建5个内核线程代表5个哲学家,每个内核线程完成了基于信号量的哲学家吃饭睡觉思考行为实现。这部分是给学生作为练习参考用的。学生可以看看信号量是如何实现的,已经如何利用信号量完成哲学家问题。

+ +

对于check_sync函数的第二部分,首先初始化了管程,然后又创建了5个内核线程代表5个哲学家,每个内核线程要完成基于管程的哲学家吃饭睡觉思考行为实现。这部分需要学生来具体完成。学生需要掌握如何用信号量来实现条件变量,以及包含条件变量的管程如何能够确保哲学家能够正常思考和吃饭。

+ +

 

+ +

3.2 同步互斥的底层支撑

+ +

开关中断

+ +

根据操作系统原理的知识,我们知道如果没有在硬件级保证读内存-修改值-写回内存的原子性,我们只能通过复杂的软件来实现同步互斥操作。但由于有开关中断和test_and_set_bit等原子操作机器指令的存在,使得我们在实现同步互斥原语上可以大大简化。在atomic.c文件中实现的test_and_set_bit等原子操作。

+ +

ucore中提供的底层机制包括中断开关控制和test_and_set相关原子操作机器指令。kern/sync.c中实现的开关中断的控制函数local_intr_save(x)local_intr_restore(x),它们是基于kern/driver文件下的intr_enable()intr_disable()函数实现的。具体调用关系为:

+ +

 

+ + + + + +
+

关中断:local_intr_save --> __intr_save --> intr_disable --> cli

+

开中断:local_intr_restore--> + __intr_restore --> intr_enable --> sti

+
+ +

 

+ +

最终的clistix86的机器指令,最终实现了关中断和开中断,即设置了eflags寄存器中与中断相关的位。通过关闭中断,可以防止对当前执行的控制流被其他中断事件处理所打断。既然不能中断,那也就意味着在内核运行的当前进程无法被打断或被从新调度,即实现了对临界区的互斥操作。所以在单处理器情况下,可以通过开关中断实现对临界区的互斥保护,需要互斥的临界区代码的一般写法为:

+ + + + + +
+

local_intr_save(intr_flag);
+
{
+   
临界区代码

+

}
+
local_intr_restore(intr_flag);

+

……

+
+ +

由于目前ucore只实现了对单处理器的支持,所以通过这种方式,就可简单地支撑互斥操作了。在多处理器情况下,这种方法是无法实现互斥的,因为屏蔽了一个CPU的中断,只能阻止本CPU上的进程不会被中断或调度,并不意味着其他CPU上执行的进程不能执行临界区的代码。所以,开关中断只对单处理器下的互斥操作起作用。在本实验中,开关中断机制是实现信号量等高层同步互斥原语的底层支撑基础之一。

+ +

 

+ +

等待队列

+ +

到目前为止,我们的实验中,用户进程或内核线程还没有睡眠的支持机制。在课程中提到用户进程或内核线程可以转入休眠状态以等待某个特定事件,当该事件发生时这些进程能够被再次唤醒。内核实现这一功能的一个底层支撑机制就是等待队列(wait +queue),等待队列和每一个事件(睡眠结束、时钟到达、任务完成、资源可用等)联系起来。需要等待事件的进程在转入休眠状态后插入到等待队列中。当事件发生之后,内核遍历相应等待队列,唤醒休眠的用户进程或内核线程,并设置其状态为就绪状态(runnable +state),并将该进程从等待队列中清除。ucorekern/sync/{ +wait.h, wait.c }中实现了wait结构和wait queue结构以及相关函数),这是实现ucore中的信号量机制和条件变量机制的基础,进入wait queue的进程会被设为睡眠状态,直到他们被唤醒。

+ +
+ +

typedef + struct {

+ +

    +struct proc_struct *proc;     //等待进程的指针

+ +

    +uint32_t wakeup_flags;               //进程被放入等待队列的原因标记

+ +

    +wait_queue_t *wait_queue;   //指向此wait结构所属于的wait_queue

+ +

    +list_entry_t wait_link;         //用来组织wait_queuewait节点的连接

+ +

} +wait_t;

+ +

typedef +struct {

+ +

    +list_entry_t wait_head;        //wait_queue的队头

+ +

} +wait_queue_t;

+ +

le2wait(le, +member)                         //实现wait_t中成员的指针向wait_t 指针的转化

+ +
+ +

 

+ +

waitwait queue相关的函数主要分为两层,底层函数是对wait queue的初始化、插入、删除和查找操作,相关函数如下:

+ + + + + +
+

void wait_init(wait_t *wait, struct proc_struct *proc);    + //初始化wait结构

+

bool wait_in_queue(wait_t *wait);                          + //wait是否在wait queue

+

void wait_queue_init(wait_queue_t *queue);                 + //初始化wait_queue结构

+

void wait_queue_add(wait_queue_t *queue, wait_t *wait);    + //wait前插到wait queue

+

void wait_queue_del(wait_queue_t *queue, wait_t *wait);    + //wait queue中删除wait

+

wait_t *wait_queue_next(wait_queue_t *queue, wait_t + *wait);//取得wait的后一个链接指针

+

wait_t *wait_queue_prev(wait_queue_t *queue, wait_t + *wait);//取得wait的前一个链接指针

+

wait_t *wait_queue_first(wait_queue_t *queue);             + //取得wait queue的第一个wait

+

wait_t *wait_queue_last(wait_queue_t *queue);              + //取得wait queue的最后一个wait

+

bool wait_queue_empty(wait_queue_t *queue);                + //wait queue是否为空

+
+ +

 

+ +

高层函数基于底层函数实现了让进程进入等待队列,以及从等待队列中唤醒进程,相关函数如下:

+ + + + + +
+

//wait与进程关联,且让当前进程关联的wait进入等待队列queue,当前进程睡眠

+

void wait_current_set(wait_queue_t *queue, wait_t *wait, + uint32_t wait_state);

+

//把与当前进程关联的wait从等待队列queue中删除

+

wait_current_del(queue, wait);

+

//唤醒与wait关联的进程

+

void wakeup_wait(wait_queue_t *queue, wait_t *wait, + uint32_t wakeup_flags, bool del);

+

//唤醒等待队列上挂着的第一个wait所关联的进程

+

void wakeup_first(wait_queue_t *queue, uint32_t + wakeup_flags, bool del);

+

//唤醒等待队列上所有的等待的进程

+

void wakeup_queue(wait_queue_t *queue, uint32_t + wakeup_flags, bool del);

+
+ +

 

+ +

3.3 信号量

+ +

信号量是一种同步互斥机制的实现,普遍存在于现在的各种操作系统内核里。相对于spinlock +的应用对象,信号量的应用对象是在临界区中运行的时间较长的进程。等待信号量的进程需要睡眠来减少占用 +CPU 的开销。参考教科书“Operating +Systems Internals and Design Principles”第五章“同步互斥”中对信号量实现的原理性描述:

+ + + + + +
+

struct semaphore {

+

int count;

+

queueType queue;

+

};

+

void semWait(semaphore s)

+

{

+

s.count--;

+

if (s.count < 0) {

+

/* place this process in s.queue + */;

+

/* block this process */;

+

}

+

}

+

void semSignal(semaphore s)

+

{

+

s.count++;

+

if + (s.count<= 0) {

+

/* remove a + process P from s.queue */;

+

/* place + process P on ready list */;

+

}

+

}

+
+ +

 

+ +

基于上诉信号量实现可以认为,当多个(>1)进程可以进行互斥或同步合作时,一个进程会由于无法满足信号量设置的某条件而在某一位置停止,直到它接收到一个特定的信号(表明条件满足了)。为了发信号,需要使用一个称作信号量的特殊变量。为通过信号量s传送信号,信号量的V操作采用进程可执行原语semSignal(s) ;为通过信号量s接收信号,信号量的P操作采用进程可执行原语semWait(s ) ;如果相应的信号仍然没有发送,则进程被阻塞或睡眠,直到发送完为止。

+ +

ucore中信号量参照上述原理描述,建立在开关中断机制和wait queue的基础上进行了具体实现。信号量的数据结构定义如下:

+ +
+ +

typedef +struct {

+ +

    +int value;                           //信号量的当前值

+ +

    +wait_queue_t wait_queue;     //信号量对应的等待队列

+ +

} +semaphore_t;

+ +
+ +

 

+ +

semaphore_t是最基本的记录型信号量(record semaphore)结构,包含了用于计数的整数值value,和一个进程等待队列wait_queue,一个等待的进程会挂在此等待队列上。

+ +

ucore中最重要的信号量操作是P操作函数down(semaphore_t *sem)V操作函数 up(semaphore_t *sem)。但这两个函数的具体实现是__down(semaphore_t +*sem, uint32_t wait_state) 函数和__up(semaphore_t +*sem, uint32_t wait_state)函数,二者的具体实现描述如下:

+ +

       +__down(semaphore_t *sem, uint32_t wait_state, timer_t +*timer):具体实现信号量的P操作,首先关掉中断,然后判断当前信号量的value是否大于0。如果是>0,则表明可以获得信号量,故让value减一,并打开中断返回即可;如果不是>0,则表明无法获得信号量,故需要将当前的进程加入到等待队列中,并打开中断,然后运行调度器选择另外一个进程执行。如果被V操作唤醒,则把自身关联的wait从等待队列中删除(此过程需要先关中断,完成后开中断)。具体实现如下所示:

+ + + + + +
+

static __noinline uint32_t __down(semaphore_t *sem, uint32_t wait_state) {
+     
bool intr_flag;
+     
local_intr_save(intr_flag);
+     
if (sem->value > 0) {
+         
sem->value --;
+         
local_intr_restore(intr_flag);
+         
return 0;
+     
}
+     
wait_t __wait, *wait = &__wait;
+     
wait_current_set(&(sem->wait_queue), wait, wait_state);
+     
local_intr_restore(intr_flag);
+
+     
schedule();
+
+     
local_intr_save(intr_flag);
+     
wait_current_del(&(sem->wait_queue), wait);
+     
local_intr_restore(intr_flag);
+
+     
if (wait->wakeup_flags != wait_state) {
+         
return wait->wakeup_flags;
+     
}
+     
return 0;
+
}

+

       +  

+
+ +

 

+ +

 

+ +

       +__up(semaphore_t *sem, uint32_t wait_state):具体实现信号量的V操作,首先关中断,如果信号量对应的wait queue中没有进程在等待,直接把信号量的value加一,然后开中断返回;如果有进程在等待且进程等待的原因是semophore设置的,则调用wakeup_wait函数将waitqueue中等待的第一个wait删除,且把此wait关联的进程唤醒,最后开中断返回。具体实现如下所示:

+ + + + + +
+

static __noinline void __up(semaphore_t *sem, uint32_t wait_state) {
+     
bool intr_flag;
+     
local_intr_save(intr_flag);
+     
{
+         
wait_t *wait;
+         
if ((wait = wait_queue_first(&(sem->wait_queue))) == NULL) {
+             
sem->value ++;
+         
}
+         
else {
+             
wakeup_wait(&(sem->wait_queue), wait, wait_state, 1);
+         
}
+     
}
+     
local_intr_restore(intr_flag);
+
}

+
+ +

 

+ +

对照信号量的原理性描述和具体实现,可以发现二者在流程上基本一致,只是具体实现采用了关中断的方式保证了对共享资源的互斥访问,通过等待队列让无法获得信号量的进程睡眠等待。另外,我们可以看出信号量的计数器value具有有如下性质:

+ +

       +value>0,表示共享资源的空闲数

+ +

       +vlaue<0,表示该信号量的等待队列里的进程数

+ +

       +value=0,表示等待队列为空

+ +

 

+ +

3.4 管程和条件变量

+ +

引入了管程是为了将对共享资源的所有访问及其所需要的同步操作集中并封装起来。Hansan为管程所下的定义:一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据。有上述定义可知,管程由四部分组成:

+ +

       +管程内部的共享变量;

+ +

       +管程内部的条件变量;

+ +

       +管程内部并发执行的进程;

+ +

       +对局部于管程内部的共享数据设置初始值的语句。

+ +

局限在管程中的数据结构,只能被局限在管程的操作过程所访问,任何管程之外的操作过程都不能访问它;另一方面,局限在管程中的操作过程也主要访问管程内的数据结构。由此可见,管程相当于一个隔离区,它把共享变量和对它进行操作的若干个过程围了起来,所有进程要访问临界资源时,都必须经过管程才能进入,而管程每次只允许一个进程进入管程,从而需要确保进程之间互斥。

+ +

但在管程中仅仅有互斥操作是不够用的。进程可能需要等待某个条件C为真才能继续执行。如果采用忙等(busy waiting)方式:

+ + + + + +
+

   while not( C ) do {}

+
+ +

在单处理器情况下,将会导致所有其它进程都无法进入临界区使得该条件C为真,该管程的执行将会发生死锁。为此,可引入条件变量(Condition Variables,简称CV)。一个条件变量CV可理解为一个进程的等待队列,队列中的进程正等待某个条件C变为真。每个条件变量关联着一个断言Pc。当一个进程等待一个条件变量,该进程不算作占用了该管程,因而其它进程可以进入该管程执行,改变管程的状态,通知条件变量CV其关联的断言Pc在当前状态下为真。因此对条件变量CV有两种主要操作:

+ +

l  +wait_cv 被一个进程调用,以等待断言Pc被满足后该进程可恢复执行. 进程挂在该条件变量上等待时,不被认为是占用了管程。

+ +

l  +signal_cv:被一个进程调用,以指出断言Pc现在为真,从而可以唤醒等待断言Pc被满足的进程继续执行。

+ +

有了互斥和信号量支持的管程就可用用了解决各种同步互斥问题。比如参考《OS +Concept》一书中的6.7.2小节“用管程解决哲学家就餐问题”就给出了这样的事例:

+ +

l 

+ +

 

+ +

虽然大部分教科书上说明管程适合在语言级实现比如java等高级语言,没有提及在采用C语言的OS中如何实现。下面我们将要尝试在ucore中用C语言实现采用基于互斥和条件变量机制的管程基本原理。

+ +

ucore中的管程机制是基于信号量和条件变量来实现的。ucore中的管程的数据结构monitor_t定义如下:

+ +

 

+ + + + + +
+

typedef struct monitor{

+

    + semaphore_t mutex;      // the mutex lock for going into the routines + in monitor, should be initialized to 1

+

semaphore_t next;       // the next semaphore is used + to down the signaling proc itself, and the other OR wakeuped

+

//waiting proc should wake up the sleeped + signaling proc.

+

    + int next_count;         // the number of of sleeped signaling proc

+

    + condvar_t *cv;          // the condvars in monitor

+

} monitor_t;

+
+ +

 

+ +

管程中的成员变量mutex是一个二值信号量,是实现每次只允许一个进程进入管程的关键元素,确保了互斥访问性质。管程中的条件变量cv通过执行wait_cv,会使得等待某个条件C为真的进程能够离开管程并睡眠,且让其他进程进入管程继续执行;而进入管程的某进程设置条件C为真并执行signal_cv时,能够让等待某个条件C为真的睡眠进程被唤醒,从而继续进入管程中执行。管程中的成员变量信号量next和整形变量next_count是配合进程对条件变量cv的操作而设置的,这是由于发出signal_cv的进程A会唤醒睡眠进程B,进程B执行会导致进程A睡眠,直到进程B离开管程,进程A才能继续执行,这个同步过程是通过信号量next完成的;而next_count表示了由于发出singal_cv而睡眠的进程个数。

+ +

管程中的条件变量的数据结构condvar_t定义如下:

+ +

 

+ + + + + +
+

typedef struct + condvar{

+

    + semaphore_t sem; // the sem semaphore is used to down the waiting proc, + and the signaling proc should up the waiting proc

+

    + int count;       // the number of waiters on condvar

+

    + monitor_t * owner; // the owner(monitor) of this condvar

+

} + condvar_t;

+
+ +

 

+ +

条件变量的定义中也包含了一系列的成员变量,信号量sem用于让发出wait_cv操作的等待某个条件C为真的进程睡眠,而让发出signal_cv操作的进程通过这个sem来唤醒睡眠的进程。count表示等在这个条件变量上的睡眠进程的个数。owner表示此条件变量的宿主是哪个管程。

+ +

理解了数据结构的含义后,我们就可以开始管程的实现了。ucore设计实现了条件变量wait_cv操作和signal_cv操作对应的具体函数,即cond_wait函数和cond_signal函数,此外还有cond_init初始化函数(可直接看源码)。函数cond_wait(condvar_t +*cvp, semaphore_t *mp)cond_signal +(condvar_t *cvp)的实现原理可参考《OS +Concept》一书中的6.7.3小节用信号量实现管程的内容:

+ +

 

+ + + + + +
+

cond_wait的原理描述

+

 

+

cv.count++;

+

if(monitor.next_count > 0)

+

   sem_signal(monitor.next);

+

else

+

   sem_signal(monitor.mutex);

+

sem_wait(cv.sem);

+

cv.count -- ;

+
+ + + + + +
+

ond_signal的原理描述

+

 

+

if( cv.count > 0) {

+

   monitor.next_count ++;

+

   sem_signal(cv.sem);

+

   sem_wait(monitor.next);

+

   monitor.next_count -- ;

+

}

+
+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

  简单分析一下cond_wait函数的实现。可以看出如果进程A执行了cond_wait函数,表示此进程等待某个条件C不为真,需要睡眠。因此表示等待此条件的睡眠进程个数cv.count要加一。接下来会出现两种情况。

+ +

情况一:如果monitor.next_count如果大于0,表示有大于等于1个进程执行cond_signal函数且睡着了,就睡在了monitor.next信号量上。假定这些进程形成S进程链表。因此需要唤醒S进程链表中的一个进程B。然后进程A睡在cv.sem上,如果睡醒了,则让cv.count减一,表示等待此条件的睡眠进程个数少了一个,可继续执行了!这里隐含这一个现象,即某进程A在时间顺序上先执行了signal_cv,而另一个进程B后执行了wait_cv,这会导致进程A没有起到唤醒进程B的作用。这里还隐藏这一个问题,在cond_waitsem_signal(mutex),但没有看到哪里有sem_wait(mutex),这好像没有成对出现,是否是错误的?其实在管程中的每一个函数的入口处会有wait(mutex),这样二者就配好对了。

+ +

情况二:如果monitor.next_count如果小于等于0,表示目前没有进程执行cond_signal函数且睡着了,那需要唤醒的是由于互斥条件限制而无法进入管程的进程,所以要唤醒睡在monitor.mutex上的进程。然后进程A睡在cv.sem上,如果睡醒了,则让cv.count减一,表示等待此条件的睡眠进程个数少了一个,可继续执行了!

+ +

对照着再来看cond_signal的实现。首先进程B判断cv.count,如果不大于0,则表示当前没有执行cond_wait而睡眠的进程,因此就没有被唤醒的对象了,直接函数返回即可;如果大于0,这表示当前有执行cond_wait而睡眠的进程A,因此需要唤醒等待在cv.sem上睡眠的进程A。由于只允许一个进程在管程中执行,所以一旦进程B唤醒了别人(进程A),那么自己就需要睡眠。故让monitor.next_count加一,且让自己(进程B)睡在信号量monitor.next上。如果睡醒了,这让monitor.next_count减一。

+ +

为了让整个管程正常运行,还需在管程中的每个函数的入口和出口增加相关操作,即:

+ + + + + +
+

function

+

{

+

sem.wait(monitor.mutex);

+

 

+

  the real body of function;

+

 

+

  if(monitor.next_count > 0)

+

     sem_signal(monitor.next);

+

  else

+

     sem_signal(monitor.mutex);

+

}

+
+ +

 

+ +

这样带来的作用有两个,(1)只有一个进程在执行管程中的函数。(2)避免由于执行了cond_signal函数而睡眠的进程无法被唤醒。对于第二点,如果进程A由于执行了cond_signal函数而睡眠(这会让monitor.next_count大于0,且执行sem_wait(monitor.next)),则其他进程在执行管程中的函数的出口,会判断monitor.next_count是否大于0,如果大于0,则执行sem_signal(monitor.next),从而执行了cond_signal函数而睡眠的进程被唤醒。上诉措施将使得管程正常执行。

+ +

需要注意的是,上述只是原理描述,与具体描述相比,还有一定的差距。需要大家在完成练习时仔细设计和实现。

+ +

 

+ +

4 实验报告要求

+ +

从网站上下载lab7.zip后,解压得到本文档和代码目录 lab7,完成实验中的各个练习。完成代码编写并检查无误后,在对应目录下执行 make handin 任务,即会自动生成 +lab7-handin.tar.gz。最后请一定提前或按时提交到网络学堂上。

+ +

注意有“LAB7”的注释,主要是修改condvar.ccheck_sync.c中的内容。代码中所有需要完成的地方challenge除外)都有“LAB7”“YOUR CODE”的注释,请在提交时特别注意保持注释,并将“YOUR +CODE”替换为自己的学号,并且将所有标有对应注释的部分填上正确的代码。

+ +

 

+ +

附录:执行”make run-matrix”的大致的显示输出

+ + + + + +
+

(THU.CST) os is loading + ...

+

……

+

check_alloc_page() succeeded!

+

……

+

check_swap() succeeded!

+

++ setup timer + interrupts

+

I am No.4 + philosopher_condvar

+

Iter 1, No.4 + philosopher_condvar is thinking

+

I am No.3 + philosopher_condvar

+

……

+

I am No.1 + philosopher_sema

+

Iter 1, No.1 + philosopher_sema is thinking

+

I am No.0 philosopher_sema

+

Iter 1, No.0 + philosopher_sema is thinking

+

kernel_execve: pid = 2, + name = “matrix”.

+

pid 14 is running (1000 + times)!.

+

pid 13 is running (1000 + times)!.

+

phi_test_condvar: + state_condvar[4] will eating

+

phi_test_condvar: + signal self_cv[4]

+

Iter 1, No.4 + philosopher_condvar is eating

+

phi_take_forks_condvar: + 3 didn’t get fork and will wait

+

phi_test_condvar: + state_condvar[2] will eating

+

phi_test_condvar: + signal self_cv[2]

+

Iter 1, No.2 + philosopher_condvar is eating

+

phi_take_forks_condvar: + 1 didn’t get fork and will wait

+

phi_take_forks_condvar: + 0 didn’t get fork and will wait

+

pid 14 done!.

+

pid 13 done!.

+

Iter 1, No.4 + philosopher_sema is eating

+

Iter 1, No.2 + philosopher_sema is eating

+

……

+

pid 18 done!.

+

pid 23 done!.

+

pid 22 done!.

+

pid 33 done!.

+

pid 27 done!.

+

pid 25 done!.

+

pid 32 done!.

+

pid 29 done!.

+

pid 20 done!.

+

matrix pass.

+

all user-mode processes + have quit.

+

init check memory pass.

+

kernel panic at + kern/process/proc.c:426:

+

    initproc exit.

+

 

+

Welcome to the kernel + debug monitor!!

+

Type 'help' for a list + of commands.

+

K> qemu: terminating + on signal 2

+

 

+
+ +

 

+ +
+ + + + diff --git a/lab8.files/image001.png b/lab8.files/image001.png new file mode 100644 index 0000000000000000000000000000000000000000..4bf6f9062ebab5331ab8cb4565e0041e2890fa2c GIT binary patch literal 113278 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 literal 0 HcmV?d00001 diff --git a/lab8.files/image002.png b/lab8.files/image002.png new file mode 100644 index 0000000000000000000000000000000000000000..6aab0ba7d42c451b5f1066790972521df3c41476 GIT binary patch literal 107546 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
  • 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 A5&!@I literal 0 HcmV?d00001 diff --git a/lab8.files/image003.png b/lab8.files/image003.png new file mode 100644 index 0000000000000000000000000000000000000000..f8ee367668f9789a7c0df0546ee17deecda96433 GIT binary patch literal 8578 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
    FK!(PA2=Et(NVlA7*t`2Di$`jGU!h z{p$JT--un-&iNkddUMT1cIfjGbyE}Gmz-DKv(L4u3ayaw>j`Gc41h!r19YHJwF}#L zKGBqBauoKxL!+3{hsl3h05$T|1xPL+iX`Um8#N{`PQzX?0i2yrY6fGPP7H5}CE5Hx zfKsZQNobo=t&%Di<)~VXrn;>=U9=NeZ|M*vG(0h`m`b~-+*6NcKn}$UKUO;iy7}o8 z!BP-9VY_3za6x1mhw2wjLZ9SEqL^yw7-6Xw}1i@Yy}EdllQl zZqt8U&d}SuP5dME{Bs2PxSh|VuFE_I^QJ<$Aq1i_@1%Q1hAhpF>=DR5PnC@Te| z&#y+$qJV%v@k@#bDi=4(B0EuNqm`_Oztj>zc}cvVV69Smw+oHD-mWx`i@NhetMVG# zL~aKMFI|qEP-uGml;u)g{8hUHU-~A;0|jKu64=E4mF++U_2V4>Zbd5YA85}&9!N9m zrk7-oI5(dsC@j?M`v|B@k^B$^!e1p)st|w#At5vn%sq;|U*?`X`8HU>&Gk&CFicr; zFZotnIpc_$u30-yNC1b+62LnAorJ=NqM*^`B^ARRV<= zYS++z%MgK|aQ}Pe^kKyiUdu0GOwOK}N1RfGf z;a}A}$kOaZ+O8yFKqR9?4&n}HIr)+|LSWK`HPpWI(909{)buF7d}^q2Oo&qF!$URR*N2Re&LGyzq%`IIICxUeFE+&B^s#lEXautRzl$%@;~?6Ym>vbZj}|%-TmRg4VjS2AVE-u2D*(ShUt3D;=UDSam&`Qo=Py# zYJM}*KK-z`R(YS}w%@Hr=S~LQpS3Au)4>HjY;P-@jdp7+)+k=~#PCMyfeDHJ%THc? zl2Ko5#69(Fb$Hpzm*;cewQ#)L?=$YVI)<-VSS2)kAwwk8x z=ldxvXLI}8?aS}4f7Vf~bAiQd@2ajTfv3*fE}N2Dzs%yIrB`0)&t;aUH25|{7vr5T z)d-jQ*2I*m7qzIT`}Lg6yL)d=QLGfd@i|OHPwcri-`zV2?w6D9*5<7@PBqUr__Ka- zFDOz2{1v1&`$})nRAfsuTxoIZuae7+EhlbGJZ5-)R>GYr4I4H@q{y-^n)BvC-p%dI zYB!VZ-A z$EydeG=F<7d1%G8_ps80`CBi)dk1W5UA4M)i|6c<*{|zFOuAn@VX(UF$L8}9$6Y6 zTaEJkr$6))R7hN(GVh?mMCs+P`<0c-|ET(Yx@zmD=oPiEls{0?ng=rPaW4pD_OO3r=9vH4iwn-bWX3Q)} z$+P>q@)YmfDABuKP2c)vTGa{sIC|Py6;xz4u-G^&m^kIj=a*>dnlSy^#g-ZQt$W7) zwEVxuONzH2{}6d%hBc$0(&CxInJU|l?(yR;V`=lMJR5yP@Yl9Aw+l~vI=B3s_0bI? zkRrif=t9)8`!&ss^QL%49x%QB;KaV#UD~%!H6<_0RXz3vQmOzKkpPPsVTBst`YTYm z)3{9tSSrCvKp0jeCXXi>H9wyWYw*`baHY*PRR{5>m8ZSvkMFj!9mHz zSh_Jo=%w~8mI-o2+jhK5VYulW49VEYWK$FHq)Y4TDKaYijwUbwfv2mV%Q~loCIH*T BG*JKm literal 0 HcmV?d00001 diff --git a/lab8.htm b/lab8.htm new file mode 100644 index 0000000..ff69e62 --- /dev/null +++ b/lab8.htm @@ -0,0 +1,3688 @@ + + + + + + +lab6_file system.doc + + + + + + +
    + + + +
    + +

    实验八:文件系统

    + +

     

    + +

    1. +实验目的

    + +

    通过完成次实验希望能到以下目标

    + +

           +了解基本的文件系统系统调用的实现方法;

    + +

           +了解一个基于索引节点组织方式的Simple FS文件系统的设计与实现;

    + +

           +了解文件系统抽象层-VFS的设计与实现;

    + +

    2. +实验内容

    + +

    实验七完成了在内核中的同步互斥实验。本次实验涉及的是文件系统,通过分析了解ucore文件系统的总体架构设计,完善读写文件操作,从新实现基于文件系统的执行程序机制(即改写do_execve),从而可以完成执行存储在磁盘上的文件和实现文件读写等功能。

    + +

    2.1 +练习

    + +

    练习0:填写已有实验

    + +

    本实验依赖实验1/2/3/4/5/6/7。请把你做的实验1/2/3/4/5/6/7的代码填入本实验中代码中有“LAB1”/“LAB2”/“LAB3”/“LAB4”/“LAB5”/“LAB6” +/“LAB7”的注释相应部分。并确保编译通过。注意:为了能够正确执行lab8的测试应用程序,可能需对已完成的实验1/2/3/4/5/6/7的代码进行进一步改进。

    + +

    练习1 完成读文件操作的实现(需要编码)

    + +

    首先了解打开文件的处理流程,然后参考本实验后续的文件读写操作的过程分析,编写在sfs_inode.csfs_io_nolock读文件中数据的实现代码

    + +

    练习2 完成基于文件系统的执行程序机制的实现(需要编码)

    + +

    改写proc.c中的load_icode函数和其他相关函数,实现基于文件系统的执行程序机制。执行:make qemu。如果能看看到sh用户程序的执行界面,则基本成功了。如果在sh用户界面上可以执行”ls”,”hello”等其他放置在sfs文件系统中的其他执行程序,则可以认为本实验基本成功。(使用的是qemu-1.0.1)。

    + +

    2.2  +项目组成

    + +

     

    + + + + + +
    +

    .

    +

    ├── boot

    +

    ├── kern

    +

       ├── debug

    +

       ├── driver

    +

          ├── clock.c

    +

          ├── clock.h

    +

          └── ……

    +

       + ├── fs

    +

       +    + ├── devs

    +

       +    +    + ├── dev.c

    +

       +    +    + ├── dev_disk0.c

    +

       +    +    + ├── dev.h

    +

       +    +    + ├── dev_stdin.c

    +

       +    +    + └── + dev_stdout.c

    +

       +    + ├── file.c

    +

       +    + ├── file.h

    +

       +    + ├── fs.c

    +

       +    + ├── fs.h

    +

       +    + ├── iobuf.c

    +

       +    + ├── iobuf.h

    +

       +    + ├── sfs

    +

       +    +    + ├── bitmap.c

    +

       +    +    + ├── bitmap.h

    +

       +    +    + ├── sfs.c

    +

       +    +    + ├── sfs_fs.c

    +

       +    +    + ├── sfs.h

    +

       +    +    + ├── sfs_inode.c

    +

       +    +    + ├── sfs_io.c

    +

       +    +    + └── sfs_lock.c

    +

       +    + ├── swap

    +

       +    +    + ├── swapfs.c

    +

       +    +    + └── swapfs.h

    +

       +    + ├── sysfile.c

    +

       +    + ├── sysfile.h

    +

       +    + └── vfs

    +

       +        + ├── inode.c

    +

       +        + ├── inode.h

    +

       +        + ├── vfs.c

    +

       +        + ├── vfsdev.c

    +

       +        + ├── vfsfile.c

    +

       +        + ├── vfs.h

    +

       +        + ├── vfslookup.c

    +

       +        + └── vfspath.c

    +

       ├── init

    +

       ├── libs

    +

          ├── stdio.c

    +

          ├── string.c

    +

          └── ……

    +

       ├── mm

    +

          ├── vmm.c

    +

          └── vmm.h

    +

       ├── process

    +

          ├── proc.c

    +

          ├── proc.h

    +

          └── ……

    +

       ├── schedule

    +

       ├── sync

    +

       ├── syscall

    +

          ├── syscall.c

    +

          └── ……

    +

       └── trap

    +

           ├── trap.c

    +

           └── ……

    +

    ├── libs

    +

    ├── tools

    +

       ├── mksfs.c

    +

       └── ……

    +

    └── user

    +

        ├── badarg.c

    +

        ├── badsegment.c

    +

        ├── divzero.c

    +

        ├── exit.c

    +

        ├── faultread.c

    +

        ├── faultreadkernel.c

    +

        ├── forktest.c

    +

        ├── forktree.c

    +

        ├── hello.c

    +

        ├── libs

    +

           ├── dir.c

    +

           ├── dir.h

    +

           ├── file.c

    +

           ├── file.h

    +

           ├── initcode.S

    +

           ├── lock.h

    +

           ├── stdio.c

    +

           ├── syscall.c

    +

           ├── syscall.h

    +

           ├── ulib.c

    +

           ├── ulib.h

    +

           └── umain.c

    +

        ├── ls.c

    +

        ├── sh.c

    +

        └── ……

    +
    + +

     

    + +

    本次实验主要是理解kern/fs目录的部分文件,并可用user/*.c测试所现的Simple FS文件系统是能够正工作。次实验及到的括:

    + +

    l  +文件系统测试用例: user/*.c文件系的实现行测试的测试用例

    + +

    l  +通用文件系统接口

    + +

    n  user/libs/file.[ch]|dir.[ch]|syscall.c:与文件系统操作相关的用户库实行;

    + +

    n  kern/syscall.[ch]:文件中包含文件系统相关的内核态系统调用接口

    + +

    n  kern/fs/sysfile.[ch]|file.[ch]:通用文件系统接口和实行

    + +

    l  +文件系统抽象层-VFS

    + +

    n  +kern/fs/vfs/*.[ch]:虚拟文件系统接口与实现

    + +

    l  +Simple +FS文件系统

    + +

    n  +kern/fs/sfs/*.[ch]SimpleFS文件系统实现

    + +

    l  +文件系统的硬盘IO接口

    + +

    n  +kern/fs/devs/dev.[ch]|dev_disk0.cdisk0硬盘设备提供给文件系统的I/O访问接口和实现

    + +

    l  +辅助工具

    + +

    n  +tools/mksfs.c:创建一个Simple FS文件系统格式的硬盘镜像。(理解此文件的实现细节对理解SFS文件系统很有帮助)

    + +

    l  +对内核其它模块的扩充

    + +

    n  +kern/process/proc.[ch]:增加成员变量 struct fs_struct *fs_struct,用于支持进程对文件的访问;重写了do_execve load_icode等函数以支持执行文件系统中的文件。

    + +

    n  +kern/init/init.c增加调用初始化文件系统的函数fs_init

    + +

    3. +文件系统设计与实现

    + +

    3.1  +ucore文件系统总体介绍

    + +

     

    + +

    操作系中负责管理和储可长期保存数据的软件功能模块称系统。在本次试验中,主要侧重文件系统的设计实现和对文件系统执行流程的分析与理解。

    + +

    ucore的文件系统模型源于HavardOS161的文件系统和Linux文件系统。但其实这二者都是源于传统的UNIX文件系统设计。UNIX提出了四个文件系统抽象概念:文件(file)、目录项(dentry)、索引节点(inode)和安装点(mount point)

    + +

    l  文件:UNIX文件中的内容可理解为是一有序字节buffer,文件都有一个方便应用程序识别的文件名称(也称文件路径名)。典型的文件操作有读、写、创建和删除等。

    + +

    l  目录项:目录项不是目录,而是目录的组成部分。在UNIX中目录被看作一种特定的文件,而目录项是文件路径中的一部分。如一个文件路径名是“/test/testfile”,则包含的目录项为:根目录“/”,目录“test”和文件“testfile”,这三个都是目录项。一般而言,目录项包含目录项的名字(文件名或目录名)和目录项的索引节点(见下面的描述)位置。

    + +

    l  索引节点:UNIX将文件的相关元数据信息(如访问控制权限、大小、拥有者、创建时间、数据内容等等信息)存储在一个单独的数据结构中,该结构被称为索引节点。

    + +

    l  安装点:在UNIX中,文件系统被安装在一个特定的文件路径位置,这个位置就是安装点。所有的已安装文件系统都作为根文件系统树中的叶子出现在系统中。

    + +

    上述抽象概念形成了UNIX文件系统的逻辑数据结构,并需要通过一个具体文件系统的架构设计与实现把上述信息映射并储存到磁盘介质上。一个具体的文件系统需要在磁盘布局也实现上述抽象概念。比如文件元数据信息存储在磁盘块中的索引节点上。当文件被载如内存时,内核需要使用磁盘块中的索引点来构造内存中的索引节点。

    + +

    ucore模仿了UNIX的文件系统设计,ucore件系统架构主要四部分组成:

    + +

    l  通用文件系统访问接口层:该层提供了一个从用户空间到文件系统的标准访问接口。这一层访问接口让应用程序能够通过一个简单的接口获得ucore内核的文件系统服务。

    + +

    l  文件系统抽象层:向上提供一个一致的接口给内核其他部分(文件系统相关的系统调用实现模块和其他内核功能模块)访问。向下提供一个同样的抽象函数指针列表和数据结构屏蔽不同文件系统的实现细节。

    + +

    l  Simple FS文件系统层:一个基于索引方式的简单文件系统实例。向上通过各种具体函数实现以对应文件系统抽象层提出的抽象函数。向下访问外设接口

    + +

    l  外设接口层:向上提供device访问接口屏蔽不同硬件细节。向下实现访问各种具体设备驱动的接口,比如disk设备接口/串口设备接口/键盘设备接口等。

    + +

    对照上面的层次我们再大致介绍一下文件系统的访问处理过程,加深对文件系统的总体理解。假如应用程序操作文件(打开/创建/删除/读写),首先需要通过文件系统的通用文件系统访问接口层给用户空间提供的访问接口进入文件系统内部,接着由文件系统抽象层把访问请求转发给某一具体文件系统(比如SFS文件系统),具体文件系统(Simple FS文件系统层)把应用程序的访问请求转化为对磁盘上的block的处理请求,并通过外设接口层交给磁盘驱动例程来完成具体的磁盘操作。结合用户态写文件函数write的整个执行过程,我们可以比较清楚地看出ucore文件系统架构的层次和依赖关系。

    + +

    ucore文件系统总体结构

    + +

     

    + +

    ucore操作系统不同的角度来看,ucore中的文件系统架构包含四类主要的数据结构, 它们分别是:

    + +

    l  超级块(SuperBlock),它主要从文件系统的全局角度描述特定文件系统的全局信息。它的作用范围是整个OS空间。

    + +

    l  索引节点(inode):它主要从文件系统的单个文件的角度它描述了文件的各种属性和数据所在位置。它的作用范围是整个OS空间。

    + +

    l  目录项(dentry):它主要从文件系统的文件路径的角度描述了文件路径中的特定目录。它的作用范围是整个OS空间。

    + +

    l  文件(file),它主要从进程的角度描述了一个进程在访问文件时需要了解的文件标识,文件读写的位置,文件引用情况等信息。它的作用范围是某一具体进程。

    + +

    如果一个用户进程打开了一个文件,那么在ucore中涉及的相关数据结构(其中相关数据结构将在下面各个小节中展开叙述)和关系如下图所示:

    + +

    ucore中文件相关关键数据结构及其关系

    + +

     

    + +

     

    + +

    3.2 +通用文件系统访问接口

    + +

    文件和目录相关用户库函数

    + +

    Lab8中部分用户库函数与文件系统有关,我们先讨论对单个文件进行操作的系统调用,然后讨论对目录和文件系统进行操作的系统调用。

    + +

    在文件操作方面,最基本的相关函数是openclosereadwrite。在读写一个文件之前,首先要用open系统调用将其打开。open的第一个参数指定文件的路径名,可使用绝对路径名;第二个参数指定打开的方式,可设置为O_RDONLYO_WRONLYO_RDWR,分别表示只读、只写、可读可写。在打开一个文件后,就可以使用它返回的文件描述符fd对文件进行相关操作。在使用完一个文件后,还要用close系统调用把它关闭,其参数就是文件描述符fd。这样它的文件描述符就可以空出来,给别的文件使用。

    + +

    读写文件内容的系统调用是readwriteread系统调用有三个参数:一个指定所操作的文件描述符,一个指定读取数据的存放地址,最后一个指定读多少个字节。在C程序中调用该系统调用的方法如下:

    + +

    count = +read(filehandle, buffer, nbytes);

    + +

    该系统调用会把实际读到的字节数返回给count变量。在正常情形下这个值与nbytes相等,但有时可能会小一些。例如,在读文件时碰上了文件结束符,从而提前结束此次读操作。

    + +

    如果由于参数无效或磁盘访问错误等原因,使得此次系统调用无法完成,则count被置为-1。而write函数的参数与之完全相同。

    + +

    对于目录而言,最常用的操作是跳转到某个目录,这里对应的用户库函数是chdir。然后就需要读目录的内容了,即列出目录中的文件或目录名,这在处理上与读文件类似,即需要通过opendir函数打开目录,通过readdir来获取目录中的文件信息,读完后还需通过closedir函数来关闭目录。由于在ucore中把目录看成是一个特殊的文件,所以opendirclosedir实际上就是调用与文件相关的openclose函数。只有readdir需要调用获取目录内容的特殊系统调用sys_getdirentry。而且这里没有写目录这一操作。在目录中增加内容其实就是在此目录中创建文件,需要用到创建文件的函数。

    + +

     

    + +

    文件和目录访问相关系统调用

    + +

        与文件相关的openclosereadwrite用户库函数对应的是sys_opensys_closesys_readsys_write四个系统调用接口。与目录相关的readdir用户库函数对应的是sys_getdirentry系统调用。这些系统调用函数接口将通过syscall函数来获得ucore的内核服务。当到了ucore内核后,在调用文件系统抽象层的file接口和dir接口。

    + +

    3.3  +Simple FS文件系统

    + +

    这里我们没有按照从上到下先讲文件系统抽象层,再讲具体的文件系统。这是由于如果能够理解Simple FS(简称SFS)文件系统,就可更好地分析文件系统抽象层的设计。即从具体走向抽象。ucore内核把所有文件都看作是字节流,任何内部逻辑结构都是专用的,由应用程序负责解释。但是ucore区分文件的物理结构。ucore目前支持如下几种类型的文件:

    + +

       +常规文件:文件中包括的内容信息是由应用程序输入。SFS文件系统在普通文件上不强加任何内部结构,把其文件内容信息看作为字节。

    + +

       +目录:包含一系列的entry,每个entry包含文件名和指向与之相关联的索引节点(index node)的指针。目录是按层次结构组织的。

    + +

       +链接文件:实际上一个链接文件是一个已经存在的文件的另一个可选择的文件名。

    + +

       +设备文件:不包含数据,但是提供了一个映射物理设备(如串口、键盘等)到一个文件名的机制。可通过设备文件访问外围设备。

    + +

       +管道:管道是进程间通讯的一个基础设施。管道缓存了其输入端所接受的数据,以便在管道输出端读的进程能一个先进先出的方式来接受数据。

    + +

    lab8中关注的主要是SFS支持的常规文件、目录和链接中的 hardlink 的设计实现。SFS文件系统中目录和常规文件具有共同的属性,而这些属性保存在索引节点中。SFS通过索引节点来管理目录和常规文件,索引节点包含操作系统所需要的关于某个文件的关键信息,比如文件的属性、访问许可权以及其它控制信息都保存在索引节点中。可以有多个文件名可指向一个索引节点。

    + +

     3.3.1文件系统的布局

    + +

    文件系统通常保存在磁盘上。在本实验中,第三个磁盘(即disk0,前两个磁盘分别是 ucore.img swap.img)用于存放一个SFS文件系统(Simple Filesystem)。通常文件系统中,磁盘的使用是以扇区(Sector)为单位的,但是为了实现简便,SFS 中以 block 4K,与内存 page 大小相等)为基本单位。

    + +

    SFS文件系统的布局如下图所示。

    + +

    + +

    0个块(4K)是超级块(superblock),它包含了关于文件系统的所有关键参数,当计算机被启动或文件系统被首次接触时,超级块的内容就会被装入内存。其定义如下:

    + + + + + +
    +

    struct sfs_super {

    +

        uint32_t + magic;                                                     /* magic number, + should be SFS_MAGIC */

    +

        uint32_t + blocks;                                                    /* # of blocks in + fs */

    +

        uint32_t + unused_blocks;                                        /* # of unused blocks + in fs */

    +

        char info[SFS_MAX_INFO_LEN + + 1];                /* infomation for sfs  */

    +

    };

    +
    + +

    可以看到,包含一个成员变量魔数magic,其值为0x2f8dbe2a,内核通过它来检查磁盘镜像是否是合法的 SFS img;成员变量blocks记录了SFS中所有block的数量,即 img 的大小;成员变量unused_block记录了SFS中还没有被使用的block的数量;成员变量info包含了字符串"simple file system"

    + +

    1个块放了一个root-dirinode,用来记录根目录的相关信息。有关inode还将在后续部分介绍。这里只要理解root-dirSFS文件系统的根结点,通过这个root-dirinode信息就可以定位并查找到根目录下的所有文件信息。

    + +

    从第2个块开始,根据SFS中所有块的数量,用1bit来表示一个块的占用和未被占用的情况。这个区域称为SFSfreemap区域,这将占用若干个块空间。为了更好地记录和管理freemap区域,专门提供了两个文件kern/fs/sfs/bitmap.[ch]来完成根据一个块号查找或设置对应的bit位的值。

    + +

    最后在剩余的磁盘空间中,存放了所有其他目录和文件的inode信息和内容数据信息。需要注意的是虽然inode的大小小于一个块的大小(4096B),但为了实现简单,每个 inode 都占用一个完整的 block

    + +

    sfs_fs.c文件中的sfs_do_mount函数中,完成了加载位于硬盘上的SFS文件系统的超级块superblockfreemap的工作。这样,在内存中就有了SFS文件系统的全局信息。

    + +

     3.3.2索引节点

    + +

    磁盘索引节点

    + +

    SFS中的磁盘索引节点代表了一个实际位于磁盘上的文件。首先我们看看在硬盘上的索引节点的内容:

    + + + + + +
    +

    struct sfs_disk_inode {

    +

        uint32_t + size;                          如果inode表示常规文件,则size是文件大小

    +

        uint16_t + type;                                  inode的文件类型

    +

        uint16_t + nlinks;                               inode的硬链接数

    +

        uint32_t + blocks;                              inode的数据块数的个数

    +

        uint32_t direct[SFS_NDIRECT];  inode的直接数据块索引值(有SFS_NDIRECT个)

    +

        uint32_t + indirect;                            inode的一级间接数据块索引值

    +

    };

    +
    + +

    通过上表可以看出,如果inode表示的是文件,则成员变量direct[]直接指向了保存文件内容数据的数据块索引值。indirect间接指向了保存文件内容数据的数据块,indirect指向的是间接数据块(indirect block),此数据块实际存放的全部是数据块索引,这些数据块索引指向的数据块才被用来存放文件内容数据。

    + +

    默认的,ucore +SFS_NDIRECT 12,即直接索引的数据页大小为 12 * 4k = 48k;当使用一级间接数据块索引时,ucore 支持最大的文件大小为 12 * 4k + 1024 * 4k = +48k + 4m。数据索引表内,0 表示一个无效的索引,inode blocks 表示该文件或者目录占用的磁盘的 block 的个数。indiret 0 时,表示不使用一级索引块。(因为 block 0 用来保存 super block,它不可能被其他任何文件或目录使用,所以这么设计也是合理的)。

    + +

    对于普通文件,索引值指向的 block 中保存的是文件中的数据。而对于目录,索引值指向的数据保存的是目录下所有的文件名以及对应的索引节点所在的索引块(磁盘块)所形成的数组。数据结构如下:

    + +

     

    + + + + + +
    +

    /* + file entry (on disk) */

    +

    struct + sfs_disk_entry {

    +

        + uint32_t ino;                                                                 + 索引节点所占数据块索引值

    +

        + char name[SFS_MAX_FNAME_LEN + 1];               文件名

    +

    };

    +
    + +

     

    + +

    操作系统中,每个文件系统下的 inode 都应该分配唯一的 inode 编号。SFS 下,为了实现的简便(偷懒),每个 inode 直接用他所在的磁盘 block 的编号作为 inode 编号。比如,root block inode 编号为 1;每个 sfs_disk_entry 数据结构中,name 表示目录下文件或文件夹的名称,ino 表示磁盘 block 编号,通过读取该 block 的数据,能够得到相应的文件或文件夹的 inodeino 0 时,表示一个无效的 entry

    + +

    此外,和 inode 相似,每个 sfs_dirent_entry 也占用一个 block

    + +

     

    + +

    内存中的索引节点

    + +

     

    + + + + + +
    +

    /* + inode for sfs */

    +

    struct + sfs_inode {

    +

        + struct sfs_disk_inode *din;                     /* on-disk inode */

    +

        + uint32_t ino;                                   /* inode number */

    +

        + uint32_t flags;                                 /* inode flags */

    +

        + bool dirty;                                     /* true if inode modified */

    +

        + int reclaim_count;                              /* kill inode if it hits zero + */

    +

        + semaphore_t sem;                                /* semaphore for din */

    +

        + list_entry_t inode_link;                        /* entry for linked-list in + sfs_fs */

    +

        + list_entry_t hash_link;                         /* entry for hash linked-list + in sfs_fs */

    +

    };

    +
    + +

           可以看到SFS中的内存inode包含了SFS的硬盘inode信息,而且还增加了其他一些信息,这属于是便于进行是判断否改写、互斥操作、回收和快速地定位等作用。需要注意,一个内存inode是在打开一个文件后才创建的,如果关机则相关信息都会消失。而硬盘inode的内容是保存在硬盘中的,只是在进程需要时才被读入到内存中,用于访问文件或目录的具体内容数据

    + +

    为了方便实现上面提到的多级数据的访问以及目录中 entry 的操作,对 inode SFS实现了一些辅助的函数:

    + +

    1.      sfs_bmap_load_nolock:将对应 sfs_inode 的第 index 个索引指向的 block 的索引值取出存到相应的指针指向的单元(ino_store)。该函数只接受 index <= +inode->blocks 的参数。当 +index == inode->blocks 时,该函数理解为需要为 inode 增长一个 +block。并标记 inode dirty(所有对 inode 数据的修改都要做这样的操作,这样,当 inode 不再使用的时候,sfs 能够保证 inode 数据能够被写回到磁盘)。sfs_bmap_load_nolock 调用的 sfs_bmap_get_nolock 来完成相应的操作,阅读 sfs_bmap_get_nolock,了解他是如何工作的。(sfs_bmap_get_nolock 只由 sfs_bmap_load_nolock 调用)

    + +

    2.      sfs_bmap_truncate_nolock:将多级数据索引表的最后一个 entry 释放掉。他可以认为是 sfs_bmap_load_nolock 中,index == +inode->blocks 的逆操作。当一个文件或目录被删除时,sfs +会循环调用该函数直到 inode->blocks 减为 0,释放所有的数据页。函数通过 sfs_bmap_free_nolock 来实现,他应该是 sfs_bmap_get_nolock 的逆操作。和 sfs_bmap_get_nolock 一样,调用 sfs_bmap_free_nolock 也要格外小心。

    + +

    3.      sfs_dirent_read_nolock:将目录的第 slot entry 读取到指定的内存空间。他通过上面提到的函数来完成。

    + +

    4.      sfs_dirent_write_nolock:用指定的 entry 来替换某个目录下的第 slot entry。他通过调用 sfs_bmap_load_nolock保证,当第 slot entry 不存在时(slot == inode->blocks),SFS 会分配一个新的 entry,即在目录尾添加了一个 entry

    + +

    5.      sfs_dirent_search_nolock:是常用的查找函数。他在目录下查找 name,并且返回相应的搜索结果(文件或文件夹)的 inode 的编号(也是磁盘编号),和相应的 entry 在该目录的 index 编号以及目录下的数据页是否有空闲的 entry。(SFS 实现里文件的数据页是连续的,不存在任何空洞;而对于目录,数据页不是连续的,当某个 entry 删除的时候,SFS 通过设置 entry->ino 0将该 entry 所在的 block 标记为 free,在需要添加新 entry 的时候,SFS 优先使用这些 free entry,其次才会去在数据页尾追加新的 entry

    + +

     

    + +

    注意,这些后缀为 nolock 的函数,只能在已经获得相应 inode semaphore 才能调用。

    + +

     

    + +

    Inode的文件操作函数

    + +

     

    + + + + + +
    +

    static + const struct inode_ops sfs_node_fileops = {

    +

        + .vop_magic                      = VOP_MAGIC,

    +

        + .vop_open                       = sfs_openfile,

    +

        + .vop_close                      = sfs_close,

    +

        + .vop_read                       = sfs_read,

    +

        + .vop_write                      = sfs_write,

    +

        + ……

    +

    };

    +
    + +

    上述sfs_openfilesfs_closesfs_readsfs_write分别对应用户进程发出的openclosereadwrite操作。其中sfs_openfile不用做什么事;sfs_close需要把对文件的修改内容写回到硬盘上,这样确保硬盘上的文件内容数据是最新的;sfs_readsfs_write函数都调用了一个函数sfs_io,并最终通过访问硬盘驱动来完成对文件内容数据的读写。

    + +

     

    + +

    Inode的目录操作函数

    + + + + + +
    +

    static + const struct inode_ops sfs_node_dirops = {

    +

        + .vop_magic                      = VOP_MAGIC,

    +

        + .vop_open                       = sfs_opendir,

    +

        + .vop_close                      = sfs_close,

    +

        + .vop_getdirentry                = sfs_getdirentry,

    +

    .vop_lookup                     = sfs_lookup,                           

    +

        + ……

    +

    };

    +
    + +

    对于目录操作而言,由于目录也是一种文件,所以sfs_opendirsys_close对应户进程发出的openclose函数。相对于sfs_opensfs_opendir只是完成一些open函数传递的参数判断,没做其他更多的事情。目录的close操作与文件的close操作完全一致。由于目录的内容数据与文件的内容数据不同,所以读出目录的内容数据的函数是sfs_getdirentry,其主要工作是获取目录下的文件inode信息。

    + +

    3.4  +文件系统抽象层-VFS

    + +

    文件系统抽象层是把不同文件系统的对外共性接口提取出来,形成一个函数指针数组,这样,通用文件系统访问接口层只需访问文件系统抽象层,而不需关心具体文件系统的实现细节和接口。

    + +

    3.4.1 file&dir接口

    + +

    file&dir接口层定义了进程在内核中直接访问的文件相关信息,这定义在file数据结构中,具体描述如下:

    + + + + + +
    +

    struct + file {

    +

        enum {

    +

            + FD_NONE, FD_INIT, FD_OPENED, FD_CLOSED,

    +

        } + status;                          //访问文件的执行状态

    +

        bool + readable;                     //文件是否可读

    +

        bool + writable;                     //文件是否可写

    +

        int + fd;                           //文件在filemap中的索引值

    +

        off_t + pos;                        //访问文件的当前位置

    +

        struct + inode *node;               //该文件对应的内存inode指针

    +

        + atomic_t open_count;              //打开此文件的次数

    +

    };

    +
    + +

    而在kern/process/proc.h中的proc_struct结构中描述了进程访问文件的数据接口 fs_struct,其数据结构定义如下:

    + + + + + +
    +

    struct + fs_struct {

    +

        struct + inode *pwd;                //进程当前执行目录的内存inode指针

    +

        struct + file *filemap;             //进程打开文件的数组

    +

        + atomic_t fs_count;                //访问此文件的线程个数??

    +

        + semaphore_t fs_sem;                //确保对进程控制块中fs_struct的互斥访问

    +

    };

    +
    + +

    当创建一个进程后,该进程的fs_struct将会被初始化或复制父进程的fs_struct。当用户进程打开一个文件时,将从filemap数组中取得一个空闲file项,然后会把此file的成员变量node指针指向一个代表此文件的inode的起始地址。

    + +

     

    + +

    3.4.2 inode接口

    + +

    index +node是位于内存的索引节点,它是VFS结构中的重要数据结构,因为它实际负责把不同文件系统的特定索引节点信息(甚至不能算是一个索引节点)统一封装起来,避免了进程直接访问具体文件系统。其定义如下:

    + + + + + +
    +

    struct + inode {

    +

        union + {                                 //包含不同文件系统特定inode信息的union成员变量

    +

            struct + device __device_info;          //设备文件系统内存inode信息

    +

            + struct sfs_inode __sfs_inode_info;    //SFS文件系统内存inode信息

    +

        } + in_info;   

    +

        enum {

    +

            + inode_type_device_info = 0x1234,

    +

            + inode_type_sfs_inode_info,

    +

        } + in_type;                          //inode所属文件系统类型

    +

        + atomic_t ref_count;                 //inode的引用计数

    +

        + atomic_t open_count;                //打开此inode对应文件的个数

    +

        struct + fs *in_fs;                   //抽象的文件系统,包含访问文件系统的函数指针

    +

        const + struct inode_ops *in_ops;     //抽象的inode操作,包含访问inode的函数指针     

    +

    };

    +
    + +

    inode中,有一成员变量为in_ops,这是对此inode的操作函数指针列表,其数据结构定义如下:

    + + + + + +
    +

    struct + inode_ops {

    +

        + unsigned long vop_magic;

    +

        int + (*vop_open)(struct inode *node, uint32_t open_flags);

    +

        int + (*vop_close)(struct inode *node);

    +

        int + (*vop_read)(struct inode *node, struct iobuf *iob);

    +

        int + (*vop_write)(struct inode *node, struct iobuf *iob);

    +

        int + (*vop_getdirentry)(struct inode *node, struct iobuf *iob);

    +

        int + (*vop_create)(struct inode *node, const char *name, bool excl, struct inode + **node_store);

    +

    int + (*vop_lookup)(struct inode *node, char *path, struct inode **node_store);

    +

    ……

    +

     };

    +
    + +

    参照上面对SFS中的索引节点操作函数的说明,可以看出inode_ops是对常规文件、目录、设备文件所有操作的一个抽象函数表示。对于某一具体的文件系统中的文件或目录,只需实现相关的函数,就可以被用户进程访问具体的文件了,且用户进程无需了解具体文件系统的实现细节。

    + +

     

    + +

    3.5 +设备层文件IO

    + +

    在本实验中,为了统一地访问设备,我们可以把一个设备看成一个文件,通过访问文件的接口来访问设备。目前实现了stdin设备文件文件、stdout设备文件、disk0设备。stdin设备就是键盘,stdout设备就是CONSOLE(串口、并口和文本显示器),而disk0设备是承载SFS文件系统的磁盘设备。下面我们逐一分析ucore是如何让用户把设备看成文件来访问。

    + +

     

    + +

    3.5.1 关键数据结构

    + +

    为了表示一个设备,需要有对应的数据结构,ucore为此定义了struct device,其描述如下:

    + + + + + +
    +

    struct + device {

    +

        + size_t d_blocks;    //设备占用的数据块个数            

    +

        + size_t d_blocksize;  //数据块的大小

    +

        + int (*d_open)(struct device *dev, uint32_t open_flags);  //打开设备的函数指针

    +

        + int (*d_close)(struct device *dev); //关闭设备的函数指针

    +

        + int (*d_io)(struct device *dev, struct iobuf *iob, bool write); //读写设备的函数指针

    +

        + int (*d_ioctl)(struct device *dev, int op, void *data); //ioctl方式控制设备的函数指针

    +

    };

    +
    + +

    这个数据结构能够支持对块设备(比如磁盘)、字符设备(比如键盘、串口)的表示,完成对设备的基本操作。ucore虚拟文件系统为了把这些设备链接在一起,还定义了一个设备链表,即双向链表vdev_list,这样通过访问此链表,可以找到ucore能够访问的所有设备文件。

    + +

    但这个设备描述没有与文件系统以及表示一个文件的inode数据结构建立关系,为此,还需要另外一个数据结构把deviceinode联通起来,这就是vfs_dev_t数据结构:

    + + + + + +
    +

    // device info entry in vdev_list 
    +
    typedef struct {
    +     
    const char *devname;
    +     
    struct inode *devnode;
    +     
    struct fs *fs;
    +     
    bool mountable;
    +     
    list_entry_t vdev_link;
    +
    } vfs_dev_t;

    +
    + +

    利用vfs_dev_t数据结构,就可以让文件系统通过一个链接vfs_dev_t结构的双向链表找到device对应的inode数据结构,一个inode节点的成员变量in_type的值0x1234,则此 inode的成员变量in_info将成为一个device结构。这样inode就和一个设备建立了联系,这个inode就是一个设备文件。

    + +

     

    + +

    3.5.2stdout设备文件

    + +

     

    + +

    初始化

    + +

    既然stdout设备是设备文件系统的文件,自然有自己的inode结构。在系统初始化时,即只需如下处理过程

    + +

    kern_init-->fs_init-->dev_init-->dev_init_stdout --> dev_create_inode

    + +

                                                                                   +--> stdout_device_init

    + +

                                                                                   +--> vfs_add_dev

    + +

    dev_init_stdout中完成了对stdout设备文件的初始化。即首先创建了一个inode,然后通过stdout_device_init完成对inode中的成员变量inode->__device_info进行初始:

    + +

    这里的stdout设备文件实际上就是指的console外设(它其实是串口、并口和CGA的组合型外设)。这个设备文件是一个只写设备,如果读这个设备,就会出错。接下来我们看看stdout设备的相关处理过程。

    + +

     

    + +

    初始化

    + +

    stdout设备文件的初始化过程主要由stdout_device_init完成,其具体实现如下:

    + + + + + +
    +

    static + void

    +

    stdout_device_init(struct + device *dev) {

    +

        + dev->d_blocks = 0;

    +

        + dev->d_blocksize = 1;

    +

        + dev->d_open = stdout_open;

    +

        + dev->d_close = stdout_close;

    +

        + dev->d_io = stdout_io;

    +

        + dev->d_ioctl = stdout_ioctl;

    +

    }

    +
    + +

    可以看到,stdout_open函数完成设备文件打开工作,如果发现用户进程调用open函数的参数flags不是只写(O_WRONLY),则会报错。

    + +

     

    + +

    访问操作实现

    + +

    stdout_io函数完成设备的写操作工作,具体实现如下:

    + + + + + +
    +

    static + int

    +

    stdout_io(struct + device *dev, struct iobuf *iob, bool write) {

    +

        + if (write) {

    +

            + char *data = iob->io_base;

    +

            + for (; iob->io_resid != 0; iob->io_resid --) {

    +

                + cputchar(*data ++);

    +

            + }

    +

            + return 0;

    +

        + }

    +

        + return -E_INVAL;

    +

    }

    +
    + +

    可以看到,要写的数据放在iob->io_base所指的内存区域,一直写到iob->io_resid的值为0为止。每次写操作都是通过cputchar来完成的,此函数最终将通过console外设驱动来完成把数据输出到串口、并口和CGA显示器上过程。另外,也可以注意到,如果用户想执行读操作,则stdout_io函数直接返回错误值-E_INVAL

    + +

     

    + +

    3.5.3 stdin设备文件

    + +

    这里的stdin设备文件实际上就是指的键盘。这个设备文件是一个只读设备,如果写这个设备,就会出错。接下来我们看看stdin设备的相关处理过程。

    + +

     

    + +

    初始化

    + +

    stdin设备文件的初始化过程主要由stdin_device_init完成了主要的初始化工作,具体实现如下:

    + + + + + +
    +

    static + void

    +

    stdin_device_init(struct + device *dev) {

    +

        + dev->d_blocks = 0;

    +

        + dev->d_blocksize = 1;

    +

        + dev->d_open = stdin_open;

    +

        + dev->d_close = stdin_close;

    +

        + dev->d_io = stdin_io;

    +

        + dev->d_ioctl = stdin_ioctl;

    +

     

    +

        + p_rpos = p_wpos = 0;

    +

        + wait_queue_init(wait_queue);

    +

    }

    +
    + +

       +相对于stdout的初始化过程,stdin的初始化相对复杂一些,多了一个stdin_buffer缓冲区,描述缓冲区读写位置的变量p_rposp_wpos以及用于等待缓冲区的等待队列wait_queue。在stdin_device_init函数的初始化中,也完成了对p_rposp_wposwait_queue的初始化。

    + +

     

    + +

    访问操作实现

    + +

    stdin_io函数负责完成设备的读操作工作,具体实现如下:

    + + + + + +
    +

    static + int

    +

    stdin_io(struct + device *dev, struct iobuf *iob, bool write) {

    +

        + if (!write) {

    +

            + int ret;

    +

            + if ((ret = dev_stdin_read(iob->io_base, iob->io_resid)) > 0) {

    +

                + iob->io_resid -= ret;

    +

            + }

    +

            + return ret;

    +

        + }

    +

        + return -E_INVAL;

    +

    }

    +
    + +

    可以看到,如果是写操作,则stdin_io函数直接报错返回。所以这也进一步说明了此设备文件是只读文件。如果此读操作,则此函数进一步调用dev_stdin_read函数完成对键盘设备的读入操作。dev_stdin_read函数的实现相对复杂一些,主要的流程如下:

    + + + + + +
    +

    static + int

    +

    dev_stdin_read(char + *buf, size_t len) {

    +

        + int ret = 0;

    +

        + bool intr_flag;

    +

        + local_intr_save(intr_flag);

    +

        + {

    +

            + for (; ret < len; ret ++, p_rpos ++) {

    +

            + try_again:

    +

                + if (p_rpos < p_wpos) {

    +

                    + *buf ++ = stdin_buffer[p_rpos % stdin_BUFSIZE];

    +

                + }

    +

                + else {

    +

                    + wait_t __wait, *wait = &__wait;

    +

                    + wait_current_set(wait_queue, wait, WT_KBD);

    +

                    + local_intr_restore(intr_flag);

    +

     

    +

                    + schedule();

    +

     

    +

                    + local_intr_save(intr_flag);

    +

                    + wait_current_del(wait_queue, wait);

    +

                    + if (wait->wakeup_flags == WT_KBD) {

    +

                        + goto try_again;

    +

                    + }

    +

                    + break;

    +

                + }

    +

            + }

    +

        + }

    +

        + local_intr_restore(intr_flag);

    +

        + return ret;

    +

    }

    +
    + +

    在上述函数中可以看出,如果p_rpos < p_wpos,则表示有键盘输入的新字符在stdin_buffer中,于是就从stdin_buffer中取出新字符放到iobuf指向的缓冲区中;如果p_rpos +>=p_wpos,则表明没有新字符,这样调用read用户态库函数的用户进程就需要采用等待队列的睡眠操作进入睡眠状态,等待键盘输入字符的产生。

    + +

    键盘输入字符后,如何唤醒等待键盘输入的用户进程呢?回顾lab1中的外设中断处理,可以了解到,当用户敲击键盘时,会产生键盘中断,在trap_dispatch函数中,当识别出中断是键盘中断(中断号为IRQ_OFFSET + IRQ_KBD)时,会调用dev_stdin_write函数,来把字符写入到stdin_buffer中,且会通过等待队列的唤醒操作唤醒正在等待键盘输入的用户进程。

    + +

     

    + +

    3.6 实验执行流程概述

    + +

    与实验七相比,实验八增加了文件系统,并因此实现了通过文件系统来加载可执行文件到内存中运行的功能,导致对进程管理相关的实现比较大的调整。我们来简单看看文件系统是如何初始化并能在ucore的管理下正常工作的。

    + +

    首先看看kern_init函数,可以发现与lab7相比增加了对fs_init函数的调用。fs_init函数就是文件系统初始化的总控函数,它进一步调用了虚拟文件系统初始化函数vfs_init,与文件相关的设备初始化函数dev_initSimple FS文件系统的初始化函数sfs_init。这三个初始化函数联合在一起,协同完成了整个虚拟文件系统、SFS文件系统和文件系统对应的设备(键盘、串口、磁盘)的初始化工作。其函数调用关系图如下所示:

    + +

     

    + +

    + +

    文件系统初始化调用关系图

    + +

      参考上图,并结合源码分析,可大致了解到文件系统的整个初始化流程。vfs_init主要建立了一个device list双向链表vdev_list,为后续具体设备(键盘、串口、磁盘)以文件的形式呈现建立查找访问通道。dev_init函数通过进一步调用disk0/stdin/stdout_device_init完成对具体设备的初始化,把它们抽象成一个设备文件,并建立对应的inode数据结构,最后把它们链入到vdev_list中。这样通过虚拟文件系统就可以方便地以文件的形式访问这些设备了。sfs_init是完成对Simple FS的初始化工作,并把此实例文件系统挂在虚拟文件系统中,从而让ucore的其他部分能够通过访问虚拟文件系统的接口来进一步访问到SFS实例文件系统。

    + +

     

    + +

    3.7文件操作实现

    + +

    3.7.1 打开文件

    + +

          有了上述分析后,我们可以看看如果一个用户进程打开文件会做哪些事情?首先假定用户进程需要打开的文件已经存在在硬盘上。以user/sfs_filetest1.c为例,首先用户进程会调用在main函数中的如下语句:

    + + + + + +
    +

    int + fd1 = safe_open("/test/testfile", O_RDWR | O_TRUNC);

    +
    + +

            从字面上可以看出,如果ucore能够正常查找到这个文件,就会返回一个代表文件的文件描述符fd1,这样在接下来的读写文件过程中,就直接用这样fd1来代表就可以了。那这个打开文件的过程是如何一步一步实现的呢?

    + +

     

    + +

    通用文件访问接口层的处理流程

    + +

    首先进入通用文件访问接口层的处理流程,即进一步调用如下用户态函数: +open->sys_open->syscall 从而引起系统调用进入到内核态。到了内核态后,通过中断处理例程,会调用到sys_open内核函数,并进一步调用sysfile_open内核函数。到了这里,需要把位于用户空间的字符串"/test/testfile"拷贝到内核空间中的字符串path中,并进入到文件系统抽象层的处理流程完成进一步的打开文件操作中。

    + +

     

    + +

    文件系统抽象层的处理流程

    + +

    1.      分配一个空闲的file数据结构变量file

    + +

     在文件系统抽象层的处理中,首先调用的是file_open函数,它要给这个即将打开的文件分配一个file数据结构的变量,这个变量其实是当前进程的打开文件数组current->fs_struct->filemap[]中的一个空闲元素(即还没用于一个打开的文件),而这个元素的索引值就是最终要返回到用户进程并赋值给变量fd1。到了这一步还仅仅是给当前用户进程分配了一个file数据结构的变量,还没有找到对应的文件索引节点。

    + +

            +为此需要进一步调用vfs_open函数来找到path指出的文件所对应的基于inode数据结构的VFS索引节点nodevfs_open函数需要完成两件事情:通过vfs_lookup找到path对应文件的inode;调用vop_open函数打开文件。

    + +

     

    + +

    2.      找到文件设备的根目录“/”的索引节点

    + +

    需要注意,这里的vfs_lookup函数是一个针对目录的操作函数,它会调用vop_lookup函数来找到SFS文件系统中的“/test”目录下的“testfile”文件。为此,vfs_lookup函数首先调用get_device函数,并进一步调用vfs_get_bootfs函数(其实调用了)来找到根目录“/”对应的inode。这个inode就是位于vfs.c中的inode变量bootfs_node。这个变量在init_main函数(位于kern/process/proc.c)执行时获得了赋值。

    + +

     

    + +

    3.      找到根目录“/”下的“test”子目录对应的索引节点

    + +

     

    + +

    在找到根目录对应的inode后,通过调用vop_lookup函数来查找“/”“test”这两层目录下的文件“testfile”所对应的索引节点,如果找到就返回此索引节点。

    + +

     

    + +

    4.      filenode建立联系

    + +

    完成第3步后,将返回到file_open函数中,通过执行语句“file->node=node;”,就把当前进程的current->fs_struct->filemap[fd](即file所指变量)的成员变量node指针指向了代表“/test/testfile”文件的索引节点node。这时返回fd。经过重重回退,通过系统调用返回,用户态的syscall->sys_open->open->safe_open等用户函数的层层函数返回,最终把把fd赋值给fd1。自此完成了打开文件操作。但这里我们还没有分析第2和第3步是如何进一步调用SFS文件系统提供的函数找位于SFS文件系统上的“/test/testfile”所对应的sfs磁盘inode的过程。下面需要进一步对此进行分析。

    + +

     

    + +

    SFS文件系统层的处理流程

    + +

    这里需要分析文件系统抽象层中没有彻底分析的vop_lookup函数到底做了啥。下面我们来看看。在sfs_inode.c中的sfs_node_dirops变量定义了“.vop_lookup = +sfs_lookup”,所以我们重点分析sfs_lookup的实现。

    + +

    sfs_lookup有三个参数:nodepathnode_store。其中node是根目录“/”所对应的inode节点;path是文件“testfile”的绝对路径“/test/testfile”,而node_store是经过查找获得的“testfile”所对应的inode节点。

    + +

    Sfs_lookup函数以“/”为分割符,从左至右逐一分解path获得各个子目录和最终文件对应的inode节点。在本例中是分解出“test”子目录,并调用sfs_lookup_once函数获得“test”子目录对应的inode节点subnode,然后循环进一步调用sfs_lookup_once查找以“test”子目录下的文件“testfile1”所对应的inode节点。当无法分解path后,就意味着找到了testfile1对应的inode节点,就可顺利返回了。

    + +

    当然这里讲得还比较简单,sfs_lookup_once将调用sfs_dirent_search_nolock函数来查找与路径名匹配的目录项,如果找到目录项,则根据目录项中记录的inode所处的数据块索引值找到路径名对应的SFS磁盘inode,并读入SFS磁盘inode对的内容,创建SFS内存inode

    + +

    3.7.2 读文件

    + +

    读文件其实就是读出目录中的目录项,首先假定文件在磁盘上且已经打开。用户进程有如下语句:

    + +

            +read(fd, data, len);

    + +

        +即读取fd对应文件,读取长度为len,存入data中。下面来分析一下读文件的实现。

    + +

        +

    + +

    通用文件访问接口层的处理流程

    + +

        +先进入通用文件访问接口层的处理流程,即进一步调用如下用户态函数:read->sys_read->syscall,从而引起系统调用进入到内核态。到了内核态以后,通过中断处理例程,会调用到sys_read内核函数,并进一步调用sysfile_read内核函数,进入到文件系统抽象层处理流程完成进一步读文件的操作。

    + +

    文件系统抽象层的处理流程

    + +

    1)      检查错误,即检查读取长度是否为0和文件是否可读。

    + +

    2)      分配buffer空间,即调用kmalloc函数分配4096字节的buffer空间。

    + +

    3)      读文件过程

    + +

    [1]    实际读文件

    + +

    循环读取文件,每次读取buffer大小。每次循环中,先检查剩余部分大小,若其小于4096字节,则只读取剩余部分的大小。然后调用file_read函数(详细分析见后)将文件内容读取到buffer中,alen为实际大小。调用copy_to_user函数将读到的内容拷贝到用户的内存空间中,调整各变量以进行下一次循环读取,直至指定长度读取完成。最后函数调用层层返回至用户程序,用户程序收到了读到的文件内容。

    + +

    [2]    file_read函数

    + +

    这个函数是读文件的核心函数。函数有4个参数,fd是文件描述符,base是缓存的基地址,len是要读取的长度,copied_store存放实际读取的长度。函数首先调用fd2file函数找到对应的file结构,并检查是否可读。调用filemap_acquire函数使打开这个文件的计数加1。调用vop_read函数将文件内容读到iob中(详细分析见后)。调整文件指针偏移量pos的值,使其向后移动实际读到的字节数iobuf_used(iob)。最后调用filemap_release函数使打开这个文件的计数减1,若打开计数为0,则释放file

    + +

     

    + +

    SFS文件系统层的处理流程

    + +

        +vop_read函数实际上是对sfs_read的包装。在sfs_inode.csfs_node_fileops变量定义了.vop_read = sfs_read,所以下面来分析sfs_read函数的实现。

    + +

        +sfs_read函数调用sfs_io函数。它有三个参数,node是对应文件的inodeiob是缓存,write表示是读还是写的布尔值(0表示读,1表示写),这里是0。函数先找到inode对应sfssin,然后调用sfs_io_nolock函数进行读取文件操作,最后调用iobuf_skip函数调整iobuf的指针。

    + +

        +sfs_io_nolock函数中,先计算一些辅助变量,并处理一些特殊情况(比如越界),然后有sfs_buf_op = +sfs_rbuf,sfs_block_op = sfs_rblock,设置读取的函数操作。接着进行实际操作,先处理起始的没有对齐到块的部分,再以块为单位循环处理中间的部分,最后处理末尾剩余的部分。每部分中都调用sfs_bmap_load_nolock函数得到blkno对应的inode编号,并调用sfs_rbufsfs_rblock函数读取数据(中间部分调用sfs_rblock,起始和末尾部分调用sfs_rbuf),调整相关变量。完成后如果offset + alen > +din->fileinfo.size(写文件时会出现这种情况,读文件时不会出现这种情况,alen为实际读写的长度),则调整文件大小为offset + alen并设置dirty变量。

    + +

        +sfs_bmap_load_nolock函数将对应sfs_inode的第index个索引指向的block的索引值取出存到相应的指针指向的单元(ino_store)。它调用sfs_bmap_get_nolock来完成相应的操作。sfs_rbufsfs_rblock函数最终都调用sfs_rwblock_nolock函数完成操作,而sfs_rwblock_nolock函数调用dop_io->disk0_io->disk0_read_blks_nolock->ide_read_secs完成对磁盘的操作。

    + +

    4. +实验报告要求

    + +

    从网站上下载lab8.zip后,解压得到本文档和代码目录 lab8,完成实验中的各个练习。完成代码编写并检查无误后,在对应目录下执行 make handin 任务,即会自动生成 +lab8-handin.tar.gz。最后请一定提前或按时提交到网络学堂上。

    + +

    注意有“LAB8”的注释,这是需要主要修改的内容。代码中所有需要完成的地方challenge除外)都有“LAB8”“YOUR CODE”的注释,请在提交时特别注意保持注释,并将“YOUR +CODE”替换为自己的学号,并且将所有标有对应注释的部分填上正确的代码。

    + +
  • 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%0ArE+cI~JX+THjeJ8Hs@W9`!!<~oV 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

    ?{JEZbI?gaN|qV3k6dbW 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 literal 0 HcmV?d00001 diff --git a/lab2.files/image004.png b/lab2.files/image004.png new file mode 100644 index 0000000000000000000000000000000000000000..7685d4672ede4561f69fe5325df53ce4843c6422 GIT binary patch literal 67544 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 literal 0 HcmV?d00001 diff --git a/lab2.files/image006.png b/lab2.files/image006.png new file mode 100644 index 0000000000000000000000000000000000000000..10aafb7e561d5f0df227ea26bf140fde5f7c2bde GIT binary patch literal 37896 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