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
}



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

原文地址:https://www.cnblogs.com/sharemi/p/6013732.html