系统调用通过软中断int 0x80从用户态进入内核态。
函数库中的某些函数调用了系统调用。
函数库中的函数可以没有调用系统调用,也可以调用多个系统调用。
编程人员可以通过函数库调用系统调用。
高级编程也可以直接采用int 0x80进入系统调用,而不必通过函数库作为中介。
如果是在核心编程,也可以通过int 0x80进入系统调用,此时不能使用函数库。因为函数库中的函数是内核访问不到的。
2、从用户调用库函数到系统调用执行的流程。
1) 假设用户调用ssize_t write (int fields, cont void buff, size_t nbytes);库函数。
2) 库函数会执行int 0x80中断。因为中断使得进程从用户态进入内核态,所以参数通过
寄存器传送。
3) 0x80中断对应的中断例程被称为system call handler。其工作是:
i 存储大多数寄存器到内核堆栈中。这是汇编代码写的。
ii 执行真正的系统调用函数――system call service routine。这是C代码。
iii 通过ret_from_sys_call ()返回,回到用户态的库函数。这是汇编代码。标准库函数有三点好处:准确性、高效性和可移植性。
准确性:编译程序的开发商通常会保证标准库函数的准确性。更重要的是。至少开发商做了全面的检测来证实其准确性,这比你所能做到的更加全面(有些昂贵的测试工具能使这项工作更加容易)。
高效性:优秀的C程序员会大量使用标准库函数,而内行的编译程序开发商也知道这一点。如果开发商能提供一套出色的标准库函数,他就会在竞争中占优势。当对相互竞争的编译程序的效率进行比较时,一套出色的标准库函数将起到决定性的作用。因此,开发商比你更有动力,并且有更多的时间,去开发一套高效的标准库函数。
可移植性:在软件要求不断变化的情况下,标准库函数在任何计算机上,对任何编译程序都具有同样的功能,并且表达同样的含义,因此它们是C程序员屈指可数的几种依靠之一。
有趣的是,你很难找到一项关于标准库函数的最标准的信息。对于每一个函数,都需要有一个(在极少数情况下需要两个)保证能将该函数的原型提供给你的头文件(在调用任何一个函数时,都应该包含其原型,见8.2)。有趣的是什么呢这个头文件可能并不是真正包含该函数原型的文件,在有些(非常糟糕!)情况下,甚至由编译程序手册推荐的头文件都不一定正确。对于宏定义,typedef和全局变量,同样会发生这种情况。
为了找到“正确的”头文件,你可以在一份ANSI/ISO c标准的拷贝中查阅相应的函数。主函数就是程序最先执行的函数,程序的入口,只有一个“main”函数,被调用函数就是别的一个函数调用另一个函数时被调用的那个函数,库函数是C语言已经定义好的函数不用你自己写,直接引入头文件然后调用
#include <stdioh>
void main()
{
printf("This is myprint!\n");
}
这里主函数就是main
被调用函数就是printf,也是库函数头文件stdioh定义的
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)