操作系统 xinu方法笔记

IO

操作系统会为每个IO设备在总线地址空间中分配一段地址,CPU就可以像访问内存一样,对IO设备进行存取。

DMA机制

DMA直接内存访问机制,解决了IO收发数据时CPU将数据传入传出缓冲区计算的操作。

为了接受数据包,操作系统会在内存中分配一个缓冲区并启动以太网设备,当数据包到达时,硬件设备接收这个数据包,经过多次总线传输将这个数据包副本写入内存缓冲中。一旦数据包接受完毕,设备会给CPU发送中断请求。

只要CPUI处理数据包的速度比数据包到达的速度快,并向列表中不断添加清空的缓冲区,网络硬件设备就会持续地读取数据包。

函数调用约定和运行时的栈

函数调用约定

系统在实现函数调用与返回过程中采取的步骤被称为函数调用约定。

​ 操作系统需要通过调用函数来处理中断及切换进程

参数和参数传递

两种常用的参数传递机制:一是将参数至于堆栈中,二是将参数传递到通用寄存器中。

运行时栈和栈帧内容

编辑器会在栈中分配足够的空间来保存被调用函数的活动记录。所分配的空间称为栈帧。每个活动记录包含了该函数的局部变量的存储空间、计算期间所需的临时存储空间,以及返回地址等其他杂项。创建栈帧所需的代码是由编辑器生成的,同时编辑器会计算局部变量所需的空间大小以及其他辅助项目所需的空间大小。

Intel

在这个处理器上,函数调用之前,调用者会把EAX,ECX和EDX等寄存器压入栈中,接下来把函数的参数逆序压栈,并调用CALL指令。

ARM

函数的前4个参数通过寄存器a0~a3传递。如果函数的参数超过4个,超过的部分会通过栈进行传递。为了调用一个函数,调用者需要执行BL指令,当BL指令被执行时,硬件会把返回地址放置在R14寄存器上。被调用函数也必须保存它将使用的寄存器,一般来说,被调用函数会将R14到R4寄存器以及CPSR(状态)寄存器依次压栈。

中断和中断处理

处理器硬件具有紧密关联的异常机制,用于在发生错误或故障时通知软件。它允许处理器在进行IO的同时进行计算。

如果中断掩码被赋值为零,则处理器将忽略所有中断,如果掩码被分配了非零值,则硬件允许发生中断。

大多数由操作系统驱动的IO都使用中断机制。

异常向量和异常处理

许多处理器使用中断处理相同的向量化方法来处理异常。硬件将异常号放在寄存器中。操作系统提取异常号码,并将该号码作为寻找异常向量的索引。

调度与上下文切换

操作系统将所有与进程相关的信息记录在进程表中。

调度器其实就是一个函数。调度器包含由正在执行的进程自愿放弃处理器时所调用的一个函数。

上下文切换

切换函数接收两个参数:一个当前进程的进程表项的指针,以及新锦成的进程表项的指针。

在函数被调用时,执行将处理器寄存器压入当前运行的进程(旧进程)栈中的指令。

在当前的进程表项中保存栈指针,并读取(新)进程的指针。

执行将从新进程栈中恢复处理器寄存器值得指令。

返回调用函数的新进程中的函数。

Intel

在这个平台下,上下文切换始于在当前栈上为旧进程保存寄存器值。先压入EBX寄存器的值。然后压入状态标志寄存器flags和所有通用寄存器的值,之后上下文切换diamante在第一个参数指定的位置保存旧进程的栈指针,并从第二个参数指定的位置获取新进程的栈指针的值。一旦栈指针发生了切换,切换函数会恢复新锦成之前保存的寄存器。

ARM

这个平台,几乎跟Intel的上下文切换相同的步骤。都是调用函数,将参数压入栈,运行函数!

内存

操作系统提供了一种保护机制,用于阻止一个程序访问或修改已被分配给其他程序的内存区域。

进程内存分配

栈:每个进程都需要栈空间来存储与该进程的函数调用相关的活动记录。除了参数声明外,还存储了局部变量。

堆:一个或一系列进程也会使用堆来存储动态分配的变量,这些变量独立于特定的函数调用。

系统不会记录进程调用getmen所得到的堆内存,因此不会自动释放堆空间。这时需要手动调用进行回收!

缓冲区

缓冲区这个术语用来反映IO程序和通信软件堆内存的预期用途

进程在请求分配缓冲区时会被阻塞,直到该请求可以被满足才继续执行。

缓冲区解决的是内存划分问题中,全局分配方案造成的死锁问题。

为什么系统不能依赖全局分配的方式?

以网络通信软件为例,网络通信中数据包的到达是随机的(顺序到达的话,会降低传输速度)。如果每个传入的数据包都被放在内存缓冲区中,这种可能使内存耗尽(当数据特别大的时候)。如果处理网络数据包的程序尝试写文件,可能造成死锁:该进程阻塞等待磁盘缓冲区,但所有内存都用于网络缓冲区并且在磁盘IO完成前没有网络缓冲区能够被释放。

所以为了防止死锁,高级内存管理必须把空闲内存划分为独立的子集,并确保一个子集分配和释放与其他子集独立。

DMA设备和驱动

为了读取一个磁盘块,操作系统首先分配一个缓冲区用来存放输入的数据,并在存储器创建一个读请求,将请求地址传递给磁盘设备。发起请求后,处理器就空闲了,操作系统就会在处理器上执行其他处于就绪状态的进程。在处理器运行的同时,DMA 硬件使用总线获取读请求,然后从磁盘向存储器中的缓冲区传输数据块。一旦整块数据都拷贝到存储器缓冲区,磁盘就中断处理器。

总所周知,DMA采用操作系统在内存上创建的一块缓冲区来进行数据的传输,那么缓冲区总会有满了一刻,在缓冲区还没有满的时候,如果处理器的处理速度大于DMA写入缓冲区的速度那么缓冲区不会发生溢出中断,如果缓冲区满了那么DMA将设置一个错误标识(通常是溢出位),并产生中断来通知操作系统。

当进程读取包时,如果缓冲区中有数据,则驱动程序将数据包从环缓冲区拷贝到调用进程的缓冲区中!

以太网在接收数据是不断读取数据包直到找到指向计算机的单播地址、网络的广播地址或者是计算机监听的多播地址中的一个,其他的数据包则会丢弃。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值