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

1、系统调用概述

系统调用的意义是操作系统为用户态进程与硬件设备进行交互提供了一组接口。系统调用具有以下功能和特性。

  1. 把用户从底层的硬件编程中解放出来。操作系统为我们管理硬件,用户态进程不用直接与硬件设备打交道。
    2.极大地提高系统的安全性。如果用户态进程直接与硬件设备打交道,会产生安全隐患,可能引起系统崩溃。
    3.使用户程序具有可移植性。用户程序与具体的硬件已经解耦合并用接口代替了,不会有紧密的关系,便于在不同系统间移植。

2、操作系统提供的API和系统调用的关系

libc函数定义了一些API内部使用了系统调用的封装例程,其主要目的是发布每个系统调用,一般每个系统调用对应一个系统调用
的封装例程,函数库用在这些封装例程定义出给程序员调用的API,这样把系统调用最终封装成方便程序员使用的库函数。
一个API可能只对应一个系统调用,也可能内部由多个系统调用实现,一个系统调用也可能被多个API调用。
系统调用的三层机制:

User Mode表示用户态,Kernel Mode表示内核态。xyz()就是一个API函数,是系统调用对应的API,其中封装了一个系统调用,
会触发int $0x80的中断,对应system_call内核代码的起点,即中断向量0x80对应的中断服务程序入口,内部会有sys_xyz()系统
调用函数,执行完会ret_from_sys_call,这里是进程调度最常见的调度时机点。

3、使用库函数API和C代码中嵌入汇编代码触发同一个系统调用

3.1使用库函数API触发一个系统调用

首先编写time.c,声明了一个time_t类型的变量tt和一个struct tm类型指针变量t。

使用gcc编译

输出结果会发现,月份不正确,通过查找问题发现:

通过修改time.c函数可得到正确结果

3.2 C代码中嵌入汇编代码触发一个系统调用

将tt=time(NULL)使用内嵌汇编替代,代码如下:

3.3 含有两个参数的系统调用示范

含有两个参数的系统调用rename,它在内核中的系统调用处理函数为sys_rename(),系统调用号为38。内核中的系统
调用处理函数原型为:
asmlinkage long sys_rename(const char _user *oldname,const char_user *newname;)
代码如下:

它的功能是将hello.c重命名为我的学号

原文地址:https://www.cnblogs.com/baoxiyuan/p/13919360.html