ARM嵌入式LINUX應(yīng)用程序設(shè)計_第1頁
ARM嵌入式LINUX應(yīng)用程序設(shè)計_第2頁
ARM嵌入式LINUX應(yīng)用程序設(shè)計_第3頁
ARM嵌入式LINUX應(yīng)用程序設(shè)計_第4頁
ARM嵌入式LINUX應(yīng)用程序設(shè)計_第5頁
已閱讀5頁,還剩591頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

ARM嵌入式LINUX應(yīng)用

程序設(shè)計課程介紹嵌入式程序設(shè)計是嵌入式系統(tǒng)概論后修課程。該課程基于ARM+linux硬軟件平臺進行程序開發(fā),具體的開發(fā)平臺是EDUK4;該課程重點是在掌握嵌入式系統(tǒng)開發(fā)流程的基礎(chǔ)上,搭建嵌入式交叉編譯平臺,實現(xiàn)基于平臺的基本應(yīng)用程序設(shè)計,接口驅(qū)動程序設(shè)計和高級應(yīng)用程序設(shè)計。2023/2/12教材弓雷.ARM嵌入式Linux系統(tǒng)開發(fā)詳解(第2版).清華大學(xué)出版社.2014,2.2023/2/13參考資料基于S3C2410嵌入式Linux開發(fā)實驗與實踐,實驗開發(fā)平臺的實驗指導(dǎo)書,深圳市英蓓特信息技術(shù)有限公司從實踐中學(xué)嵌入式LINUX應(yīng)用程序設(shè)計,華清遠見嵌入式學(xué)院,培訓(xùn)規(guī)劃教材ARM嵌入式linux培訓(xùn)班視頻教學(xué)(14.4G)深入LINUX設(shè)備驅(qū)動程序內(nèi)核機制嵌入式linux系統(tǒng)工程師培訓(xùn)標(biāo)準(zhǔn)教材2023/2/14第1章LINUX開發(fā)基礎(chǔ)2023/2/15內(nèi)容摘要Linux的誕生與發(fā)展Linux的內(nèi)核結(jié)構(gòu)Linux存儲管理Linux進程管理Linux內(nèi)核啟動與初始化進程2023/2/16Linux的誕生與發(fā)展2023/2/17UNIX操作系統(tǒng)是美國貝爾實驗室于1969年夏在DECPDP-7小型計算機上開發(fā)的一個分時操作系統(tǒng)Linux操作系統(tǒng)的誕生、發(fā)展和成長過程始終依賴著以下五個重要支柱:MINIX系統(tǒng)是由AndrewS.Tanenbaum(AST)1987年開發(fā)的,主要用于學(xué)生學(xué)習(xí)操作系統(tǒng)原理GNU計劃旨在開發(fā)一個類似Unix、并且是自由軟件的完整操作系統(tǒng):GNU系統(tǒng)。POSIX可移植操作系統(tǒng)接口標(biāo)準(zhǔn)是由IEEE開發(fā)的,由ISO/IEC標(biāo)準(zhǔn)化的一簇標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)是基于現(xiàn)有的UNIX實踐和經(jīng)驗,描述了操作系統(tǒng)的調(diào)用服務(wù)接口,用于保證編制的應(yīng)用程序可以在源代碼一級上在多種操作系統(tǒng)上移植運行。如果沒有Internet網(wǎng),沒有遍布全世界的無數(shù)計算機黑客通過網(wǎng)絡(luò)的無私奉獻,那么Linux絕對不可能發(fā)展到現(xiàn)在的水平。Linux的誕生與發(fā)展從Linux誕生開始,Linux內(nèi)核就從來沒有停止過升級,從0.02版本到1999年具有里程碑意義的2.2版本,一直到我們現(xiàn)在看到的4.0版本。2023/2/18Linux內(nèi)核版本有兩種:--穩(wěn)定版和開發(fā)版Linux內(nèi)核的命名機制:

num.num.num--第一個數(shù)字是主版本號--第二個數(shù)字是次版本號--第三個數(shù)字是修訂版本號從未停止過升級Linux的應(yīng)用領(lǐng)域2023/2/19服務(wù)器桌面系統(tǒng)嵌入式應(yīng)用LinuxLinux嵌入式系統(tǒng)開發(fā)平臺2023/2/110系統(tǒng)軟件平臺系統(tǒng)硬件平臺嵌入式Linux系統(tǒng)需要下面三個基本元素:系統(tǒng)引導(dǎo)工具——用于機器加電后的系統(tǒng)定位引導(dǎo)。Linux微內(nèi)核——內(nèi)存管理、程序管理。始化進程

但如果要它成為完整的操作系統(tǒng)并且繼續(xù)保持小型化,還必須加上硬件驅(qū)動程序、硬件接口程序和應(yīng)用程序組。選定硬件平臺前,首先要確定系統(tǒng)的應(yīng)用功能和所需要的速度,并制定好外接設(shè)備和接口標(biāo)準(zhǔn)。這樣才能準(zhǔn)確地定位所需要的硬件方案,得到性價比最高的系統(tǒng)。應(yīng)用功能速度1外接設(shè)備接口標(biāo)準(zhǔn)2+=性價比第1節(jié)Linux操作系統(tǒng)概述2023/2/111建立交叉開發(fā)環(huán)境交叉編譯和鏈接交叉調(diào)試系統(tǒng)測試建立交叉開發(fā)環(huán)境2023/2/112商業(yè)類型ARMSoftwareDevelopmentToolkitSDSCrosscompiler

MetrowerksCodeWarrior交叉開發(fā)環(huán)境GNU工具鏈交叉開發(fā)環(huán)境是指編譯、鏈接和調(diào)試嵌入式應(yīng)用軟件的環(huán)境。它與運行嵌入式應(yīng)用軟件的環(huán)境有所不同,通常采用宿主機/目標(biāo)機模式。常用的交叉開發(fā)環(huán)境主要有開放和商業(yè)兩種類型。開放的交叉開發(fā)環(huán)境的典型代表是GNU工具鏈。開放類型交叉編譯和鏈接在完成嵌入式軟件的編碼之后,就是進行編譯和鏈接,以生成可執(zhí)行代碼。由于開發(fā)過程大多是在Intel公司x86系列CPU的通用計算機上進行的,而目標(biāo)環(huán)境的處理器芯片卻大多為ARM、MIPS、PowerPC、DragonBall等系列的微處理器這就要求在建立好的交叉開發(fā)環(huán)境中進行交叉編譯和鏈接。2023/2/113建立交叉開發(fā)環(huán)境交叉編譯和鏈接交叉調(diào)試系統(tǒng)測試交叉調(diào)試2023/2/114硬件調(diào)試:如果不采用在線仿真器,可以讓CPU直接在其內(nèi)部實現(xiàn)調(diào)試功能,并通過在開發(fā)板上引出的調(diào)試端口,發(fā)送調(diào)試命令和接收調(diào)試信息,完成調(diào)試過程。軟件調(diào)試:在Linux內(nèi)核中設(shè)置一個調(diào)試樁用作調(diào)試過程中和宿主機之間的通信服務(wù)器。然后在宿主機中通過調(diào)試器的串口與調(diào)試樁進行通信應(yīng)用軟件的調(diào)試:

嵌入式上層應(yīng)用軟件的調(diào)試可以使用本地調(diào)試和遠程調(diào)試兩種方法。

嵌入式

Linux交叉調(diào)試系統(tǒng)測試2023/2/115

測試技術(shù)指的是軟件測試的專門途徑,以及能夠更加有效地運用這些途徑的特定方法。在嵌入式軟件測試中,常常要在基于目標(biāo)機的測試和基于宿主機的測試之間做出折衷?;谀繕?biāo)機的測試需要消耗較多的時間和經(jīng)費,而基于宿主機的測試雖然代價較小,畢竟是在仿真環(huán)境中進行的。嵌入式軟件測試中經(jīng)常用到的測試工具:內(nèi)存分析工具性能分析工具覆蓋分析工具缺陷跟蹤工具嵌入式Linux面臨的挑戰(zhàn)2023/2/116Linux的實時擴充性改變Linux內(nèi)核體系結(jié)構(gòu)完善Linux的集成開發(fā)環(huán)境123Solution

