
操作系统
教材《操作系统真相还原》,learning by making!
努力成长的tory
这个作者很懒,什么都没留下…
展开
-
实现一个简单的shell
知识总结一、异常和进程1、异常,中断的一种类型:故障: 错误引起,如缺页,除0陷阱:”故意的异常“,目的是使用系统调用终止:致命错误,如硬件损坏2、创建子进程 —— fork()函数:作用:创建子进程,返回两次,父进程返回创建子进程的pid,子进程返回03、僵尸进程:进程有三种状态:运行、停止、终止;进程终止时仍占用系统资源,终止但未被回收的子进程成为僵尸进程。子进程的回收交由父进程执行,接收子进程的退出状态,内核删除其信息;如果父进程先于子进程终止,则交由所有进程的祖先–init负责原创 2020-12-26 23:15:05 · 848 阅读 · 0 评论 -
矩阵分块转置降低 cache miss分析 (Cache Lab PartB)
Lab中给出的cache规格为: s=5, E=1, b=5矩阵A和B在内存中连续存放。Lab要求分别对32 * 32 , 64 * 64, 61 * 67的矩阵做转置优化,用到的都是将矩阵分块分别转置的方法。相较于普通转置,为什么分块能够优化cache miss次数?分块是通过什么来实现优化的 — > 通过减少B一次访问的列数。最根本的原因在于: Cache不能够一次装满整个矩阵,以最小的矩阵32 * 32而言,是4个cache的大小。如果矩阵大小为正好能够装满cache的16 * 16或更原创 2020-10-13 16:43:12 · 2960 阅读 · 1 评论 -
CSAPP Cache 知识总结; Cache Lab Part A
学习这部分内容的目的在于:如果理解了计算机系统中数据是如何在不同层次间移动的过程,就可以 优化程序的局部性 ,使自己应用程序的数据存储在层次较高的地方,加速CPU访问。知识总结1、程序的局部性时间局部性:多次引用相同的内存位置空间局部性:引用之前临近的内存位置1、高速缓存结构高速缓存由S个组构成,每个组包含E个行,每行包含m=s+e+b有效位表示这个行中是否包含有效信息,标记位表示高速缓存结构可以用四元组(S,E,M,B)来表示,高速缓存大小C=SEBS:E:M:B:...原创 2020-10-10 13:02:11 · 2437 阅读 · 0 评论 -
CSAPP Link总结;HIT linkbomb实验记录
实验分成五个phase,每个phase需要将main和对应的phase文件链接,修改可执行文件。可执行文件框架:#include <stdio.h>#include "config.h" void (*phase)(); /*初始化为0*/int main( int argc, const char* argv[] ) { if ( phase ) (*phase)(); else prin原创 2020-09-17 21:33:22 · 7032 阅读 · 2 评论 -
锁机制的理解与实现
Q&A多线程竞争和互斥?多个线程访问公共资源时会出现竞争现象,在访问公共资源时会出现“竞争”现象,为了防止需要在临界区实现“互斥”,最简单的互斥实现就是关中断。信号量和锁?信号量是一种同步机制,多个线程共同完成一样任务时,由信号量来协调。当信号量为0时,线程A可以获得锁进入临界区,此时其他的线程不能进入,只能在A执行结束前等待。线程的阻塞和唤醒...原创 2020-06-05 23:38:55 · 438 阅读 · 0 评论 -
创建内核线程,实现多线程轮询调度
Q&A1、什么是线程?线程的产生背景?线程是任务调度器进行调度的基本单位。一开始OS内核不支持创建多线程,后来为了满足程序高并发的需求,OS内核开始支持多线程,使用户进程可以通过系统调用使用。2、进程和线程的区别?如果程序没有使用多线程,那么运行时整个进程将成为调度的基本单位;如果使用了多线程,则整个进程会分为多个线程供处理器调度。线程共享进程的地址空间,进程有自己的页表,线程...原创 2020-05-08 19:39:55 · 1059 阅读 · 1 评论 -
实现内存的整页分配
内存池的概念:在分页机制下有虚拟和物理两种地址,分别为了管理,需要创建虚拟内存地址池和物理内存地址池。物理内存池的规划:内存中运行两种程序,内核程序和用户程序,因此将物理内存分为两个内存池,一个用来装载用户进程,一个用来运行OS内核,都是以4KB大小为单位。虚拟内存地址池的规划:包括用户进程和内核在内的所有任务都有各自的4GB虚拟地址空间,因此每个任务都需要单独规划虚拟地址,管理单位也是...原创 2020-05-02 23:23:09 · 500 阅读 · 0 评论 -
makefile和make简单笔记
1、makefile和make的关系:make命令相当于makefile的解析器2、makefile基本格式:3、make的简单原理:linux文件的数据部分会记录文件的访问和修改时间(atime,mtime,ctime),make会获取依赖文件和目标文件的mtime,如果依赖文件的mtime比目标文件新,则执行makefile中编写的命令,重新编译链接文件。stat命令查看文件修改时...原创 2020-04-23 23:39:25 · 651 阅读 · 0 评论 -
初始化中断
Q&AQ1:并行和并发的区别?并发:单位时间内累积的工作量并行:同时进行的工作量Q2:中断的分类?Q3:外部中断和内部中断的区别?如何接收外部中断?外部中断:来自硬件的中断,如收到网络的数据包内部中断:软件的中断CPU通过INTR和NMI两条信号线接收外部中断,区别如图所示:从INTR信号线接收到的是可屏蔽中断,是诸如网卡,硬盘发出的中断,从NMI信号线接收的是不可...原创 2020-04-18 15:59:21 · 1688 阅读 · 0 评论 -
CPL,DPL,RPL 特权级检查
1、CPL,DPL,RPL都位于哪里?RPL:Request Privilege Level,请求特权级,位于段寄存器后两位DPL:Descriptor Privilege Level,描述特权级,位于GDT/IDT中CPL: Current Privilege Level,当前特权级,CS.RPL2、CPL,DPL,RPL的意义?CPL:表示处理器的当前特权级DPL:表示受访者特权等...原创 2020-04-17 00:21:18 · 1020 阅读 · 0 评论 -
用户态和内核态的切换
Q1:CPU为什么要切换特权级?可执行程序的代码可分成两部分(1)3特权级的用户程序(2)0特权级的内核程序在执行可执行程序时,需要在这两种代码间进行切换。但是OS内核代码的特权级高于用户程序,因此需要切换特权级。Q2:执行高特权级代码的方式?(1)利用一致性代码段,这种方式可以让指令指针跳转到高特权级的代码段,但是并不会改变当前的CPL。(2)执行系统调用,通过门结构提高CPU的特...原创 2020-04-15 00:57:10 · 402 阅读 · 0 评论 -
loader实现ELF格式内核的加载
**从这节开始,让我们步入内核的世界~Let’s step into the world of operating system kernels!**Q&A1、为什么用C语言编写内核?因为汇编好难用,其他语言又不好控制内存。2、用C语言编写和汇编有什么不同(在最后生成的二进制文件上)?一言以蔽之:用C语言编写,计算机最后执行的是ELF格式的二进制文件(linux)。这里的...原创 2020-04-02 03:23:57 · 1744 阅读 · 0 评论 -
ELF格式学习
看《操作系统真相还原》一书,觉得需要好好学习一下elf结构,光看书上的例子还是有隔岸观火的感觉,还是要亲眼见证一下,眼见为实才对。生成elf可执行文件:在ubuntu下创建一个简单的.c,gcc编译链接成可执行文件,好好学习一下。一个无限的while循环:使用 gcc -static test.c -o test.elf命令生成可执行文件(不加static,gcc test.c -o ...原创 2020-03-20 16:13:49 · 705 阅读 · 0 评论 -
打印函数的底层实现逻辑
一定不能心急啊,心急吃不了热豆腐,且体会不到乐趣了。Q&AQ1:函数调用中的参数存放在哪里?A1:有两种方案,一种是保存在寄存器中,一种是保存在内存中。但因为要考虑到多进程的参数覆盖问题,所以索性将函数的参数放在内存当中(32位机器,64位机器前六个参数用寄存器传递)。又因为每个进程都有自己的栈,所以将函数的参数存放在各自进程的栈中。Q2:计算机如何知道具体的参数?A2:A1说...原创 2020-04-06 00:11:15 · 387 阅读 · 0 评论 -
在loader中创建页表,启动分页
上一节创建了全局描述符表,进入了保护模式,接下来继续拓展loader的功能——实现内存分页,实现虚拟地址目录***Q&A******1、什么是内存分段?为什么要实现内存分段?******2、为什么要实现内存分页?分页和分段的关系?******3、分页机制的实现?什么是页表?页表大小为什么是4KB?******4、为什么要有多级页表?******5、二级页表的构造?******5、分页机制...原创 2020-03-30 00:18:13 · 511 阅读 · 0 评论 -
在loader中创建GDT,进入保护模式
回顾目前实现了从BIOS中加载MBR,MBR从磁盘2扇区读取loader加载到内存0x900处,但loader目前尚未实现任何功能。提几个问题问题1:loader在OS中主要做什么?答:加载进入保护模式所需的配置,打开进入保护模式的开关。问题2:保护模式与实模式主要有哪些不同?答:(1)寻址范围:实模式下共20根地址线,寻址范围1MB;保护模式下地址线超过20根。(2)访问限制:保...原创 2020-03-27 00:43:14 · 640 阅读 · 0 评论 -
X86体系结构OS启动过程
完成一个OS,当然要从OS启动开始,描述一下从实模式到保护模式,OS需要完成的事情,总的流程是:BIOS -> MBR -> loader ->保护模式实模式下内存布局:BIOS加载主引导记录MBR实模式下,计算机可用的有0-19共20条地址线,访存大小1MB。开机时,CS:IP为0xF000:0xFFF0,指向BIOS的入口地址,0xFFFF0处的代码(待补充)...原创 2020-02-24 20:48:07 · 828 阅读 · 0 评论