![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
操作系统
文章平均质量分 84
南七行者
相信时间会创造奇迹。
展开
-
HIT oslab之文件管理(从磁盘到文件系统的四层抽象)
一、概述磁盘也属于外设,所以在unix/linux的世界里,操作磁盘也要像操作文件一样。那么操作系统是如何将磁盘抽象成文件系统的呢?二、直接使用磁盘1.前言操作系统把磁盘抽象成文件,本质是屏蔽掉使用磁盘的细节。所以,首先要明白如何直接使用磁盘。所谓使用磁盘,即①把内存缓冲区(缓存)的数据写到磁盘数据块中或②把磁盘数据块的数据读到缓存中。2.找到磁盘数据块根据磁盘的结构可知,通过柱面、磁头、扇区定位磁盘数据块。3.直接使用磁盘(CHS方式)(1)只要在程序中向磁盘控制器的寄存器写入柱原创 2021-04-02 18:35:17 · 285 阅读 · 0 评论 -
HIT oslab之实验1~9 完结撒花
一、完结撒花1.HIT oslab之实验2 操作系统的引导(含:实验1 实验环境搭建)2.HIT oslab之实验3 系统调用3.HIT oslab之实验4 进程运行轨迹的跟踪与统计4.HIT oslab之实验5 基于内核栈切换的进程切换5.HIT oslab之实验6 信号量的实现和应用6.HIT oslab之实验7 地址映射与共享7.HIT oslab之实验8 终端设备的控制8.HIT oslab之实验9 proc文件系统的实现二、撒花感言1.感谢李治军老师带来如此精彩的《操作系统》课原创 2021-04-02 14:57:42 · 1977 阅读 · 0 评论 -
HIT oslab之实验9 proc文件系统的实现
一、实验内容在Linux-0.11上实现procfs(proc文件系统):/proc,该目录下有2个文件:(1)psinfo(进程信息)当读取此文件的内容时,可得到系统当前所有进程的状态信息。(2)hdinfo(硬盘信息)当读取此文件的内容时,可得到系统硬盘的使用情况。说明:①procfs要在内核启动时自动创建。②相关功能实现在 fs/proc.c 文件内。二、实现procfs1.增加新文件类型(在include/sys/stat.h文件中)(0)原因在HIT oslab之设原创 2021-04-02 14:35:56 · 714 阅读 · 2 评论 -
HIT oslab之设备管理 (显示器 + 键盘)
一、整体逻辑根据unix/linux哲学:一切皆文件,所以设备也有设备文件。操作系统要让用户像操作文件一样去使用终端设备,即实现了设备管理。以下内容的操作系统指linux-0.11二、操作系统管理显示器的过程所谓操作系统管理显示器,即让用户通过printf("Hello world!\n");即可在屏幕上打印出Hello world!。1.printf函数中最核心的2件事情(1)创建缓存buf, 存储格式化输出此处指存储Hello world!\n(2)write(1, buf, .原创 2021-03-31 21:15:15 · 417 阅读 · 6 评论 -
HIT oslab之实验8 终端设备的控制
一、实验内容修改Linux-0.11的终端设备处理代码,对键盘输入和字符显示进行非常规的控制。所谓非常规,即:在初始状态,一切如常。用户按一次F12后,把应用程序向终端输出所有字母都替换为*。用户再按一次F12,又恢复正常。二、实验过程1.整体思路①按下F12,产生键盘中断,而键盘中断的相应函数为keyboard_interrupt。②keyboard_interrupt被调用后,会将键盘扫描码做为下标,调用数组 key_table 保存的与F12对应的响应函数。③在响应函数中,设置是否原创 2021-03-30 22:21:44 · 392 阅读 · 0 评论 -
HIT oslab之实验7 地址映射与共享
一、实验内容用 Bochs 调试工具跟踪 Linux 0.11 的地址翻译(地址映射)过程,了解 IA-32 和 Linux 0.11 的内存管理机制;在 Ubuntu 上编写多进程的生产者—消费者程序,用共享内存做缓冲区;在信号量实验的基础上,为 Linux 0.11 增加共享内存功能,并将生产者—消费者程序移植到 Linux 0.11。二、跟踪地址翻译过程1.将test.c传入linux-0.11,按照实验指导书进行实验。当 test 运行的时候,在命令行窗口按 Ctrl+c,Bochs原创 2021-03-30 14:04:00 · 763 阅读 · 2 评论 -
HIT oslab之实验6 信号量的实现和应用
一、实验内容1.在Ubuntu中编写程序,用信号量解决生产者–消费者问题;2.在Linux-0.11中实现信号量,用生产者—消费者程序检验之。二、编写应用程序pc.c,解决经典的生产者—消费者问题1.要求建立一个生产者进程,N 个消费者进程(N>1);用文件A建立一个共享缓冲区;生产者进程依次向缓冲区写入整数 0,1,2,…,M,M>=500;消费者进程从缓冲区读数,每次读一个,并将读出的数字从缓冲区删除,然后将本进程 ID 和 + 数字重定向输出到文件B;缓冲区同时最多只能原创 2021-03-28 21:07:04 · 680 阅读 · 0 评论 -
HIT oslab之实验5 基于内核栈切换的进程切换(含函数调用内存模型的讲解)
一、实验内容把Linux-0.11进程切换的方式改为基于内核栈切换,而不是基于TSS切换(因为太耗时)。要实现基于内核栈的任务切换,主要完成如下三件工作:重写 switch_to;将重写的 switch_to 和 schedule() 函数接在一起;修改现在的 fork()。二、修改schedule函数1.switch_to()函数的2个参数①第1个参数:指向目标进程 PCB 的指针(即pnext);②第2个参数:目标进程的LDT;进程切换必然要涉及到 LDT 的切换2.根据上原创 2021-03-26 20:54:57 · 759 阅读 · 3 评论 -
HIT oslab之实验4 进程运行轨迹的跟踪与统计(含“Error at line 31: It is a clone of previous line.”的解决办法)
一、实验内容1.基于模板 process.c 编写多进程的样本程序,实现如下功能:所有子进程都并行运行,每个子进程的实际运行时间一般不超过 30 秒;父进程向标准输出打印所有子进程的 id,并在所有子进程都退出后才退出;2.在 Linux0.11 上实现进程运行轨迹的跟踪。基本任务是在内核中维护一个日志文件 /var/process.log,把从操作系统启动到系统关机过程中所有进程的运行轨迹都记录在这一 log 文件中。要求:三个字段之间用制表符分隔。3.在修改过的 0.11原创 2021-03-19 20:48:59 · 1707 阅读 · 0 评论 -
解惑:执行fork()之后,fork之前的语句为啥会运行两次?
一、问题1.代码#include <stdio.h>#include <unistd.h> #include <sys/wait.h> int main(int argc, char * argv[]){ int id1 = fork(); printf("Hello %d print : id1 = %d\n", getpid(), id1); if(!id1) { printf("Hello I am child原创 2021-03-18 21:04:36 · 1119 阅读 · 1 评论 -
HIT oslab之实验3 系统调用(sys_iam + sys_whoami)
一、实验内容1.在 Linux 0.11 上添加两个系统调用;在原有的Linux-0.11上添加? 与原有的不冲突,应该是在原有的基础上添加我之前把linus写的删掉了… 还好我拍摄了快照!2.编写两个简单的应用程序测试它们;二、在 Linux 0.11 上添加两个系统调用1.const char * name;//name是字符串常量,const char *指向字符常量的指针所以不能用ptr来修改所指向的内容,换句话说,*ptr的值为const,不能修改。但是ptr的声明并不意味着原创 2021-03-10 14:10:54 · 2185 阅读 · 8 评论 -
HIT oslab之实验2 操作系统的引导(bootsect.s + setup.s)
零、实验1 实验环境搭建1.参考教程2.遇到的问题(1)dokg: 错误:另外一个进程已经为 dpkg fronted lock 加锁解决办法:重启,解释3.补充:查看ubuntu 位数 uname -a一、实验2的内容1.实现bootsect.s的屏幕输出功能;2.bootsect.s读入setup.s;3.setup.s获取并显示基本硬件参数;教程:操作系统原理与实践二、实现bootsect.s的屏幕输出功能1.代码(和教程有点不同,在2.说明里解释了;按照教程来)m原创 2021-03-07 19:13:31 · 4505 阅读 · 7 评论 -
bochs的安装、配置和运行(《操作系统真象还原》第1章实验)
一、搭建环境原创 2021-01-21 11:27:58 · 3022 阅读 · 0 评论 -
操作系统之内存管理_页面置换算法(C++实现LRU)
一、问题描述场景:假定系统为某进程分配了3个物理块,并考虑有页面号引用串{7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1}。若采用LRU算法进行页面置换,如上图所示,进程第一次对页面2访问时,将最近最久未被访问的页面7置换出去,然后再访问3时,将最近最久未使用的页面1置换出去。现采用C++实现LRU,模拟上述过程二、C++实现LRU1.预备知识(1)LRU : Least Recently Used 最近最少使用(2原创 2020-11-05 12:30:37 · 2348 阅读 · 0 评论