嵌入式入门-交叉编译、bootloader、kernel、根文件系统关系

在实际工作中,当你拿到一块芯片,交叉编译环境、bootload这两样东西一般芯片厂家会给你提供,而kernel和根文件系统需要根据你的需求进行调整,最后就是编写应用了。

所以实际工作中在交叉编译环境、bootloader上一般不需要下太大功夫。

而kernel需要裁剪,适配我们的芯片和板子,以及功能,举一个简单的例子:linux系统可以适配笔记本一般是x86架构,也可以适配arm等其他架构,如果都要适合,那特别臃肿,所以我们配置它只需要适配一种架构就行了。

再比如,我们要开发一款设备,需要能够连接摄像头,那在kernel中需要摄像头驱动,在根文件系统上需要相应的应用。所以实际工作中,往往是在kernel和根文件系统上下功夫。

所以你如果想去芯片级公司,重点就是交叉编译环境和bootloader,如果是产品级公司,重点就是kernel和根文件系统。

参考资料:

交叉编译、bootloader、kernel、根文件系统关系

下面稍微详细介绍一下

其实嵌入式系统的构成完全就可以用这四个东西来概括

交叉编译环境、bootloader、kernel、根文件系统,应用是属于顶层的东西也可以看做是根文件系统的一部分

1.交叉编译环境

交叉编译是在一个平台上生成另一个平台上的可执行代码。

交叉编译需要使用交叉编译器、交叉编译工具链。

要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。常见的交叉编译例子如下:
1、在Windows PC上,利用ADS(ARM开发环境),使用armcc编译器,则可编译出针对ARM CPU的可执行代码。
2、在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。
3、在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。

2.bootloader

这个词你得把它分开看,一是boot,启动,启动板子,二是load,加载,加载内核。

它是硬件复位以后第一个需要执行的程序。主要工作就是初始化操作系统运行的环境,像内存,定时器等。

以ARM为例,启动代码需要做一些工作:设置中断向量表、关闭看门狗、初始化时钟、初始化SDRAM、代码重定位、跳转main函数执行等

所以我们自己写的start.s汇编程序和bootload最主要的区别其实就是少了,load加载。当然bootload还可以具备很多其他功能。

我们完全可以自己写一个bootloader出来,不过没有必要,有很多优秀的bootload供我们选择,例如:uboot、read boot

3. kernel

内核,不多讲,不要试图去完整阅读kernel源码,几年都读不完。有需求再深入,kernel主要进行资源管理、进程调度等工作,你也可以把他理解为一个中间接口,就像库函数,底层驱动向内核注册,上层应用向内核调用。

4.根文件系统

Linux内核启动到最后,需要去挂在一个文件系统,这个是Linux的一个特点,像QT 系统、Android 系统、以及 Ubuntu 系统它们的底层都是 Linux 内核,不同的是它们的文件系统不一样,也就是说,Android 系统相关的一些代码,比如说图 形界面系统、Android 的虚拟机,Android 的框架代码都在 Linux 最后挂的文件系统里面。

可以把他理解为负责交互,无论是和人的交互,还是和程序的交互。

猜你喜欢

转载自blog.csdn.net/freestep96/article/details/126860239