- 一、系统调用概述
- 二、使用库函数API在屏幕上打印hello world
- 三、C代码中嵌入汇编代码触发系统调用
- 四、总结
系统调用的意义是操作系统为用户态进程与硬件设备进行交互提供了一组接口。系统调用具有以下功能和特性。
- 把用户从底层的硬件编程中解放出来。操作系统为我们管理硬件,用户态进程不用直接与硬件设备打交道。
- 极大的提高系统的安全性。如果用户态进程直接与硬件设备打交道,会产生安全隐患,可能引起系统崩溃。
- 使用户程序具有可移植性。用户程序与具体的硬件已经解耦合并用接口代替了,不会有紧密的关系,便于在不同系统间移植。
下面编写了一个helloworld.c程序,其中string.h是C语言标准库中一个常用的头文件,在使用到字符数组时需要使用。这里我们定义了一个char类型的字符串数组,数组的内容是“Hello World”,并通过printf()函数打印数组中的内容。
由于本虚拟机时64位系统,所以想要按照x86-32为例的话,需要在使用gcc编译时加一个-m32的参数来输出32位机器码。即:gcc helloworld.c -o helloworld -m32
以下是运行结果:
代码分析:
int main()
{
char* msg = "Hello World";
int len = 11;
int result = 0;
__asm__ __volatile__("movl %2, %%edx;nr"
"movl %1, %%ecx;nr"
"movl $1, %%ebx;nr"
"movl $4, %%eax;nr"
"int $0x80"
:"=m"(result)
:"m"(msg),"r"(len)
:"%eax");
return 0;
}
运行结果:
1. API:第一层是指Libc中定义的API,这些API封装了系统调用,使用int 0x80触发一个系统调用中断;当然,并非所有的API都使用了系统调用,如完成数学加减运算的API就没有使用系统调用;也有可能某个API使用了多个系统调用;这一层存在的价值就是为应用程序员提供易于使用的API来调用系统调用。
2. system_call:运行于内核态。system_call是所有系统调用在内核的入口点,在其中的开始处保护用户态程序执行上下文,结束处恢复用户态程序执行上下文,在中间根据传入的系统调用号对应的中断服务程序。
3. sys_xyz 系统调用封装例程:执行具体的系统调用操作,完成用户的系统调用请求;每个系统调用都对应一个封装例程。



