『操作系统』操作系统实验LAB6——管道与Shell
『操作系统』操作系统实验LAB6——管道与Shell一. 思考题Question1. 示例代码中,父进程操作管道的写端,子进程操作管道的读端。如果现在想让父进程作为“读者”,代码应当如何修改?123456789101112case 0: /* 子进程 - 作为管道的写者 */close(fildes[0]); /* 关闭不用的读端 */write(fildes[1], "Hello world\n", 12); /* 向管道中写数据 */close(fildes[1]); /* 写入结束,关闭写端 */exit(EXIT_SUCCESS);default: /* 父进程 - 作为管道的读者 */close(fildes[1]); /* 关闭不用的写端 */read(fildes[0], buf, 100); /* 从管道中读数据 */printf("child-process read:%s",buf); /* 打印读到的数据 */close(fildes[0]); /* 读取结束,关闭读端 */exit(EXIT_SUCCESS);
颠倒一下父 ...
『操作系统』操作系统实验LAB5——文件系统与外存
『操作系统』操作系统实验LAB5——文件系统与外存一. 思考题Question1. 如果通过 kseg0 读写设备,那么对于设备的写入会缓存到 Cache 中。这是一种错误的行为,在实际编写代码的时候这么做会引发不可预知的问题。请思考:这么做会引发什么问题?对于不同种类的设备(如我们提到的串口设备和 IDE 磁盘)的操作会有差异吗?可以从缓存的性质和缓存更新的策略来考虑。当我们与内存交互时使用Cache没有问题,因为内存中的数据只依赖CPU的写操作而改变,使用Cache可以保证访存数据一致性;而当我们与外设交互时,由于外设中的数据的更新并不只依赖于CPU的写操作,还会由外设自己更新(比如计时器的中断位),这会导致出现缓存数据和此刻实际外设数据不一致的情况,即Cache里仍是老数据,而实际的数据外设自身已经更新却无法及时通知给Cache。
有区别,串口是字符设备,只支持顺序读取,无需经过缓存,直接以字符(字节)为单位进行读写;而IDE磁盘是块设备,支持随机读取。内存是磁盘的缓存,如LAB5文件服务进程将磁盘空间映射到进程虚拟空间中,在访问块设备时会经过内存这一层缓存,更高效的对数据进行访 ...
『操作系统』操作系统实验LAB4——系统调用与Fork
『操作系统』操作系统实验LAB4——系统调用与Fork一. 思考题Question1. 思考并回答下面的问题:• 内核在保存现场的时候是如何避免破坏通用寄存器的?• 系统陷入内核调用后可以直接从当时的 $a0-$a3 参数寄存器中得到用户调用 msyscall留下的信息吗?• 我们是怎么做到让 sys 开头的函数“认为”我们提供了和用户调用 msyscall 时同样的参数的?• 内核处理系统调用的过程对 Trapframe 做了哪些更改?这种修改对应的用户态的变化是什么?
(1) 每当发生异常需要进入内核时,OS都会先使用SAVE_ALL将上下文保存进Trapframe中,其中便包括32个通用寄存器,具体来说,首先将指向用户栈的sp赋值给k0,再将32个寄存器及其他保存,最后将sp指向Trapframe的栈顶。在返回用户态时再调用ret_from_exception,首先执行RESTORE_SOME宏将寄存器内容归还,再将k0赋值上EPC,再将sp指向原先的用户栈,最后返回用户态,实现了对通用寄存器(除k0,k1)的保护。
(2) 可以,系统陷入内核后$a0~$a3寄存器没有发生变动 ...
『操作系统』操作系统实验LAB3——进程管理
『操作系统』操作系统实验LAB3——进程管理一. 思考题Question1. 请结合 MOS 中的页目录自映射应用解释代码中 e->env_pgdir[PDX(UVPT)] = PADDR(e->env_pgdir) | PTE_V 的含义。UVPT是kuseg中保存用户(当前进程)页表信息的虚拟内存区,大小为4MB(0x7fc00000-0x80000000),PDX(UVPT)取UVPT前10位,代表着UVPT位于第几个4MB内存区,而e->env_pgdir[PDX(UVPT)]即当前进程的页目录的第PDX(UVPT)项,写入当前页目录的物理地址并置入有效位,意义即完成自映射,当访问UVPT这一虚拟地址时,通过页表转换,可以得到页目录的物理地址。
Question2. elf_load_seg 以函数指针的形式,接受外部自定义的回调函数 map_page。 请你找到与之相关的 data 这一参数在此处的来源,并思考它的作用。没有这个参数可不可以?为什么?data来自kern/env.c的load_icode函数中,他的作用在于传递当前的进程块结构体的指针。我认为 ...
『操作系统』操作系统实验LAB2——内存管理
『操作系统』操作系统实验LAB2——内存管理一. 思考题Question1: 在编写的C程序中,指针变量中存储的地址是虚拟地址,还是物理地址?MIPS 汇编程序中 lw 和 sw 使用的是虚拟地址,还是物理地址?代码在CPU内执行时得到的都是虚拟地址。
Question2: 从可重用性的角度,阐述用宏来实现链表的好处。查看实验环境中的 /usr/include/sys/queue.h,了解其中单向链表与循环链表的实现,比较它们与本实验中使用的双向链表,分析三者在插入与删除操作上的性能差异。用宏实现链表,主要是可以模拟出C语言不具有的泛型功能。因为宏的实现方式是字符串替换,替换时不会考虑到语法等等问题,因此只要给好参数,则任何结构体的链表均能由一组宏统一实现,简单便捷。
插入操作(考虑先寻找,再插入)
双向链表:头部插入O(1),尾部插入O(n),指定节点前O(1),指定节点后O(1)
单向链表:头部插入O(1),尾部插入O(n),指定节点前O(n),指定节点后O(1)
双向循环链表:头部插入O(1),尾部插入O(1),指定节点前O(1,指定节点后O(1)
删除操作:
双向 ...
『操作系统』操作系统实验LAB1——ELF文件,Printk
『操作系统』操作系统实验LAB1——ELF文件,Printk一. 思考题Question1: 请阅读附录中的编译链接详解,尝试分别使用实验环境中的原生x86工具链(gcc、ld、readelf、objdump 等)和MIPS交叉编译工具链(带有 mips-linux-gnu-前缀),重复其中的编译和解析过程,观察相应的结果,并解释其中向 objdump 传入的参数的含义。原生环境是基于x86架构下的,而运用MIPS交叉编译工具则是虚拟了一个MIPS架构环境,编译链接反汇编等建立在MIPS架构下,二者有很大不同。
对于Helloworld文件,下图是用GCC编译后的结果:
下图是使用交叉编译器后的结果:
objdump是反汇编命令,观察LAB1内Makefile的objdump部分,有一些常用的参数如下:
123456objdump [command]-a ## 显示档案库的成员信息,类似ls -l将lib*.a的信息列出。 -l --line-numbers ## 用文件名和行号标注相应的目标代码-d ## 从objfile中反汇编那些特定指令机器码的section。 -D --d ...
『操作系统』操作系统实验LAB0——Linux,Makefile,Bash
『操作系统』操作系统实验LAB0——Git,Linux,Makefile,Bash一. 思考题Question1:Untracked, Staged,Modified如图所示
README.txt文件在未add前,处于未跟踪的状态,在add后,处于暂存区中,即处在staged暂存状态,而在对该文件修改后且未再次add时,该文件处于已修改的状态。一旦初次跟踪该文件(add)后,除非删除该文件,否则将不会再处于未跟踪的状态,若对其进行修改,即使仍需再次add,那也是从已修改状态转移到暂存状态。
Question2:
add the file: git add
stage the file: git add
commit the file: git commit -m
Question3:
git checkout —print.c
git checkout HEAD print.c
git rm —cached hello.txt
Question4:提交三次后版本信息如下图所示:
进行第一次HEAD回退后如下图所示,可见往后回退一个版本到2。
进行一次说明为1的哈希 ...
『保研经历』保研经历Part3——总结与经验分享
『保研经历』保研经历Part3——总结与经验分享写本篇时是十一最后一天,最近得了保研后综合征,一歇就是一整天,拖拖拉拉直至最后一天才完成本篇撰写。实际上保研人的大四并不会清闲,假后又要面对无尽的任务,有时无比怀念初高中时肆无忌惮和朋友们打游戏的假期,那些都已一去不复返🤦。
前言前文洋洋洒洒写了很多,更多关注一路走来的重大事件盘点与面试的技术细节,多是留给未来的自己回味的。当然,作为一篇保研经验贴,我同样希望大家因我的文章而受益。本篇进行一个浓缩精华的经验分享,不同于大多数老生常谈的如何去提升背景等,我想就我本心出发,谈谈本保研小白一路的成长与感悟。
最后の总结将时间拉回三年前,我对计算机的了解程度仅仅是用它打各种游戏,还总是将游戏下进C盘,高中信息老师教python时我都会嗤之以鼻。然而高考后,由于计算机专业的火爆,我脑子一热选择了北航信息大类,并在入学时便将最火爆的计院当作我的努力目标。我想,这冥冥中自有缘分,如果大类内网安最出名,门槛最高,我或许也会坚定的选择网安,无论如何,我很确定我最初并不是因为了解计算机并清楚学计算机会收获什么而选择了你6。
至如今,保研结束,这意味着至少 ...
『保研经历』保研经历Part2——预推免
『保研经历』保研经历Part2——预推免前言随着按下拟录取按钮的那一刻,五个月的保研之路暂告一段落,我做出了从当前视角看来最正确的决定,选择了中科大和上海人工智能实验室GVLab的联培直博,放弃了浙大cs学硕和北航cs学硕。
自我介绍相比较于夏令营期间,背景方面有变动:
一篇能源化工领域(用深度学习方法解决工业问题)Sci一区论文在投
一篇对抗样本攻击领域论文完成度80%(即可以拿出来细讲的程度)待投
智谱AI大模型算法岗实习生
还有一些方面,比如:
rk变为29/204(15%),推免后期变为26/209(12%)(进不了10%都没卵用)
一份精心设计包装的简历(CV是非常非常重要的!)
全部项目源码开源(我想并不会有人看,感动自己)
预推免
学校学院
申请学位
入选
结果
备注
清华大学自动化学院
学硕
×
×
外校强com,用尽全力向thu的最后一搏,遗憾
清华大学软件学院
专硕
×
×
有排名靠前的本院同学卡哥们,注定进不了惹
上海人工智能实验室-GVLab
直博
√
√(最终去向)
致敬传奇耐面王,两个组面了五轮
中国科学院计算技术研究所V ...
『保研经历』保研经历Part1——夏令营
『保研经历』保研经历Part1——夏令营保研经历:特指从24年5月至24年9月这五个月的经历。
Part:本经历主体共分三个部分,分别为夏令营,预推免,总结与经验分享。
秉着不半场开香槟的原则,笔者优先记录下夏令营情况,尘埃落定后再完成预推免部分。文字部分尽量做到客观,实事求是描述事件发生时笔者的所见所想。
我在知乎上看了无数的保研经历,自认为本人经历不具备任何的普适性,权当对本人学习计算机三年来的最高潮做一次分享。
宇宙级免责声明本文中若有泄露高校敏感信息(如考题)行为,或有过失言论,完全非主观行为,请联系我,我会第一时间改正!
本文为完全免费对外开放的经验分享贴,无任何收费观看行为。是经验就必然不可避免地存在着主观色彩的语言文字,如果侵犯到个人利益或集体利益,请联系我,我会第一时间道歉并改正,致歉会公示在本文(永久)!
求仙问卜,不如自己做主,念佛诵经,不如本事在身。人生百态,竞相怒放,一个人的经验不可能完全地适配任何人,如果完全按照本文的经验套用在自己身上,造成的任何后果均不由我(本文作者)承担。
文章会更新,请以最新版为主,如因阅读了旧版本而造成了损失,造成的任何后果均不由我( ...