use*_*846 5 c assembly compilation machine-code
我有三个问题:
我的目标: 我正在尝试制作一个基本的操作系统。这将使用个人制作的引导加载程序和内核。我也会尝试从 Linux 内核(即驱动程序)中获取一些零碎的东西,并将它们集成到我的内核中。我希望创建一个 32 位类似 DOS 的操作系统来处理大多数现代计算机上的内存。我认为我不会为我的操作系统创建可执行格式,因为我的操作系统不会动态到需要它。
我的情况: 我在带有 Intel Celeron CPU 的 x86-64 windows 8 笔记本电脑上运行;我相信它使用安全启动。我将在带有 Intel Core I3 CPU 的 x86-64 台式机上测试我的操作系统。我对操作系统及其技术有一般的了解。我知道这个项目所需的 C、ASM 和计算机理论。我认为值得一提的是,我 16 岁,没有接受过计算机科学方面的正规教育。
我的研究:在谷歌搜索 C 通常编译成的内容后,我找到了机器代码、二进制、纯二进制、原始二进制、汇编和可重定位目标代码的答案。据我所知,程序集通常会组装成 PE 格式的可执行文件。我听说过 Cygwin、GCC C 和 MingW C 编译器。至于汇编程序,我听说过 FASM、MASM 和 NASM。我搜索过OSDev和OSDever等网站。
我尝试过的:我尝试设置 GCC(一个噩梦)并创建一个交叉编译器(另一个噩梦)。
结论:如您所知,我对编译器、汇编器和可执行格式感到困惑。请消除我的无知并回答我的问题。这些可能是唯一让我无法在简历上安装操作系统的原因。抱歉,我会包含更多链接,但是 stackoverflow 不会让我创建两个以上的链接。万分感谢!
首先,对您的三个问题进行一些快速回答。
几乎任何编译器都会将 C 代码转换为汇编代码。这就是编译器所做的事情。GCC 和 clang 很受欢迎并且免费。
clang -S -o example.s example.c
Run Code Online (Sandbox Code Playgroud)无论您选择哪种编译器,都可能也支持汇编,只需使用相同的编译器驱动程序即可。
clang -o example.o example.s
Run Code Online (Sandbox Code Playgroud)您的链接器文档将告诉您如何将特定代码放在特定地址等。如果您如上所述使用 GCC 或 clang,您可能会使用ld(1). 在这种情况下,请阅读“链接器脚本”。
接下来,一些注意事项:
您不需要交叉编译器或自己设置 GCC。您正在一台 Intel 机器上工作,为 Intel 机器生成代码。Linux 发行版附带的 clang 或 GCC 的任何二进制发行版都应该可以正常工作。
C 编译器通常将代码编译成程序集,然后将生成的程序集传递给系统汇编器以最终得到机器代码。机器代码、二进制、纯二进制、原始二进制基本上都是同义词。
生成的机器代码被打包成某种可执行文件格式,告诉主机操作系统如何加载和运行代码。在 Windows 上,它是 PE,在 Linux 上,它是 ELF,在 Mac OS X 上,它是 Mach-O。
您不需要为您的操作系统创建可执行格式,但您可能想使用一种格式。ELF 是一个非常简单(并且有详细记录)的选项。
我希望不要让您太沮丧——如果您不太熟悉编译器、汇编器、链接器和所有这些工具的工作原理,那么您的项目将非常困难和混乱。可以这么说,您可能想从一些较小的项目开始,以获得“成功”。