zoukankan      html  css  js  c++  java
  • 作业2:操作系统是如何工作的?20135115臧文君

    操作系统是如何工作的?

    注:作者:臧文君,原创作品转载请注明出处,《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

    一、函数调用堆栈

    1、计算机的三个法宝:存储程序计算机,函数调用堆栈和中断机制。

    2、堆栈

     

    3、堆栈寄存器和堆栈操作

     

     4、函数调用堆栈的框架

     

    call指令:将eip中下一条指令的地址A保存在栈顶,设置eip指向被调用程序代码开始处。

    ret指令:将地址A恢复到eip中。

    5、举例分析函数调用堆栈

    使用gcc -g命令生成test.c的可执行文件test

    然后使用objdump -S命令获得test的反汇编代码。

     

    6、函数参数的存储和调用传递方式

     

    将参数传递给p2函数:

    先用变址寻址的方式,将yx的值存入堆栈中,push的是局部变量,再call,存入cs:eippush ebp

    add $0x8,%esp的目的是将存储xy的空间清除,有压栈必有出栈!

    函数的返回值通过eax寄存器传递,mow %eax,0xfffffffc(%ebp)

    7、观察局部变量的存储机制

    sub $0x18,%esp的命令是在堆栈中预留出0x18字节的一段空间,用来存储局部变量。

     

    总结:

     

    分析: 

    二、借助Linux内核部分源代码模拟存储程序计算机工作模型及时钟中断

    1、利用mykernel实验模拟计算机硬件平台

    一个程序切换到另一个程序:

    当一个中断信号发生时,CPU把当前的eipespebp都压栈到内核堆栈中,把eip指向中断处理程序的入口,执行中断处理程序。

    CPU和内核代码共同实现了保存现场和恢复现场。

    2、实验

    my_start_kernel函数是操作系统的入口

    my_timer_handler时钟中断程序

    三、在mykernel基础上构造一个简单的操作系统内核

    1C代码中嵌入汇编代码的写法

     

    例:

     

    %1val1%2val2,“c”(val1)表示val1的值存在ecx寄存器中。

    =m表示写到内存中去

    movl %%eax,%0表示把eax的值直接放到内存的变量val3中去

     

    练习:

     

    输出结果是:0 1temp=0,output=1

    2、在mykernel基础上构造一个简单的操作系统内核

    1mypcb.h

    定义Thread用于存储eipesp

    PCB中定义进程的id、状态state、堆栈stack、入口entry,把进程用链表*next链起来

    (2)mymain.c

    初始化0号进程的数据结构

    状态0表示正在运行,-1表示没有运行

    fork more process创建更多的进程

    %0表示第0号参数thread.ip

    %1表示第1号参数thread.spd表示edx

    push %1相当于push ebp,因为当前栈是空的,ebp=esp

    ret之后0号进程正式启动

    (3)myinterrupt.c

    进程切换的关键代码:

    操作系统的“两把剑”:中断上下文和进程上下文的切换。

    切换到一个新进程的方法:

    时间片设置小一些调度的更频繁。

    总结:

        这次课的主要内容是介绍操作系统是如何工作的,根据课程学习加上我的理解,我认为操作系统利用中断来进行进程的切换,当前进程触发另一个进程时,先将当前的eipespebp都压栈到内核堆栈中,再把eip指向中断处理程序的入口,执行中断处理程序。并且由CPU和内核代码共同实现保存现场和恢复现场。

    实验:

    1、输入命令cd LinuxKernel/linux-3.9.4qemu -kernel arch/x86/boot/bzImage加载内核

     

    2、输入命令cd mykernel,进入mymain.c,可以对时间进行修改

     

    3、进入myinterrupt.c

     

    4、添加mypcb.h头文件

     

    5、修改mymain.cmyinterrupt.c,然后再运行,可以看到多进程切换运行

     

     

  • 相关阅读:
    iOS 测试
    runtime 大牛必备
    集成微信支付
    webview的使用以及js调用OC传参
    ScrollView的坑
    iOS 字符串 数组 字典 操作!
    Git的使用场景
    什么是Runloop?
    Cannot subclass final class class com.sun.proxy.$Proxy16
    <%@page include%>、<%@include%>、<jsp:include>三者之间的本质区别
  • 原文地址:https://www.cnblogs.com/CatherineZang/p/5245969.html
Copyright © 2011-2022 走看看