![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
操作系统
操作系统的一些博客
jump_into_zehe
这个作者很懒,什么都没留下…
展开
-
进程地址空间是啥?
进程一个进程在内存中是什么样的?一个进程就是一段运行的代码,那运行的代码会有哪些东西呢?正文段,也就是代码,一个程序要运行肯定需要代码的数据段,我们在写代码时总是会定义各种数据结构,而数据结构自然要占据内存,因此我们将其表示为数据段,数据段一般是可增长的,因为我们经常会在代码中动态分配内存如malloc函数堆栈段,堆栈段不同于数据段和代码段,它一般保存着一些与程序控制有关的东西,如一个linux命令,cp src dst,这一行命令表示拷贝src文件到dst文件,那进程的堆栈段会保存这三个参数,原创 2020-11-12 23:16:53 · 1364 阅读 · 2 评论 -
地址映射与共享
跟踪地址映射过程1.通过命令./dbg-asm启动调试器,在linux-0.11运行test.c文件,使其进入死循环,我们的任务就是找到i的地址并将其修改为0使test.c程序退出循环。2.在命令行输入crit+c使Boch暂停,一般会显示下列信息(0) [0x00fc8031] 000f:00000031 (unk. ctxt): cmp dword ptr ds:0x3004, 0x00000000 ; 833d0430000000其中的 000f 如果是 0008,则说明中断在了内核里。那么原创 2020-11-12 21:08:01 · 339 阅读 · 0 评论 -
哈工大OS实验九--proc文件系统的实现
proc文件系统的实现procfs简介正式的Linux内核实现了procfs,它是一个虚拟文件系统,通常被 mount(挂载) 到/proc目录上,通过虚拟文件和虚拟目录的方式提供访问系统参数的机会,所以有人称它为 “了解系统信息的一个窗口”。这些虚拟的文件和目录并没有真实地存在在磁盘上,而是内核中各种数据的一种直观表示。虽然是虚拟的,但它们都可以通过标准的系统调用(open()、read()等)访问。例如/proc/meminfo中包含内存使用的信息,可以用 cat 命令显示其内容:实验内容:在原创 2020-05-20 11:25:22 · 641 阅读 · 0 评论 -
目录与文件系统--OS
目录与文件系统前面一节我们完成了第三层抽象,就是将盘块号抽象到文件,这一次,我们要对磁盘再进行一次抽象,将磁盘抽象为一个文件系统,用户看到的磁盘就是一个文件目录的结构,完成第四层抽象主要就是实现文件系统到磁盘的映射关系文件系统,抽象整个磁盘(第四层抽象)目录树结构:易于分类,且扩展性好,每一个节点就是一个目录我们是如何使用目录的?我们使用目录的方式就是给出一个路径名如/my/data/m,然后根据路径名找到文件的FCB,再接上我们前面讲的,有了FCB就能找到字符流对应的盘块号…等等因此我们需要做原创 2020-05-19 18:30:35 · 324 阅读 · 0 评论 -
文件使用磁盘的实现--OS
文件使用磁盘的实现通过文件使用磁盘,代码如下在fs/read_write.c中int sys_write(int fd, const char *buf, int count)//fd为文件索引,buf为缓冲区,count表示要处理的字符串长度{ struct file *file = current->filp[fd]; struct m_inode *inode = file->inode; if(S_ISREG(inode->i_mode))原创 2020-05-18 22:09:21 · 328 阅读 · 0 评论 -
从生磁盘到文件--OS
从生磁盘到文件上一节,我们已经知道如何使用生磁盘了,但是进程是如何得到盘块号的,从用户使用的角度,我们希望通过更简单的方式使用磁盘,因此进程得到盘块号应该抽象到文件这一层次来引入文件、对磁盘使用的第三层抽象用户眼里的文件:字符流磁盘上的文件就是一块一块的盘块因此实现第三层抽象关键就是建立字符流到盘块的映射连续盘块实现文件如何建立映射,我们将文件的字符流分到连续的盘块上,如0-99这一字符流放在第一个盘块,则100-199则放在第二个盘块,所以我们可以很清楚的知道如何建立映射关系了,我们只要原创 2020-05-18 18:40:10 · 732 阅读 · 0 评论 -
生磁盘的使用--OS
生磁盘的使用首先认识一下磁盘是什么东西操作系统是如何使用磁盘的?实际上简化为三步就是磁头放在磁道上旋转磁盘磁生电进行IO读写操作使用磁盘的最直观想法就是往磁盘控制器写入柱面(cyl)、磁头(head)、扇区(sect)、缓存位置,然后让磁盘控制器完成磁盘读写操作关键代码如下void do_hd_request(void){ ... hd_out(dev,nect,sec,head,cyl,WIN_WRITE,...); port_write(HD_DATA原创 2020-05-18 17:47:23 · 476 阅读 · 0 评论 -
哈工大OS实验八---按下F12让输出变成*号(终端设备的控制)
终端设备的控制参考至原文链接:https://blog.csdn.net/qq_41708792/article/details/91040147实验目的加深对操作系统设备管理基本原理的认识,实践键盘中断、扫描码等概念;通过实践掌握 Linux 0.11 对键盘终端和显示器终端的处理过程。实验内容本实验的基本内容是修改 Linux 0.11 的终端设备处理代码,对键盘输入和字符显示进行非常规的控制。在初始状态,一切如常。用户按一次 F12 后,把应用程序向终端输出所有字母都替换为“*”。原创 2020-05-18 12:27:09 · 513 阅读 · 0 评论 -
CPU如何读取键盘传过来的数据--OS
键盘键盘是如何与操作系统交互的?在显示器那一节,我们说过,CPU使用外设就是向外设写入一条指令,然后中断处理,中断处理就在键盘这一篇里,我们每按下一次键盘,就相当与向CPU发起一次中断。我们从键盘中断开始,看一下键盘中断的初始化void con_init(void){ set_trap_gate(0x21, &keyboard_interrupt);}//在kernel/chr_drv/keyboard.s中.global _keyboard_interrupt_keybo原创 2020-05-17 17:08:24 · 2206 阅读 · 0 评论 -
printf是如何将字符输出到显示器上的(IO与显示器)--OS
让外设工作起来CPU是如何让外设工作起来的?实际上每一个外设如显示器,键盘等都会各自的寄存器,而CPU就向这些寄存器发送指令,然后切换到其他进程执行,等外设计算完成之后,向CPU发起中断,CPU再进行中断处理,这样CPU就让外设工作起来了。看起来,CPU要让外设工作起来其实很简单,就是1.向外设寄存器写内容,2.然后进行中断处理,但是为什么就是这样一条简单的指令,却需要那么多的代码?其实,CPU向外设寄存器写内容并不是一项简单的工作,CPU需要查寄存器地址,内容的格式和语义,而不同公司生产的显示器等原创 2020-05-17 16:00:32 · 3332 阅读 · 1 评论 -
内存换入-换出--OS
内存换入-请求调页用换入、换出实现“大内存”我们设置虚拟内存大小位4G,但是实际内存只有1G,所以虚拟内存没办法完整的映射到实际内存中,那么如何才能让用户觉得虚拟内存就是实际的内存呢?换入换出可以实现这一点,当用户使用虚拟内存的(0G-1G)时,就将这一段的虚拟内存映射到物理内存上,当用户使用(3G-4G)处的虚拟内存时,就将虚拟内存(3G-4G)映射到物理内存上,这样就相当于4G的虚拟内存都可以使用了请求的时候才映射请求调页当MMU进行重定位时,发现虚拟内存没有映射,就会发起中断,同时不让PC+原创 2020-05-14 10:55:13 · 351 阅读 · 0 评论 -
段页结合的实际内存管理(虚拟内存)--OS
段页结合的实际内存管理如何让操作系统既支持段又支持页?虚拟内存:我们让应用程序分为段,然后映射到一段虚拟内存中,再让虚拟内存映射到物理内存中的页中,这样就完成了段和页的结合段、页同时存在时的重定位(地址翻译)根据段号找到偏移求出虚拟地址根据虚拟地址求出页号找到物理地址一个实际的段、页式内存管理内存管理核心:内存分配分配段、建段表:分配页、建页表进程带动内存使用的图谱从进程fork中的内存分配开始使用内存分为五步分配段建段表分配页建页表重定位1.分配段、建段表原创 2020-05-13 17:56:34 · 400 阅读 · 0 评论 -
内存使用(分段、分区、分页、多级页表、快表)--OS
内存使用内存使用:将程序放在内存中,PC指向内存地址首先,我们需要让程序进入内存举个例子int main(int argc, char *argv[]){ ...}.text_entry: //入口地址 call _main call _exit_main: ... ret_entry: //入口地址 call 40 call xx_main: //偏移是40 ...我们需要把上面这段程序放入内存中,因为里边有条指令原创 2020-05-13 14:33:12 · 1576 阅读 · 0 评论 -
哈工大OS实验六---信号量的实现和应用
实验步骤参考原文链接:https://blog.csdn.net/realfancy/article/details/90112982说明:这个实验我基本都是按着这位博主来做的,虽然出了一点小问题,但是这位博主写的很好,我就再对这里面的代码说明一下吧,大家如果要看完整的步骤,可以去看这位博主的实验要求:实现三个函数sem_open(): 创建一个信号量或者打开一个以及存在的信号量sem_wait():信号量的P原子操作sem_post():信号量的V原子操作sem_unlink():删除名原创 2020-05-11 20:41:40 · 423 阅读 · 0 评论 -
进程同步与信号量以及死锁处理--OS
进程同步与信号量说明信号量之前,我们先说一下信号进程同步,也就是一个进程需要和另外一个进程合作,那么肯定会发生阻塞,因为需要等待另一个进程的信号。//生产者进程while(true){ if(counter == BUFFER_SIZE) sleep(); ... if(counter==1) wakeup("消费者")}//消费者进程while(true){ if(counter == 0) sleep()原创 2020-05-11 12:51:23 · 728 阅读 · 7 评论 -
CPU调度策略&linux 0.11的schedule实现--OS
CPU调度策略如何设计调度算法?这个算法应满足尽快结束任务:周转时间(从任务进入到任务结束)短用户操作尽快响应:相应时间(从操作发生到响应)短系统内耗时间少:吞吐量(完成的任务量)总原则:系统专注于任务执行,又能合理调配任务…两种基础的CPU调度策略短作业优先短作业优先策略,主要是为了减少周转时间基本思路: 运行时间短的进程优先执行,但是可能会造成饥饿现象轮转策略轮转策略,减少相应时间基本思路: 给每一个进程设置一个时间片,当时间片用完后,就切换进程,总的响应时间最大为原创 2020-05-10 19:39:51 · 483 阅读 · 0 评论 -
哈工大OS实验五---基于内核栈切换的进程切换
基于内核栈切换的进程切换实验目的:将linux-0.11中采用的TSS切换部分去掉,取而代之的是基于堆栈的切换程序,写成一段基于堆栈切换的代码要实现基于内核栈的任务切换,主要完成如下三件工作重写switch_to将重写的switch_to和schedule()函数接在一起修改原本的fork()第一步,修改schedule()函数schedule函数在kernel/sched.c文件中if ((*p)->state == TASK_RUNNING && (*p)-&g原创 2020-05-10 16:59:43 · 600 阅读 · 2 评论 -
用户级线程和内核级线程--OS
用户级线程进程 = 资源 + 指令一个进程mov ... mov[100], ax write ax一个进程每执行一条指令,可能需要访问一个地址,这个地址就从映射表中获取,而每一个进程就有一个对应的映射表,主要是为了防止进程之间访问同一个内存地址而设置的,当我们从一个进程切换到另外一个进程的时候,就需要切换映射表,而切换映射表需要一些代价,因此我们引进线程。一般而言:进程 = 资源 + 指令资源就是映射表,因为映射表对应的就是一段段的内存地址。而线程就是希望将资源和指令执行给分开,实原创 2020-05-10 12:16:52 · 541 阅读 · 0 评论 -
哈工大OS实验四---进程运行轨迹的跟踪和统计(未统计)
进程运行轨迹的跟踪和统计(实验4)根据哈工大课程cup管理章节,为了使cpu被充分利用,因此引进了多进程的概念,一个进程在等待io命令时,此时,我们就将该进程挂起,执行其他进程,cpu通过PCB控制进程,而进程等待队列又分为就绪队列和阻塞队列。这次的实验目的为:跟踪进程的运行轨迹和统计log文件log文件主要是用来保存进程发生状态切换时的记录,文件目录为/var/process.log...原创 2020-05-08 12:16:09 · 380 阅读 · 0 评论 -
操作系统接口--OS
操作系统接口接口: 连接两个东西、信号转换、屏蔽细节接口需要实现什么?要知道调用它的是什么东西背后是怎么完成这件事情的?计算机调用接口的三种方式1.命令行命令行,其实就是一个c函数当我们操作系统启动后,会执行一个函数,该函数在目录 /bin/sh上int main(int argc, char * argv[]){ char cmd[20] while(1) {sc...原创 2020-05-06 15:11:49 · 310 阅读 · 0 评论 -
操作系统启动--OS
bootsect.s引导扇区代码:bootsect.s.globl begtext,begdata,begbss,endtext,enddata,endbss.text //文本段begtext:.data //数据段begdata:.bss //未初始化数据段begbss:entry start //关键字entry告诉链接器"程序入口"start: mov ax, #B...原创 2020-05-02 20:59:27 · 393 阅读 · 0 评论