我的问题源于我缺乏较低级系统编程的经验(特别是在操作系统的实施层面)。可执行文件包含操作系统的一些信息 - 例如,它必须在启动时动态链接到哪些库。因此编译器在编译文件时会将此类依赖项放在可执行文件中的适当位置。所以我们编译给定系统的代码。但是,我们如何编译构成系统的代码?编译器编译该代码的是哪个系统?
开发C编程语言是为了帮助编写UNIX操作系统,但是说Linux呢?
抱歉鸡蛋问题。
答案 0 :(得分:2)
大多数C编译器都可以选择不链接系统的标准C库。如果选择此类函数,则<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>install</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/conf</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.csv</include>
<!-- include my batch file -->
<include>**/*.bat</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
,malloc
等标准函数不存在。
您可以调用的唯一代码是您创建的代码。没有系统包括,没有标准的库函数,除了你自己的代码。一块空白的石板。
编写操作系统有很多东西 - 线程,进程,受保护的内存,内存分配器,权限分离,输入/输出,设备访问,文件系统,网络......列表继续。
在编写操作系统的内核时,您最终将拥有足够的支持结构,您可以开始编写用户模式系统调用来访问内核的功能,例如文件IO。如果您选择,可以通过在C标准库的标准形状中实现它们来实现。
理论上,您可以编写一个没有名为printf
或malloc
的函数的操作系统。 C编译器不关心。
答案 1 :(得分:0)
这里的技巧是拥有一个可以构建正确代码的链接器。它不是编译器。