Android驱动开发与移植实战详解_第1页
Android驱动开发与移植实战详解_第2页
Android驱动开发与移植实战详解_第3页
Android驱动开发与移植实战详解_第4页
Android驱动开发与移植实战详解_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android驱动开发与移植实战详解注:因内容过长上传受限制,本文档只显示部分内容,完整版文档请下载此文档后留言谢谢。目录\h第1章迅猛发展的Android系统\h1.1智能手机世界\h1.1.1何谓智能手机\h1.1.2当前主流智能手机系统\h1.2Android的自身优势\h1.2.1开源\h1.2.2强大的开发团队支持\h1.2.3实行奖励机制\h1.3认识驱动\h1.4分析Android架构\h1.4.1操作系统层(OS)\h1.4.2各种库和Android运行环境\h1.4.3应用程序\h1.4.4应用程序框架\h1.5开源的问题\h1.5.1雾里看花的开源\h1.5.2从选择Java开始谈为什么不开源驱动程序\h1.5.3对驱动开发者的影响\h第2章简要分析Linux内核\h2.1Linux基础\h2.1.1Linux历史简介\h2.1.2主要版本\h2.1.3Linux的发展机遇\h2.2Android和Linux的关系\h2.2.1Android继承于Linux\h2.2.2Android和Linux内核的区别\h2.3Linux内核简介\h2.3.1内核的体系结构\h2.3.2和Android相关的Linux内核知识\h2.4分析Linux内核源码\h2.4.1源码目录结构\h2.4.2浏览源码的工具\h2.4.3用汇编语言编写内核代码\h2.4.4Linux内核的显著特性\h2.4.5学习Linux内核的过程\h第3章开始分析Android源码\h3.1搭建Linux开发环境和工具\h3.1.1搭建Linux开发环境\h3.1.2设置环境变量\h3.1.3安装编译工具\h3.2获取Android源码\h3.3分析Android源码结构\h3.4编译Android源码\h3.5运行Android源码\h3.6实践演练——演示两种编译Android程序的方法\h3.6.1编译NativeC的helloworld模块\h3.6.2手工编译C模块\h3.7编译AndroidKernel\h3.7.1获取Goldfish内核代码\h3.7.2获取MSM内核代码\h3.7.3获取OMAP内核代码\h3.7.4编译Android的Linux内核\h3.8运行模拟器\h3.8.1Linux环境下运行模拟器的方法\h3.8.2模拟器辅助工具——ADB\h第4章驱动移植\h4.1Android移植\h4.1.1移植的任务\h4.1.2移植的内容\h4.1.3驱动开发需要做的工作\h4.2Android对Linux的改造\h4.2.1Android的核心驱动\h4.2.2为Android构建Linux操作系统\h4.3内核空间和用户空间接口\h4.3.1实现系统和硬件之间的交互\h4.3.2实现内核到用户空间的数据传输\h4.4三类驱动程序\h4.4.1字符设备驱动\h4.4.2块设备驱动\h4.4.3网络设备驱动\h第5章深入详解HAL层\h5.1初识HAL层\h5.1.1HAL层简介\h5.1.2比较HAL_legacy和HAL\h5.2分析HAL层源码\h5.2.1分析HALmodule\h5.2.2分析mokoid工程\h5.3Sensor在HAL层的表现\h5.3.1HAL层的Sensor代码\h5.3.2总结Sensor编程的流程\h5.4移植总结\h5.4.1移植各个Android部件的方式\h5.4.2辅助工作\h第6章常见的驱动平台\h6.1专用驱动\h6.1.1Binder驱动程序\h6.1.2Logger驱动\h6.1.3组件Lowmemorykiller\h6.1.4TimedOutput驱动程序\h6.1.5TimedGpio驱动程序\h6.1.6唤醒和休眠\h6.1.7Ashmem驱动程序\h6.1.8Pmem驱动程序\h6.1.9Alarm驱动程序\h6.1.10USBGadget驱动程序\h6.1.11AndroidParanoid驱动程序\h6.2Goldfish设备驱动\h6.3MSM内核和驱动\h6.3.1MSM基础\h6.3.2移植MSM内核\h6.3.3移植MSM\h6.3.4高通特有的组件\h6.4OMAP内核和驱动\h6.4.1OMAP基础\h6.4.2OMAP内核\h6.4.3移植OMAP体系结构\h6.4.4移植Android专用驱动和组件\h6.4.5OMAP的设备驱动\h第7章输入系统驱动\h7.1输入系统介绍\h7.1.1Android输入系统结构元素介绍\h7.1.2Android输入系统驱动\h7.1.3Input系统的层次结构\h7.1.4移植工作\h7.2Input驱动源码分析\h7.2.1文件input.h\h7.2.2文件KeycodeLabels.h\h7.2.3文件KeyCharacterMap.h\h7.2.4Kl格式文件\h7.2.5kcm格式文件\h7.2.6文件EventHub.cpp\h7.3Input设备的运作过程\h7.3.1Input设备的注册(硬件驱动层)\h7.3.2Input子系统的加载过程(子系统核心层)\h7.3.3Input子系统的事件处理(事件处理层)\h7.4模拟器的输入驱动\h7.5高通平台的输入驱动实现\h7.5.1触摸屏驱动\h7.5.2按键和轨迹球驱动\h7.6OMAP处理器中的输入驱动实现\h7.6.1触摸屏驱动程序\h7.6.2键盘驱动程序\h第8章电话系统驱动\h8.1电话系统基础\h8.1.1Android电话系统简介\h8.1.2深入分析电话系统的实现文件\h8.1.3电话系统结构\h8.2移植Modem驱动和RIL硬件抽象层\h8.3移植和调试\h8.3.1驱动程序\h8.3.2RIL接口\h8.4实现电话系统驱动\h8.4.1RIL中消息队列的建立\h8.4.2与底层Modem通信\h8.5深入分析实现Android电话系统的流程\h8.5.1初始启动流程\h8.5.2接收信息流程\h8.5.3等待硬件响应\h第9章显示系统驱动\h9.1显示系统基础\h9.1.1Android的版本\h9.1.2不同的显示系统\h9.1.3FrameBuffer驱动的使用基础\h9.2移植Android显示系统\h9.2.1FrameBuffer驱动程序\h9.2.2硬件抽象层\h9.3实现显示系统的驱动程序\h9.3.1Goldfish中的FrameBuffer驱动程序\h9.3.2使用Gralloc模块的驱动程序\h9.4MSM中显示驱动的实现\h9.4.1MSM中的FrameBuffer驱动程序\h9.4.2MSM中的Gralloc驱动程序\h9.5OMAP中显示驱动的实现\h9.5.1文件omapfb-main.c\h9.5.2文件omapfb.h\h9.66416中FrameBuffer的工作原理\h第10章音频系统驱动\h10.1音频系统结构\h10.2音频系统的层次\h10.2.1层次说明\h10.2.2Media库中的Audio框架\h10.2.3本地代码\h10.2.4JNI代码\h10.2.5Java代码\h10.3移植工作\h10.3.1两个任务\h10.3.2Audio的硬件抽象层\h10.3.3实现AudioFlinger中的Audio硬件抽象层\h10.3.4真正实现Audio硬件抽象层\h10.4MSM平台实现Audio驱动系统\h10.4.1实现Audio驱动程序\h10.4.2实现硬件抽象层\h10.5OSS平台实现Audio驱动系统\h10.5.1OSS驱动程序介绍\h10.5.2mixer\h10.6ALSA平台实现Audio系统\h10.6.1ALSA基础\h10.6.2注册音频设备和音频驱动\h10.6.3ALSA的底层接口\h10.6.4放音流程\h10.6.5录音流程\h10.6.6在Android中使用ALSA声卡\h10.6.7在OMAP平台移植Android的ALSA声卡驱动\h10.76410中的ALSA驱动\h10.7.1ALSA的设备文件\h10.7.2创建声卡和PCM设备\h第11章视频输出系统驱动\h11.1视频输出系统结构\h11.2移植的内容\h11.3分析硬件抽象层\h11.3.1Overlay系统硬件抽象层的接口\h11.3.2实现硬件抽象层\h11.3.3实现接口\h11.4实现Overlay硬件抽象层\h11.5在OMAP平台实现Overlay系统\h11.5.1实现输出视频驱动程序\h11.5.2实现Overlay硬件抽象层\h11.6系统层调用Overlay模块\h11.6.1测试文件\h11.6.2在Android系统中创建Overlay\h11.6.3管理OverlayHAL模块\h11.7抽象层实现(V4l2驱动实现方式)\h第12章振动器系统驱动\h12.1振动器系统结构\h12.1.1硬件抽象层\h12.1.2JNI框架部分\h12.2开始移植\h12.2.1移植振动器驱动程序\h12.2.2实现硬件抽象层\h12.3在MSM平台实现振动器驱动\h第13章Android多媒体插件框架\h13.1Android多媒体插件\h13.2需要移植的内容\h13.3OpenCore引擎详解\h13.3.1OpenCore的层次结构\h13.3.2OpenCore的代码结构\h13.3.3OpenCore的编译结构\h13.3.4OpenCoreOSCL\h13.3.5实现OpenCore中的OpenMax部分\h13.3.6OpenCore的扩展\h13.4Stagefright引擎\h13.4.1代码结构\h13.4.2实现OpenMax接口\h13.4.3VideoBuffer传输流程\h第14章Camera照相机驱动\h14.1Camera系统的结构\h14.2移植的内容\h14.2.1fimc驱动模块的加载\h14.2.2V4l2驱动的用法\h14.3移植和调试\h14.3.1V4L2驱动程序\h14.3.2硬件抽象层\h14.4实现Camera系统的硬件抽象层\h14.4.1Java程序部分\h14.4.2Java本地调用部分\h14.4.3本地库libui.so\h14.4.4Camera服务libcameraservice.so\h14.5实现Camera系统\h14.5.1在MSM平台实现Camera系统\h14.5.2OMAP平台实现Camera系统\h14.6借助Sensor驱动使用照相机系统\h第15章传感器系统驱动\h15.1传感器系统的结构\h15.2移植Sensor驱动\h15.2.1移植驱动程序\h15.2.2移植硬件抽象层\h15.2.3实现上层部分\h15.3实现传感器\h第16章Wi-Fi系统、蓝牙系统和GPS系统\h16.1Wi-Fi系统的应用和移植\h16.1.1Wi-Fi系统的结构\h16.1.2移植的内容\h16.1.3移植和调试\h16.1.4OMAP平台实现Wi-Fi\h16.1.5配置Wi-Fi\h16.1.6SDIO设备的移植\h16.1.7移植Wi-Fi驱动的注意事项\h16.2蓝牙系统的应用和移植\h16.2.1蓝牙结构\h16.2.2移植的内容\h16.2.3具体移植\h16.2.4MSM平台的蓝牙驱动\h16.2.5本地适配器连接过程\h16.2.6远程适配器连接过程\h16.2.7分析6410的蓝牙驱动\h16.3定位系统\h16.3.1系统结构\h16.3.2移植的内容\h16.3.3移植和调试\h16.3.4GPS的串口驱动和数据读取\h第17章振动器驱动和警报器驱动\h17.1Alarm系统基础\h17.1.1Alarm系统的结构\h17.1.2移植的内容\h17.2移植和调试\h17.3实现Alarm驱动\h17.4MSM平台实现Alarm\h第18章光系统驱动和电池系统驱动\h18.1Lights光系统的应用和移植\h18.1.1Lights系统的结构\h18.1.2移植的内容\h18.1.3移植和调试\h18.1.4MSM平台实现光系统\h18.1.5深入分析Android的光系统\h18.2Battery电池系统的应用和移植\h18.2.1Battery系统的结构\h18.2.2移植的内容\h18.2.3移植和调试\h18.2.4模拟器中实现电池系统第1章迅猛发展的Android系统Android(安卓)是IT巨头谷歌公司推出的一款手机系统,是建立在Linux内核基础之上的,能够迅速建立手机软件的解决方案。Android的功能十分强大,作为一个新兴的热点,已经成为了软件行业中的一股新兴力量。据市场数据统计,Android系统已经成为当今市场占有率第一位的智能手机系统。本章将简单介绍Android的发展历程和背景,让读者了解Android的辉煌之路。1.1智能手机世界智能手机是指具有像个人电脑那样独立的操作系统,用户可以在上面安装自己需要的第三方软件或游戏程序,并且可以通过移动通信网络接入无线网络。在Android系统诞生之前已经有很多优秀的智能手机产品,例如家喻户晓的Symbian(塞班)系列和微软的WindowsMobile系列等。1.1.1何谓智能手机当今公认的智能手机必须具备下面的功能标准:(1)操作系统必须支持新应用的安装;(2)高速度处理芯片;(3)支持播放式的手机电视;(4)大存储芯片和存储扩展能力;(5)支持GPS导航。后来手机联盟制定了一个标准,在该标准中列出了智能手机的如下主要特点:(1)具备普通手机的全部功能,例如可以进行正常的通话和发短信等手机应用;(2)是一个开放性的操作系统,在系统平台上可以安装更多的应用程序,从而实现功能的无限扩充;(3)具备上网功能;(4)具备PDA的功能,实现个人信息管理、日程记事、任务安排、多媒体应用、浏览网页;(5)可以根据个人需要扩展机器的功能;(6)扩展性能强,并且可以支持很多第三方软件。1.1.2当前主流智能手机系统当今最主流的智能手机系统有微软的WindowsPhone系列、塞班系列、PDA、黑莓、苹果的iOS和本书的主角Android。1.微软的WindowsMobileWindowsMobile是微软公司的一款杰出产品,WindowsMobile将熟悉的Windows桌面扩展到了个人设备中。使用WindowsMobile操作系统的设备主要有PPC手机、PDA、随身音乐播放器等。WindowsMobile操作系统有三种,分别是WindowsMobileStandard、WindowsMobileProfessional、WindowsMobileClassic。当前的最新版本是WindowsPhone7,WindowsPhone8也即将发布。2.塞班系统塞班系统Symbian是一款久负盛名的手机系统,最初是由诺基亚、索尼爱立信、摩托罗拉、西门子等几家大型移动通信设备商共同出资组建的一个合资公司,职责是专门研发手机操作系统。Symbian有着良好的界面,采用内核与界面分离技术,对硬件的要求比较低,支持C++、VisualBasic和J2ME。目前根据人机界面的不同,Symbian体系的UI(UserInterface,用户界面)平台分为Series60、Series80、Series90、UIQ等。其中Series60主要是给数字键盘手机用,Series80是为完整键盘所设计,Series90则是为触控笔方式而设计。2010年9月,诺基亚宣布将从2011年4月起从Symbian基金会(SymbianFoundation)手中收回Symbian操作系统控制权。3.PalmPalm是流行的个人数字助理(PDA,又称掌上电脑)的传统名字。从广义上讲,Palm是PDA的一种,是Palm公司发明的。而从狭义上讲,Palm是Palm公司生产的PDA产品,区别于SONY公司的Clie和Handspring公司的Visor/Treo等其他运行Palm操作系统的PDA产品。其显著特点之一是写入装置输入数据的方法,能够点击显示器上的图标选择输入的项目。2009年2月11日,Palm公司CEOEdColligan宣布以后将专注于WebOS和WindowsMobile的智能设备,而将不会再有基于“PalmOS”的智能设备推出,除了PalmCentro会在以后和其他运营商合作时继续推出。4.黑莓BlackBerryBlackBerry是加拿大RIM公司推出的一种移动电子邮件系统终端,其特色是支持推动式电子邮件、手提电话、文字短信、互联网传真、网页浏览及其他无线资讯服务,其最大优势在于收发邮件。5.iOSiOS是苹果手机产品iPhone的操作系统,iPhone是一款手机产品,由苹果公司在2007年1月9日举行的Macworld宣布推出,并在2007年6月29日在美国上市。IPhone实现了将创新的移动电话、可触摸宽屏iPod以及具有桌面级电子邮件、网页浏览、搜索和地图功能的突破性因特网通信设备这三种产品完美地融为一体。每一件iPhone产品都是一件艺术品,无论是外观还是品质和性能,都拥有超高的人气。推出的每一款新iPhone,都马上成为市面智能手机的标杆。在2011年10月4日推出了当前最新的iPhone4S。6.AndroidAndroid是本书的主角,是一款基于Linux内核的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。1.2Android的自身优势Android采用了WebKit浏览器引擎,具备触摸屏、高级图形显示和上网功能,用户能够在手机上查看电子邮件、搜索网址和观看视频节目等,同时Android还具有比iPhone等其他手机更强的搜索功能,可以说是一种融入全部Web应用的平台。正是因为其特有的巨大优势,在2010年下半年,Android规模便超越了苹果iPhone,大有一统手机系统之势!并且终于在2011年超越了塞班,成为市场占有率最高的智能手机系统。1.2.1开源Android出身于Linux世家,是一款开源的手机操作系统。Android功成名就之后,各大手机联盟纷纷加入,这个联盟由包括中国移动、摩托罗拉、高通、宏达电子和T-Mobile在内的30多家技术和无线应用的领军企业组成。通过与运营商、设备制造商、开发商和其他有关各方结成深层次的合作伙伴关系,希望借助建立标准化、开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统。1.2.2强大的开发团队支持Android的研发队伍阵容强大,包括摩托罗拉、Google、HTC(宏达电子)、PHILIPS、T-Mobile、高通、魅族、三星、LG以及中国移动在内的34家企业。它们都将基于该平台开发手机的新型业务,应用之间的通用性和互联性将在最大程度上得到保持。并且还成立了手机开放联盟,联盟中的成员由手机制造商、半导体公司和软件公司组成,具体名单如下。1.手机制造商台湾宏达国际电子(HTC)(Palm等多款智能手机的代工厂),摩托罗拉(美国最大的手机制造商),韩国三星电子(仅次于诺基亚的全球第二大手机制造商),韩国LG电子,中国移动(全球最大的移动运营商),日本KDDI(2900万用户),日本NTTDoCoMo(5200万用户),美国SprintNextel(美国第三大移动运营商,5400万用户),意大利电信(TelecomItalia,意大利主要的移动运营商,3400万用户),西班牙Telefónica(在欧洲和拉美有1.5亿用户),T-Mobile(德意志电信旗下公司,在美国和欧洲有1.1亿用户)。2.半导体公司AudienceCorp(声音处理器公司),BroadcomCorp(无线半导体主要提供商),英特尔(Intel),MarvellTechnologyGroup,Nvidia(图形处理器公司),SiRF(GPS技术提供商),Synaptics(手机用户界面技术),德州仪器(TexasInstruments),高通(Qualcomm),惠普HP(Hewlett-PackardDevelopmentCompany,L.P)。3.软件公司Aplix,Ascender,eBay的Skype,Esmertec,LivingImage,NMSCommunications,NoserEngineeringAG,NuanceCommunications,PacketVideo,SkyPop,SonixNetwork,TAT-TheAstonishingTribe,WindRiverSystems。1.2.3实行奖励机制安卓(Android)为了提高程序员的开发积极性,不但为其提供了一流硬件的设置,还提供了一流的软件服务。并且采取了振奋人心的奖励机制,定期召开比赛,创意和应用夺魁者将会得到重奖。1.开发Android平台的应用在Android平台上,程序员可以开发出各式各样的应用。其中Android应用项目是通过Java语言开发的,只要具备Java开发基础,就能很快地上手并掌握。作为单独的Android开发,Java编程门槛并不高,即使没有编程经验的门外汉,也可以在突击学习Java之后而学会Android。另外,Android完全支持2D、3D和数据库,并且和浏览器实现了集成。所以通过Android平台,程序员可以迅速、高效地开发出绚丽多彩的应用,例如常见的工具、管理、互联网和游戏等。2.奖金丰厚的Android大赛为了吸引更多的用户使用Android开发,已经成功举办了奖金为1000万美元的开发者竞赛。鼓励开发人员创建出有创意的实用软件。这种大赛对于开发人员来说,不但能练习自己的开发水平,并且有机会获得高额的奖金。3.在AndroidMarket上获取收益AndroidMarket地址是http://www.A/market/。为了能让Android平台吸引更多的关注,谷歌开发了自己的Android软件下载店AndroidMarket,允许开发人员将应用程序在上面发布,也允许Android用户随意下载获取自己喜欢的程序。开发者需要申请开发者账号,有账号后才能将自己开发的作品上传到AndroidMarket,并且可以对自己的软件进行定价。只要开发的软件作品足够吸引人,就可以获得好的金钱回报。1.3认识驱动驱动是硬件和软件之间的媒介和载体,是计算机等电子产品运行的根本。生活中总会遇到这样的场景:买了一个新USB鼠标,插在电脑上后会提示安装新的驱动;买了一台新的打印机,也需要安装驱动后才能使用。驱动含有推动和发动之意,计算机领域中的驱动也含有推动之意。当我们在电脑中安装新硬件时,总会被要求放入“这种硬件的驱动程序”。其实在Windows系统中,在安装主板、光驱、显卡、声卡这些硬件产品时都对应着一套完整的驱动程序。如果需要外接别的硬件设备,也还需要安装相应的驱动程序,例如外接游戏硬件要安装手柄、方向盘、摇杆、跳舞毯等的驱动程序,外接打印机要安装打印机驱动程序,上网或接入局域网要安装网卡、Modem甚至ISDN、ADSL的驱动程序。和Windows系统一样,在Android手机中也经常需要使用一些外部硬件设备,例如蓝牙耳机、存储卡和摄像头。要想使用这些外部辅助设备,也需要安装对应的驱动程序。驱动程序是添加到操作系统中的一段代码,通常这段代码比较简短,但是在里面包含了和硬件相关的设备信息。有了这些信息,计算机就可以与设备进行通信,从而使用这些硬件。驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。操作系统不同,对应的硬件驱动程序也不同。硬件厂商为了保证硬件的兼容性及增强硬件的功能,会不断更新、升级驱动程序,例如显卡芯片公司Nvidia平均每个月会升级驱动程序2到3次。驱动程序是硬件的一个构成部分,当我们安装新的硬件时,也必须安装对应的驱动程序。凡是安装一个原本不属于我们电脑中或手机中的硬件设备时,系统就会要求你安装驱动程序,将新的硬件与电脑或手机系统连接起来。驱动程序在此扮演了一个沟通的角色,负责把硬件的功能告诉电脑系统,并且也将系统的指令传达给硬件,让它开始工作。手机中的驱动和电脑中的驱动一样,当在手机中使用数据线、蓝牙、红外等连接方式连接电脑时,在一般情况下需要驱动程序。而且在一部分手机中,通过数据线、蓝牙、红外方式连接电脑后还需要软件才能传输数据到电脑,或者传输数据到手机。此时可以使用购买手机时的随机光盘中的驱动程序解决问题,驱动程序也可以在手机网站或论坛上下载。1.4分析Android架构Android作为一个移动设备的平台,其软件层次结构包括操作系统(OS)、中间件(MiddleWare)和应用程序(Application)。根据Android的软件框图,其软件层次结构自下而上分为以下4层。(1)操作系统层(OS)。(2)各种库(Library)和Android运行环境(RunTime)。(3)应用程序框架(ApplicationFramework)。(4)应用程序(Application)。上述各个层的具体结构如图1-1所示。▲图1-1Android操作系统的组件结构图1.4.1操作系统层(OS)Android使用Linux2.6作为操作系统,Linux2.6是一种标准的技术,Linux也是一个开放的操作系统。Android对操作系统的使用包括核心和驱动程序两部分,Android的Linux核心为标准的Linux2.6内核,Android更多的是需要一些与移动设备相关的驱动程序。主要的驱动如下所示。●显示驱动(DisplayDriver):常用基于Linux的帧缓冲(FrameBuffer)驱动。●Flash内存驱动(FlashMemoryDriver):是基于MTD的Flash驱动程序。●照相机驱动(CameraDriver):常用基于Linux的v4l(VideoforLinux)驱动。●音频驱动(AudioDriver):常用基于ALSA(AdvancedLinuxSoundArchitecture,高级Linux声音体系)驱动。●WiFi驱动(CameraDriver):基于IEEE801.31标准的驱动程序。●键盘驱动(KeyBoardDriver):作为输入设备的键盘驱动。●蓝牙驱动(BluetoothDriver):基于IEEE801.35.1标准的无线传输技术。●BinderIPC驱动:Android一个特殊的驱动程序,具有单独的设备节点,提供进程间通信的功能。●PowerManagement(能源管理):管理电池电量等信息。1.4.2各种库和Android运行环境本层次对应一般嵌入式系统,相当于中间件层次。Android的本层次分成两个部分,一个是各种库(Library),另一个是Android运行环境(RunTime)。本层的内容大多是使用C++实现的。其中包含的各种库如下。●C库:C语言的标准库,也是系统中一个最为底层的库,C库是通过Linux的系统调用来实现的。●多媒体框架(MediaFramework):这部分内容是Android多媒体的核心部分,基于PacketVideo(即PV)的OpenCORE,从功能上本库一共分为两大部分,一部分是音频、视频的回放(PlayBack),另一部分则是音视频的纪录(Recorder)。●SGL:2D图像引擎。●SSL:即SecureSocketLayer,位于TCP/IP协议与各种应用层协议之间,为数据通信提供安全支持。●OpenGLES1.0:提供了对3D的支持。●界面管理工具(SurfaceManagement):提供了对管理显示子系统等功能。●SQLite:一个通用的嵌入式数据库。●WebKit:网络浏览器的核心。●FreeType:位图和矢量字体的功能。Android的各种库一般是以系统中间件的形式提供的,它们均有的一个显著特点就是与移动设备的平台的应用密切相关。Android运行环境主要是指虚拟机技术——Dalvik。Dalvik虚拟机和一般JAVA虚拟机(JavaVM)不同,它执行的不是JAVA标准的字节码(Bytecode),而是Dalvik可执行格式(.dex)中执行文件。在执行的过程中,每一个应用程序即一个进程(Linux的一个Process)。二者最大的区别在于JavaVM是基于栈的虚拟机(Stack-based),而Dalvik是基于寄存器的虚拟机(Register-based)。显然,后者最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备的特点。1.4.3应用程序Android的应用程序(Application)主要是用户界面(UserInterface)方面的,通常以Java程序编写,其中还可以包含各种资源文件(放置在res目录中)。Java程序及相关资源经过编译后,将生成一个APK包。Android本身提供了主屏幕(Home)、联系人(Contact)、电话(Phone)、浏览器(Brower)等众多的核心应用。同时应用程序的开发者还可以使用应用程序框架层的API实现自己的程序。这也是Android开源的巨大潜力的体现。1.4.4应用程序框架Android的应用程序框架(ApplicationFramework)为应用程序层的开发者提供API,它实际上是一个应用程序的框架。由于上层的应用程序是以Java构建的,因此本层次提供的首先包含了UI程序中所需要的各种控件,例如View(视图组件),其中又包括了List(列表)、Grid(栅格)、TextBox(文本框)、Button(按钮)等,甚至一个嵌入式的Web浏览器。一个基本的Andoid应用程序,可以使用应用程序框架中的如下部分。●Activity(活动)。●BroadcastIntentReceiver(广播意图接收者)。●Service(服务)。●ContentProvider(内容提供者)。●IntentandIntentFilter(意图和意图过滤器)。1.5开源的问题我们都知道Android是基于Linux内核的,因为一直以来Linux是开源的,所以基于Linux内核的Android也号称开源,所以一经推出后就受到了广大程序员和手机厂商的青睐。但是在开源方面Android“半遮半掩”,具体原因得从Android的发展历史谈起。1.5.1雾里看花的开源在Android刚被推出的时候,只能用Java语言开发应用程序,这就需要所有的应用程序都运行在一个巨大的虚拟机上。在2009年6月,Android发布了NDK工具包,这样就可以支持C/C++语言编程,但是性能不如SKD工具包中的Java语言。2010年2月,LinuxKernel的维护者GregKroah-Hartman宣布,将Android代码从LinuxKernel代码库中删除,此事对于普通用户可能并没有什么影响,但对于开发者,尤其是开源社区的开发者来说,算是一颗重磅炸弹。消息公布以后,外界普遍觉得惊讶和可惜。好不容易,才有了一个这么受欢迎的开源手机系统,应该齐心协力共同开发才对,为什么要“窝里斗”呢?到底是什么矛盾,使得LinuxKernel小组剔除Android代码呢?从Linux2.6.33版本开始,Google智能手机操作系统Android核心代码全部被删除。这是因为提倡开源的Android在Linux面前使用了雾里看花的把戏,它修改了Kernel内核,但是又不提供修改的细节,这相当于自己搞了一个封闭的系统。尽管Android取得了空前的成功,但是Google也放弃了构建一个真正开源的手机系统的机会,从而也就不能获得由全世界程序员提供智慧、分享代码和推动创新的好处。由此可见,是因为Android的不真正开源,所以才被从Linux体系中删除。Android与Ubuntu、Debian、Redhat等传统的Linux发行版相比,只有系统的底层结构是一样的,而其他东西在Android中都不一样,尤其是程序员的编程接口是完全不同的。所以必须重新写Android应用程序后才能使用,现存的Linux程序无法移植上去。由此可见,Android是一种全新的系统,它与Linux的距离有很远。1.5.2从选择Java开始谈为什么不开源驱动程序(1)使用Java的好处。Android很好地解决了长期令手机制造商头痛不已的问题:在业界缺乏一个开源的Java虚拟机和统一的应用程序接口。使用Android后,程序员只要编写一次程序就可以用在各种手机硬件平台之上。这就是Android应用程序使用Java语言开发的原因,因为如果不这样做的话,无法让程序实现和硬件无关。可能很多熟知Linux的读者会反问:传统的Linux系统也不依赖特定的硬件,只要把源代码根据不同的平台分别编译,同一个程序就可以在不同的硬件架构、不同的Linux发行版中使用。那么Android只采用Kernel、只允许用Java编程的真正原因到底是什么呢?(2)为什么驱动不开源。LinuxKernel的版权是GPL。在此版本下,硬件厂商都希望自己的硬件能在LinuxKernel下运行,此时就必须使用驱动程序。但是如果把驱动程序的源码公开,就等于公开硬件规格,这是广大硬件厂商所不能接受的。所以硬件厂商只提供编好的驱动程序,而不提供原始码。Android的重点是商业应用,为了解决上述驱动开源的问题,Google采用了自己的方法来绕过这个问题。Google把驱动程序移到“userspace”中,即让驱动程序在LinuxKernel上面运行,而不是一起运行,这样就可以避过GPL规则。然后在Kernel开一个小门,让本来不能直接控制到硬件的“userspace”程序也可以碰得到,此时只需公布这个开的“小门”程序源码即可。由此可见,Google在Kernel和应用程序之间设计了一个中间层,这样既不违反GPL许可,又能不让外界看到厂商的硬件驱动和应用程序的源码。(3)带来的问题。但是Google的上述做法随之带来了一个问题,Kernel和Android采取不同的许可证,Kernel采用GPL许可证,而Android采用ApacheSoftwareLicense(简称ASL)许可证。在GPL许可证中规定,对源码的任何修改都必须开源,所以Android需要开源,因为它修改了Kernel。而在ASL许可证中规定,用户可以随意使用源码而不必开源,所以建立在Android之上的硬件驱动和应用程序都可以保持封闭。这种封闭得到了更多硬件厂商的支持,Google特意修改了Kernel,使得原本应该包括在Kernel中的某些功能都被转移到了“userspace”中,所以就避开了开源。(4)影响。Google的上述行为有利于推广Android,并且可以吸引更多厂商和软件开发商的加入,但是同时也宣布放弃了构建一个真正开源的手机系统的机会。所有为Android写的硬件驱动都不能合并到Kernel中,因为它们只在Google的代码里才有效,而在Kernel里根本没法用。1.5.3对驱动开发者的影响所有为Android写的硬件驱动都不能合并到Kernel中。这些驱动程序只能在Google代码中有效,而在Kernel中根本没法用。正是因为这个原因,Google从不把大量的硬件驱动程序和平台源码提交给Kernel。既然硬件厂商都不开源驱动代码,对于我们生存在Android底层的开发人员,特别是从事驱动开发的成员来说,就带来了巨大的就业机会。我们可以为硬件厂商开发不开源的驱动程序而获得报酬,为此随着Android的异常火爆,市面上有很多企业在招聘Android驱动开发人员。由此可见,驱动的不开源给我们的学习带来了难题,但同样也为以后的就业机会增加了砝码。第2章简要分析Linux内核Android系统是基于Linux内核的,所以在学习Android底层开发之前,很有必要了解一些Linux内核的基本知识。在本章将简要讲解Linux内核的基础知识,特别是和Android系统密切相关的知识,为读者步入本书后面高级知识的学习打下基础。2.1Linux基础Linux是一类Unix计算机操作系统的统称,Linux操作系统也是自由软件和开放源代码发展中最著名的例子。严格来讲,Linux一词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。2.1.1Linux历史简介Linux最早是由一位名叫LinusTorvalds的计算机业余爱好者设计的,当时他是芬兰赫尔辛基大学的学生。他的目标是想设计一个代替Minix(是由一位名叫AndrewTannebaum的计算机教授编写的一个操作系统示教程序)的操作系统,这个操作系统可用于386、486或奔腾处理器的个人计算机上,并且具有Unix操作系统的全部功能,由此开始了Linux雏形的设计。1983年,理查德·马修·斯托曼(RichardStallman)创立了GNU计划(GNUProject)。这个计划的其中一个目标是为了发展一个完全免费自由的Unix-like操作系统。自20世纪90年代发起这个计划以来,GNU开始大量地产生或收集各种系统所必备的元件,像函式库(library)、编译器(compiler)、侦错工具(debugger)、文字编辑器(texteditor)、网页服务器(webserver),以及一个Unix的使用者接口(Unixshell)。1990年,GNU计划开始在马赫微核(Machmicrokernel)的架构之上开发系统核心,也就是所谓的GNUHurd,但是这个基于Mach的设计异常复杂,发展进度相对缓慢。2.1.2主要版本在当前市面中的主流Linux发行版本有Asianux,ArchLinux,B2DLinux,ConectivaLinux,DebianGNU/Linux,FedoraCore,GentooLinux,KnoppixLinux,LinuxFromScratch,MagicLinux,MandrivaLinux,RedHatLinux,SlackwareLinux,StanixLiveCD,SUSELinux,TurboLinux,UbuntuLinux.IPCop,NUtyx,DEFT,NETbsd,turbolinux。在国内主流的Linux发行版本有红旗Linux(RedflagLinux),QomoLinux,冲浪Linux(XteamLinux),蓝点Linux,新华Linux,共创Linux,百资Linux,veket,lucky8k-veket.OpenDesktop,HiweedGNU/Linux,MagicLinux,EngineeringComputingGNU/Linux,kylin,中标普华Linux,中软Linux,新华华镭Linux(RaysLX),CDLinux,MCLinux,即时Linux(Thizlinux),b2dlinux,IBOX,MCLOS,FANX,Everest,酷博linux,新氧Linux,Hiweed,雨林木风,DeepinLinux,宏碁Linux,PUDGNU/Linux。2.1.3Linux的发展机遇长久以来,在计算机操作系统领域,Windows、Netware和UNIX一直占据主导地位。但是最近几年发生了一些变化,以自由标榜自己的Linux越来越显示出其咄咄逼人的气势,正日益成为一个令人生畏的对手。据估计现在全球已有1000多万Linux用户,有31%的互联网服务器采用了Linux系统。Linux正在发起一项产业革命,逐渐吞噬着传统操作系统的市场份额。请回头看一看,看看我们平常使用的技术:嵌入式系统、移动计算、移动互联网工具、服务器、超级计算。在几乎每个技术领域,Linux正在展现出作为未来主导平台的势头。随着SaaS、云计算、虚拟化、移动平台、企业2.0等新兴技术的发展,Linux事业正面临巨大发展机遇。主要体现在如下3个方面。(1)向企业级核心应用迈进。Linux的采用已由网络领域逐步转向了关键业务应用,企业关键任务成为IBM的增长领域,比如ERP软件。同时,随着IT决策逐步从IT主管下放给IT管理人员,这些管理者对Linux显示了强烈的支持,但同时对安全、可用性与服务提出了更高的需求。尽管很多用户仍将Unix视为关键任务的平台,但随着Linux开发者逐步缩小两者的功能性差距,有越来越多的用户开始将关键业务部署在Linux之上。(2)Linux将主导移动平台。Linux进入到移动终端操作系统后,很快就以其开放源代码的优势吸引了越来越多的终端厂商和运营商对它的关注,包括摩托罗拉和NTTDoCoMo等知名的厂商。已经开发出的基于Linux的手机有摩托罗拉的zn5、V8、A1210、A810、A760、A768、A780、e680i、e680、e2、e680g、E6、E8、em30、CEC的e2800、三星的i519等。Linux与其他操作系统相比是个后来者,但Linux具有两个其他操作系统无法比拟的优势。其一,Linux具有开放的源代码,能够大大降低成本。其二,既满足了手机制造商根据实际情况有针对性地开发自己的Linux手机操作系统的要求,又吸引了众多软件开发商对内容应用软件的开发,丰富了第三方应用。(3)新技术为Linux加速。在目前的企业级计算领域,云计算、SaaS、虚拟化是热门技术话题。在这些领域,Linux同样大有可为。云计算将全部使用Linux,Linux也是一款未来运行数据中心虚拟机的理想操作系统。2.2Android和Linux的关系Linux和Android之间的关系密切,具体说来主要有如下3点。(1)Android采用Linux作为内核。(2)Android对Linux内核做了修改,目的是适应其在移动设备上的应用。(3)Andorid开始是作为Linux的一个分支,后来由于无法并入Linux的主开发树,已被Linux内核组从开发树中删除。2.2.1Android继承于LinuxAndroid是在Linux2.6的内核基础之上运行的,提供的核心系统服务包括安全、内存管理、进程管理、网络组和驱动模型等内容。内核部分还相当于介于硬件层和系统中其他软件组之间的一个抽象层次。但是严格来说它不算是Linux操作系统。因为Android内核是由标准的Linux内核修改而来的,所以很自然地继承了Linux内核的很多优点,并且保留了Linux内核的主题架构。Android本身有了很大的创新,按照移动设备的需求在文件系统、内存管理、进程间通信机制和电源管理方面进行了修改,根据需要添加了很多相关的驱动程序和必要的新功能。总而言之,Android很大程度地保留了Linux的基本架构,也正因为如此,Android的应用性和扩展性更强。当前Android版本对应的Linux内核版本如下所示。●Android1.5:Linux-2.6.27。●Android1.6:Linux-2.6.29。●Android2.0,2.1:Linux-2.6.29。●Android2.2:Linux-。●Android2.2:Linux-2.6.36。2.2.2Android和Linux内核的区别Android系统的系统层面的底层是基于Linux内核,中间加上了一个叫做Dalvik的Java虚拟机,表面层上面是Android运行库。每个Android应用都运行在自己的进程上,享有Dalvik虚拟机为它分配的专有实例。为了支持多个虚拟机在同一个设备上高效运行,Dalvik被谷歌工程师们改写了。Dalvik虚拟机执行的是Dalvik格式的可执行文件.dex。该格式经过了专门的优化处理,目的是将内存耗用降到最低。Java编译器将Java源文件转为class文件,class文件又被内置的dx工具转化为dex格式文件,这种文件在Dalvik虚拟机上注册并运行。由此可见,Android系统的应用软件都是运行在Dalvik之上的Java软件,而Dalvik是运行在Linux中的,在一些底层功能——比如线程和低内存管理方面,Dalvik虚拟机是依赖Linux内核的。综上所述可以得出一个结论:Android是运行在Linux之上的操作系统,但是它本身不能算是Linux的某个版本。Android内核和Linux内核的差别主要体现在下面的11个方面。(1)AndroidBinder。AndroidBinder是基于OpenBinder框架的一个驱动,用于提供Android平台的进程间通信(IPC,inter-processcommunication)。原来的Linux系统上层应用的进程间通信主要是D-bus(desktopbus),采用消息总线的方式来进行IPC。其源代码位于drivers/staging/android/binder.c。(2)Android电源管理(PM)。Android电源管理是一个基于标准Linux电源管理系统的轻量级的Android电源管理驱动,针对嵌入式设备做了很多优化。利用锁和定时器来切换系统状态,控制设备在不同状态下的功耗,以达到节能的目的。其源代码分别位于如下文件。●kernel/power/earlysuspend.c。●kernel/power/consoleearlysuspend.c。●kernel/power/fbearlysuspend.c。●kernel/power/wakelock.c。●kernel/power/userwakelock.c。(3)低内存管理器(LowMemoryKiller)。Android中的低内存管理器和Linux标准的OOM(OutOfMemory)相比,其机制更加灵活,它可以根据需要杀死进程来释放需要的内存。低内存管理器的代码很简单,关键的一个函数是Lowmem_shrinker。作为一个模块在初始化时调用register_shrinke注册了一个lowmem_shrinker,它会被vm在内存紧张的情况下调用。Lowmem_shrinker完成具体操作。简单说就是寻找一个最合适的进程杀死,从而释放它占用的内存。其源代码位于drivers/staging/android/lowmemorykiller.c。(4)匿名共享内存(Ashmem)。匿名共享内存为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。如果一个程序尝试访问Kernel释放的一个共享内存块,它将会收到一个错误提示,然后重新分配内存并重载数据。其源代码位于mm/ashmem.c。(5)AndroidPMEM(Physical)。PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。驱动中提供了mmap,open,release和ioctl等接口。源代码位于drivers/misc/pmem.c。(6)AndroidLogger。AndroidLogger是一个轻量级的日志设备,用于抓取Android系统的各种日志,是Linux所没有的。其源代码位于drivers/staging/android/logger.c。(7)AndroidAlarm。AndroidAlarm提供了一个定时器用于把设备从睡眠状态唤醒,同时它也提供了一个即使在设备睡眠时也会运行的时钟基准。其源代码位于下面的两个文件。●drivers/rtc/alarm.c。●drivers/rtc/alarm-dev.c。(8)USBGadget驱动。此驱动是一个基于标准LinuxUSBgadget驱动框架的设备驱动,Android的USB驱动是基于gadget框架的。其源代码位于如下文件。●drivers/usb/gadget/android.c。●drivers/usb/gadget/f_adb.c。●drivers/usb/gadget/f_mass_storage.c。(9)AndroidRamConsole。为了提供调试功能,Android允许将调试日志信息写入一个被称为RAMConsole的设备里,它是一个基于RAM的Buffer。其源代码位于drivers/staging/android/ram_console.c。(10)Androidtimeddevice。Androidtimeddevice提供了对设备进行定时控制功能,目前仅仅支持vibrator和LED设备。其源代码位于drivers/staging/android/timed_output.c(timed_gpio.c)。(11)Yaffs2文件系统。在Android系统中,采用Yaffs2作为MTDnandflash文件系统。Yaffs2是一个快速稳定的应用于NAND和NORFlash的跨平台的嵌入式设备文件系统。同其他Flash文件系统相比,Yaffs2使用更小的内存来保存其运行状态,因此它占用内存小;Yaffs2的垃圾回收非常简单而且快速,因此能达到更好的性能;Yaffs2在大容量的NANDFlash上性能表现尤为明显,非常适合大容量的Flash存储。其源代码位于fs/yaffs2/目录下。Android是在Linux2.6的内核基础之上运行的,提供的核心系统服务包括安全、内存管理、进程管理、网络组和驱动模型等内容。内核部分还相当于介于硬件层和系统中其他软件组之间的一个抽象层次。但是严格来说它不算是Linux操作系统。2.3Linux内核简介既然Android内核与Linux内核有密切的联系,所以在学习Android底层驱动开发之前,很有必要了解Linux内核的基本知识。本节将简要介绍Linux内核的基本应用知识,为读者步入本书后面高级知识的学习打下基础。2.3.1内核的体系结构图2-1显示了一个完整Linux系统的最基本的视图,由此可见内核的作用就是将应用程序和硬件分离开来。▲图2-1Linux操作系统的基本视图内核的主要任务是负责与计算机硬件进行交互,实现对硬件的编程控制和接口操作,调度对硬件资源的访问。内核为用户应用程序提供了一个高级的执行环境和访问硬件的虚拟接口。提供硬件的兼容性是内核的设计目标,几乎所有的硬件都可以得到Linux的支持,只要不是为其他操作系统所定制的就可以。与硬件兼容性相关的是可移植性,即在不同的硬件平台上运行Linux的能力。从最初只支持标准IBM兼容机上的IntelX86架构到现在可以支持Alpha、ARM、MIPS、PowerPC等硬件平台。再看图2-2所示的Linux操作系统的基本视图。▲图2-2Linux操作系统的基本视图由图2-2可以得出Linux内核分为如下两部分。(1)体系相关部分:这部分内核为体系结构和硬件所特有。(2)体系无关部分:这部分内核是可移植的。体系无关部分通常会定义与体系相关部分的接口,这样,内核向新的体系结构移植的过程就变成确认这些接口的特性并将它们加以实现的过程。用户应用程序和内核之间的联系是通过标准C库来实现,标准C库是应用程序和内核之间的中间层。标准C库函数是建立在内核提供的系统调用基础之上的,通过此C库以及内核体系无关部分与体系相关部分的接口,使用户应用程序和部分内核都成为可移植的。根据上述描述,可以得出Linux操作系统的标准视图。具体如图2-3所示。▲图2-3Linux系统的标准视图上述视图中的主要构成模块的具体说明如下所示。(1)系统调用接口。为了与用户应用程序进行交互,内核提供了一组系统调用接口,通过这组接口,应用程序可以访问系统硬件和各种操作系统资源。系统调用接口层在用户应用程序和内核之间添加了一个中间层,形象地说,它扮演了一个函数调用多路复用和多路分解器的角色。(2)进程管理。进程管理负责创建和销毁进程,并处理它们之间的互相联系(进程间通信),同时负责安排调度它们去分享CPU。进程管理部分实现了一个进程世界的抽象,这个进程世界类似于我们的人类世界,只不过我们人类世界里的个体是人,而在进程世界里则是一个一个的进程,人与人之间通过书信、手机、网络等进行交互,而各个进程之间则是通过不同方式的进程间通信,我们所有人都在分享同一个地球,而所有进程都在分享一个或多个CPU。(3)内存管理。在进程世界里,内存是重要的资源之一,就好比我们的土地。因此,管理内存的策略与方式是决定系统性能的一个关键因素。内核的内存管理部分根据不同的需要,提供了包括malloc/free在内的许多简单或者复杂的接口,并为每个进程都提供了一个虚拟的地址空间,基本上实现虚拟内存对进程的按需分配。(4)虚拟文件系统。虚拟文件系统为用户空间提供了文件系统接口,同时又为各个具体的文件系统提供了通用的接口抽象。在VFS上面,是对诸如open、close、read和write之类函数的一个通用API抽象,在VFS下面则是具体的文件系统,它们定义了上层函数的实现方式。通过虚拟文件系统,我们可以利用标准的Linux文件系统调用对不同介质上的不同文件系统进行操作。应该说,VFS是内核在各种具体的文件系统上建立的一个抽象层,它提供了一个通用的文件系统模型,而该模型囊括了我们所能想到的所有文件系统的行为。(5)网络功能。网络子系统处理数据包的收集、标识、分发,路由和地址的解析等所有网络有关的操作。socket层是网络子系统的标准API,它为各种网络协议提供了一个用户接口。(6)设备驱动程序。操作系统的目的是为用户提供一种方便访问硬件的途径,因此,几乎每一个系统操作最终都会映射到物理的硬件设备上。除了CPU、内存等有限的几个对象,所有设备的访问控制操作都要由相关的代码来完成,这些代码就是所谓的设备驱动程序。(7)代码。这里的代码需要依赖体系结构,因为部分内核代码是体系相关的,在“./linux/arch”子目录中定义了内核源代码中依赖于体系结构的部分,其中包含了对应各种特定体系结构的子目录。比如,对于一个典型的桌面系统来说,使用的是i386目录。每个特定体系结构对应的子目录又包含了很多下级子目录,分别关注内核中的一个特定方面,比如引导、内核、内存管理等。2.3.2和Android相关的Linux内核知识我们知道,Android是建立在Linux2.6的内核基础之上运行的,提供的核心系统服务包括安全、内存管理、进程管理、网络组和驱动模型等内容。接下来将简要讲解上述核心系统服务的基本知识。1.安全关于Linux安全的知识主要涉及用户权限问题和目录权限问题。(1)Linux系统中用户和权限。Linux系统中的每个文件和目录都有访问权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。Linux系统中规定了文件3种不同类型的用户:文件拥有者用户(user)、同组用户(group)、可以访问系统的其他用户(others)。并规定3种访问文件或目录的方式:读(r)、写(w)、可执行或查找(x)。(2)文件及目录权限的功能。读权限(r)表示只允许指定用户读取相应文件的内容,禁止对它做任何的更改操作,如目录读权限表示可以列出存储在该目录下的文件,即读目录内容。写权限(w)表示允许指定用户打开并修改文件,如目录写表示允许你从目录中删除或创建文件或目录。执行权限(x)表示允许指定用户将该文件作为一个程序执行,如对目录表示允许你在目录中查找,并能用cd命令将工作目录切换到该目录。Linux系统在创建文件的时候会自动把该文件的读写权限分配给其属主,使用户能够显示和修改该文件。也可以将这些权限改变为其他的组合形式。一个文件若有执行权限,则允许它作为一个程序被执行。2.内存管理内存管理是计算机编程最为基本的领域之一。在很多脚本语言中,我们不必担心内存是如何管理的,这并不能使内存管理的重要性有一点点降低。对实际编程来说,理解内存管理器的能力与局限性至关重要。在大部分系统语言中必须进行内存管理,例如C和C++。追溯到在AppleII上进行汇编语言编程的时代,那时内存管理还不是个大问题。实际上在运行整个系统,系统有多少内存我们就有多少内存。我们甚至不必费心思去弄明白它有多少内存,因为每一台机器的内存数量都相同。所以,如果内存需要非常固定,那么您只需要选择一个内存范围并使用它即可。但是即使是在这样一个简单的计算机中也会有问题,尤其是当我们不知道程序的每个部分将需要多少内存时。如果我们的空间有限,而内存需求是变化的,那么需要用一些方法来满足下面的需求。(1)确定您是否有足够的内存来处理数据。(2)从可用的内存中获取一部分内存。(3)向可用内存池(pool)中返回部分内存,以使其可以由程序的其他部分或者其他程序使用。实现上述需求的程序库称为分配程序(allocator),因为它们负责分配和回收内存。程序的动态性越强,内存管理就越重要,您的内存分配程序的选择也就更重要。让我们来了解可用于内存管理的不同方法,它们的好处与不足,以及它们最适用的情形。3.进程管理在Linux操作系统中包括了三种不同类型的进程,分别是交互进程、批处理进程和守护进程。每种进程都有自己的特点和属性。交互进程是由一个Shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。批处理进程和终端没有联系,是一个进程序列。系统守护进程是Linux系统启动时启动的进程,并在后台运行。Linux管理进程的最好方法就是使用命令行下的系统命令。Linux下面的进程涉及的命令有如ps、kill、pgrep等工具。(1)父进程和子进程。父进程和子进程的关系是管理和被管理的关系,当父进程终止时,子进程也随之而终止。但子进程终止,父进程并不一定终止。比如httpd服务器运行时,我们可以杀掉其子进程,父进程并不会因为子进程的终止而终止。在进程管理中,当我们发现占用资源过多,或无法控制的进程时,应该杀死它,以保护系统的稳定安全运行。(2)进程命令。在Linux中,通过命令来管理和操作进程,其中常用的命令可以分为如下几类。监视进程命令。●ps(processstatus命令)用于显示瞬间进程(process)的动态,其使用方式如下所示。ps的参数非常多,常用参数的具体说明如下所示。-A:列出所有的进程。-w:显示加宽,可以显示较多的资讯。-au:显示较详细的资讯。-aux:显示所有包含其他使用者的进程。●pstree命令,其功能是将所有进程以树状图显示,树状图将会以pid(如果有指定)或是以init这个基本进程为根(root),如果有指定使用者id,则树状图会只显示该使用者所拥有的进程。其使用方式如下所示。常用参数的具体说明如下所示。-a:显示该进程的完整指令及参数,如果是被记忆体置换出去的进程则会加上括号。-c:如果有重覆的进程名,则分开列出(预设值时会在前面加上*)。●rop命令用于实时显示process的动态,其使用方式如下所示。常用参数的具体说明如下所示。d:改变显示的更新速度,或是在交谈式指令列(interactivecommand)按s。q:没有任何延迟的显示速度,如果使用者是有superuser的权限,则top将会以最高的优先序执行。c:切换显示模式,共有两种模式,一种是只显示执行档的名称,另一种是显示完整的路径与名称。S:累积模式,会将已完成或消失的子进程(deadchildprocess)的CPUtime累积起来。s:安全模式,将交谈式指令取消,避免潜在的危机。i:不显示任何闲置(idle)或无用(zombie)的进程。n:更新的次数,完成后将会退出top。b:批次档模式,搭配“n”参数一起使用,可以用来将top的结果输出到档案内。控制进程命令。向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号,系统内核就可以对进程标识号指定的进程进行操作。例如在top命令中会看到系统运行的许多进程,有时就需要使用kill中止某些进程来提高系统资源。在安装和登录命令中使用多个虚拟控制台的作用是,当一个程序出错造成系统死锁时可以切换到其他虚拟控制台工作关闭这个程序。此时使用的命令就是kill,因为kill是大多数Shell内部命令可以直接调用的。在Linux系统中,使用kill命令来控制进程。kill可以删除执行中的程序或工作,可以将指定的信息送至程序,预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或jobs指令查看。有如下两种使用kill命令的方式。各个参数的具体说明如下所示。-l<信息编号>:如果不加<信息编号>选项,则-l参数会列出全部的信息名称。-s<信息名称或编号>:指定要送出的信息。注意进程是Linux系统中一个非常重要的概念。Linux是一个多任务的操作系统,系统上经常同时运行着多个进程。我们不关心这些进程究竟是如何分配的,或者是内核如何管理分配

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论