擴展Linux的實時性能向外擴展向上擴展Linux的內(nèi)核體系采用的是

Monolithic內(nèi)核體系結(jié)構(gòu)

Microkernel一個完整的嵌入式系統(tǒng)的集成開發(fā)環(huán)境一般需要提供的工具是:編譯/連接器內(nèi)核調(diào)試/跟蹤器集成圖形界面開發(fā)平臺編輯器調(diào)試器軟件仿真器監(jiān)視器整體集成開發(fā)環(huán)境還有待提高和完善嵌入式Linux的發(fā)展及應(yīng)用前景由于Linux具有對各種設(shè)備的廣泛支持性,因此,能方便地應(yīng)用于機頂盒、IA設(shè)備、PDA、掌上電腦、WAP手機、尋呼機、車載盒以及工業(yè)控制等智能信息產(chǎn)品中。與PC相比,手持設(shè)備、IA設(shè)備以及信息家電的市場容量要高得多,而Linux嵌入式系統(tǒng)的強大的生命力和利用價值,使越來越多的企業(yè)和高校表現(xiàn)出對它極大的研發(fā)熱情。Linux嵌入式操作系統(tǒng)所具有的技術(shù)優(yōu)勢和獨特的開發(fā)模式給業(yè)界以新異,有理由相信,它能成為Internet時代嵌入式操作系統(tǒng)中的最強音。2023/2/117Linux內(nèi)核特點2023/2/118Linux內(nèi)核編程容易可移植性可量測性模塊化穩(wěn)定性和可靠性安全性標(biāo)準(zhǔn)化和互用性完善的網(wǎng)絡(luò)支持Linux內(nèi)核既能支持32位體系結(jié)構(gòu)又能支持64位體系結(jié)構(gòu)。Linux內(nèi)核全部源代碼是遵守GPL軟件許可的免費軟件開發(fā)者可以免費得到社區(qū)的貢獻、支持、檢查代碼和測試。驅(qū)動程序可以免費發(fā)布給其他人,可以靜態(tài)編譯進內(nèi)核。以源碼形式發(fā)布驅(qū)動程序,可以不必為每一個內(nèi)核版本和補丁版本都提供二進制的程序Linux內(nèi)核的組成2023/2/119進程調(diào)度程序(SCHED)負(fù)責(zé)控制進程訪CPU。保證進程能夠公平地訪問CPU,同時保證內(nèi)核可以準(zhǔn)時執(zhí)行一些必需的硬件操作;內(nèi)存管理程序(MM)使多個進程可以安全地共享機器的主存系統(tǒng),并支持虛擬內(nèi)存;虛擬文件系統(tǒng)(VFS)通過提供一個所有設(shè)備的公共文件接口,VFS抽象了不同硬件設(shè)備的細(xì)節(jié)。此外,VFS支持與其他操作系統(tǒng)兼容的不同的文件系統(tǒng)格式;網(wǎng)絡(luò)接口(NET)提供對許多建網(wǎng)標(biāo)準(zhǔn)和網(wǎng)絡(luò)硬件的訪問;進程間通信(IPC)子系統(tǒng)為進程與進程之間的通信提供了一些機制。這5部分之間是相互依賴的關(guān)系存儲管理2023/2/120內(nèi)存管理任務(wù)屏蔽各種硬件的內(nèi)存結(jié)構(gòu)并向上層返回統(tǒng)一的訪問界面頁式存儲管理機制每個頁面的大小隨處理機芯片而異支持虛擬內(nèi)存

硬件無關(guān)部分進程的映射和邏輯內(nèi)存的對換硬件相關(guān)部分為內(nèi)存管理硬件提供了虛擬接口分類頁表每個進程保留一張頁表,用于將本進程空間中的虛擬地址變換成物理地址。進程調(diào)度2023/2/121當(dāng)需要選擇下一個進程運行時,由調(diào)度程序選擇最值得運行的進程,依據(jù)每個進程的task_struct結(jié)構(gòu)policypriorityrt-prioritycounter

policy是進程的調(diào)度策略兩類Linux進程:普通進程與實時進程實時進程的優(yōu)先級高于其他進程

priority是調(diào)度管理器分配給進程的優(yōu)先級

是進程允許運行的時間rt_priority用于實時進程間的選擇

調(diào)度器使用這個域給每個實時進程一個相對優(yōu)先級可以通過系統(tǒng)調(diào)用來改變實時進程的優(yōu)先級。counter是進程剩余的時間片內(nèi)核源代碼目錄結(jié)構(gòu)2023/2/122documentationscriptslibnetfskernelipcdriversmminitincludearch內(nèi)核源代碼目錄結(jié)構(gòu)Linux存儲管理2023/2/123進程虛存空間的管理虛存空間的映射和虛存區(qū)域的建立

Linux的分頁式存儲管理物理內(nèi)存空間的管理內(nèi)存的分配與釋放內(nèi)存分配與釋放的數(shù)據(jù)結(jié)構(gòu)內(nèi)存分配函數(shù)kmalloc()虛擬內(nèi)存的申請和釋放進程虛存空間的管理2023/2/124每一個進程,用一個mm-struct結(jié)構(gòu)體來定義它的虛存用戶區(qū)。

mm_struct結(jié)構(gòu)體首地址在任務(wù)結(jié)構(gòu)體task-struct成員項mm中:structmm-struct*mm。Linux的存儲管理主要是管理進程虛擬內(nèi)存的用戶區(qū)Linux操作系統(tǒng)采用了請求式分頁存儲管理方法。系統(tǒng)為每個進程提供4GB的虛擬內(nèi)存空間。各個進程的虛擬內(nèi)存彼此獨立。進程運行時能訪問的存儲空間只是它的虛擬內(nèi)存空間。對當(dāng)前該進程而言只有屬于它的虛擬內(nèi)存是可見的。mm_struct結(jié)構(gòu)定義在/include/linux/schedul.h中進程虛存空間的管理2023/2/125structmm_struct{intcount;pgd_t*pgd;unsignedlongcontext;unsignedlongstart_code,end_code,start_data,end_data;unsignedlongstart_brk,brk,start_stack,start_mmap;unsignedlongarg_start,arg_end,env_start,env_end;unsignedlongrss,total_vm,locked_vm;unsignedlongdef_flags;structvm_area_struct*mmap;structvm_area_struct*mmap_avl;structsemaphoremmap_sem;};mm_struct結(jié)構(gòu)定義在/include/linux/schedul.h中進程虛存空間的管理2023/2/126structvm_area_struct{structmm_struct*vm_mm;unsignedlongvm_start;unsignedlongvm_end;pgprot_tvm_page_prot;unsignedshortvm_flags;shortvm_avl_height;structvm_area_struct*vm_avl_left;structvm_area_struct*vm_avl_right;structvm_area_struct*vm_next;structvm_area_struct*vm_next_share;structvm_area_struct*vm_prev_share;structvm_operations_struct*vm_ops;unsignedlongvm_offset;structinode*vm_inode;unsignedlongvm_pte;};定義在/include/linux/mm.h中每個虛擬區(qū)域用一個vm-area-struct結(jié)構(gòu)體進行描述虛存空間的映射和虛存區(qū)域的建立2023/2/127虛擬存儲技術(shù)用戶的代碼和數(shù)據(jù)(可執(zhí)行映像)等并不是完整地裝入物理內(nèi)存,而是全部映射到虛擬內(nèi)存空間。在進程需要訪問內(nèi)存時,在虛擬內(nèi)存中“找到”要訪問的程序代碼和數(shù)據(jù)等unsignedlongdo_mmap(structfile*file,unsignedlongaddr,unsignedlonglen,unsignedlongprot,unsignedlongflags,unsignedlongoff)Linux使用do_mmap()函數(shù)完成可執(zhí)行映像向虛存區(qū)域的映射Linux的分頁式存儲管理2023/2/128頁表是從線性地址向物理地址轉(zhuǎn)換中不可缺少的數(shù)據(jù)結(jié)構(gòu),而且它使用的頻率較高。頁表必須存放在物理存儲器中。Linux采用了三級頁表結(jié)構(gòu),以利于節(jié)省物理內(nèi)存。三級分頁管理把虛擬地址分成四個位段:頁目錄、頁中間目錄、頁表、頁內(nèi)編址。系統(tǒng)設(shè)置三級頁表系列頁目錄PGDPaGeDirectory頁中間目錄PMDPageMiddleDirectory頁表PTEPageTablE物理內(nèi)存空間的管理2023/2/129物理內(nèi)存的頁面管理

