




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- DB23-T2841-2021-政務信息資源目錄第3部分:編制指南-黑龍江省
- 廚房安全檢查管理制度
- 工業企業采購管理制度
- 泵站搬遷方案(3篇)
- 電梯困人賠償方案(3篇)
- 兒童快樂之家管理制度
- 小學教學教具管理制度
- 商貿公司物流管理制度
- 小區設施秩序管理制度
- 危險運輸公司管理制度
- 各種奶茶配方資料
- 120與急診交接流程
- 《中國政法大學》課件
- 2024-2030年中國高效節能無基礎空壓機商業計劃書
- 《蛇咬傷的急診處理》課件
- 2023-2024學年廣東省深圳市龍崗區八年級(下)期末歷史試卷
- 《電氣與PLC控制技術》課件-三相異步電動機順序起動逆序停止PLC控制
- 【MOOC】健康傳播:基礎與應用-暨南大學 中國大學慕課MOOC答案
- 璞泰來公司成本費用核算制度優化設計
- 麻醉科建設發展規劃
- 木工工程分包合同模版
評論
0/150
提交評論