工程师嵌入式 Linux 自学笔记及体会
针对初学嵌入式的广大朋友们,以下是我在初学接触嵌入式的过程中整理处的一些资料信息,
希望能为大家有所帮助。
一个典型的桌面 Linux 系统包括 3 个主要的软件层---linux 内核、C 库和应用程序代码。
内核是唯一可以完全控制硬件的层,内核驱动程序代表应用程序与硬件之间进行会话。内核之
上是 C 库,负责把 POSIX API 转换为内核可以识别的形式,然后调用内核,从应用程序向内核传
递参数。应用程序依靠驱动内核来完成特定的任务。
在设计嵌入式应用的时候,可以不按照这种层次,应用程序越过 C 库直接和内核会话,或者把
应用和内核捆绑在一起,甚至可以把应用写为内核的一个线程,在内核中运行,虽然这样在移植上
带来了困难,但考虑嵌入式系统对尺寸要求小的特点,是完全可行的。不过我们使用三层软件结构
的模式来学习嵌入式 linux 将会是我们认识更清晰,简单可行并使应用具有弹性。
快速入门
最简单的建立嵌入式 Linux 应用的方法就是从我们使用的桌面 Linux 入手,安装一个喜爱的版
本,把我们的某个应用作为初始化的一部分,框架就算完成了。
当然,嵌入式 linux 应用远比我们的桌面版本功能简单专一,它也许就是一个用于足彩的终端机,
或是一个数码音频播放器,这些系统除了使用嵌入式 CPU 外,仅仅再需要一个串口,网口等少量的
输入输出接口就可以完成它们特定的应用了。
在软件上,它可以按照三层的概念由内核装载器,定制的内核和较少的为特定任务设计的静态
连接的应用程序组成。之所以使用静态连接的应用程序,是因为少量的静态连接程序所要的存储空
间,比同样数量的动态连接的程序所占的空间小,这个平衡点需要我们在实际开发中去获取。也许
你正在设计的是个 PDA,它的应用程序较多,那么你很可能就要使用动态连接程序来减少存储空间。
在你的/bin 或者/sbin 目录下,用厂列表看看 bash,ifconfig,vi...,也许只用几十 K,当你运行
ldd /bin/bash 时,你会看到它们都和好几个库文件相连。好了,这样看来,我们得把 PC 想像成一
个嵌入式硬件平台,再重新制作一个特定功能的嵌入式 linux。
基础知识
再进行实际操作之前,先来搞清楚几个基础知识。
内核装载器 Loader,它的作用是把内核从外部存储器,移动到内存中。它只作这个事情,一旦
完成了调入内核的工作,Loader 就跳转到内核位置开始执行。不同架构有不同的 Loader,在 x86
结构的 PC 上,通常使用的 loader 有 LILO,GRUB,syslinux,syslinux 在嵌入式 linux 中也同样工
作。其他非 x86 架构的应用中,你必须使用专门的 loader,或者自己编写 loader 来装入内核。也有
不使用 loader 的情况,系统加电以后,内核直接从烧录有映象的 Flash 上开始执行。
内核,一旦内核开始执行,它将通过驱动程序初始化所有硬件,这可以从我们的 pc 机监视器的
输出看出来,每个驱动程序都打印一些有关它的信息。初始化完成后,计算机就准备运行嵌入式应