空閑頁面的管理—Buddy算法

Linux對物理內(nèi)存空間按照分頁方式進行管理,把物理內(nèi)存劃分成大小相同的物理頁面。Linux設(shè)置了一個

mem_map[]數(shù)組管理內(nèi)存頁面。mem_map[]在系統(tǒng)初始化時由free_area_init

()函數(shù)創(chuàng)建,它存放在物理內(nèi)存的底部(低地址部分)內(nèi)存空閑空間的管理采用Buddy

算法Buddy算法是把內(nèi)存中的所有頁面按照2n劃分,其中n=0~5,對一個內(nèi)存空間按1個頁面、2個頁面、4個頁面、8個頁面、16個頁面、32個頁面進行六次劃分。對于每種頁面塊按前后順序兩兩結(jié)合成一對Buddy“伙伴”。內(nèi)存分配與釋放的數(shù)據(jù)結(jié)構(gòu)2023/2/130Linux中用于內(nèi)存分配和釋放的函數(shù)主要是kmalloc()和kfree(),它們用于分配和釋放連續(xù)的內(nèi)存空間blocksize表page_descriptorsizes表block_header

kmalloc()和kfree()分配和釋放內(nèi)存是以塊(block)為單位進行的可以分配的空閑塊的大小記錄在blocksize表中,它是一個靜態(tài)數(shù)組

加在頁面塊前部的信息頭稱為頁描述符

Linux設(shè)置了sizes[]數(shù)組,對頁面塊進行描述數(shù)組元素是size_descriptor結(jié)構(gòu)體blocksize[]與sizes[]元素數(shù)目相同,它們一一對應(yīng)由sizes[]管理的各個頁面塊中每個塊的頭部還有一個對該塊進行描述的塊頭block_header內(nèi)存分配函數(shù)kmalloc()2023/2/131void*kmalloc(size_tsize,intpriority)voidkfree(void*__ptr)參數(shù)size是申請分配內(nèi)存的大小priority是申請優(yōu)先級ptr是kmalloc分配的內(nèi)存空間的首地址GFP_KERNELGFP_ATOMIC

GPF_DMA虛擬內(nèi)存的申請和釋放2023/2/132在申請和釋放較小且連續(xù)的內(nèi)存空間時,使用kmalloc()和kfree()申請和釋放較大的內(nèi)存空間時,使用vmalloc()和vfree()void*vmalloc(unsignedlongsize)voidvfree(void*addr)用法和kmalloc()和kfree()一樣由vmalloc()申請的內(nèi)存空間在虛擬內(nèi)存中是連續(xù)的,它們映射到在物理內(nèi)存時,可以使用不連續(xù)的物理頁面,而且僅把當(dāng)前訪問的部分放在物理頁面中由vmalloc()分配的虛存空間稱為虛擬內(nèi)存塊(虛存塊)Linux進程管理介紹2023/2/133Linux是一個多用戶多任務(wù)的操作系統(tǒng)。指多個用戶可以在同一時間使用計算機系統(tǒng)多任務(wù)是指Linux可以同時執(zhí)行幾個任務(wù)操作系統(tǒng)監(jiān)控著一個等待執(zhí)行的任務(wù)隊列,這些任務(wù)包括用戶作業(yè)操作系統(tǒng)任務(wù)郵件打印作業(yè)操作系統(tǒng)根據(jù)每個任務(wù)的優(yōu)先級為每個任務(wù)分配合適的時間片進程與作業(yè)2023/2/134

