第一部分
使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
图1 39号系统调用
mkdir函数使用的是39号系统调用,作用是创建一个新的目录。int mkdir(const char *pathname, mode_t mode)有两个参数,一个是目录的名字,另外一个参数是创建目录的权限。这里使用的mode_t值使用S_IRWXU(具有读写执行权限),函数返回一个整形变量。
使用库函数API使用mkdir这个系统调用
#include <stdio.h>
#include <sys/stat.h>
int main()
{
mkdir("new_dir",S_IRWXU);
return 0;
}
图2 API实验效果
按照指定的的权限创建了一个新的new_dir目录
使用C代码中嵌入汇编代码使用mkdir这个系统调用
#include <stdio.h>
#include <sys/stat.h>
int main()
{
char *dirName = "new_dirAsm";
mode_t mode = S_IRWXU;
int return_Value = 0;
asm volatile
(
"movl $39,%%eax\r\n" /*使用eax传递39号系统调用号*/
"movl %1,%%ebx\r\n" /*将第一个参数文件名的地址存入ebx寄存器中*/
"movl %2,%%ecx\r\n" /*将第二个参数文件权限存入ecx寄存器中*/
"int $0x80\r\n" /*执行$0x80中断进入内核态*/
"movl %%eax, %0" /*最后将返回值放入retrun_Value中*/
:"=m"(return_Value)
:"d"(dirName),"D"(mode)
);
printf("%d\n",return_Value);
return 0;
}
图3 C代码中嵌入汇编代码实验效果
按照指定的的权限创建了一个新的new_dirAsm目录
第二部分
API:应用程序接口是一个函数定义,系统调用通过软中断向内核发出一个明确的请求。
系统调用:操作系统为用户态进程与硬件设备进行交互提供了一组接口。
当API中包含系统调用时,通过系统调用号进入相应的系统调用,然后使用软中断进入内核态。中断发生后会保护现场,将用户的当前栈顶地址,当时的状态字和cs:eip的值进行压栈。之后进入由用户态切换到内核态,处理完中断程序后还原现场,返回用户态。
通过使用API和C代码中嵌入式汇编代码两种方式实现系统调用,理解了系统调用的工作过程。
小市民 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000