Linux 系统调用(SCI,system call interface)的实现机制实际上是一个多路汇聚以及分解的过程,该汇聚点就是 0x80 中断这个入口点(X86 系统结构)。也就是说,所有系统调用都从用户空间中汇聚到 0x80 中断点,同时保存具体的系统调用号。当 0x80 中断处理程序运行时,将根据系统调用号对不同的系统调用分别处理(调用不同的内核函数处理)。
我们先在文件系统中加入上次课程使用的命令:stat。(http://blog.chinaunix.net/uid-29798130-id-5679169.html)
编辑文件:test.c
-
int Stat_self()
-
{
-
struct stat myst;
-
int ret = 0;
-
char *p = "/root";
-
struct stat *pst = &myst;
-
-
ret = stat(p, pst);
-
if(ret == 0){
-
printf("%s|%d, Get stat ok!\n", __func__, __LINE__);
-
}else
-
printf("%s|%d,Get stat failed!\n", __func__, __LINE__);
-
-
return 0;
-
}
-
int Stat_self_asm()
-
{
-
struct stat myst;
-
int ret = 0;
-
char *p = "/root";
-
struct stat *pst = &myst;
-
-
asm volatile(
-
"mov %1,%%ebx\n\t"
-
"mov %2,%%ecx\n\t"
-
"mov $106, %%eax\n\t"
-
"int $0x80\n\t"
-
"mov %%eax,%0\n\t"
-
:"=m"(ret)
-
:"b"(p),"c"(pst)
-
);
-
if(ret == 0){
-
printf("%s|%d, Get stat ok!\n", __func__, __LINE__);
-
}else
-
printf("%s|%d,Get stat failed!\n", __func__, __LINE__);
-
-
return 0;
-
}
-
-
int main()
-
{
-
PrintMenuOS();
-
SetPrompt("MenuOS>>");
-
MenuConfig("version","MenuOS V1.0(Based on Linux 3.18.6)",NULL);
-
MenuConfig("quit","Quit from MenuOS",Quit);
-
MenuConfig("time","Show System Time",Time);
-
MenuConfig("time-asm","Show System Time(asm)",TimeAsm);
-
MenuConfig("stat","Show /root get status",Stat_self);
-
MenuConfig("stat-asm","Show /root get status(asm)",Stat_self_asm);
-
ExecuteMenu();
-
}
此时新编译的文件系统就可以输入stat、stat-asm命令,输出结果如下:
实际调用的整个流程如下:
从服务提供者的角度来看Linux系统,可以将内核视为一个综合性的库,它包含了各种可面向用户应用程序提供的功能。系统调用是应用程序与该库之间的接口,因此了解系统调用的工作方式无论对于研究内核还是系统编程都是颇有益处的。
作者程大鹏, 转载请注明出处 http://blog.chinaunix.net/blog/post.htmlLinux内核分析》MOOC课程 ”
阅读(2001) | 评论(0) | 转发(0) |