2021-2022-1 20212818《Linux内核原理与分析》第五周作业

本文介绍了计算机中内核态和用户态的概念,阐述了中断处理和系统调用在从用户态进入内核态的角色。通过实验展示了如何使用库函数API和嵌入汇编代码调用系统调用,并总结了系统调用的工作机制,强调了其在安全性和可移植性上的优势。
摘要由CSDN通过智能技术生成

 一、相关知识

1、内核态和用户态

        计算机的硬件资源是有限的,为了减少有限资源的访问和使用冲突,CPU和操作系统必须提供一些机制对用户程序进行权限划分。现代的CPU一般都有几种不同的指令执行级别,就是什么样的程序执行什么样的指令是有权限的。

        内核态:在高的执行级别下,代码可以执行特权指令,访问任意的物理内存,这时CPU的执行级别对应的就是内核态,对所有的指令包括特权指令都可以执行。 

        用户态:在用户态(低级别指令),代码能够掌握的范围会受到限制。

2、中断 

        中断处理是从用户态进入内核态的主要方式,系统调用也是一种中断。一般来说,进入内核态是由中断触发的,可能是硬件中断,在用户态进程执行时,硬件中断信号到来,进入内核态,就会执行这个中断对应的中断服务例程。也可能是用户态程序执行的过程中,调用了一个系统调用,陷入了内核态,叫做Trap(系统调用知识特殊的中断)。这时就会有从用户态到内核态的寄存器上下文的切换问题,当用户态切换到内核态时,就要吧用户态寄存器上下文保存起来,同时要把内核态的寄存器的值放在当前的CPU中。int指令也会触发中断机制。

3、系统调用的功能和特性

        系统调用的意义是操作系统为用户态进程与硬件设备进行交互提供了一组接口。

        系统调用具有以下功能和特性:

        A、把用户从底层的硬件编程中解放出来。操作系统为我们管理硬件,用户态进程不用直接与硬件设备打交道。

        B、极大地提高系统的安全性。如果用户态进程直接与硬件设备打交道,会产生安全隐患,可能引起系统崩溃。

        C、使用户程序具有可移植性。用户程序与具体的硬件已经解耦合并用接口代替了,不会有紧密的关系,便于在不同系统间移植。

二、实验内容

使用库函数 API 和 C 代码中嵌入汇编代码两种方式使用同一个系统调用

三、实验过程:

        请求一个系统调用,一般有两种方法可以实现,一是使用Libc提供的API,二是直接在C中内嵌汇编代码触发0x80中断来完成。

(一)、使用库函数 API触发一个系统调用

        编写一个main.c的程序,这里调用20号系统调用,在main.c函数中调用库函数getpid。main函数以及运行结果如下图。

 (二)、使用C 代码中嵌入汇编代码触发一个系统调用

        编写一个main函数,在其中嵌入汇编代码并运行。main函数及运行结果如下图所示。

四、实验总结

对系统调用工作机制的理解:

        当处于用户态的进程调用一个系统调用时,CPU会从用户态切换到内核态并开始执行一个中断服务程序和系统调用内核函数。即,在Linux中通过执行int $0x80来触发系统调用的执行,这条汇编指令产生中断向量为128的编程异常。进入内核后,开始执行中断向量128对应的中断服务程序。内核通过给每一个系统调用一个编号来区分进行哪一个系统调用,这个编号叫做系统调用号。

        用户态和内核态两种模式下使用的是不同的堆栈存储参数的,当发生系统调用使用户态切换为内核态时,就不能通过参数压栈的方式进行参数传递,而是通过寄存器传递参数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值