嵌入式Linux设备驱动程序开发指南(原书第2版)
上QQ阅读APP看书,第一时间看更新

1.4 系统共享库

系统共享库是程序启动时预加载的库。当一个共享库被正确加载之后,被启动的所有程序将自动使用这个共享库。用户态应用程序一般会链接系统共享库,并使用系统共享库访问特定的系统功能。这个系统功能可能是包含在库中的,比如压缩或者加密算法,或者需要访问内核底层资源和硬件。对后一种情况,库提供了一些简单的API,这些API抽象并封装了内核以及直接驱动访问的复杂性。

或者说,系统共享库封装了系统功能,因此在构建与系统交互的应用程序时成为一个基本的构建块。每一个共享库有一个特定名称“soname”。soname包含前缀“lib”、库的名字、“.so”,后面跟一个句点和一个版本号。当接口发生改变时,版本号将递增(作为一个例外,底层的C库不会以“lib”开头)。一个完整的soname以它所在的目录名为前缀;在实际工作中的系统中,一个完整的soname是指向共享库“真实名称”的符号链接。

每一个共享库也有一个“真实名称”,即包含库代码的文件名。真实名称是soname后面添加一个句点、一个次版本号、另一个句点和发行版本号。最后一个句点以及发行版本号是可选的。你可以通过次版本号和发行版本号知道库的安装版本,并控制库的配置。注意,这个版本号与库文档中描述的版本号有可能不一致。

另外,在使用编译器的时候也要依赖一些库(称为“链接名”),它只是soname,不带版本号。

下面列出的这些共享库是LSB(Linux标准库)规范所必需的,因此在符合LSB的系统中必须包含这些库:

  • libc:标准C库(C运行时库)。基础语言支持与操作系统服务支持。直接访问操作系统的系统调用接口。
  • libm:数学库。由System V、ANSI C、POSIX等规定的通用数学基础功能和浮点运算环境库。
  • libpthread:POSIX线程库。libc的一个工具集,主要提供向后兼容的功能。
  • libdl:动态链接库。libc的一个工具集,主要提供向后兼容的功能。
  • libcrypt:加密库。提供一些加密和解密的相关功能。
  • libpam:PAM(可插入式身份验证模块)库。处理一些PAM工作。
  • libz:压缩/解压库。提供通用数据压缩和解压功能。
  • libncurses:CRT屏幕处理和优化包。它包括:对整个显示界面和窗口的管理、显示界面的操作;窗口和显示界面的输出;读取终端的输入;终端和光标的输入输出选项;环境查询例程;颜色管理;软标签键的使用。
  • libutil:系统实用程序库。各种系统守护进程依赖的应用库。抽象功能主要涉及伪终端仿真和登录管理。

这些库被放在标准根文件系统的指定路径下:

  • /lib:系统启动需要的库。
  • /usr/lib:大部分系统库。
  • /usr/local/lib:非系统库。

注意:针对SAMA5D2(helloworld_sam.c)和BCM2837(helloworld_rpi.c)的驱动程序源代码可以从本书的GitHub仓库下载。