一、Linux发展简史 1、什么是嵌入式操作系统? 嵌入式操作系统(Embedded Operating System,简称EOS):嵌入式系统是以应用为中心,以计算机技术为基础,并且软、硬件可裁剪,适用于对功能、可靠性、成本、体积、功耗有严格要求的专用性计算机系统。 嵌入式操作系统是一种用途广泛的系统软件,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等。 不同于以Windows为代表的个人PC操作系统,以Linux为代表的嵌入式操作系统具有以下特性: 1.专用性: 嵌入式操作系统的个性化很强,其中的软件系统与硬件系统结合非常紧密,一般要针对特定的硬件进行系统开发移植,即使同一品牌、同一系列的产品也需要根据系统硬件的变化做出修改。 2.可裁剪: 嵌入式操作系统不要求其功能设计上过于复杂。由于嵌入式系统一般针对小型电子设备,系统资源有限,因此该产品非必要的功能需要尽可能的删减。 3.高效可靠: 高实时性是嵌入式操作系统的基本要求,而且软件代码也要求保证高质量与高可靠性。 4.应用广泛 5.需要开发工具和环境: 嵌入式系统开发需要专用的开发工具与环境。由于其本身不具备自主开发能力,即使设计完成后用户通常也不能对程序某功能进行修改,必须借助一套专用的开发工具与环境才能进行开发。开发阶段有“主机”和“目标机”的概念,主机用于程序开发,目标机作为最后的执行机。开发阶段需要交替结合进行。 常见的嵌入式操作系统:Linux,Windows CE,VxWorks,Symbian,Android,Meego,chromeOS等 2、Linux系统简介 1)一切要从UNIX系统讲起 1969年,AT&T公司(美国电话电报公司)的贝尔实验室与MIT合作开发了UNIX操作系统,旨在开发一个用于大型、并行、多用户的操作系统。最早由Ken Thompson、Dennis Ritchie(同时也是C语言创始人)和Douglas McIlroy三人负责研发。 1971年,Ken Thompson向学院申请了一台PDP-11/24机器(只有24K内存与500K磁盘),第一版的UNIX系统就诞生在这台电脑上。同时著名的fork()系统调用(开启多进程)也是在这一时间段出现的。 到了1973年,Ken Thompson与Dennis Ritchie深感使用汇编语言编写系统移植太过头疼,因此他们想采取高级编程语言完成UNIX系统的第三版。一开始他们试图使用Fortran但是失败了,后来Dennis Ritchie整合了BCPL语言形成B语言,然后在B语言的基础上进行大幅度的修改,这就是大名鼎鼎的C语言。于是Dennis Ritchie成功的使用C语言完成了UNIX第三版内核的开发。而C语言与UNIX系统的完美连体,很快就成为了世界的主导。 2)UNIX系统版本内讧战争 20世纪70年代,AT&T开始注意到UNIX系统所带来的商业价值。公司的律师开始着手保护UNIX系统并让其成为了商业机密。从1979年的UNIXv7版本开始,UNIX禁止大学使用UNIX源码,包括在授课过程中学习与研究。1980年,UNIX分成了两个版本线,一个是Berkeley的BSD UNIX版本,另一个是AT&T的UNIX版本。竞争最终引发了UNIX的战争。 1982年,Joy创建了SUN公司并提供了SunOS系统,而随后几年AT&T则发布了UNIX System V的第一版。 3)Linux的横空出世 林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds, 1969年~ ),出生于芬兰赫尔辛基市,著名的电脑程序员、黑客。在《时代》周刊根据读者投票评选出的二十世纪100位最重要人物中,林纳斯居然排到了第15位,而从20世纪的最后几年就开始霸占全球首富称号的盖茨不过才是第17位。 1991年4月,Linus为了让自己寝室内的电脑运行与实验室的电脑一样的系统,开始研究minix(Unix系统的一个精简版)系统。 1991年的10月5日,林纳斯·托瓦兹在comp.os.minix新闻组上发布消息,正式向外宣布Linux内核的诞生(Freeminix-like kernel sources for 386-AT)。 1993年,大约有100余名程序员参与了Linux内核代码编写/修改工作,其中核心组由5人组成,此时Linux 0.99的代码大约有十万行,用户大约有10万左右。 1994年3月,Linux1.0发布,代码量17万行,采用GPL协议。 3、GNU与GPL 1)GNU GNU的英文全称是"GNU is Not Unix"(递归缩写,程序员的幽默),又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。由于GNU在英文中原意为非洲牛羚,因此GNU计划的图标就是一个牛羚。 GNU计划下的著名软件有Linux系统、gcc编译器、make工程管理器、OpenOffice办公等 2)GPL GNU计划认为任何软件都应当以自由软件发布。要想让一款软件成为“自由软件”,必须使用自由软件许可证来发布。通常使用GPL(或与GPL兼容的)许可证发布。 GPL(GNU General Public License,GNU通用公共许可证)。GPL对GNU下的软件有以下要求: 1.它要求软件以源代码的形式发布,并规定任何用户能够以源代码的形式将软件复制或发布给别的用户。 2.如果用户的软件使用了受GPL保护的任何软件的一部分,那么该软件就继承了GPL软件,并因此而成为GPL 软件,也就是说必须随应用程序一起发布源代码。 3.GPL并不排斥对自由软件进行商业性质的包装和发行,也不限制在自由软件的基础上打包发行其他非自由软件。 4、脱颖而出的Linux系统——Ubuntu Ubuntu(中译“乌班图”)是一个以桌面应用程序为主的Linux系统,其名称Ubuntu来自非洲南部祖鲁语的"Ubuntu"一词,意为“人性”“人道待人”“我的存在是因为大家存在”,是非洲的一种传统价值观,类似中国的“仁爱”“众生平等”。 Ubuntu由马克·舍特尔沃斯创立,其首个版本—4.10发布于2004年10月20日,它以Debian为开发蓝本。与Debian稳健的升级策略不同,Ubuntu每六个月便会发布一个新版,其中每年4月发布的为稳定版,10月发布的为测试版(不稳定版)。有些带有LTS字样意为长期支持版。 2014年2月20日,Ubuntu操作系统正式登陆魅族MX3国际版。 二、Linux体系结构 Linux系统大致分为Linux内核、Shell、文件系统、应用程序4大部分 //见附图1 1、内核 内核是操作系统的核心,具有一个操作系统最基本的功能,它负责管理系统的进程、内存、设备驱动、文件和网络系统,直接决定系统的性能与稳定性。 Linux系统内核大概可分为:内存管理部分、进程管理部分、设备驱动管理部分、文件系统部分和网络管理部分等。 //见附图2 1.系统调用接口(System Call Interface,简称SCI):系统调用提供了从用户空间到内核的函数调用。 2.进程管理(Process Management):主要用于处理进程/线程虚拟化空间、创建、杀死、活动进程间资源共享等需求。 3.内存管理(Memory Management):内核负责管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。 4.虚拟文件系统(Virtual File System,简称VFS):虚拟文件系统是Linux内核中非常重要的组成部分,它提供了一个通用接口对象,隔离了系统调用接口与内核支持的文件系统,在二者之间提供了一个交换层,这样可以屏蔽不同文件系统中对不同文件读写操作的差异,简化程序开发。 5.网络堆栈(Network Stack):网络系统的分层体系结构,例如传输控制协议(TCP/UDP)、网络协议(Internet Protocol,简称IP)等。 6.设备驱动(Device Drivers):提供设备驱动程序,用于运转特定的硬件设备。 7.依赖体系结构代码(Arch):Linux在运行时虽然采用独立的体系结构,但是有些元素必须考虑特定体系结构才能正常操作并提高效率。arch子目录内定义了内核源代码中依赖于体系结构的部分。例如对于典型的桌面操作系统,使用i386目录。 Linux内核用于控制进程、输入与输出、文件系统操作、内存管理等,并且Linux内核支持多用户、多任务模式。 /**********Linux版本号***********/ 查看当前计算机版本信息:uname -a Linux的版本号有两种版本: 第一种:由三个数字组成:r.x.y r:目前发布的内核主版本 x:偶数表示稳定版,奇数表示测试版 y:错误补丁修补次数 主版本号在内核结构有较大变化时才会变更。 例如2009年发布的2.6.27版,表示主版本为Linux2,稳定版,修订了27次 第二种:major.minor.patch-build.desc 1.major:主版本号 2.minor:次版本号,新增功能时会发生变化;偶数表示稳定版,奇数表示测试版 3.patch:对次版本的修订次数 4.build:表示编译(或构建)次数,每次编译可能对少量程序做优化修改但一般没有大的功能性变化 5.desc:描述当前版本的信息。例如一些内核版本中有SMP,表示多对称处理器(Symmetric MultiProcessing)。 Linux版本号简史: 0.02:1991年10月5日,Linus Torvalds将这个版本内核代码发布到了Minix新闻组,很快得到了反应。Linus在其他热心支持者的帮助下推出了第一个稳定工作版。 0.11:1991年12月8日,发布在Internet上,已经是可以正常运行的内核版本。 0.95:1992年3月8日,加入了虚拟文件系统 1.0:1994年3月14日,Linux核心开发团队正式组建,Linux用于也越来越多 2.0:1996年2月9日 2.6:2003年12月17日,与之前的相比,首次支持多处理器运算和64位计算,支持高效率处理本机POSIX的线程库(NPTL),改进了性能、安全、驱动程序等诸多方面。 目前最新的内核版本是4.10.2和4.11-rc2。有关不同内核版本信息与下载,可以去Linux内核官网https://www.kernel.org/查看更多信息。 /**********Linux版本号end********/ 2、Shell Shell(中文翻译为“壳”,为了区别于Kernel“核”)是Linux内的一个命令行解释器,它为使用者提供使用界面,用户在Shell内输入指令,Shell接收用户的指令然后调用相关程序或指令。 另一方面,Shell又是一种程序设计语言。作为一门解释性语言,提供各种变量、参数、循环与分支等。 Shell基本上可以分为两大类 1)图形界面Shell:例如Gnome等 2)命令行式Shell:例如Bourne Shell(最早的Shell)、bash、csh以及Windows系统的cmd.exe等 有关Shell的具体介绍我们将在后续课程中讲解。 3、其他操作系统组件 Linux还包括图形用户界面(GUI)、应用程序管理、编程工具(例如GCC、Java eclipse等)、配置服务器等组件。这里就不一一介绍。 三、Vim简介 Linux系统内支持多种文本编辑器,常用的有gedit、OpenOffice、emacs等,但是使用最为广泛的文本编辑器还是Vim Vim是Linux系统下一个功能强大、高度可定制的文本编辑器,它基于VI,同时又增加了许多新的特性。Vim与Emacs并列为类Unix系统用户最喜欢的文本编辑器。 Vim的设计理念是“命令组合”。例如指令"2dd",其中2代表重复两次,第一个d代表删除,第二个d代表当前行。另外vim的许多快捷键与正则表达式类似(^ $等),方便记忆。 由于程序员在写代码的时候双手需要时刻停留在键盘上,因此Vim专门针对程序员进行了优化,例如分割视窗、多级撤销、定位代码、控制光标等操作,这样程序员的双手就无需离开键盘去点击鼠标。而且,Vim无需使用图形化界面,这也就意味着对于某些极端情况(例如图形桌面系统全面崩溃等)下,Vim是唯一一种可靠的编辑器。 //当然,还有很多人习惯于可视化的编辑界面,习惯于使用鼠标操作,对于这些人来说使用Vim反而效率低下,他们更倾向于诸如Notepad++等文本编辑器以及VS等IDE开发环境。 1、Vim指令——开始编辑 Vim有三种模式:命令模式、插入模式、底行模式。进入Vim的时候默认为命令模式,在这个模式下能对文本进行命令操作但是无法输入文本。若想输入文本需要进入到插入模式。从命令模式进入插入模式有以下几种方式,虽然都是进入插入模式,但是有所区别(主要区别在于进入插入模式后的光标位置),使用的时候要选取合适的进入插入模式的方式。 从插入模式退出回到命令模式:按键ESC 新增(append,简写为a) a:从光标所在位置后面开始新增 A:从光标所在行最后的地方开始新增 插入(insert,简写为i) i:从光标所在位置前面开始插入 I:从光标行所在的第一个非空白字符前面开始插入 开始(open,简写为o) o:在光标所在行的下一行新增一行并开始插入 O:在光标所在行的上一行新增一行并开始插入 2、Vim指令——删除与修改 删除字符 x:删除光标所在字符(相当于delete) X:删除光标前面的字符(相当于backspace) s:删除光标所在字符并进入插入模式 S:删除光标所在行并进入插入模式 删除多个字符/行 dw:删除光标所在单词直至词尾 dd:删除光标所在行 dj:删除光标所在行与下一行 cw或ce:删除光标所在单词在光标后的字符并进入插入模式 cb:删除光标所在单词在光标前的字符并进入插入模式 cc:删除当前行并进入插入模式 3、Vim指令——保存与退出 :q:文件未修改,不保存退出 :q!:文件修改,不保存强制退出 :wq:文件修改,保存退出 :x:等价于:wq :w:存盘 :w 文件名:存入文件名的文件中 :w! 文件名:强制存入文件名的文件中 4、Vim指令——控制光标移动 b:移动到当前单词开始 e:移动到当前单词结尾 w:移动到下一个单词 h:向前移动 j:向下移动 k:向上移动 l:向后移动 5、Vim指令——拷贝与粘贴 yw:复制光标所在单词在光标后的字符至剪贴板 yy:复制当前行至剪贴板 p:将剪贴板内容粘贴在光标后 P:将剪贴板内容粘贴在光标前 6、Vim指令——其他指令 u:撤销操作 /关键字:查找关键字,按n查看下一个 .(小数点符号):重复你的上一个指令 有关Vim的指令还有很多,时间有限,不再介绍更多。有兴趣的同学可以查阅相关资料。 四、Linux系统软件包管理机制 最初的Linux系统没有合理的软件管理机制,应用程序开发者将二进制程序直接发送给用户,用户再逐一自行安装。这样做十分不便。 Debian系统首次提出了“软件包”的管理机制——deb软件包。deb软件包将应用程序的二进制文件、配置文件、帮助界面(man)等其他与软件相关的文件合并打包在一个文件内,用户使用软件包就可以直接完成获取、安装、卸载、查询、更新等系列操作。随后,Redhat系统基于deb的概念也推出了自己的软件包管理机制——rpm软件包。 随着Linux系统的不断发展壮大,软件与软件之间的依赖关系也愈发变得错综复杂,用户在安装软件的时候十分麻烦。这时Debian系统又推出了软件包管理器——APT。APT可以自动检测软件包间的依赖关系,并且可以利用internet自动获取软件包并安装。APT的出现使得deb软件包被广泛地使用。由于Ubuntu系统是基于Debian系统研发的,因此Ubuntu系统也采用deb软件包管理机制。 在Ubuntu系统内有两种deb软件包,分别为二进制软件包(常见为.deb后缀)和源码包(常见.dsc后缀)。可以使用file命令查看软件包的类型。 1、软件包的命名规则 软件包命名遵循以下规则: Filename_Version-Reversion_Architecture.deb 其中: Filename:软件包名称 Version:版本信息 Reversion:修订版本信息 Architecture:体系架构 例如有软件g++,软件包名为g++_4.1.2-9ubuntu2_i386.deb,则 g++:软件包名 4.1.2:软件版本为4.1.2 9ubuntu2:修订版本信息 i386:基于x86架构 2、dpkg与APT 1)dpkg 在Ubuntu系统中,最常用的两个管理软件包的工具是dpkg和APT。 dpkg是最早的deb软件包管理工具,他在Debian提出软件包管理机制之后就诞生了。使用dpkg可以实现软件包的安装、编译、卸载、打包等操作。由于当时系统与Internet的限制,dpkg的功能十分有限,它没有考虑到未来软件包间错综复杂的依赖关系以及如何帮助用户从网络上获取软件包的问题,因此我们就发明了APT工具。 dpkg相关命令: dpkg -i 软件包名:安装一个在本地文件系统上的deb软件包 dpkg -r 软件包名:移除一个已安装的软件包 dpkg -P 软件包名:移除已安装的软件包以及配置文件 dpkg -L 软件包名:列出安装软件包的清单 dpkg -s 软件包名:显示软件包安装状态 2)APT(Advanced Packaging Tool) 由于dpkg有种种弊端,因此人们发明了APT来管理软件包。APT系列工具可能是deb软件包管理工具中功能最强大的工具。APT提供软件包的安装、更新、查询、卸载、升级以及检查依赖关系等一系列操作且无需用于操作,自动完成。 Ubuntu采用集中式仓库机制管理软件。将每种软件分门别类地存放在不同的软件仓库中进行管理。然后将软件仓库存放在许许多多的镜像服务器内供用户获取。 由于每一位用户所处的网络环境不同,因此不可能随意访问所有镜像服务器。为了选择可访问的服务器,在Ubuntu系统中,文件/etc/apt/sources.list用于配置最适合访问的镜像服务器节点地址。但即便如此,配置文件只是告知Ubuntu系统可以访问哪些镜像服务器地址,但是该服务器上有什么地址却并不清楚。因此在每个镜像服务器上都有一个软件资源列表清单(索引文件),以便用户机查询。同时,借由索引文件,APT还可以自动检测软件包之间的依赖关系,大大简化了用户安装软件的流程。因此,APT成为了Ubuntu系统内最受欢迎的软件包管理工具。 APT的软件包获取地址文件在/etc/apt/sources.list中,这个文件本质上就是一个普通的文本文件,在管理员授权下可以用任意文本编辑器编辑。 /*************************** !!!注意!!!(这是一个悲伤的故事) 不要擅自修改该文件内容,即使想修改也请事先做好备份工作 修改完毕后,保存文件后执行apt-get update命令更新配置文件 ***************************/ APT提供一组命令供用户选择,以下是一些常见的命令: //注意:大多数的apt命令都需要管理员权限运行,因此使用时常常与sudo一起使用 apt-get:最常用,用于管理软件包,包括安装、更新、卸载等操作 apt-cache:查询软件包信息 apt-cdrom:安装CD-ROM内软件包 …… 在这些命令中,我们最常用的是apt-get。apt-get本身并没有软件包管理功能,而是提供了一个软件包管理平台,在该平台上使用子命令来完成具体的操作任务。 1)apt-get命令格式: apt-get 子命令 [可选指令] 软件包名 子命令: update:下载更新软件包列表信息 upgrade:升级软件包到最新版本 install:下载软件包并安装 remove:卸载软件包 autoremove:自动卸载不满足依赖关系的软件包 source:下载源码 clean:删除缓存内已下载的包 check:检查系统中依赖关系的完整性 可选指令: -d:仅下载而不解压安装 -f:修复系统中存在的软件包依赖性问题 --purge:与remove一起使用,完全卸载软件包 --reinstall:与install一起使用,重新安装该软件包 -b:下载源码包后编译生成相应的软件包 -y:对所有询问都做yes回答,apt在执行时不再进行任何提示 -h:获取帮助信息 -v:获取apt-get版本号 当我们执行apt-get install命令后,APT就可以自动完成整个安装过程,而无需考虑软件包的版本、优先级、依赖关系等。 apt-get install安装软件大致分为4步: 1.扫描本地存放的列表,寻找镜像服务器上的软件包 2.进行软件包依赖性检查,找到支持该软件正常运行的所有软件包 3.从镜像服务器中下载相关软件包 4.安装软件并配置相关文件 练习:使用APT安装以下软件,然后运行软件并查看效果 1.sl(小火车) 2.cmatrix(弹幕) 3.xchat(Ubuntu聊天室) 4.cowsay 或 xcowsay(老牛说) 5.fortune-zh(诗词) 2)apt-cache命令格式: apt-cache 子命令 [可选指令] 软件包名 子命令: showpkg:获取二进制软件包的常规描述信息 showsrc:获取源码包的常规描述信息 show:获取二进制软件包的详细描述信息 stats:获取统计信息 dump:获取软件源内所有软件包的简要信息 search:检索软件包 depends:获取该软件包的依赖信息 rdepends:获取所有依赖于该软件包的软件包 pkgnames:列出所有已安装的软件包的名称 policy:获取软件包当前的安装状态 练习:查看xchat这个软件的相关信息 答案:sudo apt-cache showpkg xchat