历史上的今天
返回首页

历史上的今天

今天是:2024年11月20日(星期三)

正在发生

2019年11月20日 | 学习嵌入式Linux的笔记和体会

2019-11-20 来源:51hei

一个典型的桌面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机监视器的输出看出来,每个驱动程序都打印一些有关它的信息。初始化完成后,计算机就准备运行嵌入式应用。也许一个,也许是多个应用程序组成了嵌入式应用,但通常首先调用的是init(通过loader 向核心传入init=/program 可以定制首先运行的程序)。桌面linux中,init会读取/etc/inittab文件,来决定执行级别和哪些脚本和命令。嵌入式应用中,可以根据实际的情况决定是否使用标准的init执行方式,也许这个init是个静态程序,它能够完成我们的嵌入应用的特定任务,那完全不用考虑inittab了。 

initrd文件系统,initrd以一种把内核从存储介质装入到内存的相同的机制来装入一个小型文件系统。这个文件系统最好是以压缩的方式存储在介质上的,解压缩到RAM盘上。通过使用initrd,包含有核心驱动和启动脚本的小文件系统,就可以直接从介质上和内核一起启动起来,内核届压缩这个文件系统,并执行这个文件系统上叫做/linuxrc的脚本文件,这个脚本通常会把启动过程中所需要的驱动程序装入。脚本退出以后,initrd文件系统也卸下了,启动过程进入真正初始化过程。对于嵌入式来讲,可以将需要的应用软件都运行在这个initrd文件系统上,只要/linxrc文件不结束,内核启动过程的其他部分就不会继续。 

做个试验: 

cp /boot/initrd-2.4.20.img /tmp 

cd /tmp 

mv initrd-2.4.2-.img initrd.img.gz 

gunzip initrd.img.gz 

mount -o loop initrd.img /mnt 

cd /mnt 

ls 

cat linuxrc 可以看到里面执行了加载了两个模块的操作,你在启动linxu的时候会看见屏幕打印信息。 


推荐阅读

史海拾趣

HiRel Connectors Inc公司的发展小趣事
如遇到无法自行解决的供电电路故障应及时联系专业维修人员进行检修和维护。
BLACK&DECKER公司的发展小趣事

BLACK&DECKER公司的历史可以追溯到1910年,由Alonzo G. Decker和Duncan S. Black在美国马里兰州巴尔的摩共同创立。两位创始人的初始投资来自于Black先生卖掉他的二手车所得的600美元,再加上1200美元的贷款。公司起初主要生产牛奶瓶装盖机、棉花采集机、糖果浸包机等工业用设备。然而,真正让BLACK&DECKER崭露头角的,是1916年他们发明的现代手枪钻原型。这一创新产品解决了当时德国电动工具笨重、难以操控的问题,为电动工具行业带来了革命性的变革。

Crystal Semiconductor Corp公司的发展小趣事

Crystal Semiconductor Corp成立之初,面临着资金短缺、技术难题和市场竞争的多重压力。然而,公司的创始人凭借对半导体技术的深刻理解和敏锐的市场洞察力,成功吸引了一批志同道合的工程师和投资者。他们共同攻克了技术难关,推出了首款具有竞争力的晶体管产品,迅速在市场上占据了一席之地。

Electech Electronics公司的发展小趣事

在快速发展的同时,Electech Electronics也注重环保和可持续发展。公司积极采用环保材料和绿色生产工艺,降低生产过程中的能耗和排放。此外,Electech Electronics还积极参与环保公益活动,推动电子行业的绿色发展。这些举措不仅体现了公司的社会责任感,也为公司的长期发展奠定了基础。

台湾丰宾(CapXon)公司的发展小趣事

面对日益激烈的市场竞争,CapXon公司始终坚持以技术创新为驱动,不断推动产业升级。公司投入大量资金用于研发新的技术和产品,以满足市场对高品质、高性能电容器的需求。通过不断的努力,CapXon成功研发出了一系列具有自主知识产权的高性能电容器产品,这些产品不仅具有更高的稳定性和可靠性,而且能够满足更广泛的应用场景需求。

Belden Wire and Cable公司的发展小趣事

为了满足不断增长的市场需求,1928年,Belden在印第安纳州里士满开设了一家专为制造电线而设计的新工厂。这家工厂的建立极大地提升了公司的产能和效率,为公司的进一步发展提供了有力保障。在随后的几十年里,随着第二次世界大战的爆发和战后经济的复苏,里士满工厂经历了多次扩建和升级,逐渐成为百通最大的制造工厂之一。

问答坊 | AI 解惑

51 IO口模拟串口通讯C源程

#include sbit BT_SND =P1^0; sbit BT_REC =P1^1; /**********************************************IO 口模拟232通讯程序 使用两种方式的C程序 占用定时器0 **********************************************/ #define MODE_QUICK #define ...…

查看全部问答>

matlab第二课---for的用法!

对于循环,用的最多的就是它了,看看怎么用吧?…

查看全部问答>

何必呢!

我以前电脑上大多元件的datasheet都是在EEWORLD上搜索的,现在基本不用了。 说下原因:改版后好像只能搜索器件的前缀,不能搜索包含字。我知道一个器件的包含数字不知道前缀基本上是搜索不到了。还有写报告经常要在datasheet拷贝一些文字或图片。 ...…

查看全部问答>

ADC与DAC专题学习之一

本帖最后由 dontium 于 2015-1-23 13:19 编辑 第一章 ADC与DAC概念 什么是ADC? “ADC”Analog-to-Digital Converter的缩写,指模/数转换器或者模拟/数字转换器。真实世界的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处 ...…

查看全部问答>

【求助】有关无线通信的问题

我对电子信息了解不多,因为老师给的任务是做一个监控系统,我负责传感器模块和主模块之间的无线通信,请问各位高手怎么做,是用单片机控制无线模块收发数据还是无线模块本身就可编程?我在网上查了些资料,最后一头雾水,我对这些了解太少了。希望 ...…

查看全部问答>

Wince 内存管理

各位高手:我用wince5.0测试程序,在程序中用new分配2M内存,然后delete[]。然后退出程序,在此过程中监视内存使用量,发现几次操作后系统内存使用量变大了。貌似程序退出后系统并没有完全回收内存!请教原因!…

查看全部问答>

ARM-linux中断的问题

linux在运行应用程序的时候是用户态的,MMU的0地址指向的是用户的物理地址。那有中断触发时,它是怎么跳到内核的中断向量表的?有人能详细说一说吗? 紧接上面的问题,linux的进程调度器的时间片是怎么控制的?从中断模式跳入操作系统模式的过程是 ...…

查看全部问答>

嵌入式真的这么好吗?

现在好多人都想搞嵌入式开发,我也有这个想法,想请在搞嵌入式的朋友给点看法,以正视听!!!…

查看全部问答>

关于SD无线网卡

各位:    我的系统可以识别SD卡,读写都没有问题, 插上SD无线网卡也可以识别,也可以找到无线路由,可以设置,可以连接 但是问题是刚刚连接上就死机!! 请问各位这个可能是哪的原因!! 谢谢!…

查看全部问答>

可不可以将一个edif型文件和一个.V文件一起综合?

由于可能要频繁改动一个工程中的一个verilog文件,其他的文件不改变。由于每一次综合整个系统需要花很久的时间,现在希望先把其他的文件综合出.edf文件,再和剩下的那个.V文件最后再综合一次。这样可能会省时间,并且不需要改动其他的文件?…

查看全部问答>