Linux系統(tǒng)上所有運行的東西都有可以看成進程在自身的虛擬地址空間運行的一個單獨的程序隨時都可能發(fā)生變化的使用系統(tǒng)運行資源的動態(tài)的++程序+進程進程和作業(yè)的概念也有區(qū)別:一個正在執(zhí)行的進程稱為一個作業(yè)作業(yè)可以包含一個或多個進程,尤其是當(dāng)使用了管道和重定向命令作業(yè)控制指的是控制正在運行的進程的行為。手工啟動2023/2/135啟動一個進程有兩個主要途徑:手工啟動調(diào)度啟動由用戶輸入命令,直接啟動一個進程便是手工啟動。手工啟動進程又分為前臺啟動和后臺啟動前臺啟動是手工啟動一個進程的最常用的方式。一般用戶鍵入一個命令“l(fā)s–l”,這就已經(jīng)啟動了一個進程,而且是一個前臺的進程直接從后臺手工啟動一個進程用得比較少一些,除非是該進程甚為耗時,且用戶也不急著需要結(jié)果的時候。調(diào)度啟動2023/2/136有時候需要對系統(tǒng)進行一些比較費時而且占用資源的維護工作,這些工作適合在深夜進行,要使用自動啟動進程的功能,就需要掌握以下幾個啟動命令:at命令cron命令crontab命令用戶使用at命令在指定時刻執(zhí)行指定的命令序列。也就是說,該命令至少需要指定一個命令、一個執(zhí)行時間才可以正常運行??梢圆粩嘀貜?fù)一些命令cron命令是不應(yīng)該手工啟動的crontab命令用于安裝、刪除或者列出用于驅(qū)動cron后臺進程的表格。每個用戶都可以有自己的crontab文件。進程的掛起與恢復(fù)2023/2/137作業(yè)控制允許將進程掛起并可以在需要時恢復(fù)進程的運行,被掛起的作業(yè)恢復(fù)后將從中止處開始繼續(xù)運行。只要在鍵盤上按【Ctrl+Z】,即可掛起當(dāng)前的前臺作業(yè)。使用jobs命令可以顯示Shell的作業(yè)清單,包括具體的作業(yè)、作業(yè)號以及作業(yè)當(dāng)前所處的狀態(tài)?;謴?fù)進程執(zhí)行時,有兩種選擇:用fg命令將掛起的作業(yè)放回到前臺執(zhí)行;用bg命令將掛起的作業(yè)放到后臺執(zhí)行。進程管理2023/2/138由于Linux是個多用戶系統(tǒng),同時也是一個多進程系統(tǒng),經(jīng)常需要對這些進程進行一些調(diào)配和管理,就要知道當(dāng)前的進程情況。who命令w命令ps命令top命令kill命令該命令主要用于查看當(dāng)前線上的用戶情況可以顯示出當(dāng)前用戶當(dāng)前正在進行的工作是非常強大的進程查看命令top命令和ps命令的基本作用是相同的該命令可以終止后臺進程nohup命令使進程在用戶退出后仍繼續(xù)執(zhí)行Linux內(nèi)核啟動和初始化進程2023/2/139開機自檢核心引導(dǎo)階段bootsect階段setup階段head.S階段main.c階段init進程和inittab引導(dǎo)腳本確定用戶登錄模式執(zhí)行內(nèi)容/etc/rc.d/rc.sysinit啟動內(nèi)核的外掛模塊及各運行級的腳本開機自檢2023/2/140在剛開機時,根據(jù)X86CUP的特性,代碼段寄存器的值為全1,指令計數(shù)器的值為全0,即CS=FFFF、IP=0000。這時CPU根據(jù)CS和IP的值執(zhí)行FFFF0H處的指令,F(xiàn)FFF0H處的指令一般總是一個JMP指令,這個地址通常是ROMBIOS的入口地址。接著,ROMBIOS進行開機自檢,如檢查內(nèi)存,鍵盤等。在自檢過程中,ROMBIOS會在上位內(nèi)存中進行掃描,看看是否存在合法的設(shè)備控制卡ROMBIOS(如:SCSI卡上的ROM),如果有,就執(zhí)行其中的一些初始化代碼。最后,ROMBIOS讀取磁盤上的第一個扇區(qū)并將這個扇區(qū)的內(nèi)存裝入內(nèi)存。核心引導(dǎo)階段2023/2/141在Grub或者Lilo等引導(dǎo)程序成功完成引導(dǎo)Linux系統(tǒng)的任務(wù)之后,Linux就可從它們手中接管了CPU的控制權(quán)。在這個過程中主要用到該目錄下的這幾個文件:bootsect.S、setup.S以及compressed目錄下head.S等。首先要介紹一下,Linux的內(nèi)核通常是壓縮過后的,包括如上述提到的那幾個重要的匯編程序,它們都是在壓縮內(nèi)核vmlinuz中的。因為Linux中提供的內(nèi)核包含了眾多驅(qū)動和功能,因而比較大,所以采用壓縮內(nèi)核可以節(jié)省大量的空間。bootsect階段2023/2/142當(dāng)grub讀入vmlinuz后,會根據(jù)bootsect,把它自身和setup程序段讀到不大于0x90000開始的內(nèi)存里,然后grub會跳過bootsect那512bytes的程序段,直接運行setup里的第一條指令。就是說bzImage里bootsect的程序沒有再被執(zhí)行了,而bootsect.S在完成了指令搬移之后就退出了。之后執(zhí)行權(quán)就轉(zhuǎn)到了setup.S的程序中。內(nèi)核啟動過程setup階段2023/2/143setup.S的主要功能就是利用ROMBIOS中斷讀取機器系統(tǒng)數(shù)據(jù),并將系統(tǒng)參數(shù)保存到0x90000~0x901FF開始的內(nèi)存中位置。此外,setup.S還將video.S中的代碼包含進來,檢測和設(shè)置顯示器和顯示模式。最后,它還會設(shè)置CPU的控制寄存器CR0,從而進入32位保護模式運行,并跳轉(zhuǎn)到絕對地址為0x100000,同時執(zhí)行startup_32。CPU0x100000startup_32head.S階段2023/2/144當(dāng)運行到head.S時,系統(tǒng)已經(jīng)運行在保護模式,而head.S完成了一個重要任務(wù)就是將內(nèi)核解壓。就如本節(jié)前面提到的,內(nèi)核是通過壓縮的方式放在內(nèi)存中的,head.S通過調(diào)用misc.c中定義的decompress_kernel()函數(shù),將內(nèi)核vmlinuz解壓到0X100000的。接下來head.S程序完成寄存器、分頁表的初始化工作,但要注意的是,這個head.S程序與完成解壓縮工作的head.S程序是不同的,它在源代碼中的位置是arch/i386/kernel/head.S程序與完成解壓縮工作的head.S程序是不同的在完成了初始化之后,head.S就跳轉(zhuǎn)到start_kernel()函數(shù)中去了。main.c階段2023/2/145start_kernel()是“init/main.c”中的定義的函數(shù),start_kernel()調(diào)用了一系列初始化函數(shù),進行內(nèi)核的初始化工作。要注意的是,在初始化之前系統(tǒng)中斷是被屏蔽的,另外內(nèi)核也處于被鎖定狀態(tài),以保證只有一個CPU用于Linux系統(tǒng)的啟動。在start_kernel()的最后,調(diào)用了init()函數(shù)輸出Linux版本信息設(shè)置與體系結(jié)構(gòu)相關(guān)的環(huán)境頁表結(jié)構(gòu)初始化使用“arch/alpha/kernel/entry.S”中的入口點設(shè)置系統(tǒng)自陷入口使用alpha_mv結(jié)構(gòu)和entry.S入口初始化系統(tǒng)IRQprintk(linux_banner)setup_arch()paging_init()trap_init()Init_IRQ()init進程和inittab引導(dǎo)腳本2023/2/146init進程是系統(tǒng)所有進程的起點,內(nèi)核在完成內(nèi)核引導(dǎo)以后,即在本線程(進程)空間內(nèi)加載init程序,它的進程號是1。inittab是以行為單位的描述性(非執(zhí)行性)文本,每一個指令行都具有以下格式:id:runlevel:action:process入口標(biāo)識符運行級別運行級別具體的執(zhí)行程序id一般要求4個字符以內(nèi),對于getty或其他login程序項,要求id與tty的編號相同,否則getty程序?qū)⒉荒苷9ぷ?。runlevel是init所處于的運行級別的標(biāo)識,一般使用0-6以及S或s。initdefault是一個特殊的action值,用于標(biāo)識缺省的啟動級別,sysinit、boot、bootwait等action將在系統(tǒng)啟動時無條件運行,確定用戶登錄模式2023/2/147在“/etc/inittab”中列出了登錄模式,其中的單人維護模式是類似于Windows中的“安全模式”,在這種情況下,系統(tǒng)不加載復(fù)雜的模式,從而使系統(tǒng)能夠正常啟動。其中本系統(tǒng)中默認(rèn)的為5,也就是X-Windows多用戶模式。單人維護模式多用戶無網(wǎng)絡(luò)模式文字界面多用戶模式X-Windows多用戶模式登錄模式?執(zhí)行內(nèi)容/etc/rc.d/rc.sysinit2023/2/148rc.sysinit中最常見的動作就是:激活交換分區(qū)檢查磁盤加載硬件模塊如果沒有其他boot、bootwait動作運行級別3/etc/rc.d/rc將會得到執(zhí)行命令行數(shù)3/etc/rc.d/rc3.d/目錄下的文件rc3.d下的文件都是指向/etc/rc.d/init.d/目錄下各個Shell腳本的符號連接。getty和login2023/2/149mingetty程序能打開終端,設(shè)置模式。同時它會顯示一個文本登錄界面,這個界面就是經(jīng)??吹降牡卿浗缑妫谶@個登錄界面中會提示用戶名,而用戶輸入的用戶名將作為參數(shù)傳給login程序來驗證用戶的身份。login程序在getty的同一個進程空間中運行,接受getty傳來的用戶名參數(shù)作為登錄的用戶名。當(dāng)用戶登錄通過了這些檢查后,login將搜索/etc/passwd文件用于匹配密碼、設(shè)置主目錄和加載shell在設(shè)置好shell的uid、gid,以及TERM,PATH等環(huán)境變量以后,進程加載shell,login的任務(wù)也就完成了mingettyusername:passwd:login等待用戶登錄2023/2/150系統(tǒng)初始化完畢后,INIT為每一個虛擬控制臺和終端啟動一個GETTY進程。GETTY進程負(fù)責(zé)接受和檢驗用戶的登錄要求。至此,LINUX系統(tǒng)的啟動工作全部完成。不同核心版本的LINUX的啟動過程有一定的差異,不同發(fā)行版本的LINUX的啟動也可能稍有不同,但基本過程是類似的。另外,在“BOOT:”后,利用“LINUXSINGLE”命令可以迫使LINUX進入單用戶模式,除不要求用戶登錄和不啟動虛擬終端以外,啟動過程的其它部分也基本類似。Linux常用命令2023/2/151常用命令及帳戶管理用戶管理用戶組管理文件權(quán)限設(shè)定文件、目錄操作命令使用光盤和U盤文件、目錄操作命令使用光盤和U盤Linux命令格式2023/2/152Linux命令的組成部分命令字命令選項命令參數(shù)command[option][arguments]執(zhí)行的命令命令的選項,說明對命令的要求命令的參數(shù),描述命令作用的對象表示選項或參數(shù)可有可無,即參數(shù)并非必須命令格式舉例2023/2/153$ls-l/home命令參數(shù)命令提示符命令字命令選項命令組成部分用空格進行分隔命令中的其他組成2023/2/154命令提示符表示命令輸入的狀態(tài)管理員root用戶的提示符“#”[root@localhost~]#普通用戶提示符“$”[teacher@localhost~]$命令的各組成部分之間用空格分隔命令的輸入以回車鍵結(jié)束獲得命令幫助2023/2/155help命令$helppwd“--help”命令選項$touch--help使用man命令閱讀手冊頁$manls使用info命令閱讀信息頁$infols文件、目錄操作命令2023/2/156目錄操作命令lspwdcdmkdirrmdir文件操作命令filetouchcprmmvfind文本文件查看命令catmorelessheadtail目錄命令實例2023/2/157列目錄$ls$ls-l顯示當(dāng)前目錄名稱$pwd更改當(dāng)前目錄$cd/etc$cd../bin建立和刪除目錄$mkdirmydir$rmdirmydir路徑的表示2023/2/158相對路徑是以“.”或“..”開始的目錄路徑表示形式cd./testls../bin絕對路徑是以“/”開始的路徑表示形式ls/cd/home文件操作命令2023/2/159命令功能file顯示指定文件的類型touch建立指定名稱的文件或更新文件時間cp復(fù)制文件或目錄rm刪除文件或目錄mv移動文件或目錄,文件或目錄重命名find在指定目錄查找符合條件的文件文件命令實例2023/2/160檢測文件類型$file/etc/passwd建立空文件$touchtfile文件查找按文件名進行查找$find.-namefile*按文件屬主進行查找$find.-userteacher復(fù)制和刪除文件$cpfileafileb$rmfilea文件移動與重命名$mvfileafileb$mvfileadira/文本文件查看命令2023/2/161命令功能cat顯示文本文件內(nèi)容more分頁顯示文本文件內(nèi)容less分頁顯示文本文件內(nèi)容,并可方便反復(fù)瀏覽head顯示文件首部內(nèi)容tail顯示文件尾部內(nèi)容文本查看實例2023/2/162顯示文本$cat/etc/passwd分頁顯示文本$more/etc/passwd分頁文本瀏覽$less/etc/passwd顯示文件首$head-5/etc/passwd顯示文件尾$tail-5/etc/passwd用戶系統(tǒng)命令2023/2/163命令功能su用于將普通用戶身份轉(zhuǎn)變?yōu)槌売脩魀s顯示當(dāng)前系統(tǒng)中由該用戶運行的進程列表kill刪除執(zhí)行中的程序或工作fdisk查看硬盤分區(qū)情況及對硬盤進行分區(qū)管理網(wǎng)絡(luò)相關(guān)命令2023/2/164命令功能ifconfig網(wǎng)絡(luò)信息查看ping測試和遠程計算機的聯(lián)網(wǎng)狀態(tài)telnet進入指定的目錄ftp創(chuàng)建指定名稱的目錄光盤的基本使用2023/2/165光盤驅(qū)動器設(shè)備文件/dev/cdrom掛載光盤使用mount命令#mount-tiso9660/dev/cdrom/media/cdrom/光盤內(nèi)容的讀取使用命令訪問光盤掛載點目錄#ls/media/cdrom/卸載光盤使用umount命令#umount/dev/cdrom光盤驅(qū)動器托盤的彈出與收回2023/2/166彈出光盤驅(qū)動器托盤#eject收回光盤驅(qū)動器托盤#eject-t光盤鏡像文件操作2023/2/167使用cp命令制作光盤鏡像文件#cp/dev/cdrommydatacd.iso使用mount命令掛載光盤鏡像文件#mount-oloop-tiso9660mydatacd.iso/media/cdrom/通過掛載點目錄訪問ISO鏡像文件的內(nèi)容#ls/media/cdrom/使用umount命令卸載光盤鏡像文件#umount/media/cdrom/U盤的使用方法2023/2/168識別USB存儲設(shè)備包括USB硬盤、U盤、MP3播放器等/dev/sda /dev/sdb……#fdisk-l使用mount命令掛載U盤#mount-tvfat/dev/sda1/mnt/通過掛載點目錄訪問U盤的內(nèi)容#ls/mnt使用umount命令卸載U盤#umount/mnttar命令建立歸檔2023/2/169對文件和目錄進行歸檔$tarcfmyfiles.tarfiles/對文件和目錄進行壓縮歸檔$tarczfmyfiles.tar.gzfiles/命令名命令選項c表示建立歸檔z表示對歸檔進行壓縮f用于指定建立的歸檔文件名命令參數(shù),歸檔文件名命令參數(shù),需要進行歸檔的文件或目錄名查看歸檔中的文件列表2023/2/170查看歸檔文件中的目錄列表$tartfmyfiles.tar.gz查看壓縮歸檔文件中的目錄列表$tartzfmyfiles.tar

