• 20169211《Linux内核原理与分析》第六周作业


    1.教材内容总结
    2.实验报告
    3.学习总结

    一、教材内容总结
    1、系统调用与应用编程接口API的区别
    操作系统为用户态进程与硬件设备进行交互提供了一组接口,就是系统调用。它主要有一下三个方面的作用:
    (1)把用户从底层的硬件编程中解放出来
    (2)极大的提高了系统的安全性
    (3)使用户程序具有可移植性
    而API和操作系统是不同的,API只是一个函数定义,而系统调用通过软中断向内核发出一个明确的请求。一般每个系统调用对应一个封装例程,然后libc库再用这些封装例程定义出给用户的API。不是每一个API都对应一个特定的系统调用。
    (1)API可能直接提供用户态的服务,例如一些数学函数等。
    (2)不同的API可能调用几个系统调用
    (3)不同的API可能调用了同一个系统调用
    2、内核态和用户态
    操作系统为了维持计算机的可持续的工作,要对这些可能影响到系统稳定的因素进行严格控制,不能让用户随意进行操作。这就是操作系统区分内核态和用户态的思想。对于一些可能影响系统稳定的函数,操作系统将它们放到内核态当中,在用户态中用户只能调用一些用户态的函数,而对于一些对内核函数,用户只能通过中断进入内核态中进行调用。下图简略的说明了用户态和内核态的程序调用关系。


    二、实验报告
    系统调用write。下面使用库函数和C代码嵌入汇编代码两种方式使用同一个系统调用。
    库函数调用系统调用:

    int write(int fd,const char *buf, off_t count)//fd为文件描述符,buf为写缓冲区指针,count为写入字节数
    
    #include<stdio.h>
    int main()
    {
    	char* c = "this is sys_write";
    	write(0,c,18);
    	return 0;
    }
    


    嵌入汇编代码调用系统调用

    #include<stdio.h>
    int main()
    {
    	char* c = "this is sys_write";
    	asm volatile (
    		"mov $0,%%ebx
    	"//对应fd
    		"mov %0,%%ecx
    	"//对应buf,也就是c
    		"mov $18,%%edx
    	"//对应count
    		"mov $0x4,%%eax
    	"//系统调用号为4
    		"int $0x80
    	"
    		:
    		:"r"(c)
    	);
    	return 0;
    }
    或
    int main()
    {
    	char* c="this is sys_write";
    	asm volatile(
    		"mov $0,%%ebx
    	"//对应fd
    		"mov $18,%%edx
    	"//对应count
    		"mov $0x4,%%eax
    	"//系统调用号为4
    		"int $0x80
    	"
    		:
    		:"c"(c)//直接将输入存入ecx
    }
    



    三、学习总结
    这一节主要通过实验,了解了系统如何进行系统调用的,加深了对内核态和用户态的理解。操作系统平常工作都在用户态当中,当用户态需要操作一些内核数据时,才会通过系统调用进入内核态,而这些系统调用都是操作系统本身实现了,用户无法修改。可以看出通过这种方式,操作系统实现了对关键数据的保护,从而维护了系统的高效稳定运行。

  • 相关阅读:
    深度学习优化方法比较
    调参
    Numpy/Pytorch之数据类型与强制转换
    numpy:维度问题
    js模板引擎-juicer
    js模板引擎-腾讯artTemplate 简洁语法例子
    canva绘制时钟
    js中的break ,continue, return
    JavaScript奇技淫巧44招
    数据类型
  • 原文地址:https://www.cnblogs.com/sharemi/p/6013732.html
Copyright © 2020-2023  润新知