Linux-0.11OS
哈工大OS实验课
徐步小兵
这个作者很懒,什么都没留下…
展开
-
Linux内存寻址管理:逻辑地址到物理地址转化
虚拟地址(Virtual Address)是指由程序产生的由段选择符和段内偏移地址两个部分组成的地址。因 为这两部分组成的地址并没有直接用来访问物理内存,而是需要通过分段地址变换机制处理或映射后才 对应到物理内存地址上,因此这种地址被称为虚拟地址。虚拟地址空间由 GDT 映射的全局地址空间和 由 LDT 映射的局部地址空间组成。逻辑地址(Logical Address)是指由程序产生的与段相关的...原创 2020-02-14 11:07:03 · 1000 阅读 · 0 评论 -
Linux 0.00系统的编译运行与代码解析
简介《Linux内核完全剖析》这本书在第4章4.9节给出了一个简单多任务内核示例程序,称之为Linux 0.00系统,给出实现这个简单内核的源程序:启动引导程序 boot.s 和保护模式多任务内核程序 head.s,实现了两个任务分别称为任务 A 和任务 B(或任务 0 和任务 1),它们会调用这个显示系统调用在屏幕上分别显示出字符’A’和’B’,直到每个 10 毫秒切换到另一个任务。任务 A ...原创 2020-02-11 14:03:53 · 1412 阅读 · 0 评论 -
哈工大李治军Linux-0.11操作系统实验索引与总结
索引目录Linux-0.11操作系统实验1-操作系统的引导Linux-0.11操作系统实验2-系统调用Linux-0.11操作系统实验3-进程运行轨迹的跟踪与统计Linux-0.11操作系统实验4-基于内核栈切换的进程切换Linux-0.11操作系统实验5-信号量的实现和应用Linux-0.11操作系统实验6-地址映射与共享Linux-0.11操作系统实验7-终端设备的控制Lin...原创 2020-02-08 15:27:20 · 3968 阅读 · 0 评论 -
Linux-0.11操作系统实验8-proc文件系统的实现
实验环境:实验楼-proc文件系统的实现实验理论:Linux-0.11操作系统实验8理论-proc文件系统的实现实验任务:在 Linux 0.11上实现 procfs(proc 文件系统)内的psinfo结点。当读取此结点的内容时,可得到系统当前所有进程的状态信息。例如,用 cat命令显示 /proc/psinfo 的内容,可得到:# cat /proc/psinfo pid sta...原创 2020-02-07 14:44:04 · 2774 阅读 · 0 评论 -
Linux-0.11操作系统实验8理论-proc文件系统的实现
L28 生磁盘的使用磁盘定义磁盘利用了电流的磁效应,对一些电信号进行磁化,保存在磁盘中,用来表示一些信息。每个盘面上都有磁道、扇区这2个概念。先从磁道说起,每个盘面上有多条圆环,也就是磁道,这些磁道中存储着磁盘的信息。每个磁道上又被分为若干个扇区,磁盘每次的读写数据的操作单位就是这个扇区。每个扇区的大小一般为512字节大小。磁盘是由多个盘片叠加在一起的,由于磁盘每次进行读写的开始都要...原创 2020-02-07 14:25:08 · 831 阅读 · 0 评论 -
Linux-0.11操作系统实验7-终端设备的控制
实验环境:终端设备的控制实验任务:修改 Linux 0.11 的终端设备处理代码,对键盘输入和字符显示进行非常规的控制。在初始状态,一切如常。用户按一次F12 后,把应用程序向终端输出所有字母都替换为“*”。用户再按一次F12,又恢复正常。第三次按 F12,再进行输出替换。依此类推。实验本质:IO的使用:让外设工作起来表现为CPU给外设的硬件寄存器发送指令,控制器完成真正的工作,向CPU发...原创 2020-02-06 14:57:49 · 3677 阅读 · 1 评论 -
Linux-0.11操作系统实验6-地址映射与共享
实验环境:地址映射与共享实验理论:Linux-0.11操作系统实验6理论-地址映射与共享实验任务:用 Bochs 调试工具跟踪 Linux 0.11 的地址翻译(地址映射)过程,了解 IA-32 和 Linux 0.11 的内存管理机制;在 Ubuntu 上编写多进程的生产者—消费者程序,用共享内存做缓冲区;在信号量实验的基础上,为 Linux 0.11 增加共享内存功能,并将生产者—...原创 2020-02-06 10:41:09 · 2882 阅读 · 3 评论 -
Linux-0.11操作系统实验6理论-地址映射与共享
L20 内存使用与分段运行时重定位:基地址 + 逻辑偏移地址基地址以表的形式保存在PCB中。一个程序分成多个段,每个段都要记录其基地址,存在一个表中,称为段表,保存在PCB中。GDT : 操作系统的段表LDT : 各个用户进程的段表(其实就是之前讲到的映射表)如何使用内存:程序编译时分为多个段,每个段在内存中找到一段空闲分区,将每个空闲区的基地址存入LDT表中,此时一个程序已经...原创 2020-02-05 15:25:17 · 1250 阅读 · 0 评论 -
Linux-0.11操作系统实验5-信号量的实现和应用
实验环境:信号量的实现和应用实验任务:在 Ubuntu 下编写程序,用信号量解决生产者——消费者问题;在 linux-0.11 中实现信号量,用生产者—消费者程序检验之。用信号量解决生产者—消费者问题实验要求:pc.c程序需打开一个文件buffer.txt作为共享缓冲区,缓冲区同时最多只能保存 10 个数;创建一个生产者进程和N个消费者进程,其中生产者进程向缓冲区写入连续的整数,0...原创 2020-02-04 11:19:04 · 6427 阅读 · 7 评论 -
Linux-0.11操作系统实验5理论-信号量与临界区
CPU调度策略FIFO:谁先进入,谁先调度Priority:任务短可以适当优先调度周转时间: 从开始申请执行任务,到执行任务完成响应时间: 从开始申请执行任务到开始执行任务相互影响和矛盾:响应时间小 ------> 切换次数多 ------> 系统内耗大 ------> 吞吐量小调度需要折中和综合FCFS:先来先服务 first come first server...原创 2020-02-02 20:05:31 · 631 阅读 · 0 评论 -
Linux-0.11操作系统实验4-基于内核栈切换的进程切换
实验环境:基于内核栈切换的进程切换实验本质:将 Linux 0.11 中采用的 TSS 切换部分去掉,取而代之的是基于堆栈的切换程序。具体的说,就是将 Linux 0.11 中的 switch_to实现去掉,写成一段基于堆栈切换的代码。重写 switch_to修改/kernel/system_call.s:.globl system_call,sys_fork,timer_interrup...原创 2020-02-02 12:02:18 · 2265 阅读 · 9 评论 -
Linux-0.11操作系统实验4理论-内核级线程实现
从fork中断开始fork()中有中断,执行 INT 0x80时,CPU找到对应的内核栈,将 SS SP PC CS 压栈;接着执行_system_call切换五段论中的中断入口和出口刚进入内核,_system_call将用户态信息压栈,这就是中断入口—建立内核栈和用户栈的关联# system_call.s 程序movl _current,%eax # 取当前任务(进程)数据结构地址...原创 2020-02-02 10:33:13 · 1167 阅读 · 0 评论 -
Linux-0.11操作系统实验4理论-用户级和内核级线程
进程与线程进程 = 资源 (包括寄存器值,PCB,内存映射表)+ 指令序列线程 = 指令序列线程 的资源是共享的进程 间的资源是分隔独立的,内存映射表不同,占用物理内存地址是分隔的线程 的切换只是切换PC,切换了指令序列进程 的切换不仅要切换PC,还包括切换资源,即切换内存映射表用户级线程:调用Yield函数,自己主动让出cpu,内核看不见,内核只能看见所属进程而看不见用户级线程,所...原创 2020-02-01 21:59:14 · 826 阅读 · 3 评论 -
Linux-0.11操作系统实验3-进程运行轨迹的跟踪与统计
实验环境:进程运行轨迹的跟踪与统计process.c根据实验楼提供的模板,做如下修改:/*1. 所有子进程都并行运行,每个子进程的实际运行时间一般不超过30秒;2. 父进程向标准输出打印所有子进程的id,并在所有子进程都退出后才退出;*/int main(int argc, char * argv[]){ pid_t n_proc[10]; /*10个子进程 PID*/ i...原创 2020-01-31 22:42:56 · 3314 阅读 · 4 评论 -
Linux-0.11操作系统实验1-操作系统引导
实验环境:实验楼之操作系统引导bootsect.sbootsect.s 被BIOS启动子程序加载至0x7c00 (31k)处,并将自己 移到了地址0x90000 (576k)处,并跳转至那里。然后使用BIOS 中断INT 0x13将’setup’直接加载到自己的后面(0x90200)(576.5k),同时读取磁盘参数表中当前启动引导盘的参数,共读4 个扇区,即将setup模块从磁盘加载到内...原创 2020-01-29 21:47:43 · 3312 阅读 · 5 评论 -
Linux-0.11操作系统实验2-系统调用
实验环境:实验楼之系统调用参考文章:哈工大李治军老师操作系统实验-系统调用内核层面的修改:修改 include/unistd.h 文件添加 __NR_whoami 和 __NR_iam 两个宏/* 添加系统调用号 */#define __NR_whoami 72 #define __NR_iam 73修改kernel/system_call.s 文件nr_syst...原创 2020-01-02 11:02:48 · 2602 阅读 · 7 评论