命令名命令選項t表示查看歸檔z表示歸檔文件是壓縮格式f用于指定歸檔文件名命令參數(shù),需要查看的歸檔文件名恢復(fù)歸檔文件2023/2/171恢復(fù)歸檔文件$tarxfmyfiles.tar恢復(fù)壓縮的歸檔文件$tarxzfmyfiles.tar.gz恢復(fù)歸檔文件到指定目錄$tarxzfmyfiles.tar.gz-Crestore/

命令名命令選項x表示回復(fù)歸檔z表示歸檔是壓縮格式f用于指定歸檔文件名歸檔文件名-C指定歸檔恢復(fù)的目標(biāo)目錄歸檔恢復(fù)的目錄名創(chuàng)建、查看、恢復(fù)歸檔和壓縮文件2023/2/172歸檔和壓縮

tarcvfredhat.tarredhat tarz(j)cvfredhat.tar.gz(bz2)redhat查看歸檔和壓縮文件

tartvf redhat.tar tartz(j)vf redhat.tar.gz(bz2)恢復(fù)歸檔文件和壓縮文件

tarxvf redhat.tar tarz(j)xvf redhat.tar.gz(bz2)Linux軟件的安裝目前在Linux界軟件安裝方式最常見方法是:dpkg

最早是由DebianLinux社群所開發(fā)出來的,透過dpkg的機制,Debian提供的軟件就能夠簡單的安裝起來,同時還能提供安裝后的軟件信息。只要是衍生于Debian的其他Linux發(fā)行版大多使用dpkg這個機制來管理軟件,如B2D、Ubuntu等等。RPM

最早是由RedHat這家公司開發(fā)出來的,很多Linux發(fā)行版

使用該機制來作為軟件安裝的管理方式,如Fedora、CentOS、SuSE等等。2023/2/173Linux軟件的在線升級2023/2/174Linux軟件管理機制使用指令線上升級機制(指令)RedHat/FedoraRPMrpmYUM(yum)Debian/UbuntuDPKGdpkgAPT(apt-get)目前新的Linux開發(fā)商都有提供這樣的『線上升級』機制,透過這個機制,原版光盤(ISO)就只有第一次安裝時需要用到而已,其他時候只要有網(wǎng)路,妳就能夠取得原本開發(fā)商所提供的任何軟件了呢!在dpkg管理機制上就開發(fā)出APT的線上升級機制,RPM則依開發(fā)商的不同,有RedHat系統(tǒng)的yum,SuSE系統(tǒng)的YastOnlineUpdate(YOU),Mandriva的urpmi軟件等。Linux軟件包安裝2023/2/175目的rpm用法dpkg用法安裝指定包rpm-ipkgfile.rpmdpkg-ipkgfile.debLinux軟件包信息查詢2023/2/176目的rpm用法dpkg用法顯示所有已安裝包名稱rpm-qadpkg-l(小寫L)顯示包內(nèi)的所有文件rpm-ql軟件(小寫L)dpkg-L軟件名稱顯示特定文件所屬包名稱rpm-qf/path/to/filedpkg-S/path/to/file查詢包信息rpm-qippkgfile.rpm(顯示包信息)

