上QQ阅读APP看书,第一时间看更新
1.3 系统调用接口和C运行时库
系统调用是应用程序和Linux内核之间的基本接口,也是用户态应用程序与内核交互的唯一途径。换句话说,它是用户态和内核态之间的桥梁。严格意义来说,用户态和内核态的根本区别是,用户态应用程序不能随意访问内核态资源,从而确保了系统的安全稳定。系统调用提升了用户进程的权限。
系统调用接口通常不被应用程序直接调用(即使可以这样做),它一般是通过C运行时库中的封装函数调用的。在这些封装函数中,有一些函数只是比系统调用函数稍微增加了些代码(仅仅进行参数检查和参数设置),而另一些函数则添加了额外的一些功能。表1-2展示了一些系统调用函数和对它们的描述。
表1-2 部分常见系统调用
C运行时库(标准C库)定义了宏、类型、字符串处理函数、数学运算函数、输入/输出处理、内存分配和一些与操作系统服务相关的其他功能。运行时库抽象封装了操作系统调用接口,为应用程序提供访问操作系统资源和功能的方法。
目前有好几种C运行时库:glibc、uClibc、eglibc、dietlibc、newlib。必须在交叉编译生成工具链时选择使用哪个C库,因为GCC编译器在编译时要依据特定的C库。
glibc是GNU C库,也是我们在Yocto工程的示例中使用的默认库。GUN C库设计的主要目的是实现一个可移植的和高性能的C库。它遵循了所有的相关标准,包括ISO C11和POSIX.1-2008。它同时也是面向全球开放的,拥有已知最完整的国际化接口。读者可以在如下网址找到glibc的手册:https://www.gnu.org/software/libc/manual/。