OS_理论笔记
第一章一、什么是操作系统Q:HelloWorld 从代码到显示到屏幕,经过了哪些os过程?
编译成可执行文件、用户告诉shell执行该可执行文件、
计算机体系中的接口
UI:
API:源代码和第三方库的接口
ABI(Application Binary Interface)为应用程序二进制接口
如果链接器可以将 MSVC 编译出来的目标文件和 GCC 编译出来的目标文件链接到一起,那么链接器首先需要支持 MSVC 编译生成的目标文件的格式 PE/COFF 和 GCC 的 ELF 格式。
此外,不同格式的目标文件需要拥有相同的符号修饰标准、变量内存分布方式、函数调用方式等等。其中目标文件格式、符号修饰标准、变量内存分布方式、函数调用方式等这些跟二进制可执行代码兼容性相关的内容称为 ABI
ISA:
二、操作系统的作用
用户与计算机硬件系统之间的接口(API/GUI)
系统资源管理者(处理机、存储器、IO设备等)
处理器管理:
存储器管理:内存的分配和回收
IO的管理:
实现对计算机资源的抽象
三、操作系统的发展1、批处理系统
联机批处理系统:I ...
OS_lab5
思考题Thinking 5.1
如果通过 kseg0 读写设备,那么对于设备的写入会缓存到 Cache 中。这是 一种错误的行为,在实际编写代码的时候这么做会引发不可预知的问题。请思考:这么做 这会引发什么问题?对于不同种类的设备(如我们提到的串口设备和IDE磁盘)的操作会 有差异吗?可以从缓存的性质和缓存更新的策略来考虑。
当外部设备产生中断信号或者更新数据时,此时Cache中之前旧的数据可能刚完成缓存,那么完成缓存的这一部分无法完成更新,则会发生错误的行为。
对于串口设备来说,读写频繁,信号多,在相同的时间内发生错误的概论远高于IDE磁盘。
Thinking 5.2
查找代码中的相关定义,试回答一个磁盘块中最多能存储多少个文件控制块?一个目录下最多能有多少个文件?我们的文件系统支持的单个文件最大为多大?
在user/include/fs.h中,有如下定义
12#define BLOCK_SIZE PAGE_SIZE#define FILE_STRUCT_SIZE 256
从宏定义可以看出:磁盘块的大小和页大小一样,都是4KB;文件控制块的大小 FIL ...
OS_lab4
思考题Thinking 4.1思考并回答下面的问题:
内核在保存现场的时候是如何避免破坏通用寄存器的?
内核通过在kern/entry.S中调用SAVE_ALL来保存现场,SAVE_ALL的实现在include/stackframe.h中,具体实现如下
1234567891011121314151617181920212223242526272829303132333435.macro SAVE_ALL.set noat.set noreorder mfc0 k0, CP0_STATUS andi k0, STATUS_UM beqz k0, 1f move k0, sp //将用户栈指针存入k0 li sp, KSTACKTOP //sp指向内核处理栈1: subu sp, sp, TF_SIZE // 处理栈指针下压TF_SIZE sw k0, TF_REG29(sp) // 将用户栈指针存入内核栈TF_REG29处 // 借助k0将CP0寄存器和HI、LO寄存器存入内核栈 mfc0 k0, CP0_ ...
OS_lab3
Thinking 3.1
请结合 MOS 中的页目录自映射应用解释代码中 e->env_pgdir[PDX(UVPT)] = PADDR(e->env_pgdir) | PTE_V 的含义。
UVPT是用户页表的起始地址,PDX(UVPT)取了虚拟地址UVPT的高十位,作为页目录偏移量;e->env_pgdir是该进程的页目录基地址(位于 kseg0 的虚拟地址),因此e->env_pgdir[PDX(UVPT)] 代表页目录的第PDX(UVPT)个页目录项
PADDR(e->env_pgdir)是页目录的物理地址,PTE_V是页表项的有效位
因此这句代码的含义是:把进程页目录的物理地址存在页目录的第PDX(UVPT)个页目录项中,并把有效位置1
进一步,根据自映射的知识我们知道,自映射页目录项$PDE_{self-mapping}$相对于页目录基地址的偏移是$PT_{base}>>22$,也就是这里的PDX(UVPT)
因此,这里实现了页目录的自映射,即让自映射页目录项存储了页目录的物理地址。
Thinking 3.2
elf ...
OS_lab2
思考题Thinking 2.1
根据上述说明,回答问题:在编写的 C 程序中,指针变量中存储的地址 被视为虚拟地址,还是物理地址?MIPS 汇编程序中 lw 和 sw 指令使用的地址被视为虚拟 地址,还是物理地址?
在编写的 C 程序中,指针变量中存储的地址 被视为虚拟地址。
MIPS 汇编程序中 lw 和 sw 指令使用的地址被视为虚拟地址。
Thinking 2.2
从可重用性的角度,阐述用宏来实现链表的好处
指导书中提到:“C++ 中可以使用 std::stack 定义一个类型为 T 的栈,Java 中可以使用 HashMap 定义一个键类型为 K 且值类型为 V 的哈希表。这种模式称为泛型,C 语言并没有泛型的语法,因 此需要通过宏另辟蹊径来实现泛型。”
我认为用宏来实现链表的好处主要是:实现泛型。宏定义实现链表,用参数type来表示结构体类型,这样就可以针对不同的数据结构使用同样的链表代码,可重用性更高。
除此之外,field的设计也十分巧妙,利用==字符串字面量的替换==,使得其能代表所有结构结构体的所有成员变量,提 ...
OS_lab1
思考题Thinking 1.1
请阅读 附录中的编译链接详解,尝试分别使用实验环境中的原生 x86 工具 链(gcc、ld、readelf、objdump 等)和 MIPS 交叉编译工具链(带有 mips-linux-gnu前缀),重复其中的编译和解析过程,观察相应的结果,并解释其中向 objdump 传入的参数 的含义。
使用x86工具链命令行代码如下
12345678910touch hello.cvim hello.cgcc -E hello.c -o hello.ivim hello.igcc -c hello.c -o hello.oobjdump -DS hello.o > re1vim re1gcc hello.c -o helloobjdump -DS hello > re2vim re2
只进行预处理gcc -E hello.c -o hello.i,结果如下(截取hello.i中部分内容)
生成hello.o并进行反汇编之后的文件如下:
直接编译成可执行文件hello后,进行反汇编结果如下(截取main部分):
使用MIPS交叉编译工具链 ...
OS_lab0
Lab0 思考题Thinking 0.1
cat Untracked.txt 和 cat Stage.txt的两次运行结果的不同:前者是未跟踪Untracked files,后者是要提交(暂存)Changes to be commited
README.txt位置的不同:Untracked.txt处在未跟踪状态,add之后处于暂存状态
cat Modified.txt:结果与第一次执行add命令之前的status不一样。原因:README.txt现在是已经跟踪的状态,所以不会变成第一次add前的未跟踪状态;但是该文件经过了修改,也没有经过暂存和提交,现在正处于被修改状态,也就是 “尚未暂存以备提交的变更”
Thinking 0.2
add the file:git add <filename>
stage the file:git add <filename>
commit:git commit <filename> -m <message>
Thinking 0.3
1 代码文件 print.c 被错误删除时,应当使用什么 ...
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post1$ hexo new "My New Post"
More info: Writing
Run server1$ hexo server
More info: Server
Generate static files1$ hexo generate
More info: Generating
Deploy to remote sites1$ hexo deploy
More info: Deployment