diff --git a/README.md b/README.md index f9d226d13..fbd5fbfd5 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ -# OS课程练习 -这里的习题用于清华大学计算机系2017年春季课程练习。 +# OS 课程练习 +这里的习题用于清华大学计算机系 2017 年春季课程练习。 -这里包括从互联网上搜集的操作系统课程相关习题和答案,包括部分考研试题,版权属于各出题单位或个人。由清华大学OS课的老师和助教撰写的习题和答案的文档版权属于陈渝、向勇,并采用 Creative Commons Attribution/Share-Alike (CC-BY-SA) License. +这里包括从互联网上搜集的操作系统课程相关习题和答案,包括部分考研试题,版权属于各出题单位或个人。由清华大学 OS 课的老师和助教撰写的习题和答案的文档版权属于陈渝、向勇,并采用 Creative Commons Attribution/Share-Alike (CC-BY-SA) License. -OS习题集采用gitbook的方式展现,可进行在线交互式答题。 +OS 习题集采用 gitbook 的方式展现,可进行在线交互式答题。 -下面是gitbook提供的试题编写的例子: +下面是 gitbook 提供的试题编写的例子: ## mcqx test1 {%mcq ans="o1"%} diff --git a/SUMMARY.md b/SUMMARY.md index dbbf06f69..8701df212 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -4,57 +4,57 @@ * [Intro](all/1-intro.md) * [教学环境准备](all/00-preparation.md) * [问卷](all/01-1-questionnaire.md) - * [lec1 SPOC讨论](all/01-2-spoc-discussion.md) + * [lec1 SPOC 讨论](all/01-2-spoc-discussion.md) * [lec2-lab0 在线练习](all/01-3-lab0-quiz.md) - * [lec2-lab0 SPOC讨论](all/01-3-lab0-spoc-discussion.md) + * [lec2-lab0 SPOC 讨论](all/01-3-lab0-spoc-discussion.md) * [中断、异常和系统调用](all/2-intr.md) - * [lec3 SPOC讨论](all/02-1-spoc-discussion.md) + * [lec3 SPOC 讨论](all/02-1-spoc-discussion.md) * [lec4-lab1 在线练习](all/02-2-lab1-quiz.md) - * [lec4-lab1 SPOC讨论](all/02-2-lab1-spoc-discussion.md) + * [lec4-lab1 SPOC 讨论](all/02-2-lab1-spoc-discussion.md) * [物理内存管理](all/3&4-pmm.md) * [lec5 在线练习](all/03-1-quiz.md) - * [lec5 SPOC讨论](all/03-1-spoc-discussion.md) + * [lec5 SPOC 讨论](all/03-1-spoc-discussion.md) * [lec6 在线练习](all/03-2-quiz.md) - * [lec6 SPOC讨论](all/03-2-spoc-discussion.md) + * [lec6 SPOC 讨论](all/03-2-spoc-discussion.md) * [lec7-lab2 在线练习](all/03-3-lab2-quiz.md) - * [lec7lab2 SPOC讨论](all/03-3-lab2-spoc-discussion.md) + * [lec7lab2 SPOC 讨论](all/03-3-lab2-spoc-discussion.md) * [虚拟内存管理](all/5&6-vmm.md) * [lec8 在线练习](all/04-1-quiz.md) - * [lec8 SPOC讨论](all/04-1-spoc-discussion.md) + * [lec8 SPOC 讨论](all/04-1-spoc-discussion.md) * [lec9 在线练习](all/04-2-quiz.md) - * [lec9 SPOC讨论](all/04-2-spoc-discussion.md) + * [lec9 SPOC 讨论](all/04-2-spoc-discussion.md) * [lec10-lab3 在线练习](all/04-3-lab3-quiz.md) - * [lec10-lab3 SPOC讨论](all/04-3-lab3-spoc-discussion.md) + * [lec10-lab3 SPOC 讨论](all/04-3-lab3-spoc-discussion.md) * [进程、线程管理](all/7-process&thread.md) * [lec11 在线练习](all/05-1-quiz.md) - * [lec11 SPOC讨论](all/05-1-spoc-discussion.md) + * [lec11 SPOC 讨论](all/05-1-spoc-discussion.md) * [lec12 在线练习](all/05-2-quiz.md) - * [lec12 SPOC讨论](all/05-2-spoc-discussion.md) + * [lec12 SPOC 讨论](all/05-2-spoc-discussion.md) * [lec13-lab4 在线练习](all/05-3-lab4-quiz.md) - * [lec13-lab4 SPOC讨论](all/05-3-lab4-spoc-discussion.md) + * [lec13-lab4 SPOC 讨论](all/05-3-lab4-spoc-discussion.md) * [lec14-lab5 在线练习](all/05-4-lab5-quiz.md) - * [lec14-lab5 SPOC讨论](all/05-4-lab5-spoc-discussion.md) -* [CPU调度](all/8-sched.md) + * [lec14-lab5 SPOC 讨论](all/05-4-lab5-spoc-discussion.md) +* [CPU 调度](all/8-sched.md) * [lec15 在线练习](all/06-1-quiz.md) - * [lec15 SPOC讨论](all/06-1-spoc-discussion.md) + * [lec15 SPOC 讨论](all/06-1-spoc-discussion.md) * [lec16-lab6 在线练习](all/06-2-lab6-quiz.md) - * [lec16-lab6 SPOC讨论](all/06-2-lab6-spoc-discussion.md) + * [lec16-lab6 SPOC 讨论](all/06-2-lab6-spoc-discussion.md) * [同步](all/9-sync.md) * [lec17 在线练习](all/07-1-quiz.md) - * [lec17 SPOC讨论](all/07-1-spoc-discussion.md) + * [lec17 SPOC 讨论](all/07-1-spoc-discussion.md) * [lec18 在线练习](all/07-2-quiz.md) - * [lec18 SPOC讨论](all/07-2-spoc-discussion.md) + * [lec18 SPOC 讨论](all/07-2-spoc-discussion.md) * [lec19 在线练习](all/07-3-lab7-quiz.md) - * [lec19-lab7 SPOC讨论](all/07-3-lab7-spoc-discussion.md) + * [lec19-lab7 SPOC 讨论](all/07-3-lab7-spoc-discussion.md) * [死锁和进程间通信](all/11-deadlock.md) * [lec20 在线练习](all/08-1-quiz.md) - * [lec20 SPOC讨论](all/08-1-spoc-discussion.md) + * [lec20 SPOC 讨论](all/08-1-spoc-discussion.md) * [文件系统](all/12-filesystem.md) * [lec21 在线练习](all/09-1-quiz.md) - * [lec21 SPOC讨论](all/09-1-spoc-discussion.md) + * [lec21 SPOC 讨论](all/09-1-spoc-discussion.md) * [lec22-lab8 在线练习](all/09-2-lab8-quiz.md) - * [lec22-lab8 SPOC讨论](all/09-2-lab8-spoc-discussion.md) -* [I/O子系统](all/13-io.md) + * [lec22-lab8 SPOC 讨论](all/09-2-lab8-spoc-discussion.md) +* [I/O 子系统](all/13-io.md) * [lec23 在线练习](all/10-1-quiz.md) - * [lec23 SPOC讨论](all/10-1-spoc-discussion.md) + * [lec23 SPOC 讨论](all/10-1-spoc-discussion.md) diff --git a/all/01-2-spoc-discussion.md b/all/01-2-spoc-discussion.md index ee07cfe06..1ffe43a38 100644 --- a/all/01-2-spoc-discussion.md +++ b/all/01-2-spoc-discussion.md @@ -2,35 +2,35 @@ --- -## **提前准备** +## 提前准备 (请在上课前完成) -* 完成lec1的视频学习和提交对应的在线练习 +* 完成 lec1 的视频学习和提交对应的在线练习 * git pull ucore\_os\_lab, ucore\_os\_docs, os\_tutorial\_lab, os\_course\_exercises in github repos。这样可以在本机上完成课堂练习。 -* 知道OS课程的入口网址,会使用在线视频平台,在线练习/实验平台,在线提问平台\(piazza\) +* 知道 OS 课程的入口网址,会使用在线视频平台,在线练习/实验平台,在线提问平台\(piazza\) * [http://os.cs.tsinghua.edu.cn/oscourse/OS2017spring](http://os.cs.tsinghua.edu.cn/oscourse/OS2017spring) * 了解学习方法 ``` - for (i=1; i<=13; i++) { - 1. 完成第i周课前视频学习 - 2. 完成第i周OpenEdx上的在线基本练习(直接在OpenEdx上提交) - 3. 上SPOC课并完成课上练习(课堂上完成并提交到piazza上的老师指定的特定帖下) - 4. 在deadline前,按序完成ucore_lab实验 - 5. if (i==7) 参加期中考试; - 6. if (i==13) 参加期末考试; - 7. if (碰到问题) 到piazza的论坛上提问; + for (i = 1; i <= 13; i++) { + 1. 完成第 i 周课前视频学习 + 2. 完成第 i 周 OpenEdx 上的在线基本练习 ( 直接在 OpenEdx 上提交 ) + 3. 上 SPOC 课并完成课上练习( 课堂上完成并提交到 piazza 上的老师指定的特定帖下 ) + 4. 在 deadline 前,按序完成 ucore_lab 实验 + 5. if (i == 7) 参加期中考试; + 6. if (i == 13) 参加期末考试; + 7. if (碰到问题) 到 piazza 的论坛上提问; } ``` -* 会使用linux shell命令,如ls, rm, mkdir, cat, less, more, gcc等,也会使用linux系统的基本操作。 -* 了解v9-computer会使用v9-computer的dis,xc, xem命令(包括启动参数),阅读v9-computer中的v9_computer.md文档,了解汇编指令的类型和含义等,了解v9-computer的细节。 +* 会使用 linux shell 命令,如 ls, rm, mkdir, cat, less, more, gcc 等,也会使用 linux 系统的基本操作。 +* 了解 v9-computer 会使用 v9-computer 的 dis, xc, xem 命令(包括启动参数),阅读 v9-computer 中的 v9_computer.md 文档,了解汇编指令的类型和含义等,了解 v9-computer 的细节。 * [v9 computer](https://github.com/chyyuu/os_tutorial_lab/blob/master/v9_computer/docs/v9_computer.md) -* 在piazza上就学习中不理解问题进行提问。 +* 在 piazza 上就学习中不理解问题进行提问。 -* 观看[Peter Denning’s talk video, “Perspectives on OS Foundations”, presented at the SOSP History Day Workshop (SOSP‘15).](https://www.youtube.com/watch?v=xs6cDaXbsUA) +* 观看 [Peter Denning’s talk video, “Perspectives on OS Foundations”, presented at the SOSP History Day Workshop (SOSP‘15).](https://www.youtube.com/watch?v=xs6cDaXbsUA) # 操作系统概述思考题 @@ -40,17 +40,17 @@ ## 个人思考题 --- -* 当前常见的操作系统包括{%s%} Windows, GNU/Linux, MacOS, iOS, Android, DoS, VxWorks, uCOS,FreeRTOS,eCOS,QNX{%ends%}。 -* 当前常见的操作系统主要用{%s%} C,C++,ASM{%ends%}编程语言编写。 -* 操作系统是{%s%} 管理系统资源,控制程序执行,改善人机界面,提供各种服务,合理组织计算机工作流程和胃用户使用计算机提供良好的运行环境{%ends%}的一种系统软件。 -* "Operating system"这个单词起源于{%s%} Operator {%ends%}。 +* 当前常见的操作系统包括 {%s%} Windows, GNU/Linux, MacOS, iOS, Android, DoS, VxWorks, uCOS, FreeRTOS, eCOS, QNX{%ends%}。 +* 当前常见的操作系统主要用 {%s%} C, C++, ASM{%ends%} 编程语言编写。 +* 操作系统是 {%s%} 管理系统资源,控制程序执行,改善人机界面,提供各种服务,合理组织计算机工作流程和为用户使用计算机提供良好的运行环境{%ends%}的一种系统软件。 +* 「Operating system」这个单词起源于{%s%} Operator {%ends%}。 * 在计算机系统中,控制和管理各种资源、有效地组织多道程序运行的系统软件称作{%s%} 操作系统 {%ends%}。 * 允许多用户将若干个作业提交给计算机系统集中处理的操作系统称为{%s%} 批处理 {%ends%}操作系统 -* 你了解的当前世界上使用最多的32bit CPU是{%s%} ARM {%ends%},其上运行最多的操作系统是{%s%} Android{%ends%}。 +* 你了解的当前世界上使用最多的 32 bit CPU 是{%s%} ARM {%ends%},其上运行最多的操作系统是{%s%} Android{%ends%}。 * 应用程序通过{%s%} 系统调用 {%ends%}接口获得操作系统的服务。 * 推动操作系统发展的因素有{%s%} ARM {%ends%}。 * 现代操作系统的特征包括{%s%}并行性,虚拟性,异步性(不确定性)、共享性和持久性 {%ends%}。 -* 操作系统内核的架构设计包括{%s%}宏内核(单体内核,monolithic kernel),微内核(microkernel),外核(exokernel){%ends%}。 +* 操作系统内核的架构设计包括{%s%}宏内核(单体内核, monolithic kernel),微内核 (microkernel),外核(exokernel){%ends%}。 --- @@ -59,24 +59,22 @@ {%s%} -``` 不同点: -1)面向的目标不同:Windows面向PC,服务器、;Linux/FreeBSD面向嵌入式,PC,服务器;Android/iOS面向移动终端;MacOS面向PC。 -2)开放性不同:Windows/iOS/MacOS是封闭,不开放源码,开发过程不开放;Linux基于GPL协议开放源码,开发过程不开放;FreeBSD基于BSD协议开放源码,开发过程不开放;Android基于Apache/GPL等协议开放源码,但开发过程不开放。 -3)支持硬件不同:Windows支持x86, arm CPU;MacOS支持x86;Linux支持绝大部分32/64bit CPU;FreeBSD支持一部分32/64bit CPU;iOS支持ARM CPU。 +1)面向的目标不同: Windows 面向 PC, 服务器、;Linux / FreeBSD 面向嵌入式,PC,服务器; Android / iOS 面向移动终端;MacOS 面向 PC。 +2)开放性不同:Windows / iOS / MacOS 是封闭,不开放源码,开发过程不开放;Linux 基于 GPL 协议开放源码,开发过程不开放;FreeBSD 基于 BSD 协议开放源码,开发过程不开放;Android 基于 Apache/GPL 等协议开放源码,但开发过程不开放。 +3)支持硬件不同: Windows 支持 x86, ARM CPU; MacOS 支持 x86;Linux 支持绝大部分 32 / 64bit CPU; FreeBSD 支持一部分 32 / 64bit CPU;iOS 支持 ARM CPU。 相同点: 2)类型:都是通用操作系统,具有通用操作系统的功能和特点。 -``` {%ends%} -- 如何评价Windows的封闭发展模式和Linux的开放发展模式? +- 如何评价 Windows 的封闭发展模式和 Linux 的开放发展模式? {%s%} -这是两种发展模式,没有对错/优劣,二者都有各自的生存和发展的途径。 +这是两种发展模式,没有对错 / 优劣,二者都有各自的生存和发展的途径。 {%ends%} @@ -84,7 +82,7 @@ {%s%} -从总体上看,操作系统具有五个方面的特征:虚拟性(Virtualization)、并发性(concurrency)、异步性、共享性和持久性(persistency)。在虚拟性方面,可以从操作系统对内存,CPU的抽象和处理上有更好的理解;对于并发性和共享性方面,可以从操作系统支持多个应用程序“同时”运行的情况来理解;对于异步性,可以从操作系统调度,中断处理对应用程序执行造成的影响等几个放马来理解;对于持久性方面,可以从操作系统中的文件系统支持把数据方便地从磁盘等存储介质上存入和取出来理解。 +从总体上看,操作系统具有五个方面的特征:虚拟性(Virtualization)、并发性(concurrency)、异步性、共享性和持久性(persistency)。在虚拟性方面,可以从操作系统对内存,CPU的抽象和处理上有更好的理解;对于并发性和共享性方面,可以从操作系统支持多个应用程序「同时」运行的情况来理解;对于异步性,可以从操作系统调度,中断处理对应用程序执行造成的影响等几个方面来理解;对于持久性方面,可以从操作系统中的文件系统支持把数据方便地从磁盘等存储介质上存入和取出来理解。 {%ends%} @@ -100,7 +98,7 @@ {%s%} -通过学习与实践来来更好地理解操作系统原理和概念,掌握软件与硬件的交互,掌握大型软件的分析与开发方法。 +通过学习与实践来更好地理解操作系统原理和概念,掌握软件与硬件的交互,掌握大型软件的分析与开发方法。 {%ends%} @@ -108,7 +106,7 @@ {%s%} -当前,大数据、人工智能、机器学习、高速网络、AR/VR、异构/新型计算机硬件与外设(CPU+GPU, CPU+FPGA, NVRAM等)、系统安全、系统正确性等对操作系统等系统软件带来了新的挑战。如何有效支持和利用这些技术是未来操作系统的挑战与方向。 +当前,大数据、人工智能、机器学习、高速网络、AR / VR、异构/新型计算机硬件与外设(CPU + GPU, CPU + FPGA, NVRAM等)、系统安全、系统正确性等对操作系统等系统软件带来了新的挑战。如何有效支持和利用这些技术是未来操作系统的挑战与方向。 {%ends%} @@ -116,7 +114,7 @@ {%s%} -用过的包括:Windows/MacOS适合一般办公用户,Android/iOS适合移动终端用户,Linux/FreeBSD适合专业计算机人士 +用过的包括:Windows / MacOS 适合一般办公用户,Android / iOS适合移动终端用户,Linux / FreeBSD适合专业计算机人士 {%ends%} @@ -132,10 +130,7 @@ {%s%} -- 操作系统内核是指大多数操作系统的核心部分。它由操作系统中用于管理存储器、文件、外设和系统资源的那些部分组成。操作系统内核通常运行进程,并提供进程间的通信。 - -* 微内核(Microkernelkernel)微内核是内核的一种精简形式。微内核结构由一个非常简单的硬件抽象层和一组比较关键的原语或系统调用组成,这些原语仅仅包括了建立一个系统必需的几个部分,如线程管理,地址空间和进程间通信等。通常与内核集成在一起的系统服务层被分离出来,变成可以根据需求加入的组件,这样就可提供更好的可扩展性和更加有效的应用环境。使用微内核设计,对系统进行升级,只要用新模块替换旧模块,不需要改变整个操作系统。其最大的问题是性能由于进程间频繁通信而会受到影响。 -* 外核(Exokernel)结构:是一种极简化的微核心,约在1994年由MIT PDOS组提出,。其设计理念是让用户程序的设计者来决定硬件接口的设计。外核本身非常的小,它通常只负责硬件资源保护和硬件资源复用相关的服务。在外核上运行一个针对具体应用的LibOS,并给LibOS提供硬件功能支持。单一应用运行在LibOS上,可获得性能的优势。 +操作系统内核是指大多数操作系统的核心部分。它由操作系统中用于管理存储器、文件、外设和系统资源的那些部分组成。操作系统内核通常运行进程,并提供进程间的通信。微内核( Microkernelkernel )微内核是内核的一种精简形式。微内核结构由一个非常简单的硬件抽象层和一组比较关键的原语或系统调用组成,这些原语仅仅包括了建立一个系统必需的几个部分,如线程管理,地址空间和进程间通信等。通常与内核集成在一起的系统服务层被分离出来,变成可以根据需求加入的组件,这样就可提供更好的可扩展性和更加有效的应用环境。使用微内核设计,对系统进行升级,只要用新模块替换旧模块,不需要改变整个操作系统。其最大的问题是性能由于进程间频繁通信而会受到影响。外核( Exokernel )结构:是一种极简化的微核心,约在 1994 年由 MIT PDOS 组提出。其设计理念是让用户程序的设计者来决定硬件接口的设计。外核本身非常的小,它通常只负责硬件资源保护和硬件资源复用相关的服务。在外核上运行一个针对具体应用的 LibOS,并给 LibOS 提供硬件功能支持。单一应用运行在 LibOS 上,可获得性能的优势。 {%ends%} @@ -143,9 +138,9 @@ {%s%} -首先来看看内存的虚拟化。程序员在写应用程序的时候,不用考虑其程序的起始内存地址要放到计算机内存的具体某个位置,而是用字符串符号定义了各种变量和函数,直接在代码中便捷地使用这些符号就行了。这是由于操作系统建立了一个**地址固定**,**空间巨大**的虚拟内存给应用程序来运行,这是**空间虚拟化**。这里的每个符号在运行时是要对应到具体的内存地址的。这些内存地址的具体数值是什么?程序员不用关心。为什么?因为编译器会自动帮我们吧这些符号翻译成地址,形成可执行程序。程序使用的内存是否占得太大了?在一般情况下,程序员也不用关心。 +首先来看看内存的虚拟化。程序员在写应用程序的时候,不用考虑其程序的起始内存地址要放到计算机内存的具体某个位置,而是用字符串符号定义了各种变量和函数,直接在代码中便捷地使用这些符号就行了。这是由于操作系统建立了一个地址固定,空间巨大的虚拟内存给应用程序来运行,这是空间虚拟化。这里的每个符号在运行时是要对应到具体的内存地址的。这些内存地址的具体数值是什么?程序员不用关心。为什么?因为编译器会自动帮我们把这些符号翻译成地址,形成可执行程序。程序使用的内存是否占得太大了?在一般情况下,程序员也不用关心。 -再来看CPU虚拟化。不同的应用程序可以在内存中并发运行,相同的应用程序也可有多个拷贝在内存中并发运行。而每个程序都“认为”自己完全独占了CPU在运行,这是”时间虚拟化“。这其实也是操作系统给了运行的应用程序一个虚拟幻象。其实是操作系统把时间分成小段,每个应用程序占用其中一小段时间片运行,用完这一时间片后,操作系统会切换到另外一个应用程序,让它运行。由于时间片很短,操作系统的切换开销也很小,人眼基本上是看不出的,反而感觉到多个程序各自在独立”并行“执行,从而实现了**时间虚拟化**。 +再来看 CPU 虚拟化。不同的应用程序可以在内存中并发运行,相同的应用程序也可有多个拷贝在内存中并发运行。而每个程序都「认为」自己完全独占了 CPU 在运行,这是「时间虚拟化」。这其实也是操作系统给了运行的应用程序一个虚拟幻象。其实是操作系统把时间分成小段,每个应用程序占用其中一小段时间片运行,用完这一时间片后,操作系统会切换到另外一个应用程序,让它运行。由于时间片很短,操作系统的切换开销也很小,人眼基本上是看不出的,反而感觉到多个程序各自在独立「并行」执行,从而实现了时间虚拟化。 {%ends%} @@ -155,25 +150,25 @@ --- -- 目前的台式PC机标准配置和价格? +- 目前的台式 PC 机标准配置和价格? {%s%} -x86 多核CPU,4GB+内存,128GB+硬盘/SSD,19寸显示器,400瓦机箱,键盘/鼠标,价格大约2000~3000 RMB左右就够了。 +x86 多核 CPU,4GB+ 内存,128GB+ 硬盘 /SSD,19 寸显示器,400 瓦机箱,键盘 / 鼠标,价格大约 2000~3000 RMB 就够了。 -如果配置不要求太高,1000RMB可以买一个笔记本。 +如果配置不要求太高,1000 RMB 可以买一个笔记本。 {%ends%} -- 为什么现在的操作系统基本上用C语言来实现? +- 为什么现在的操作系统基本上用 C 语言来实现? {%s%} -C语言足够高级,成熟,可以方便编写OS和跨平台;且足够底层,能够很好地描述计算机硬件细节(比如位操作);C编译器可以生成高效的机器语言组成的执行代码,性能有保证;C语言产生的一个原因就是为了更好地编写UNIX操作系统。 +C 语言足够高级,成熟,可以方便编写 OS 和跨平台;且足够底层,能够很好地描述计算机硬件细节(比如位操作);C 编译器可以生成高效的机器语言组成的执行代码,性能有保证;C 语言产生的一个原因就是为了更好地编写 UNIX 操作系统。 {%ends%} -- 为什么没有人用python,java来实现操作系统? +- 为什么没有人用 python,java 来实现操作系统? {%s%} @@ -181,11 +176,11 @@ C语言足够高级,成熟,可以方便编写OS和跨平台;且足够底 {%ends%} -- 请评价用C++来实现操作系统的利弊? +- 请评价用 C++ 来实现操作系统的利弊? {%s%} - c++作为高级编程语言,实现操作系统可以很好的模块化和面向对象的特征。但不足是现在基于C++写出的OS还很少,不够成熟,C++语言的一些机制相对比较复杂,难以掌握,开发,调试,对性能也有一定影响。 + C++ 作为高级编程语言,实现操作系统可以很好的模块化和面向对象的特征。但不足是现在基于 C++ 写出的 OS 还很少,不够成熟,C++ 语言的一些机制相对比较复杂,难以掌握,开发,调试,对性能也有一定影响。 {%ends%} @@ -195,7 +190,7 @@ C语言足够高级,成熟,可以方便编写OS和跨平台;且足够底 --- -- 请评价用LISP,Haskell, GO, D,RUST等实现操作系统的利弊? +- 请评价用 LISP, Haskell, GO, D,RUST 等实现操作系统的利弊? {%s%} @@ -203,15 +198,15 @@ C语言足够高级,成熟,可以方便编写OS和跨平台;且足够底 {%ends%} -- 为什么微软的Windows没有在手机终端领域取得领先地位? +- 为什么微软的 Windows 没有在手机终端领域取得领先地位? {%s%} -起步太晚,吃PC的老本,领导对未来方向把握不够,现在的市场已经被Android/iOS瓜分了,再追已经很困难了。 +起步太晚,吃 PC 的老本,领导对未来方向把握不够,现在的市场已经被 Android / iOS 瓜分了,再追已经很困难了。 {%ends%} -- 你认为未来(10年内)的操作系统应该具有什么样的特征和功能? +- 你认为未来(10 年内)的操作系统应该具有什么样的特征和功能? {%s%} @@ -225,7 +220,7 @@ C语言足够高级,成熟,可以方便编写OS和跨平台;且足够底 --- -- 请分析模拟v9\-computer的em.c。理解:在v9\-computer中如何实现时钟中断的;v9 computer的CPU指令,关键变量描述有误或不全的情况;在v9\-computer中的跳转相关操作是如何实现的;在v9\-computer中如何设计相应指令,可有效实现函数调用与返回;OS程序被加载到内存的哪个位置,其堆栈是如何设置的;在v9\-computer中如何完成一次内存地址的读写的;在v9\-computer中如何实现分页机制; +- 请分析模拟 v9\-computer 的 em.c。理解:在 v9\-computer 中如何实现时钟中断;v9 computer 的 CPU 指令,关键变量描述有误或不全的情况;在 v9\-computer 中的跳转相关操作是如何实现的;在 v9\-computer 中如何设计相应指令,可有效实现函数调用与返回;OS 程序被加载到内存的哪个位置, 其堆栈是如何设置的;在 v9\-computer 中如何完成一次内存地址的读写的;在 v9\-computer 中如何实现分页机制; {%s%} @@ -237,7 +232,7 @@ https://github.com/chyyuu/os_tutorial_lab/blob/master/v9_computer/docs/v9_comput {%ends%} -- 请编写一个小程序,在v9-cpu下,能够输出字符 +- 请编写一个小程序,在 v9-cpu 下,能够输出字符 {%s%} @@ -245,13 +240,13 @@ https://github.com/chyyuu/os_tutorial_lab/tree/master/v9_computer/os_helloworld {%ends%} -- 请编写一个小程序,在v9-cpu下,能够接收你输入的字符并输出你输入的字符 +- 请编写一个小程序,在 v9-cpu 下,能够接收你输入的字符并输出你输入的字符 {%s%} {%ends%} -- 请编写一个小程序,在v9-cpu下,能够产生各种异常/中断 +- 请编写一个小程序,在 v9-cpu 下,能够产生各种异常 / 中断 {%s%} @@ -267,7 +262,7 @@ https://github.com/chyyuu/os_tutorial_lab/tree/master/v9_computer/os_timer_inter {%ends%} -- 请编写一个小程序,在v9-cpu下,能够统计并显示内存大小 +- 请编写一个小程序,在 v9-cpu 下,能够统计并显示内存大小 {%s%} diff --git a/all/01-3-lab0-quiz.md b/all/01-3-lab0-quiz.md index ab3cdbde7..6811aca09 100644 --- a/all/01-3-lab0-quiz.md +++ b/all/01-3-lab0-quiz.md @@ -11,7 +11,7 @@ - [ ] xv6 - [ ] Nachos -> 是参考了xv6, OS161, Linux的教学操作系统ucore OS +> 是参考了 xv6, OS161, Linux 的教学操作系统 ucore OS 在ucore lab的实验环境搭建中,使用的**非开源**软件是() @@ -22,14 +22,14 @@ > Scitools Understand 是非开源软件,主要可以用于分析代码,可免费试用一段时间。 -在ucore lab的实验环境搭建中,用来模拟一台PC机(即基于Intel 80386 CPU的计算机)的软件是() +在 ucore lab 的实验环境搭建中,用来模拟一台 PC 机(即基于 Intel 80386 CPU 的计算机)的软件是() - [ ] apt - [ ] git - [ ] meld - [x] qemu -> qemu是一个支持模拟多种CPU的模拟软件 +> qemu 是一个支持模拟多种 CPU 的模拟软件 --- @@ -40,13 +40,13 @@ | | 是 | 否 | | ---------------- | ---- | --- | -ucore lab实验中8个实验是否可以不按顺序完成|(x)|()| +ucore lab 实验中 8 个实验是否可以不按顺序完成|(x)|()| -> 每个实验i依赖前面所有的实验(0~i-1),即完成了lab i,才能完成lab i+1 +> 每个实验 i 依赖前面所有的实验 ( 0 ~ i - 1 ),即完成了 lab i,才能完成 lab i + 1 | | 是 | 否 | | ---------------- | ---- | --- | -ucore lab实验中在C语言中采用了面向对象的编程思想,包括函指针表和通用链表结构|(x)|()| +ucore lab 实验中在 C 语言中采用了面向对象的编程思想,包括函指针表和通用链表结构|(x)|()| > 是的,这使得可编出更加灵活的操作系统功能模块和数据结构 @@ -56,13 +56,13 @@ ucore lab实验中在C语言中采用了面向对象的编程思想,包括函 --- -x86-32 CPU(即80386)有多种运行模式,ucore lab中碰到和需要处理哪些模式() +x86-32 CPU( 即 80386 )有多种运行模式,ucore lab 中碰到和需要处理哪些模式 () - [x] 实模式 - [x] 保护模式 - [ ] SMM模式 - [ ] 虚拟8086模式 -> ucore需要碰到和处理16位的实模式和32位的保护模式 +> ucore 需要碰到和处理 16 位的实模式和 32 位的保护模式 --- diff --git a/all/01-3-lab0-spoc-discussion.md b/all/01-3-lab0-spoc-discussion.md index 81641f139..28469f941 100644 --- a/all/01-3-lab0-spoc-discussion.md +++ b/all/01-3-lab0-spoc-discussion.md @@ -1,18 +1,18 @@ # lab0 SPOC思考题 -##**提前准备** +## 提前准备 (请在上课前完成) -- 完成lec2的视频学习和提交对应的在线练习 +- 完成 lec2 的视频学习和提交对应的在线练习 - git pull ucore_os_lab, os_tutorial_lab, os_course_exercises in github repos。这样可以在本机上完成课堂练习。 -- 了解代码段,数据段,执行文件,执行文件格式,堆,栈,控制流,函数调用,函数参数传递,用户态(用户模式),内核态(内核模式)等基本概念。思考一下这些基本概念在linux, ucore, v9-cpu中是如何具体体现的。 -- 安装好ucore实验环境,能够编译运行ucore labs中的源码。 -- 会使用linux中的shell命令:objdump,nm,file, strace,gdb等,了解这些命令的用途。 -- 会编译,运行,使用v9-cpu的dis,xc, xem命令(包括启动参数),阅读v9-cpu中的v9\-computer.md文档,了解汇编指令的类型和含义等,了解v9-cpu的细节。 -- 了解基于v9-cpu的执行文件的格式和内容,以及它是如何加载到v9-cpu的内存中的。 -- 在piazza上就学习中不理解问题进行提问。 - -- 观看[Tech Talk: Linus Torvalds on git](https://www.youtube.com/watch?v=4XpnKHJAok8) +- 了解代码段,数据段,执行文件,执行文件格式,堆,栈,控制流,函数调用, 函数参数传递,用户态(用户模式),内核态(内核模式)等基本概念。思考一下这些基本概念在 linux, ucore, v9-cpu 中是如何具体体现的。 +- 安装好 ucore 实验环境,能够编译运行 ucore labs 中的源码。 +- 会使用 linux 中的 shell 命令 : objdump,nm,file, strace,gdb 等,了解这些命令的用途。 +- 会编译,运行,使用 v9-cpu 的 dis, xc, xem 命令(包括启动参数),阅读 v9-cpu 中的 v9\-computer.md 文档,了解汇编指令的类型和含义等,了解 v9-cpu 的细节。 +- 了解基于 v9-cpu 的执行文件的格式和内容,以及它是如何加载到 v9-cpu 的内存中的。 +- 在 piazza 上就学习中不理解问题进行提问。 + +- 观看 [Tech Talk: Linus Torvalds on git](https://www.youtube.com/watch?v=4XpnKHJAok8) --- ## 视频相关讨论题 @@ -50,7 +50,7 @@ - 编辑工具 - 代码阅读工具 - - 调试工具、 + - 调试工具 {%ends%} @@ -58,56 +58,56 @@ {%s%} > 物理地址:是处理器提交到总线上用于访问计算机系统中的内存和外设的最终地址。一个计算机系统中只有一个物理地址空间。 - > 逻辑地址:在有地址变换功能的计算机中,访问指令给出的地址叫逻辑地址。 - > 线性地址:线性地址是逻辑地址到物理地址变换之间的中间层,处理器通过段(Segment)机制控制下的形成的地址空间。 + > 逻辑地址:在有地址变换功能的计算机中, 访问指令给出的地址叫逻辑地址。 + > 线性地址:线性地址是逻辑地址到物理地址变换之间的中间层,是处理器通过段 ( Segment ) 机制控制下的形成的地址空间。 {%ends%} -- x86的实模式和保护模式有什么区别? +- x86 的实模式和保护模式有什么区别? {%s%} - > 可访问的物理内存空间大小不同,实模式下可访问的物理内存空间不超过1MB,在保护方式下,全部32条地址线有效,可寻址高达4G字节的物理地址空间。 + > 可访问的物理内存空间大小不同,实模式下可访问的物理内存空间不超过 1 MB,在保护方式下,全部 32 条地址线有效,可寻址高达 4 G 字节的物理地址空间。 > - > 护模式和实模式的根本区别是进程内存是否受保护,实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和用户程序没有区别对待,而且每一个指针都是指向"实在"的物理地址。这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序区域,并改变了值,那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的。为了克服这种低劣的内存管理方式,处理器厂商开发出保护模式。这样,物理内存地址不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问,程序对此一无所知。 + > 保护模式和实模式的根本区别是进程内存是否受保护,实模式将整个物理内存看成分段的区域, 程序代码和数据位于不同区域,系统程序和用户程序没有区别对待, 而且每一个指针都是指向「实在」的物理地址。这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序区域,并改变了值,那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的。为了克服这种低劣的内存管理方式,处理器厂商开发出保护模式。这样,物理内存地址不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问,程序对此一无所知。 > - > CPU启动环境为16位实模式,之后切换到保护模式,这主要是因为下x86需要向下兼容 + > CPU 启动环境为 16 位实模式,之后切换到保护模式,这主要是因为 x86 需要向下兼容 {%ends%} -- 实模式的地址空间不能大于1MB的原因是什么? +- 实模式的地址空间不能大于 1 MB 的原因是什么? {%s%} - >Intel早期的8086CPU提供了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(前面的0fff0fh是segment=0ffffh并向左移动4位的结果,后面的0ffffh是可能的最大offset),这个计算出的10ffefh是多大呢?大约是1088KB,就是说,segment:offset的地址表示能力,超过了20位地址线的物理寻址能力。所以当寻址到超过1MB的内存时,会发生“回卷”(不会发生异常)。 + > Intel 早期的 8086 CPU 提供了 20 根地址线,可寻址空间范围 0 ~ 2^20 ( 00000H ~ FFFFF H ) 的 1 MB 内存空间。但 8086 的数据处理位宽位 16 位, 无法直接寻址 1MB 内存空间,所以 8086 提供了段地址加偏移地址的地址转换机制。PC 机的寻址结构是 segment : offset, segment 和 offset 都是 16 位的寄存器, 最大值是 0ffffh, 换算成物理地址的计算方法是把 segment 左移 4 位, 再加上 offset, 所以 segment : offset 所能表达的寻址空间最大应为 0ffff0h + 0ffffh = 10ffefh ( 前面的 0fff0fh 是 segment = 0ffffh 向左移动 4 位的结果, 后面的 0ffffh 是可能的最大 offset), 这个计算出的 10ffefh 是多大呢? 大约是 1088 KB, 就是说, segment : offset 的地址表示能力, 超过了 20 位地址线的物理寻址能力。所以当寻址到超过 1MB 的内存时, 会发生「回卷」( 不会发生异常 )。 {%ends%} -- pmm_manager数据结构的定义、初始化和引用代码在哪? +- pmm_manager 数据结构的定义、初始化和引用代码在哪? {%s%} -> pmm_manager 数据结构在pmm.h中的定义,在pmm.c中的init_pmm_manager函数中初始化,在pmm.c的pmm_init函数中引用 +> pmm_manager 数据结构在 pmm.h 中的定义, 在 pmm.c 中的 init_pmm_manager 函数中初始化,在 pmm.c 的 pmm_init 函数中引用 {%ends%} -- list_entry双向链表数据结构如何可以用于不同数据类型的链表定义?链表操作函数有哪些?这种链表定义方法有什么好处? +- list_entry 双向链表数据结构如何可以用于不同数据类型的链表定义?链表操作函数有哪些?这种链表定义方法有什么好处? {%s%} -> 链表节点list_entry不包括传统的data数据域,而是在具体的数据结构中包含链表节点。 +> 链表节点 list_entry 不包括传统的 data 数据域,而是在具体的数据结构中包含链表节点。 > 链表操作函数有初始化、插入、删除、访问链表节点所在的宿主数据结构等。 -> 避免了为每个特定数据结构类型定义针对这个数据结构的特定链表的麻烦,而可以让所有的特定数据结构共享通用的链表操作函数,使代码更加简洁。 +> 避免了为每个特定数据结构类型定义针对这个数据结构的特定链表的麻烦, 而可以让所有的特定数据结构共享通用的链表操作函数,使代码更加简洁。 {%ends%} -- 队列数据结构有4个基本操作函数,如何基于这些函数来实现支持保存不同数据的多种队列?操作系统内核中的队列数据结构是如何实现的? +- 队列数据结构有 4 个基本操作函数,如何基于这些函数来实现支持保存不同数据的多种队列?操作系统内核中的队列数据结构是如何实现的? -- 理解2.6节中宏定义的含义是什么?自己再找一个类似的例子,并进行解释。 +- 理解 2.6 节中宏定义的含义是什么?自己再找一个类似的例子,并进行解释。 {%s%} -> le2page这个宏通过page结构的链表节点成员list_entry来访问page +> le2page 这个宏通过 page 结构的链表节点成员 list_entry 来访问 page > -> mmu.h中的宏SETGATE用来设置中断描述符 +> mmu.h 中的宏 SETGATE 用来设置中断描述符 {%ends%} @@ -126,11 +126,11 @@ --- -- 能否读懂ucore中的AT&T格式的X86-32汇编语言? +- 能否读懂 ucore 中的 AT&T 格式的 X86-32 汇编语言? - - [Intel格式和AT&T格式汇编区别](http://www.cnblogs.com/hdk1993/p/4820353.html) + - [Intel 格式和 AT&T 格式汇编区别](http://www.cnblogs.com/hdk1993/p/4820353.html) - - ##### [x86汇编指令集  ](http://hiyyp1234.blog.163.com/blog/static/67786373200981811422948/) + - ##### [x86 汇编指令集  ](http://hiyyp1234.blog.163.com/blog/static/67786373200981811422948/) - ##### [PC Assembly Language, Paul A. Carter, November 2003.](https://pdos.csail.mit.edu/6.828/2016/readings/pcasm-book.pdf) @@ -140,30 +140,30 @@ ​ -- 虽然学过计算机原理和x86汇编(根据THU-CS的课程设置),但对ucore中涉及的哪些x86硬件设计或功能细节不够了解? +- 虽然学过计算机原理和 x86 汇编(根据 THU-CS 的课程设置),但对 ucore 中涉及的那些 x86 硬件设计或功能细节不够了解? - [Phil Storrs PC Hardware book,Phil Storrs, December 1998.](http://web.archive.org/web/20040603021346/http://members.iweb.net.au/%7Epstorr/pcbook/) - [Bochs technical hardware specifications directory](http://bochs.sourceforge.net/techdata.html) -- 哪些困难(请分优先级)会阻碍你自主完成lab实验? +- 哪些困难(请分优先级)会阻碍你自主完成 lab 实验? - 硬件细节 - - 复杂的C代码和汇编 - - 不能象应用程序那样很方便地调试 + - 复杂的 C 代码和汇编 + - 不能像应用程序那样很方便地调试 -- 如何把一个在gdb中或执行过程中出现的物理/线性地址与你写的代码源码位置对应起来? +- 如何把一个在 gdb 中或执行过程中出现的物理 / 线性地址与你写的代码源码位置对应起来? -> 1. 在gdb中通过break加行号得到物理地址,list加*物理地址得到行号。 -> 2. 用nm, objdump工具可以看到 +> 1. 在 gdb 中通过 break 加行号得到物理地址,list 加 * 物理地址得到行号。 +> 2. 用 nm, objdump 工具可以看到 -- 了解函数调用栈对lab实验有何帮助? +- 了解函数调用栈对 lab 实验有何帮助? -> 除了错可以调试 +> 出了错可以调试 > 对于函数的调用过程和程序的运行过程有更好的理解。 > 便于调试以及检查。 -- 你希望从lab中学到什么知识? - - 尝试理解和实现一个面向真实硬件的简单OS,对理解OS原理有很好的补充。 +- 你希望从 lab 中学到什么知识? + - 尝试理解和实现一个面向真实硬件的简单 OS,对理解 OS 原理有很好的补充。 --- @@ -173,72 +173,72 @@ - 搭建好实验环境,请描述碰到的困难和解决的过程。 -> 困难:在virtualbox中设置虚拟机的时候找不到Linux的64位选项。 -> 解决:需要通过BIOS设置将电脑的虚拟化功能打开(本电脑LenovoY480的VT功能是锁的,需要打开)。 -> 开始时选择了UBUNTU 32位,不能启动,后来换成64位就能顺利运行 +> 困难:在 virtualbox 中设置虚拟机的时候找不到 Linux 的 64 位选项。 +> 解决:需要通过 BIOS 设置将电脑的虚拟化功能打开(本电脑 LenovoY480 的 VT 功能是锁的,需要打开)。 +> 开始时选择了 UBUNTU 32 位,不能启动,后来换成 64 位就能顺利运行 -> 熟悉基本的git命令行操作命令,从github上的 http://www.github.com/chyyuu/ucore_os_lab 下载ucore lab实验 +> 熟悉基本的 git 命令行操作命令,从 github 上的 http://www.github.com/chyyuu/ucore_os_lab 下载 ucore lab 实验 > > clone 仓库 -> gitclone http://www.github.com/chyyuu/ucore_os_lab +> git clone http://www.github.com/chyyuu/ucore_os_lab > -> 尝试用qemu+gdb(or ECLIPSE-CDT)调试lab1 +> 尝试用 qemu + gdb(or ECLIPSE-CDT)调试 lab1 > 清除文件夹:make clean -> 编译lab1:make -> 调出debug命令行:make debug +> 编译 lab1:make +> 调出 debug 命令行:make debug -对于如下的代码段,请说明”:“后面的数字是什么含义 -``` +对于如下的代码段,请说明「:」后面的数字是什么含义 +```c /* Gate descriptors for interrupts and traps */ struct gatedesc { - unsigned gd_off_15_0 : 16; // low 16 bits of offset in segment - unsigned gd_ss : 16; // segment selector + unsigned gd_off_15_0 : 16; // low 16 bits of offset in segment + unsigned gd_ss : 16; // segment selector unsigned gd_args : 5; // # args, 0 for interrupt/trap gates unsigned gd_rsv1 : 3; // reserved(should be zero I guess) unsigned gd_type : 4; // type(STS_{TG,IG32,TG32}) - unsigned gd_s : 1; // must be 0 (system) - unsigned gd_dpl : 2; // descriptor(meaning new) privilege level - unsigned gd_p : 1; // Present - unsigned gd_off_31_16 : 16; // high bits of offset in segment + unsigned gd_s : 1; // must be 0 (system) + unsigned gd_dpl : 2; // descriptor(meaning new) privilege level + unsigned gd_p : 1; // Present + unsigned gd_off_31_16 : 16; // high bits of offset in segment }; ``` - [x] ​ -> 每一个filed(域,成员变量)在struct(结构)中所占的位数; 也称“位域”,用于表示这个成员变量占多少位(bit)。 +> 每一个 filed ( 域,成员变量 ) 在 struct ( 结构 ) 中所占的位数; 也称「位域」,用于表示这个成员变量占多少位 (bit)。 - 对于如下的代码段, -``` -#define SETGATE(gate, istrap, sel, off, dpl) { \ - (gate).gd_off_15_0 = (uint32_t)(off) & 0xffff; \ - (gate).gd_ss = (sel); \ - (gate).gd_args = 0; \ - (gate).gd_rsv1 = 0; \ - (gate).gd_type = (istrap) ? STS_TG32 : STS_IG32; \ - (gate).gd_s = 0; \ - (gate).gd_dpl = (dpl); \ - (gate).gd_p = 1; \ - (gate).gd_off_31_16 = (uint32_t)(off) >> 16; \ +```c +#define SETGATE(gate, istrap, sel, off, dpl) { + (gate).gd_off_15_0 = (uint32_t)(off) & 0xffff; + (gate).gd_ss = (sel); + (gate).gd_args = 0; + (gate).gd_rsv1 = 0; + (gate).gd_type = (istrap) ? STS_TG32 : STS_IG32; + (gate).gd_s = 0; + (gate).gd_dpl = (dpl); + (gate).gd_p = 1; + (gate).gd_off_31_16 = (uint32_t)(off) >> 16; } ``` -如果在其他代码段中有如下语句, -``` +如果在其他代码段中有如下语句: +```c unsigned intr; -intr=8; -SETGATE(intr, 0,1,2,3); +intr = 8; +SETGATE(intr, 0 , 1 , 2 , 3); ``` -请问执行上述指令后, intr的值是多少? +请问执行上述指令后, intr 的值是多少? > 0x10002 > https://github.com/chyyuu/ucore_lab/blob/master/related_info/lab0/lab0_ex3.c -- 请分析 [list.h](https://github.com/chyyuu/ucore_lab/blob/master/labcodes/lab2/libs/list.h)内容中大致的含义,并能include这个文件,利用其结构和功能编写一个数据结构链表操作的小C程序 +- 请分析 [list.h](https://github.com/chyyuu/ucore_lab/blob/master/labcodes/lab2/libs/list.h) 内容中大致的含义,并能 include 这个文件,利用其结构和功能编写一个数据结构链表操作的小C程序 --- @@ -246,36 +246,36 @@ SETGATE(intr, 0,1,2,3); --- -- 是否愿意挑战大实验(大实验内容来源于你的想法或老师列好的题目,需要与老师协商确定,需完成基本lab,但可不参加闭卷考试),如果有,可直接给老师email或课后面谈。 +- 是否愿意挑战大实验(大实验内容来源于你的想法或老师列好的题目,需要与老师协商确定,需完成基本 lab,但可不参加闭卷考试),如果有,可直接给老师 email 或课后面谈。 -- 更新和完善ucore实现环境Linux、Mac OS和Windows操作系统下的实验环境部署帮助。 +- 更新和完善 ucore 实验环境 Linux、Mac OS 和 Windows 操作系统下的实验环境部署帮助。 -> 关于自己在ubuntu中配置环境的一些问题 +> 关于自己在 ubuntu 中配置环境的一些问题 > -> 实验指导书中关于安装eclipse-CDT的网址有些旧,许多资源已经不存在了,不建议按照该网址的指导安装。 +> 实验指导书中关于安装 eclipse-CDT 的网址有些旧,许多资源已经不存在了,不建议按照该网址的指导安装。 > 如下网址的安装方法可以参考: > http://blog.sina.com.cn/s/blog_15e13208d0102w56j.html > -> 安装之后打开ecilpse可能会遇到没有菜单栏的现象,在ubuntu12.0之后的版本这个问题很常见,解决办法: -> 1. 因为缺少一个环境变量,在/etc/profile 里面新建这个变量并且把值写成0  +> 安装之后打开 ecilpse 可能会遇到没有菜单栏的现象,在 ubuntu12.0 之后的版本这个问题很常见,解决办法: +> 1. 因为缺少一个环境变量,在 /etc/profile 里面新建这个变量并且把值写成 0  > export UBUNTU_MENUPROXY=0  -> 之后重启就OK了。如果该方法不行,请尝试方法2 +> 之后重启就 OK 了。如果该方法不行,请尝试方法 2 > -> 2. 新建一个eclipse.sh文件,加入如下内容,第三行是eclipse的路径 +> 2. 新建一个 eclipse.sh 文件,加入如下内容,第三行是 eclipse 的路径 > \#!/bin/bash > export UBUNTU_MENUPROXY=0 > /usr/bin/eclipse -> 在终端进入eclipse.sh目录,然后 sh eclipse.sh -> 此时如果配置正确的话,就会打开eclipse,菜单栏出现了 +> 在终端进入 eclipse.sh 目录,然后 sh eclipse.sh +> 此时如果配置正确的话,就会打开 eclipse,菜单栏出现了 > > -> 配置好eclipse之后,按照mooc视频 2.7小节即可正确运行调试ucore +> 配置好 eclipse 之后,按照 mooc 视频 2.7 小节即可正确运行调试 ucore --- -## v9-cpu相关题目 +## v9-cpu 相关题目 --- ### 提前准备 @@ -286,26 +286,26 @@ git clone https://github.com/chyyuu/os_tutorial_lab.git -- 分析和实验funcall.c,需要完成的内容包括: +- 分析和实验 funcall.c,需要完成的内容包括: - 修改代码,可正常显示小组两位同学的学号(用字符串) - - 生成funcall.c的汇编码,理解其实现并给汇编码写注释 - - 尝试用xem的简单调试功能单步调试代码 + - 生成 funcall.c 的汇编码,理解其实现并给汇编码写注释 + - 尝试用 xem 的简单调试功能单步调试代码 - 回答如下问题: - - funcall中的堆栈有多大?是内核态堆栈还是用户态堆栈 - - funcall中的全局变量ret放在内存中何处?如何对它寻址? - - funcall中的字符串放在内存中何处?如何对它寻址? - - 局部变量i在内存中的何处?如何对它寻址? + - funcall 中的堆栈有多大?是内核态堆栈还是用户态堆栈 + - funcall 中的全局变量 ret 放在内存中何处?如何对它寻址? + - funcall 中的字符串放在内存中何处?如何对它寻址? + - 局部变量 i 在内存中的何处?如何对它寻址? - 当前系统是处于中断使能状态吗? - - funcall中的函数参数是如何传递的?函数返回值是如何传递的? - - 分析并说明funcall执行文件的格式和内容 + - funcall 中的函数参数是如何传递的?函数返回值是如何传递的? + - 分析并说明 funcall 执行文件的格式和内容 -- 分析和实验os0.c,需要完成的内容包括: - - 生成os0.c的汇编码,理解其实现并给汇编码写注释 +- 分析和实验 os0.c,需要完成的内容包括: + - 生成 os0.c 的汇编码,理解其实现并给汇编码写注释 - - 尝试用xem的简单调试功能单步调试代码 + - 尝试用 xem 的简单调试功能单步调试代码 - 回答如下问题: - 何处设置的中断使能? @@ -313,17 +313,17 @@ git clone https://github.com/chyyuu/os_tutorial_lab.git - 系统何时处于中断屏蔽状态? - 如果系统处于中断屏蔽状态,如何让其中断使能? + + - 系统产生中断后,CPU 会做哪些事情?(在没有软件帮助的情况下) - - 系统产生中断后,CPU会做哪些事情?(在没有软件帮助的情况下) - - - CPU执行RTI指令的具体完成工作是哪些? + - CPU 执行 RTI 指令的具体完成工作是哪些? ​ -- [HARD]分析和实验os1/os3.c,需要完成的内容包括: +- [HARD]分析和实验 os1/os3.c,需要完成的内容包括: - - os1中的task1和task2的栈的起始和终止地址是什么? - - os1是如何实现任务切换的? - - os3中的task1和task2的栈的起始和终止地址是什么? - - os3是如何实现任务切换的? - - os3的用户态task能够破坏内核态的系统吗? + - os1 中的 task1 和 task2 的栈的起始和终止地址是什么? + - os1 是如何实现任务切换的? + - os3 中的 task1 和 task2 的栈的起始和终止地址是什么? + - os3 是如何实现任务切换的? + - os3 的用户态 task 能够破坏内核态的系统吗?