rpm-qlppkgfile.rpm(小寫L,顯示包內(nèi)所有文件)dpkg-Ipkgfile.deb(大寫i)

dpkg-cpkgfile.deb顯示指定包是否安裝rpm-q軟件(只顯示包名稱)

rpm-qi軟件(顯示包信息)dpkg-l軟件(小寫L,顯示簡單信息)

dpkg-s軟件(顯示詳細(xì)信息)

dpkg-p軟件(顯示詳細(xì)信息)Linux軟件包卸載2023/2/177目的rpm用法dpkg用法卸載指定包rpm-e軟件名稱dpkg-r軟件(會留下包配置信息)dpkg-P軟件(完全移除)Debian下使用alien處理RPM包2023/2/178alien可處理.deb、.rpm、.slp、.tgz等格式文件的格式轉(zhuǎn)換或安裝。在Debian系Linux下安裝非Debian系包時,可使用alien進行安裝。安裝alien包:apt-getinstallalien在Debian安裝RPM包:alien-iquota-3.12-7.i386.rpm制作成deb的包格式:alien-dquota-3.12-7.i386.rpm制作成rpm的包格式:alien-rquota_3.12-6_i386.debAPT2023/2/179apt-setup設(shè)定/etc/apt/souces.listapt-getupdate軟件資料庫同步apt-getinstall軟件1[軟件2]安裝軟件apt-getremove軟件1[軟件2...]移除軟件(保留設(shè)定檔)apt-get--purgeremove軟件1[軟件2...]移除軟件(不保留設(shè)定檔)apt-cachesearch軟件名稱列出所有sofrwarename的包apt-upgrade[軟件1軟件2...]更新包,不指定包名則更新所有可更新的包apt-getclean(autoclean)刪除系統(tǒng)暫存的deb(autoclean只會將比目前系統(tǒng)舊版的包刪除)apt-getdist-upgrade轉(zhuǎn)換系統(tǒng)的版本(需在/etc/apt/sources.list指定stable,testing或unstable)YUM2023/2/180yuminstall軟件1[軟件2]安裝包yumupdate[軟件

1軟件

2...]更新包,不指定包名則更新所有可更新的包yumlist列出目前在yumserver上面有的包yuminfo類似rpm-qiyumclean移除下載到本機的packages或headersyumremove軟件1[軟件2]移除已經(jīng)安裝的包Ubuntu常用ROOT命令2023/2/181命令功能sudo+命令以root權(quán)限執(zhí)行命令sudo-i切換到root用戶模式下sudonautilus以root權(quán)限打開文件或是文件夾sudo

passwdroot為root用戶設(shè)置密碼suroot切換到root用戶模式下,需先調(diào)用:sudo

passwdroot用戶管理命令2023/2/182命令功能adduser添加用戶帳號passwd設(shè)置(更改)用戶口令userdel刪除用戶帳號(及宿主目錄)usermod設(shè)置用戶屬性用戶帳號管理2023/2/183建立用戶帳號#adduserst01設(shè)置用戶口令#passwdst01刪除用戶帳號#userdel-rst01設(shè)置用戶帳號屬性鎖定用戶帳號禁止登錄#usermod-Lst01用戶組管理命令及文件2023/2/184命令功能groupadd添加指定名稱的用戶組帳號groupdel刪除指定名稱的用戶組帳號文件功能/etc/group保存用戶組帳號信息用戶組帳號管理2023/2/185添加用戶組#groupaddclass1

在建立用戶時指定用戶組#adduser-gclass1st03更改用戶的組帳號#usermod-gclass1st01刪除用戶組#groupdelclass1用戶帳號相關(guān)文件和目錄2023/2/186用戶帳號信息保存在passwd文件中/etc/passwd用戶的加密口令保存在shadow文件中/etc/shadow用戶的宿主目錄是home目錄中與用戶名稱相同的目錄/home/teacher用戶的初始配置文件來在skel目錄(配置模版)/etc/skel查看文件的權(quán)限屬性2023/2/187文件權(quán)限(-rw--r--r--)#ls-linstall.log-rw-r--r--1rootroot26195Dec1710:42install.log權(quán)限表示權(quán)限項讀寫執(zhí)行讀寫執(zhí)行讀寫執(zhí)行字符表示(r)(w)(x)(r)(w)(x)(r)(w)(x)數(shù)字表示421421421權(quán)限分配文件所有者文件所屬組用戶其他用戶使用chmod命令更改文件屬性2023/2/188chmod命令用于更改文件對于某類用戶的操作權(quán)限chmod[ugoa...][[+-=][rwx]FILE...設(shè)置權(quán)限的對象,可以是用戶、組、其他人或所有人屬性操作符+增加權(quán)限-減少權(quán)限=設(shè)置權(quán)限為權(quán)限內(nèi)容,可以是讀、寫、執(zhí)行權(quán)限的組合被設(shè)置屬性的文件或目錄文件權(quán)限設(shè)置實例2023/2/189使用chmod命令設(shè)置文件權(quán)限查看文件權(quán)限$ls-lafile-rw-rw-r--1st01class10Apr316:52afile增加文件屬主st01的執(zhí)行權(quán)限(x)$chmodu+xafile去除文件屬組class1的寫權(quán)限(w)$chmodg-wafile設(shè)置其他用戶的文件權(quán)限為可執(zhí)行$chmodo=xafile

設(shè)置文件屬主和屬組2023/2/190chown命令用于設(shè)置文件的屬主和屬組命令格式chownOWNER[:[GROUP]]FILE...

設(shè)置文件afile的屬主為用戶st01#chownst01afile

設(shè)置文件afile的屬組為用戶組class1#chown:class1afile設(shè)置文件afile的屬主為st03,并設(shè)置文件的屬組為class2#chownst03:class2afile

