操作系统是如何工作的————一个精简的操作系统内核(20135304 刘世鹏)

操作系统是如何工作的————一个精简的操作系统内核

作者:20135304 刘世鹏

原创作品转载请注明出处

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

实验过程

使用实验楼虚拟机打开shell,加载实验所需linux内核,执行搭建好的系统

cd LinuxKernel/linux-3.9.4
qemu -kernel arch/x86/boot/bzImage

一直在执行mystartkernel,交替执行mytimerhandler



查看mymain.c代码

voidinit mystartkernel(void)从这开始是操作系统的入口 每循环10万次打印一个mystartkernel



查看myinterrupt.c代码

每次时钟中断调用printk打印一个mytimerhandler,是在中断实际发生时做的一些中断处理。

至此模拟硬件平台的工作,包括初始化动作就已完成



https://github.com/mengning/mykernel中可以找到实验所需多进程时间片轮转代码

运行后可观察到在0、1、2、3进程中切换


代码分析

打开mypcb.h

thread用来保存eip和esp,在pcb里,int pid 定义了进程ID;volatile long state定义了进程状态;char stack[KERNEL_STACK_SIZE]定义了内核堆栈。my_schedule表示调度器,task_entry为入口



打开mymain.c

mymain.c告诉我们如何初始化,并对初始化0号进程进行了描述

这段代码目的在于创建多个进程

创建后启动0号进程,此处为一段嵌入式汇编代码,其中的%0表示的是参数thread.ip,%1表示的是参数thread.sp。第49行表示的就是把参数thread.sp放到esp中;接下来push %1,又因为当前栈为空,esp=ebp,所以等价于push ebp;然后push thread.ip;ret等价于pop thread.ip;最后pop ebp。

ret之后0号进程就正式启动了

函数my_process定义所有进程的工作。这个函数里面定义了一个循环,if语句表示循环1000万次才有机会判断是否需要调度。这是一个主动调度的机制。



打开myinterrupt.c

next = my_current_task->next;//当前进程的下一个进程赋给next
prev = my_current_task;//当前进程
if(next->state == 0)如果下一个进程状态是0(正在执行)

/* switch to next process *///(进程上下文切换),此处是一个嵌入式汇编代码,

If语句表示task为空,即发生错误时返回。第52行开始介绍my_scheduel的工作,先把当前进程的下一个进程赋给next,当前进程为prev。

第54行表示如果下一个进程的状态是正在执行的话,就运用if语句中的代码表示的方法来切换进程,这些代码为嵌入式汇编代码,与mymain.c代码中的相似。

%0表示prev->thread.sp,%1表示prev->thread.ip,%2表示next->thread.sp,%3表示next->thread.ip。push ebp为保存当前进程的ebp;然后保存当前进程的esp;把下一个进程的sp放到esp中;接下来保存eip,$1表示后面的标号1:的位置;然后把下一个进程的eip push到栈里面。

ret之后下一个进程就开始执行了。这是进程切换的关键代码。

与上一段代码不同的是如果下一个进程为新进程时,就运用else中的这一段代码。首先将这个进程置为运行时状态,将这个进程作为当前正在执行的进程。之后的代码为嵌入式汇编代码,与上文稍微有点不同,但语句都差不多类似,这里就不赘述了。


总结

第一周的学习让我学习到了计算机的工作基本模型,就是存储程序计算机+函数调用对战,在本周深入学习操作系统的工作原理,首先引入一个重要模型就是中断机制,我认为这是现代计算机操作系统的工作的核心,早期的计算机在cpu完全处理完一个程序之后才会进行下一个任务的处理,这样大大降低了计算机的工作效率,而现代计算机引入中断机制,而时间片轮转模型又是现代计算机的基础模型,这就使得计算机通过中断机制在多个进程中以时钟信号我依据进行切换,从宏观的角度来看便是多个程序共同执行,大大提高了计算机的工作效率。

时间: 2024-10-05 07:19:51

操作系统是如何工作的————一个精简的操作系统内核(20135304 刘世鹏)的相关文章

计算机是如何工作的———高级语言转变为机器语言的过程(20135304 刘世鹏)

