您的位置:首页 > 其它

第四课 初识系统调用

2016-04-29 22:22 120 查看
赵连讯 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

本次课的名称:扒开系统调用的三层皮(上)

我将它理解为初步识别系统调用。

系统调用

系统调用的实现的实质是软中断,而不是简单的函数调用。为什么这么做呢?

系统的调用的意义如下:

把用户从底层的硬件编程中解放出来(不必关注硬件特性)

极大的提高了系统的安全性(用户不能随意的进入到内核中,必须经过中断,间接的进入到内核。内核和应用空间分开了)

使用户程序具有可移植性(因为对外的函数接口是一致的,应用程序只调用此接口即可)

三层皮

三层皮是那三层呢?

1. 第一层:应用层的libc提供的API函数。这些API函数虽然在应用层,但是他们不是随意的定义的。对外接口函数的形式一旦确定了,发布了,就不会随意的修改。否则使用libc的应用函数将无法承受。

libc对下使用int 0x80来实现系统调用

2.第二层:system_call系统调用函数。与0x80是对应的,是通过查表找到的系统调用函数。是traps_init函数注册的。

3.第三层:就是软件中断实现函数了。比如我们的fork函数,最终内核中的实现是sys_fork函数。

系统调用与函数调用区别

系统调用和一般的函数调用是不同的。让我们从汇编语言实现的角度来理解两者的区别。

如果是一个函数调用,大家首先想到的是使用前面讲到的系统编译生成的汇编文件来代替。在同一个栈空间中使用压栈和出栈的方式,借用call来实现。

但是系统调用的汇编实现却是不同的。我们必须生成一个发送给内核的中断。幸好有产生软件中断的语句:

int 0x80


系统调用的中断号码是0x80。具体是哪一个系统调用函数使用eax来传递。 eax来传递的参数也叫做系统调用号。

此外,函数的入参还可使用ebx,ecx,edi等等六个寄存器来使用。

实验过程

实验要求用汇编语言实现一段系统调用。

在本实验中我使用mkdir函数来修改汇编。

库函数的调用方式

源代码如下:



汇编语言调用方式

将系统调用改为汇编语言后,源代码如下:



使用ebx和ecx作为mkdir的入参,mkdir的输出参数没有接收。

eax作为系统函数的函数号码等于十进制的39.

最后执行系统调用int 0x80即可。执行后,可生成test目录。

执行结果

执行后创建了test目录,是程序执行的结果。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: