刘昆
+《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
#include <stdio.h>
#include <unistd.h>
/*
库函数:pid_t getpid(void)
该函数返回值为当前进程的进程号,系统调用号为20,
通过内嵌汇编证明手动使用相关系统调用号进入内核进程,
和getpid()系统自动使用相关系统调用号进入内核进程效果一样
*/
int main(){
int volatile pid,pid_asm;
pid = getpid();
printf("pid = %u\n",pid);
asm volatile(
"movl $0,%%ebx\n\t"
"movl $20,%%eax\n\t" //%%eax存放系统调用号
//产生异常号128,调用软终端进入内核,内核中系统调用表中值匹配%eax值,拿出内核sys_getpid()等的内核函数指针,并进入内核态执行,执行结果最后放入%eax
"int $128\n\t"
"movl %%eax,%0\n\t"
:"=m"(pid_asm)
);
printf("pid_asm = %u\n");
}