原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
系统调用有两种方式,一为通过函数API进行调用,二为直接使用汇编代码进行调用。
在C语言中嵌入汇编代码的一般格式:
asm volatile(
语句:“”
输出:
输入:
破坏语句:
)
以获取进程号为例:
C语言实现:
//example.c
#include<stdio.h>
#include<unistd.h>
void main()
{
int pid ;
pid = getpid() ;
printf("Process ID is %d \n",pid) ;
}
编译通过,运行
成功运行!
嵌入汇编实现:
//example_asm.c
#include<stdio.h>
#include<unistd.h>
void main()
{
pid_t pid ;
asm volatile(
"movl $0x14,%%eax\n\t"
"int $0x80\n\t"
"movl %%eax,%0\n\t"
:"=m"(pid)
) ;
printf("Process ID is %d \n",pid) ;
}
编译通过,运行
成功运行!
系统调用原理
通过本周的作业,更加熟悉了系统调用的本质,以及系统调用和中断的关联。系统调用是用户态和内核态的桥梁,而具体的措施就是中断。上面我们采用内嵌汇编编写的代码,在运行时,通过eax准备系统调用号,使用ebx、ecx等传递具体参数,当我们触发0x80中断时,经过中断处理程序,我们就进入了内核态。