【引子】
对于初次接触MCU的小伙伴来说,应该很好奇为什么MCU上电后就自动执行到了main函数,在此之前MCU经历了什么?MCU从上电的一瞬间开始是怎么一步一步执行到main函数的?让我们带着这些疑问开启今天的内容分享。
【正文】
第一回 操作系统下的C程序是怎么运行的?
我们以下面一个例子来粗略介绍一下C程序是怎么在Linux操作系统下执行的(仅做了解,不必深究),以次来引入MCU的启动,看这样一段代码:
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello World\n");
return 0;
}
相信这段代码大家都不陌生,我们在Linux下编译完该程序后得到一个a.out的可执行文件,毋庸置疑,这个可执行程序是存储在磁盘里的,当我们在命令行里执行./a.out命令时,由于不能在磁盘里执行程序,操作系统会帮我们把这段代码加载到内存中运行,粗略的步骤如下所示:
- 1)首先shell会创建一个新的子进程,创建完毕后内核使用execve系统调用加载a.out,execve会替换当前进程的内存空间,将a.out的二进制代码和数据段加载到进程的地址空间(内存)中,这意味着新进程将从a.out的main函数开始执行。
- 2)其次,如果a.out是一个使用动态链接的程序,内核会调用动态链接器来解析和加载程序中所需的动态库,动态链接库会将这些库的代码