文本編輯器vi2023/2/191vi是在Linux操作系統(tǒng)的字符界面下使用的全屏幕文本編輯器。和常用的圖形界面下的文本編輯器不同,它只能編輯字符,不能對字體和段落進行排版,沒有菜單,只有命令,而且命令繁多。但是,由于在字符界面下操作Linux可以使用戶更好地了解Linux的運行狀況,保證各項設(shè)定的正確執(zhí)行,因此,常用vi來編輯和修改文件內(nèi)容,實現(xiàn)系統(tǒng)管理、系統(tǒng)設(shè)定、服務(wù)器參數(shù)設(shè)定等工作。vi仍舊是Unix/Linux系列操作系統(tǒng)中非常重要的文本編輯器,也可以說是一款非常經(jīng)典的字處理軟件。提示:Linux系統(tǒng)中的參數(shù)文件幾乎都是ASCII碼的純文本文件,因此利用任何一款文本編輯軟件都可以修改Linux的參數(shù)文檔。文本編輯器vi的三種模式命令模式(又稱為一般模式):當(dāng)用vi打開一個文件時,默認(rèn)的工作模式就是命令模式。編輯模式:按下“i,I,o,O,a,A,r,R”等字母之后可以進入編輯模式。最后行模式(又稱為末行模式):在命令模式中輸入“:”就可以將光標(biāo)移動到屏幕最后一行。2023/2/192vi三種工作模式的相互轉(zhuǎn)換關(guān)系2023/2/193命令模式編輯模式最后行模式ESC自動返回i,o,a:/移動光標(biāo),查找,替換,刪除字符,刪除整列,復(fù)制整列,粘貼整列。可輸入任何字符。保存文件,退出vi。vi三種模式進入vi的命令模式啟動vi的命令格式為:vi[文件]說明:如果不指定文件或者指定的文件不存在,則新建一個文件;如果指定的文件存在,則打開該文件在vi的命令模式下所有輸入的字母都被當(dāng)作編輯命令解釋并執(zhí)行,而不會在屏幕上顯示。如果行首有“~”符號,則表示此行為空行。2023/2/194進入vi的命令模式舉例:建立一個名為test.txt的文件[root@testroot]#vitest.txt打開的vi界面分為兩部分:編輯區(qū)和命令/狀態(tài)區(qū)最后一行左下角顯示這個文件的當(dāng)前狀態(tài):如果是新建文件,則顯示“文件名”[NewFile];如果是已存在文件,則顯示當(dāng)前文件的名稱,行數(shù)和字符數(shù),如“文件名”XL,XXC2023/2/195進入vi的編輯模式在命令模式下,只要輸入i,I,o,O,a,A任何一個字母就可以進入編輯模式。在編輯模式中,最后一行的左下角會出現(xiàn)--INSERT--字樣,這表明此時在編輯區(qū)可以輸入任意字符要想退出編輯模式,只需要按下ESC鍵即可2023/2/196進入最后行模式在命令模式下輸入“:”,光標(biāo)會移動到最后一行,在該模式下,可以實現(xiàn)字符的替換,設(shè)置行號,保存文件并退出vi等操作例如“:wq”表示存盤并退出當(dāng)前vi2023/2/197VI命令模式下有關(guān)光標(biāo)移動的命令2023/2/198h或←光標(biāo)向左移動一個字符j或↓光標(biāo)向下移動一個字符k或↑光標(biāo)向上移動一個字符l或→光標(biāo)向右移動一個字符Ctrl+f屏幕向前翻動一頁Ctrl+b屏幕向后翻動一頁Ctrl+d屏幕向前翻動半頁Ctrl+u屏幕向后翻動半頁+光標(biāo)移動到非空格符的下一行-光標(biāo)移動到非空格符的上一行VI命令模式下有關(guān)光標(biāo)移動的命令2023/2/199n<space>按下數(shù)字后再按空格鍵,光標(biāo)會在當(dāng)前行向右移動n個字符,如20空格

0移動到光標(biāo)所在行的第一個字符處$移動到光標(biāo)所在行的最后一個字符處H光標(biāo)移動到當(dāng)前屏幕最上方那一行M光標(biāo)移動到當(dāng)前屏幕中央的那一行L光標(biāo)移動到當(dāng)前屏幕最下方那一行G光標(biāo)移動到文件的最后一行nG光標(biāo)從文件開頭向下移動到第n行,例如20G,可以和setnu配合使用n<enter>光標(biāo)從當(dāng)前位置處向下移動n行命令模式下有關(guān)查找和替換的命令2023/2/1100/word在光標(biāo)之后查找名為word的字符串?word在光標(biāo)之前查找名為word的字符串n繼續(xù)查找滿足條件的字符串N改變查找的方向,繼續(xù)查找滿足條件的字符串命令模式下的刪除、復(fù)制和粘貼2023/2/1101x,Xx為向后刪除n一個字符,X為向前刪除一個字符nx向后刪除n個字符dd刪除光標(biāo)所在的那一整列ndd刪除光標(biāo)所在列的向下n列,例如20dd,向下刪除20列d1G刪除光標(biāo)所在行到第一行的所有數(shù)據(jù)dG刪除光標(biāo)所在行到最后一行的所有數(shù)據(jù)yy復(fù)制光標(biāo)所在行nyy復(fù)制光標(biāo)所在行的向下n列,例如20yy,向下復(fù)制20列y1G復(fù)制光標(biāo)所在列到第一列的所有數(shù)據(jù)yG復(fù)制光標(biāo)所在列到最后一列的所有數(shù)據(jù)p,Pp為復(fù)制的數(shù)據(jù)粘貼在光標(biāo)下一行,P為粘貼在光標(biāo)的上一行J將光標(biāo)所在列與下一列的數(shù)據(jù)結(jié)合成一列u撤銷前一個動作.重復(fù)前一個動作VI編輯模式下有關(guān)光標(biāo)移動的命令vi編輯器中“上下左右”變?yōu)椤癆BCD”的問題先卸載vim-tiny:sudoapt-getremovevim-common

再安裝vimfull:sudoapt-getinstallvim這是因為ubuntu預(yù)裝的是vimtiny版本,安裝vimfull版本即可解決。2023/2/1102編輯模式下的常用命令2023/2/1103i在當(dāng)前光標(biāo)所在處插入要輸入的字符,光標(biāo)后面的字符會向后退I將光標(biāo)移動到當(dāng)前行的行首插入字符a從當(dāng)前光標(biāo)的下一個字符的位置添加字符,已存在的字符會向后退A將光標(biāo)移動到當(dāng)前行的行尾添加字符o在光標(biāo)所在行的下方插入一行O在光標(biāo)所在行的上方插入一行r替換光標(biāo)所指的那一個字符R一直替換光標(biāo)所指的字符,直到按下Esc為止ESC退出編輯模式,回到命令模式最后行模式下的常用命令

2023/2/1104:w將編輯的數(shù)據(jù)保存至硬盤文件中:w!若文件屬性為只讀,強制寫入該文件:q退出vi,若文件被改動,則提示無法退出信息:q!不保存文件,直接退出vi:wq保存文件后退出:wq!強制保存文件后退出:w[filename]將數(shù)據(jù)保存到另一個文件中,相當(dāng)于另存為:r[filename]將另一個文件的內(nèi)容加入到當(dāng)前文件光標(biāo)所在行的后面最后行模式下的常用命令2023/2/1105:setnu顯示行號,設(shè)定之后,會在每一行前面出現(xiàn)行號:setnonu取消行號:n1,n2con3將從n1行到n2行之間(包括n1,n2行本身)的所有文本復(fù)制到n3行之下:n1,n2mn3將從n1行到n2行之間(包括n1,n2行本身)的所有文本移動到n3行之下:n1,n2d刪除從n1行到n2行之間(包括n1,n2行本身)的所有文本:n1,n2s/$1/$2/g將n1行到n2行之間(包括n1,n2行本身)所有字符串1用字符串2替換第2章嵌入式Linux編程基礎(chǔ)2023/2/1106Linux程序開發(fā)過程2023/2/1107編輯編譯鏈接運行調(diào)試對源代碼進行編輯,VI(GEDIT)對源代碼編譯,生成目標(biāo)程序,GCC將分散的模塊組成一個可執(zhí)行的整體運行編譯好的程序./目標(biāo)文件名調(diào)試運行時的錯誤GDB初識GCCGNUprojectCandC++CompilerGNUCompilerCollectiongcc是一個全功能的

ANSI

C

