我的问题源于我对低级系统编程缺乏经验(特别是在操作系统的实现级别)。可执行文件包含操作系统的一些信息 - 例如,它必须在启动时动态链接到哪些库。因此编译器在编译文件时将这些依赖关系放在可执行文件的适当位置。所以我们编译给定系统的代码。但是,我们如何编译构成系统的代码呢?编译器编译哪个系统的代码?开发C编程语言是为了帮助编写UNIX操作系统,但是说Linux呢?可执行文件格式
对不起鸡蛋问题。
我的问题源于我对低级系统编程缺乏经验(特别是在操作系统的实现级别)。可执行文件包含操作系统的一些信息 - 例如,它必须在启动时动态链接到哪些库。因此编译器在编译文件时将这些依赖关系放在可执行文件的适当位置。所以我们编译给定系统的代码。但是,我们如何编译构成系统的代码呢?编译器编译哪个系统的代码?开发C编程语言是为了帮助编写UNIX操作系统,但是说Linux呢?可执行文件格式
对不起鸡蛋问题。
大多数C编译器可以选择不链接系统的标准C库。如果您选择这样的功能,那么标准功能如malloc
,printf
不存在。
您可以调用的唯一代码就是您创建的代码。没有系统包含,没有标准的库函数,除了你自己的代码外没有别的。空白的石板。
写入操作系统有很多内容 - 线程,进程,受保护的内存,内存分配器,特权分离,输入/输出,设备访问,文件系统,网络......这样的列表还在继续。当您编写操作系统的内核时,您最终将拥有足够的支持结构,您可以开始编写用户模式系统调用以访问内核的功能,例如文件IO。如果你选择,你可以通过在C标准库的标准形状中实现它们来实现。
从理论上讲,您可以编写一个不具有称为malloc
或printf
的函数的操作系统。 C编译器不会在意。
这里的诀窍是有一个链接器,可以建立正确的代码。这不是编译器。
我不认为我会关注。举例来说,系统提供了一个链接器,将动态链接信息置于原地? – Curious
您需要不同的系统链接器,或者您的链接器需要有构建系统代码的选项(例如使用静态库)。 – user3344003
你问的是如何编译Linux内核? – immibis
的确,这就是我要求的 – Curious
@immibis你能说出更多关于这种工作方式的更多信息吗? – Curious