嵌入式Linux初学者眼中的世界

原创 2013年12月02日 23:20:45

本文送给嵌入式Linux初学者。


相信大家刚接触Linux的时候跟我的感觉是一样的,面对着无数的英文单词(其实大部分是一堆辅音字母的组合,读都没法读)和术语,不知道它们都是什么东西,不知道它们是个具体东西还是抽象概念,不知道它们到底是什么关系。即便进行Google,又会在解释中遇到一大堆新的术语,无穷尽也……特别是像我一样没有计算机软件专业背景,只是单纯喜欢编程的人,或者刚刚从单片机过渡到ARM的人,对我们来说计算机体系结构,操作系统原理、编译原理等等那些东西也是比较陌生的,这些杂糅在一起就造成了我们“老虎吃天,无从下口”的现状。这也是导致很多人望而却步的一大原因。

经过之前一段时间的摸爬滚打,我以为我会慢慢找到门路,可是我没有。直到最近,我看了很多Linux相关书籍……的目录,到网上进行了很多搜索,终于慢慢看清了整个Linux大厦的雏形。下面就简要记录一下我对嵌入式Linux大厦的初步认识。


嵌入式Linux跟桌面Linux一样,是一个操作系统。从单片机走过来的我们往往习惯于直接控制寄存器,事必躬亲,从零开始实现想要的功能。在嵌入式Linux的世界里,我们首先要抛弃这个思想,应把它作为最后没办法的办法。就像我们想要在windows系统中编写一个程序,首先想到的不是操作CPU芯片的寄存器,而是学习Windows API一样。我们在嵌入式linux编程时,首先想到的应该是使用现成的驱动或软件或Linux API。没有的话看看能不能修改一下现成的资源为己所用。还是不行的话才考虑自己从头开始写。

嵌入式Linux大厦是由很多层组成的,当我们想找一个人时,首先要明确他在那一层楼。同样的,我们遇到问题时,首先要知道是哪个方面的问题,然后才有可能知道到哪里寻找答案。下面我们把这座大厦进行一下拆解。


我们平时使用Linux系统的话,最常用的工具就是Shell(或者用windows中常见的说法:命令行),初学者接触Linux的第一个东西往往也是shell。也许你已经知道,把shell命令组合起来写成一个文件,亦即shell编程,也是一门大学问,它能做的事很多很强大,但仅限于对Linux系统的操作。我们一定不会用shell命令去编写一个显示屏程序,或者一个GPS导航程序。而且作为嵌入式Linux开发来说,shell不可能作为最终产品工作的平台,因为我们不能要求用户在屏幕中输入代码来实现功能。因此我认为对嵌入式开发来说,shell命令无需深究,掌握基本操作就够了。

shell基本操作主要包括:获取命令帮助,到达指定目录,查看目录内容,权限修改,文件的复制粘贴等基本操作,文件搜索,文件内容查看和编辑,系统关机重启……(这些只是最基本的,后面再慢慢学别的命令,比如学习进程编程时,再学习进程相关的命令;学习C语言编程时,再学各种编译和调试命令也不迟)


学习嵌入式Linux,我们的最终目的是制作一套嵌入式系统来实现功能。往往需要用C/C++或Python等其他语言来编写程序,但是编程之前我们要先明确一些基本概念。

最基本的,当我们编写程序时,首先要明确嵌入式Linux分为用户空间内核空间。用户空间是应用程序运行的空间,内核空间就是操作系统和驱动程序运行的空间。这是从软件的角度来说的,对应于ARM芯片来说,就是芯片的不同“工作模式”。这两个空间是通过“地理隔离”实现互相完全独立的,它们各自的程序使用不同的内存地址区间,各自使用自己的头文件(有些头文件在两个空间内甚至是重名的,要注意区分)、各自调用属于自己空间的函数(哪怕实现的功能相同,比如printf()和printk()),而且不能互相直接访问(用指针也不行)。(意味着学习这两部分的编程时要学习两套独立的知识体系)

内核空间相关的东西有:Linux内核源码、内核编译和配置、内核移植、文件系统、Busybox、设备驱动程序编写、中断编程……

用户空间相关的东西有:Shell、应用程序编译和调试、进程、线程、文件IO编程、网络通信相关、Qt图形界面编程……

如果你仅仅要开发应用程序,那你就可以远离内核空间那些东西了。对你来说,驱动程序、底层硬件、操作系统的工作方式等都是透明的,你写的程序在别的芯片上也能跑得很好。

但如果你想要开发驱动程序,或者定制自己的操作系统,或者你想向一片“全裸”芯片中写入操作系统,并使它正常运行起来,那就得学习内核空间的知识了。


如果你想让“全裸”芯片运行起来,还会遇到一块比内核更底层的东西,Bootloader。它是在内核启动前运行的一段程序,用来初始化硬件、建立内存空间映射等,与芯片的品牌、型号极其相关。我们通常对一些现成的Bootloader进行修改来满足需求,常见的Bootloader有U-Boot、Vivi等。

再多说一句,如果想从零开始做一个嵌入式设备,还有更底层的问题需要解决和学习:电路设计、PCB布线等。


因此,我们看到的嵌入式Linux书籍就可以粗略分成两个方向:一类讲嵌入式Linux应用程序编程,另一类讲如何搭建一个完整的嵌入式Linux平台。分别对应的就是用户空间和内核空间的事情。