兼容編譯器,它是所有UNIX系統(tǒng)可用的C、C++編譯器。gcc是可以在多種硬體平臺上編譯出可執(zhí)行程序的超級編譯器,其執(zhí)行效率與一般的編譯器相比平均效率要高20%~30%。2023/2/1108GCC安裝確認(rèn)網(wǎng)絡(luò)正常連接;在終端界面中輸入指令:sudoapt-getinstallbuild-enssential或sudoapt-getinstallgcc中間需要輸入兩次或一次:Y后就會自動安裝。安裝完畢后輸入以下指令查看GCC是否安裝成功。gcc–version或gcc-v2023/2/1109GCC與G++的關(guān)系GCC用于編譯多種語言編寫的程序,主要是C;G++用于編譯C++程序,以GCC為基礎(chǔ),編譯過程中加入了C++的支持庫,參數(shù)與GCC基本一致;可以利用GCC編譯C++程序,但是需要在參數(shù)中加入引用的C++庫,比如libstdc++(如gcc-oout–lstdc++main.cc)。2023/2/1110GCC編譯處理流程預(yù)處理(Preprocessing):分析各種預(yù)處理命令,如#define,#include,#if等;編譯(Compilation):根據(jù)輸入文件產(chǎn)生匯編語言程序;匯編(Assembly):將匯編語言輸入,產(chǎn)生擴展名為.o的目標(biāo)文件;鏈接(Linking):以.o目標(biāo)文件,庫文件作為輸入,生成可執(zhí)行文件(在Linux系統(tǒng)中,可執(zhí)行文件沒有統(tǒng)一的后綴,其主要由文件的屬性來區(qū)分)。2023/2/1111源程序文件(.h,.c,.cc,.etc)經(jīng)預(yù)處理的文件(.i,.ii)匯編語言文件(.s)目標(biāo)文件(.o)可執(zhí)行程序(.out)GCC文件類型.c為后綴的文件,C語言源代碼文件;.a為后綴的文件,是由目標(biāo)文件構(gòu)成的靜態(tài)庫文件;.so為后綴的文件,是由目標(biāo)文件構(gòu)成的動態(tài)庫文件;.C,.cc或.cxx為后綴的文件,是C++源代碼文件;.h為后綴的文件,是程序所包含的頭文件;.i為后綴的文件,是已經(jīng)預(yù)處理過的C源代碼文件;.ii為后綴的文件,是已經(jīng)預(yù)處理過的C++源代碼文件;.m為后綴的文件,是Objective-C源代碼文件;.o為后綴的文件,是編譯后的目標(biāo)文件;.s為后綴的文件,是匯編語言源代碼文件;.S為后綴的文件,是經(jīng)過預(yù)編譯的匯編語言源代碼文件。2023/2/1112GCC的常用選項選項含義-ofile將經(jīng)過gcc處理過的結(jié)果存為文件file,這個結(jié)果文件可能是預(yù)處理文件、匯編文件、目標(biāo)文件或者最終的可執(zhí)行文件。假設(shè)被處理的源文件為source.suffix,如果這個選項被省略了,那么生成的可執(zhí)行文件默認(rèn)名稱為a.out;目標(biāo)文件默認(rèn)名為source.o;匯編文件默認(rèn)名為source.s;生成的預(yù)處理文件則發(fā)送到標(biāo)準(zhǔn)輸出設(shè)備。-E不生成文件,只輸出預(yù)處理結(jié)果(輸出終端)-S只預(yù)處理和編譯,把文件編譯成為匯編代碼2023/2/1113GCC的常用選項2023/2/1114-c預(yù)處理,編譯和匯編,生成.o的obj文件

。編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標(biāo)文件。在對源文件進行查錯時,或只需產(chǎn)生目標(biāo)文件時可以使用該選項。-g[gdb]調(diào)試選項,在可執(zhí)行文件中加入調(diào)試信息,方便進行程序的調(diào)試。如果使用中括號中的選項,表示加入gdb擴展的調(diào)試信息,方便使用gdb來進行調(diào)試。-pg調(diào)試選項,產(chǎn)生供gprof剖析用的可執(zhí)行文檔:gcc-pghelloworld.c。-O[0、1、2、3]優(yōu)化編譯。對生成的代碼使用優(yōu)化,中括號中的部分為優(yōu)化級別,缺省的情況為2級優(yōu)化,0為不進行優(yōu)化。注意,采用更高級的優(yōu)化并不一定得到效率更高的代碼。GCC的常用選項2023/2/1115-Idirname指定搜索系統(tǒng)頭文件的目錄,可以重復(fù)使用多個該選項指定多個目錄,是在預(yù)編譯過程中使用的參數(shù)。先在你所制定的目錄查找,然后再按常規(guī)的順序去找頭文件。-Ldirname在dir這個目錄尋找被-l的庫,指定編譯時搜索庫的路徑。-lname在連接時,裝載名字為“l(fā)ibname.a”的函數(shù)庫,該函數(shù)庫位于系統(tǒng)預(yù)設(shè)的目錄或者由-L選項確定的目錄下。例如,-lm表示連接名為“l(fā)ibm.a”的數(shù)學(xué)函數(shù)庫。-fpic或-fPIC產(chǎn)生位置無關(guān)的目標(biāo)代碼,以構(gòu)造共享庫(sharedlibrary)。-static連接器將忽略動態(tài)連接庫,同時通過將靜態(tài)目標(biāo)文件直接包含到結(jié)果目標(biāo)文件完成對所有引用的解析。禁止與共享庫鏈接,若沒有,則優(yōu)先選擇共享庫鏈接-shared產(chǎn)生共享庫,在創(chuàng)建共享函數(shù)庫時使用。GCC的常用選項2023/2/1116-w禁止輸出警告信息-Wwarning允許產(chǎn)生warning類型的警告,warning可以是:main、unused等很多取值,最常用是-Wall,表示顯示所有警告。如果warning取值為error,其含義是將所有警告轉(zhuǎn)換為錯誤(error),即出現(xiàn)警告就停止編譯。-ansi支持ANSI/ISOC的標(biāo)準(zhǔn)語法,取消GNU的語法中與該標(biāo)準(zhǔn)有沖突的部分,但并不保證生成與ANSI兼容代碼。-Dmacro-Dmacro=value相當(dāng)于在源程序中使用#definemacro1-Umacro取消宏的定義-M生成文件關(guān)聯(lián)的信息。包含目標(biāo)文件所依賴的所有源代碼。-v查看當(dāng)前系統(tǒng)gcc的版本信息常見的預(yù)編譯指令#include指令:頭文件包含指令#define指令:宏定義指令#if、#else和#endif指令:條件編譯指令2023/2/1117#include指令:頭文件包含指令該指令指示編譯器將xxx.xxx文件的全部內(nèi)容插入此處。若用<>括起文件則在系統(tǒng)的INCLUDE目錄中尋找文件,若用""括起文件則在當(dāng)前目錄中尋找文件。一般來說,該文件是后綴名為“h”或“cpp”的頭文件。一般為/usr/include路徑注意:<>不會在當(dāng)前目錄下搜索頭文件,如果我們不用<>而用""把頭文件名擴起,其意義為在先在當(dāng)前目錄下搜索頭文件,再在系統(tǒng)默認(rèn)目錄下搜索。

2023/2/1118#define指令:宏定義指令該指令常用有二種用法:第一種是定義標(biāo)識,標(biāo)識有效范圍為整個程序,形如#defineXXX,常與#if配合使用;第二種是定義常數(shù),如#definemax100,則max代表100;注意:這種情況下使用const定義常數(shù)更好,const常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型。編譯器可以對前者進行類型安全檢查,而對后者只進行字符替換,沒有類型安全檢查,并且在字符替換時可能會產(chǎn)生意料不到的錯誤(邊際效應(yīng))。2023/2/1119#if、#else和#endif指令:條件編譯指令2023/2/1120條件編譯指令程序員在源程序中通過定義不同的宏來決定編譯程序?qū)δ男┐a進行處理。利用GCC編譯第一個程序2023/2/1121#include<stdio.h>intmain(void){

printf(“hello大家好!\n”);

return0;}程序名稱存為”hello.c”GCC常用編譯指令1、無選項編譯鏈接用法:$gcc

hello.c作用:將hello.c預(yù)處理、匯編、編譯并鏈接形成可執(zhí)行文件。這里未指定輸出文件,默認(rèn)輸出為a.out2、選項

-o用法:$gcc

hello.c

-o

hello作用:將hello.c預(yù)處理、匯編、編譯并鏈接形成可執(zhí)行文件hello(可自定義名稱)。-o選項用來指定輸出文件的文件名。3、選項

-E(大寫)用法:$gcc

-E

hello.c

-o

hello.i作用:將hello.c預(yù)處理輸出hello.i文件。2023/2/1122GCC常用編譯指令4、選項

-S(大寫)用法:$gcc

-S

hell

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論