手写一个操作系统01

在真正打造操作系统前,有一条必经之路:你知道程序是如何运行的吗?

计算机硬件是无法直接运行 C 语言文本程序代码的,需要 C 语言编译器,把这个代码编译成具体硬件平台的二进制代码。再由具体操作系统建立进程,把这个二进制文件装进其进程的内存空间中,才能运行。

那c语言是怎么编译成可执行的二进制代码的了?

使用命令:gcc HelloWorld.c -o HelloWorld 或者 gcc ./HelloWorld.c -o ./HelloWorld ,就可以编译这段代码。其实,GCC 只是完成编译工作的驱动程序,它会根据编译流程分别调用预处理程序、编译程

手写一个操作系统01

序、汇编程序、链接程序来完成具体工作。

其实,我们也可以手动控制以上这个编译流程,从而留下中间文件方便研究:gcc HelloWorld.c -E -o HelloWorld.i 预处理:加入头文件,替换宏。gcc HelloWorld.c -S -c -o HelloWorld.s 编译:包含预处理,将 C 程序转换成汇编程序。gcc HelloWorld.c -c -o HelloWorld.o 汇编:包含预处理和编译,将汇编程序转换成可链接的二进制程序。gcc HelloWorld.c -o HelloWorld 链接:包含以上所有操作,将可链接的二进制程序和其它别的库链接在一起,形成可执行的程序文件。

可执行程序已经形成,那么这个程序需要装载到什么地方才能执行了?

图灵机

提出了电子计算机使用二进制数制系统和储存程序,并按照程序顺序执行,他叫冯诺依曼,他的电子计算机理论叫冯诺依曼体系结构。

把程序和数据装入到计算机中;

必须具有长期记住程序、数据的中间结果及最终运算结果;

完成各种算术、逻辑运算和数据传送等数据加工处理;

根据需要控制程序走向,并能根据指令控制机器的各部件协调操作;

能够按照要求将处理的数据结果显示给用户。

装载数据和程序的输入设备;

记住程序和数据的存储器;

完成数据加工处理的运算器;

控制程序执行的控制器;

显示处理结果的输出设备。

控制代码执行:靠地址总线寻找对应的“纸带格子”。读取写入数据由数据总线完成,而动作的控制就是控制总线的职责了。更形象地将 HelloWorld 程序装入原型计算机


怎么装进图灵机或者内存中?

我们尝试将 HelloWorld 程序装入这个原型计算机,在装入之前,我们先要搞清楚 HelloWorld 程序中有什么。我们可以通过 gcc -c -S HelloWorld 得到(只能得到其汇编代码,而不能得到二进制数据)。我们用 objdump -d HelloWorld 程序,得到 /lesson01/HelloWorld.dump,其中有很多库代码(只需关注 main 函数相关的代码)

装进去的程序是什么样子?

手写一个操作系统01

以上图中,分成四列:第一列为地址;第二列为十六进制,表示真正装入机器中的代码数据;第三列是对应的汇编代码;第四列是相关代码的注释。这是 x86_64 体系的代码,由此可以看出 x86 CPU 是变长指令集。

手写一个操作系统01

我们理清了程序运行的所有细节和原理。还有一点,你可能有点疑惑,即 printf 对应的 puts 函数,到底做了什么?而这正是我们后面的课程要探索的!

为了实现 C 语言中函数的调用和返回功能,CPU 实现了函数调用和返回指令,即上图汇编代码中的“call”,“ret”指令,请你思考一下:call 和 ret 指令在逻辑上执行的操作是怎样的呢?

展开阅读全文

页面更新:2024-05-01

标签:图灵机   装进   汇编程序   总线   指令   函数   操作系统   代码   链接   程序   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top