当前位置:首页>科技>正文

系统调用是通过什么方式陷入内核态的 什么是系统调用

2023-07-06 07:08:32 互联网 未知 科技

 系统调用是通过什么方式陷入内核态的 什么是系统调用

系统调用是通过什么方式陷入内核态的

第一步,在系统中添加一个不用传递参数的系统调用;执行这个系统调用,使用户的uid等于0。显然,这不是一个有实际意义的系统调用。我们的目的并不是实用不实用,而是通过最简单的例子,帮助熟悉对系统调用的添加过程,为下面我们添加更加复杂的系统调用打好基础。
第二步,用kernel module机制,实现系统调用gettimeofday的简化版,返回调用时刻的日期和时间。

实验指导
1.一个简单的例子
在我们开始学习系统调用这一章之前,让我们先来看一个简单的例子。就好像哪个经典的编程书上都会使用到的例子一样:

1: int main(){
2: printf(“Hello World! ”)
3: }

我们也准备了一个例子给你:

1: #include /* all system calls need this header */
2: int main(){
3: int i = getuid()
4: printf(“Hello World! This is my uid: %d ”, i)
5: }

这就是一个最简单的系统调用的例子。与上面那个传统的例子相比,在这个例子中多了2行,他们的作用分别是:
第一行:包括unistd.h这个头文件。所有用到系统调用的程序都需要包括它,因为系统调用中需要的参数(例如,本例中的“__NR_getuid”,以及_syscall0()函数)包括在unistd.h中;根据C语言的规定,include 意味着/usr/include/linux目录下整个unistd.h都属于Hello World源程序了。
第三行:进行getuid()系统调用,并将返回值赋给变量i。
好了,这就是最简单的一个使用了系统调用的程序,现在你可以在你的机器上试一试它。然后我们一起进入到系统调用的神秘世界中去。

什么是系统调用

什么是系统调用

在Linux的世界里,我们经常会遇到系统调用这一术语,所谓系统调用,就是内核提供的、功能十分强大的一系列的函数。这些系统调用是在内核中实现的,再通过一定的方式把系统调用给用户,一般都通过门(gate)陷入(trap)实现。系统调用是用户程序和内核交互的接口。