操作系统实验一:OS初步

实验一:操作系统初步

在linux系统中的实现

实验原理

API

API(Application Programming Interface,应用程序编程接口),指的是我们用户程序编程调用的如read(),write(),malloc(),free()之类的调用的是glibc库提供的库函数。API直接提供给用户编程使用,运行在用户态。这里要另外提一下,POSIX针对API提出标准,即针对API的函数名,返回值,参数类型进行规范约束,但是并不管API具体如何实现。

系统调用

系统操作系统为用户态进程与硬件设备进行交互提供了一组接口——系统调用,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务。通过软中断或系统调用指令向内核发出一个明确的请求,内核将调用内核相关函数来实现(如sys_read(),sys_write())。用户程序不能直接调用这些Sys_read,sys_write等函数。这些函数运行在内核态。

两者联系与区别

区别:API只是一个函数定义,系统调用通过软终端向内核发出一个明确的请求
联系:
1.Libc库定义了一些API引用了封装例程,目的在于发布系统调用。
2.一般每个系统调用对应了一个封装例程,库再用这些封装例程定义出给用户的API。通常API函数库中的函数会调用封装例程,封装例程负责发起系统调用,这些都运行在用户态;内核开始接受系统调用后,CPU从用户态切换到内核态;内核调用相关的内核函数来处理再逐步返回给封装例程,cpu进行一次内核态到用户态的切换,API函数从封装例程拿到结果,在处理完毕后返回用户。
3.当API函数不一定都需要进行系统调用

系统调用号

一个系统调用号,对应一个函数入口地址,glibc和内核里面的这个系统调用号是一致的,所以glibc调用汇编之类把系统调用号传给内核的时候,内核找到这个具体的系统调用服务例程对应的函数入口地址,如sys_read。

系统调用和函数调用的区别
  • 系统调用和库函数的关系
    a. 系统调用通过软终端int 0x80从用户态进入内核态。 函数库中的某些函数调用了系统调用
    b. 函数库中的函数可以没有调用系统调用,也可以调用多个系统调用 编程人员可以通过函数库调用系统调用 高级编程也可以直接采用int
    c.0x80进入系统调用,而不必通过函数库作为中介 如果是在核心编程,也可以通过int
    d.0x80进入系统调用,此时不能使用函数库。因为函数库中的函数是内核访问不到的,
  • 从用户调用库函数到系统调用执行的流程
    a.用户调用getpid()库函数
    b.库函数执行int 0x80中断,由于中断使得进程从用户态进入内核态,参数通过寄存器传送
    c.0x80中断对应的中断例程被称为system call handler。其工作为存储大多数寄存器到内核堆栈中,这是汇编代码写的
    d.执行真正的系统调用函数-system call service routine,这是C代码
    e.通过ret_from_sys_call()返回,回到用户态的库函数,这是汇编代码写的
    软中断

软中断与硬中断

硬中断:由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统系统外设的变化,比如网卡收到数据包的时候,就会发送一个中断。通常我们说的中断指的是硬中断(hardirq)
软中断:为了满足实时系统的要求,中断处理应该是越快越好。Linux为了实现这个特点,当中断发生的时候硬中断处理那些短时间就可以完成的工作,而将那些处理事情比较长的工作,放到中断之后来完成,也就是软中断(softirq)
软中断指令。
Int是软中断指令。中断向量表是中断号和中断处理函数地址的对应表,int n-触发软中断n。相应的中断处理函数的地址为:中断向量表地址+4*n
int与函数调用call的区别

以上内容参考以下博主的该篇文档中的实验原理部分
原文:https://blog.csdn.net/weixin_43641509/article/details/88567034

Task1 系统调用实验

实验要求

  1. 分别运行用API接口函数getpid()直接调用和汇编中断调用两种方式调用Linux操作系统的同一个系统调用getpid的程序

  2. 请问getpid的系统调用号是多少?linux系统调用的中断向量号是多少?

    答:getpid的系统调用号是 14H、中断向量号是80H。

实验代码

使用接口
invoke.c

//Using API getpid()
#include <stdio.h>
#include <unistd.h>

int main()
{
   
	pid_t pid;
	pid = getpid();
	printf("%d\n",pid );
	return 0;
}

使用汇编中断
invokeassemble.c

//Using Assembly Language
#include <stdio.h>
#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值