主要观点:标准库包含大量无需自己编写的代码,如printf
、scanf
等数学函数,要确保操作系统能链接到该库且正常工作,此文展示如何将操作系统链接到标准库newlib
及过程中的困难。
关键信息:
- 库能让程序员在更高层次开始编写程序,一般是编译和汇编源代码的目标文件,共享对象可按需加载。
- 低级库的工作是确保参数位置正确、系统调用号在正确寄存器且实际发出系统调用,如
RISC-V
的ecall
指令。 - 内核要能处理库发出的系统调用,不同系统调用遵循
UNIX SYSV
约定。 C++
标准包含标准库信息,包括复杂度保证和内存占用等。- 程序运行的真正入口是
_start
,会设置一些环境后调用int main
,最后通过exit
结束。 - 动态链接需要更稳健地解析
ELF
格式,文中操作系统因无法处理动态链接而需将标准库静态链接到程序,导致程序大小增加。
重要细节: - 以
printf
为例,它会构建字符串并通过write
系统调用输出到stdout
。 - 内核中
open
系统调用要找到应用在虚拟内存中的位置并转换为物理内存。 C++2011
标准规定了被视为C++
标准的不同标准函数。crt0.S
汇编文件中的_start
例程会在调用main
前进行一些初始化工作。- 可通过
readelf -l
查看可执行文件的动态链接信息及所需的动态链接器。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。