操作系统实战45讲-学习笔记1

1. 程序的运行过程:从代码到机器运行

程序编译过程

它会根据编译流程分别调用预处理程序、编译程序、汇编程序、链接程序来完成具体工作。

原来简单的一行"helloworld" ,底层也有这么多道工序组成,长见识了。

操作系统实战45讲-学习笔记1_第1张图片

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 链接:包含以上所有操作,将可链接的二进制程序和其它别的库链接在一起,形成可执行的程序文件。

程序装载执行

图灵机概念

抽象出卡带的概念,从头到尾读取指令,逐句执行,不过这个阶段仅仅停留在概念阶段

操作系统实战45讲-学习笔记1_第2张图片

下一个阶段则到了我们熟知的冯诺依曼体系结构

到了这个阶段提出完整的计算机需要具备的五大基础组件

    输入设备

    存储器

    运算器

    控制器

    输出设备

操作系统实战45讲-学习笔记1_第3张图片

总结

现代电子计算机正是通过内存中的信息(指令和数据)做出相应的操作,并通过内存地址的变化,达到程序读取数据,控制程序流程(顺序、跳转对应该图灵机的读头来回移动)的功能。这和图灵机的核心思想相比,没有根本性的变化。只要配合一些 I/O 设备,让用户输入并显示计算结果给用户,就是一台现代意义的电子计算机。

思考题

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

“call”即“打电话”,“ret”即”返回某个地方“。要想实现这两个指令,那么首先call需要知道调用的东西在哪,ret需要返回的地方在哪。

对于call,在程序编译完成之后,所有的指令代码都已按顺序存储至计算机中,事先在call 之后附上相应的存储地址即可;

对于ret,其实计算机是使用一种叫做“栈”的结构,简单来说“栈”就好像是一个桶,计算机不停地往里扔东西(压栈),只有拿起上面的东西(出栈),才能拿到下面的东西。ret即是利用栈的结构,来存储自己将要返回的地方。

另外,call与ret是配套使用的。call的时候会将此时运行到的位置压入栈中,ret会从栈中弹出自己将要返回的位置。


打怪升级的道路往往是枯燥且寂寞的,一起加油鸭!

我可是很努力的  ╮( ̄▽  ̄)╭

网盘资料有需要自取:

链接:https://pan.baidu.com/s/1JqSp4zUfE-PH-7MXr_wZxA 
提取码:nf3q 

你可能感兴趣的:(读书笔记,系统架构,linux,ubuntu,centos)