虽然用户空间和内核空间是独立的,但就像Windows提供了API,允许我们对系统进行操作一样,用户空间的程序也可以通过系统调用来访问内核(就是一些的C语言函数)。但由于系统调用非常基础,所以有时使用起来很麻烦。比如说一个简单的给变量分配内存空间的操作,就需要动用多个系统调用。Linux定义一些库函数(API)来将系统调用组合成某些常用的功能,以方便我们编程(同样是C语言函数)。因此,我们在读别人的程序时,就要区分其中的函数是系统调用,还是库函数,还是C/C++标准库中的函数,还是用户自己定义的函数。如果是前三者,就可以到各个地方搜索相应的资料,这样学习起来就快很多。

那么shell程序和我们用C/C++编写的程序有什么区别呢?事实上,我们在shell中写的每一个命令,都对应了一个程序,在程序内部就是通过调用各种API来实现相应功能的。因此用shell能实现的功能,理论上都能用C语言实现。


作为嵌入式Linux开发初学者,简单熟悉了shell以后,就可以开始进行一些C语言编程的尝试了。

我们最早接触编程一般都是在大学的编程课上,而且往往用的是Visual C++ 6.0。窃以为这是让我对编程原理长期困惑不解的罪魁祸首!啥是环境变量?为啥要设置include路径,lib路径?为啥一点编译按钮就会出来那么多后缀名不同的文件?这些很基础很重要的问题都被VC6.0这个外壳掩盖了。但哪怕你在Linux中使用gcc编译一个最简单程序,一定就会像我一样马上明白把一个.c的源文件变成一个可执行文件,中间究竟发生了什么事情。如果你再用gdb调试一个程序,就会明白得更多一点。

关于C/C++编程的基本工具,我们需要学习的有:vim等代码编辑器、diff等文件比较的shell命令、gcc等编译器、gdb等调试工具、交叉编译等。这里需要特别提到一个重要工具(网站):github,根据百度的解释,它是一个“分布式的版本控制系统”,初学者还用不到版本控制,那就可以单纯把它当成一个开放的源代码库。这个网站里有大量优秀的源代码供学习和使用。


学习了基本的编程方法,我们就该接触Linux的API等内容了。毕竟,我们的嵌入式系统要与设备进行交互,只用C/C++标准库是不够的。在此之前,需要建立一个Linux的重要概念:一切皆文件。甚至硬件设备对Linux系统来说,也是文件。这样对设备的操作就等同于对文件进行读、写,或读写以外的操作。这部分内容在各种书籍资料中通常以“文件IO编程”命名,作为一个章节来写。我觉得这是应当第一个来学的东西,因为看到自己能随意操控文件和外设是一件让人很振奋的事情!成就感是继续学习的一大动力!


另外一个重要内容是,理解进程和线程。通过学习这个部分,能管中窥豹地大致领略到Linux系统如何进行调度,你的程序是怎么在Linux中运行的。这是操作系统原理的内容,但作为非软件专业出身的人,没办法,只能自学了。


其他应用程序编程如网络编程、Qt图形编程等就不一一说明了。


驱动程序可能是我们将来接触内核空间遇到的第一个内容。不过暂时还没什么特别想说的。内核空间距离初学者还是有点远的……以后再来学这部分内容。




相关文章推荐

嵌入式linux驱动开发流程总结

嵌入式linux驱动开发流程 嵌入式系统中,操作系统是通过各种驱动程序来驾驭硬件设备的。设备驱动程序是操作系统内核和硬件设备之间的接口,它为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是...

【实战】嵌入式linux修改内核启动的LOGO界面

默认是小企鹅,现在我们换成一张自己的图片。准备好BMP或者PNG 图片,若是别的格式的图片,可以使用Windows自带的画图软件打开,然后另存为BMP或者PNG格式,Logo图片分辨率不大于LCD分...

交叉编译VIM并移植到ARM嵌入式Linux系统

一、编译环境: Host机:ubuntu-16.10(32bit) Target:arm     交叉工具链:arm-linux-gnueabi-gcc     工具包:               ...

嵌入式Linux入门:概述

李迟按: 嵌入式入门文章比比皆是,不同的人有不同的入门方法。本文就结合笔者经历写一写个人的嵌入式Linux入门的一些步骤和经验。不当之处,望方家指正。...
  • subfate
  • subfate
  • 2017年06月01日 20:48
  • 1413

嵌入式Linux磁盘(硬盘、SD卡)读写性能测试

背景在Windows下有一些磁盘基准测试工具,用于测试硬盘/SD卡的读写速度,如ATTO Disk Benchmark(注:单词benchmark就是基准检查的意思)。那在嵌入式linux系统中如何测...

基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(九)使用domoticz+mosquitto+Android客户端实现控制mini2440上的LED(二)

为了充分利用domoticz平台的对MQTT客户端的控制功能,现在,受控设备端代码的核心任务转移到了对domoticz/out主题的MQTT消息解析上。本文将设计一个简单框架来实现对其消息的解析和功能...

在Microzed上构建嵌入式linux系统(ubuntu16.04下)

July 19, 2016 作者:dengshuai_super 出处:http://blog.csdn.net/dengshuai_super/article/details/51958097 ...

郭天祥ARM9架构嵌入式linux培训视频教程

第一部分  嵌入式系统开发流程概述 第一讲嵌入式基础知识 1. 嵌入式的定义、特点、应用 2. 嵌入式硬件结构 3. 嵌入式软件结构 第二讲如何学习嵌入式 1. 嵌入式系统开发流程...

嵌入式Linux中摄像头使用简要整理

本文转载自:http://emouse.cnblogs.com 本文涉及软硬件平台: 开发板:飞凌OK6410 系统:Ubuntu 12.04+飞凌官方3.0.1     嵌入式Linux还处在入...
  • marc07
  • marc07
  • 2017年04月14日 09:41
  • 290
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式Linux初学者眼中的世界
举报原因:
原因补充:

(最多只允许输入30个字)