计算机是如何工作的———高级语言转变为机器语言的过程 作者:20135304 刘世鹏 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 实验过程 写入c语言代码 执行gcc -S -o main.s main.c -m32指令后得到汇编代码 删除以“.”开头的附加项后得到纯净的汇编代码 分析过程 得到纯净的汇编代码之后对其工作过程进行分析 前几步较为简单,ebp和esp所指向数值的箭头颜色与右边代码外框的颜色

构建一个简单的Linux系统 MenuOs —— start_kernel到init进程(20135304刘世鹏)

构建一个简单的Linux系统 MenuOs —— start_kernel到init进程 作者:刘世鹏20135304 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核代码简介 内核源码三个个重要目录 arch占有代码量最大,支持不同cpu的源代码,arch/x86目录下的代码是我们关注的重点 init,内核启动相关的代码基本都在init目录下,init/main.c中start_kernel是整

操作系统是如何工作的

实验2:运行并分析一个精简的操作系统内核,理解操作系统是如何工作的 姓名:李冬辉 学号:20133201 注: 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1.计算机是如何工作的?(总结)——三个法宝 存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: 函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆栈机制对于计算机来说并不那么重要,但有了高级语言及函数

操作系统是如何工作的--------Linux 实验二

操作系统是如何工作的? 作者:20135108 李泽源 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 mykernel实验指导(操作系统是如何工作的) 运行并分析一个精简的操作系统内核,理解操作系统是如何工作的 使用实验楼的虚拟机打开shell cd LinuxKernel/linux-3.9.4 qemu -kernel arch/x86/boot/bzImage 然后cd mykernel 您可以看到qe

操作系统是如何工作的--知识总结及实验报告

操作系统是如何工作的 攥写人:杨光  学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ) 知识总结: ***计算机工作的三个法宝 存储程序计算机.中断机制.堆栈 ***堆栈的作用 函数调用框架 传递参数 保存返回地址 提供局部变量空间 ***堆栈用到的寄存器 esp,指向栈顶 ebp,指向栈底,在C语言中用作记录当前函数调用基址. ***E

作业二:操作系统是如何工作的进行

作业二:操作系统是如何工作的进行 mykernel实验指导(操作系统是如何工作的) 运行并分析一个精简的操作系统内核,理解操作系统是如何工作的 打开shell cd LinuxKernel/linux-3.9.4 qemu -kernel arch/x86/boot/bzImage 然后cd mykernel 您可以看到qemu窗口输出的内容的代码mymain.c和myinterrupt.c 一.实验截图 二.分析进程的启动和进程的切换机制 一个小的内核源代码 mypcb.h: 1.#defin

Linux第二周学习总结——操作系统是如何工作的

LINUX内核分析第一周学习总结——操作系统是如何工作的 黄韧(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [知识点总结] (一)计算机是如何工作的?(总结)——三个法宝 存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: 函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆栈机制对于计算机来说并不那么重要,但有了高级语言及函数,堆栈成为了计算机的基础功能:函

WEEK TWO(2.29——3.6)操作系统是如何工作的?

[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK TWO(2.29——3.6)操作系统是如何工作的? SECTION 1 函数调用堆栈 1.总结上一讲 计算机是如何工作的? 存储程序计算机工作模型(冯诺依曼结构),是各种类型计算机的一个框架: 堆栈在早期是没有的,它是高级语言的起点(函数调用堆栈) 中断机制(多道系统的基础,也是计算机效率提升的关键——否则的画计算机能

linux内核分析作业:操作系统是如何工作的进行:完成一个简单的时间片轮转多道程序内核代码

计算机如何工作 三个法宝:存储程序计算机.函数调用堆栈.中断机制. 堆栈 函数调用框架 传递参数 保存返回地址 提供局部变量空间 堆栈相关的寄存器 Esp 堆栈指针  (stack pointer) Ebp 基址指针 (base pointer) 堆栈操作 Push:pop Ebp用作记录当前函数调用基址- 其他关键寄存器   中断 Call指令:1.将eip中下一条指令的地址A保存在栈顶:2.设置eip指向被调用程序代码开始处 1.Call xxx 2.进入xxx pushl %ebp mov