第二章Linux內(nèi)核及內(nèi)核編程_第1頁
第二章Linux內(nèi)核及內(nèi)核編程_第2頁
第二章Linux內(nèi)核及內(nèi)核編程_第3頁
第二章Linux內(nèi)核及內(nèi)核編程_第4頁
第二章Linux內(nèi)核及內(nèi)核編程_第5頁
已閱讀5頁,還剩57頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Linux內(nèi)核及編程第2章Linux內(nèi)核及內(nèi)核編程計算機科學技術(shù)系李偉民2012年7月Linux內(nèi)核及編程提綱Linux內(nèi)核介紹

-Linux內(nèi)核演變及新版特點

-Linux內(nèi)核的組成Linux內(nèi)核編程

-Linux內(nèi)核編譯及加載-Linux下的C編程特點

Linux內(nèi)核及編程Linux內(nèi)核的發(fā)展與演變Linux生存發(fā)展的支柱UNIX操作系統(tǒng):Linux可以看做UNIX的一個克隆版本Minix操作系統(tǒng):開放源代碼,Linux參照Minix于1991年開發(fā)GNU計劃:GNU計劃和FSF由Stallman于84年創(chuàng)辦,開發(fā)出了許多高質(zhì)量的免費軟件,為Linux開發(fā)創(chuàng)造了合適的環(huán)境。Posix標準:可移植的操作系統(tǒng)接口,保證應用程序在源代碼一級上在多種操作系統(tǒng)上移植,是Linux前進的燈塔Internet:從0.95版開始,對內(nèi)核的改進和擴充以網(wǎng)友為主Linux內(nèi)核及編程Linux內(nèi)核的發(fā)展與演變Linux版本的發(fā)展

從1991年10月最初原型0.1版到2003年12月2.6版,Linux朝著支持更多的CPU、硬件體系結(jié)構(gòu)和外部設備,支持更廣泛領域的應用,提供更好的性能3個方向發(fā)展。編號問題:奇偶數(shù)編號含義。

針對嵌入式系統(tǒng)的應用的改進內(nèi)核,如HardHatLinux和RTLinux,

uClinux,ThinLinux,MontaVista。Linux內(nèi)核及編程Linux2.6內(nèi)核特點新的調(diào)度器:高負載下執(zhí)行出色,多處理器也能很好的擴展。內(nèi)核搶占:提高實時性,增強系統(tǒng)的用戶交互性。改進的線程模型:可以處理任意數(shù)目的線程,最大達20億。虛擬內(nèi)存的變化:融合反向映射技術(shù)。文件系統(tǒng):支持日志文件系統(tǒng)功能,對擴展屬性及Posix標準訪問控制支持,給指定的文件在文件系統(tǒng)中嵌入元數(shù)據(jù)。音頻:ALSA支持USB和MIDI設備。電源管理:調(diào)節(jié)CPU,降低功耗。聯(lián)網(wǎng)和IPSec:加入對IPSec和NFSv4的支持,改進對IPv6的支持。用戶界面層:加入了對近乎所有接口設備的支持。Linux內(nèi)核及編程Linux內(nèi)核的組成Linux內(nèi)核源代碼目錄結(jié)構(gòu)arch:和硬件體系結(jié)構(gòu)相關(guān)的代碼,每種平臺占一個相應目錄。drivers:設備驅(qū)動程序,每個不同驅(qū)動占用一個子目錄。fs:支持的各種文件系統(tǒng),如EXT、FAT、NTFS、JFFS2。block:塊設備驅(qū)動程序I/O調(diào)度。include:與系統(tǒng)相關(guān)的頭文件放在include/linux下。init:內(nèi)核初始化代碼。kernel:內(nèi)核最核心部分,和平臺相關(guān)的一部分放在arch/*/kernelmm:內(nèi)存管理代碼,和平臺相關(guān)的一部分放在arch/*/mmscripts:用于配置內(nèi)核的腳本文件。usr:實現(xiàn)了用于打包和壓縮的cpio等。Linux內(nèi)核及編程Linux內(nèi)核的組成Linux內(nèi)核組成Linux內(nèi)核及編程Linux內(nèi)核的組成進程調(diào)度Linux內(nèi)核及編程Linux內(nèi)核的組成內(nèi)存管理

內(nèi)存管理的主要作用是控制多個進程安全地共享主內(nèi)存區(qū)域。Linux內(nèi)存管理完成為每個進程進行虛擬內(nèi)存到物理內(nèi)存的轉(zhuǎn)換。Linux的每個進程享有4GB的內(nèi)存空間,0~3GB屬于用戶空間,3~4GB屬于內(nèi)核空間,內(nèi)核空間對常規(guī)內(nèi)存、I/O設備內(nèi)存以及高端內(nèi)存存在不同的處理方式。虛擬文件系統(tǒng)

隱藏了各種硬件細節(jié),為所有設備統(tǒng)一了接口。Linux內(nèi)核及編程Linux內(nèi)核的組成網(wǎng)絡接口提供對各種網(wǎng)絡標準的存取和各種網(wǎng)絡硬件的支持,分為網(wǎng)絡協(xié)議和網(wǎng)絡驅(qū)動程序。網(wǎng)絡協(xié)議實現(xiàn)可能的網(wǎng)絡傳輸協(xié)議,網(wǎng)絡設備驅(qū)動程序負責與硬件設備通信,每一種設備都有相應的驅(qū)動程序。進程通信支持進程間的多種通信機制,包含信號量、共享內(nèi)存、管道等,可協(xié)助多個進程、多資源的互斥訪問、進程間的同步和消息傳遞。Linux內(nèi)核及編程Linux內(nèi)核的組成Linux內(nèi)核組成部分之間的依賴關(guān)系進程創(chuàng)建依賴內(nèi)存管理的數(shù)據(jù)裝入。進程間通信依賴內(nèi)存管理支持共享內(nèi)存通信機制。虛擬文件系統(tǒng)利用網(wǎng)絡接口支持網(wǎng)絡文件系統(tǒng)。內(nèi)存管理利用虛擬文件系統(tǒng)支持交換,交換進程定期由調(diào)度程序調(diào)度,這說明內(nèi)存管理也依賴與進程調(diào)度。Linux內(nèi)核及編程Linux內(nèi)核的組成Linux內(nèi)核空間與用戶空間CPU內(nèi)部實現(xiàn)了不同操作模式。不同模式有不同功能。Linux系統(tǒng)充分利用了CPU這一特性,但它只使用了兩級:內(nèi)核空間和用戶空間。內(nèi)核可以進行任何操作,用戶程序被禁止對硬件的直接訪問和對內(nèi)存的未授權(quán)訪問,它們的地址空間不同。Linux只能通過系統(tǒng)調(diào)用和硬件中斷完成從用戶空間到內(nèi)核空間的控制轉(zhuǎn)移。Linux內(nèi)核及編程Linux內(nèi)核編譯為什么重新編譯內(nèi)核?Linux是一個自由軟件,內(nèi)核版本不斷更新,并增加了許多特性。根據(jù)自身系統(tǒng),定制更高效,更穩(wěn)定內(nèi)核的需要。更新的版本支持更多的硬件,具備更好的進程管理能力,運行速度更快,更穩(wěn)定,并一般會修復老版本中的bug。

經(jīng)常性地選擇升級更新的系統(tǒng)內(nèi)核是Linux使用者的必要操作內(nèi)容。編譯適合自己的內(nèi)核,將不需要的功能不要編譯進內(nèi)核,以免增加被系統(tǒng)攻擊者利用的漏洞。Linux內(nèi)核及編程Linux內(nèi)核編譯Linux內(nèi)核的獲取和更新linux內(nèi)核版本發(fā)布的官方網(wǎng)站http://。發(fā)布形式:一種是full/Source版本,另外一種是patch文件,即補丁。完整內(nèi)核版本較大,一般是tar.gz或者是.bz2文件,二者分別是使用gzip或者bzip2進行壓縮的文件,使用時需要解壓縮。patch文件則比較小,一般只有幾十K到幾百K,但是patch文件是針對于特定的版本的,你需要找到自己對應的版本才能使用。Linux內(nèi)核及編程Linux內(nèi)核編譯Linux內(nèi)核編譯準備知識編譯內(nèi)核需要root權(quán)限。一般把內(nèi)核拷貝到/usr/src下,刪除該目前下存在的linux目錄鏈接。解壓縮源代碼,如果所下載的是.tar.gz(.tgz)文件,tar-zxvfFORLINX_linux-.tar.gz。文件解壓到/usr/src/linux目錄,然后稍作修改。

mv

linuxlinux-2.6.5;ln-slinux-2.6.5linux。(可選)Linux內(nèi)核及編程Linux內(nèi)核編譯步驟通常要運行的第一個命令是:

cd/usr/src/linux

。makemrproper

:該命令確保源代碼目錄下沒有不正確的.ko文件以及文件的互相依賴。如果我們使用剛下載的完整的源程序包進行編譯,本步可以省略。而如果你多次使用了這些源程序編譯內(nèi)核,那么最好要先運行一下這個命令。Linux內(nèi)核及編程Linux內(nèi)核編譯步驟Linux內(nèi)核配置配置內(nèi)核可以根據(jù)需要與愛好使用下面命令中的一個:

#makeconfig(基于文本的最為傳統(tǒng)的配置界面,不推薦使用)#makemenuconfig(基于文本選單的配置界面,字符終端下推薦使用)#makexconfig(基于圖形窗口模式的配置界面,Xwindow下推薦使用,要求QT被安裝)#makegconfig(要求GTK+被安裝)。Linux內(nèi)核及編程Linux內(nèi)核編譯步驟Linux內(nèi)核配置界面Linux內(nèi)核及編程Linux內(nèi)核編譯步驟Linux內(nèi)核編譯#makeclean:完成刪除前面步驟留下的文件,以避免出現(xiàn)一些錯誤。這在多次編譯過內(nèi)核的話是有必要的。makebzImage或makezImage:實現(xiàn)完全編譯內(nèi)核,二者生成的內(nèi)核都是使用gzip壓縮的,只要使用一個就夠了,它們的區(qū)別在于使用makebzImage可以生成大一點的內(nèi)核。建議大家使用makezImage命令。Linux內(nèi)核及編程Linux內(nèi)核配置主要項目簡介Loadablemodulesupport這個選項是你的內(nèi)核對內(nèi)核模塊的支持選項,包括是否支持和支持的一些配置等,選擇此項會使一些不常用到的驅(qū)動或特性可以編譯為模塊以減少內(nèi)核的體積。SystemType

選擇對系統(tǒng)的支持,如什么樣的ARM內(nèi)核,什么樣的配置平臺等,如果使用不同的處理器其系統(tǒng)或是不同的內(nèi)核時此處的選項可能不同。Linux內(nèi)核及編程Linux內(nèi)核配置主要項目簡介GeneralSetup這里是內(nèi)核本身的一些屬性的配置,包括壓縮方式,網(wǎng)絡支持等很多屬性。Parallelportsupport這個選項顧名思義就是選擇內(nèi)核對并口的支持情況,當選中對并口支持后會出現(xiàn)新的選項來配置支持不同類型不同模式的并口。Linux內(nèi)核及編程Linux內(nèi)核配置主要項目簡介MemoryTechnologyDevices(MTD)對MTD設備的支持選項,這個選項對嵌入式系統(tǒng)比較重要,內(nèi)核對各種Flash的支持都在這里配置,包括種類,分區(qū)等。Blockdevices內(nèi)核對塊設備的支持選項,各種磁盤系統(tǒng)的支持。Networkingsupport對網(wǎng)絡設備的支持選項,例如系統(tǒng)配置不同的網(wǎng)卡時就要在這里選中不同的選項。Linux內(nèi)核及編程Linux內(nèi)核配置主要項目簡介Characterdevices字符型設備的支持,這個選項是嵌入式系統(tǒng)經(jīng)常使用的選項,嵌入式系統(tǒng)中大量的設備都屬于Char型的設備。Multimediadevices多媒體設備的支持。Filesystems內(nèi)核對不同文件系統(tǒng)的支持選項,在這里選擇需要支持的文件系統(tǒng)。Linux內(nèi)核及編程Linux內(nèi)核配置主要項目簡介USBsupport各種USB設備的支持。Bluetoothsupport藍牙設備的支持。Kernelhacking內(nèi)核DeBug

用的一些選項,用于報告各種信息。Linux內(nèi)核及編程內(nèi)核配置小結(jié)Linux內(nèi)核的配置系統(tǒng)由以下3個部分組成Makefile:定義Linux內(nèi)核的編譯規(guī)則。配置文件(Kconfig):給用戶提供配置選擇的功能。配置工具:配置命令解釋器和配置用戶界面。使用makemenuconfig等命令后,會生成一個.config配置文件,記錄哪些被編譯入內(nèi)核,哪些被編譯為內(nèi)核模塊。Linux內(nèi)核及編程Kconfig和MakeFile在Linux內(nèi)核中增加程序需要完成以下3項工作將編寫的源代碼拷入Linux內(nèi)核源代碼的相應目錄。在目錄的Kconfig文件中增加關(guān)于新源代碼對應項目的配置選項在目錄的Makefile文件中增加對新源代碼的編譯條目。Makefile定義Linux內(nèi)核的編譯規(guī)則,make工具可以實現(xiàn)自動編譯和增量編譯,但必須告訴make源程序之間的依賴關(guān)系,描述這種關(guān)系的就是Makefile文件。Linux內(nèi)核及編程MakeFile文件分類Linux內(nèi)核及編程MakeFile的作用決定編譯哪些文件頂層Makefile決定內(nèi)核根目錄下哪些子目錄將被編進內(nèi)核(采用遞歸的方式)。arch/$(ARCH)/Makefile決定arch/$(ARCH)目錄下哪些文件、哪些目錄將被編進內(nèi)核。各級子目錄下的Makefile決定所在目錄下哪些文件將被編進內(nèi)核,哪些文件將被編成模塊(即驅(qū)動程序),進入哪些子目錄繼續(xù)調(diào)用它們的Makefile

。Linux內(nèi)核及編程Makefile的作用怎樣編譯這些文件?即編譯選項、連接選項是什么。選項分3類:全局的,適用于整個內(nèi)核代碼樹;局部的,僅適用于某個Makefile中的所有文件;個體的,僅適用于某個文件。Linux內(nèi)核及編程MakeFile的作用怎樣連接這些文件,它們的順序如何?arch/arm/Makefile:頂層Makefile:Linux內(nèi)核及編程Makefile的作用頂層Makefile按照一定的順序組織文件,根據(jù)連接腳本arc/$(ARCH)/kernel/vmlinux.lds生成內(nèi)核映象文件vmlinux。obj–y用來定義哪些文件被編進(built-in)內(nèi)核。obj-m用來定義哪些文件被編譯成可加載模塊(Loadablemodule)。lib-y用來定義哪些文件被編成庫文件。obj-y、obj-m還可以用來指定要進入的下一層子目錄。Linux內(nèi)核及編程Makefile的主要語法目標定義定義哪些內(nèi)容作為模塊編譯,哪些要編譯并連接進內(nèi)核。更常見的做法:根據(jù).config文件中的CONFIG變量來決定文件編譯方式,如:obj-y+=foo.c:表示要由foo.c或者foo.s文件編譯得到foo.o并連接進內(nèi)核。obj-$(CONFIG_ISDN)+=isdn.oobj-$(CONFIG_ISDN_PPP_BSDCOMP)+=isdn_bsdc.oLinux內(nèi)核及編程Makefile的主要語法多文件模塊的定義采用模塊名加-y或-bojs后綴來定義模塊的組成文件。目錄層次迭代當CONFIG_EXT2_FS的值為y或m時,kbuild將會把ext2目錄列入向下迭代的目標中。obj-$(CONFIG_EXT2_FS)+=ext2.oext2-y:=balloc.odir.ofile.oobj-$(CONFIG_EXT2_FS)+=ext2/Linux內(nèi)核及編程Kconfig分析一個文本形式的文件,其中主要作用是在內(nèi)核配置時候,作為配置選項,是各種配置界面的源文件。內(nèi)核的配置工具讀取各個Kconfig文件,生成配置界面供開發(fā)人員配置內(nèi)核,最后生成配置文件.config。內(nèi)核的配置界面以樹狀的菜單形式組織,主菜單下有若干個子菜單,子菜單下又有子菜單或配置選項。每個子菜單或選項可以有依賴關(guān)系,這些依賴關(guān)系用來確定它們是否顯示。只有被依賴項的父項已經(jīng)被選中,子項才會顯示。內(nèi)核源碼每個子目錄中,都有一個Makefile文件和Kconfig文件。Linux內(nèi)核及編程Kconfig基本要素config條目config條目用來配置一個選項,它用于生成一個變量,這個變量會連同它的值一起被寫入配置文件.config中。config出現(xiàn)的三種配置結(jié)果:config關(guān)鍵字,表示一個配置選項的開始。CONFIG_LEDS_S3C24XX=y#對應的文件被編進內(nèi)核CONFIG_LEDS_S3C24XX=m#對應的文件被編成模塊#CONFIG_LEDS_S3C24XX#對應的文件沒有被使用Linux內(nèi)核及編程Kconfig基本要素config變量類型:bool布爾類型、

tristate三態(tài)(內(nèi)建、模塊、移除)、string字符串、hex十六進制、integer整型。條件判斷:依賴關(guān)系:缺省值定義:

注意:省略了前綴“CONFIG_”“if〈expr〉”“prompt”<prompt>[“if”<expr>]注意:prompt關(guān)鍵字可以省略“dependson”/“requires”<expr>“default”<expr>[“if”<expr>]Linux內(nèi)核及編程Kconfig基本要素選擇選項:幫助信息:

“select”<symbol>[“if”<expr>]“help”or“---help---”Linux內(nèi)核及編程Kconfig基本要素menu條目所有處在“menu”和“endmenu”之間的菜單入口都會成為“Floatingpointemulation”子菜單。而且,所有子菜單選項都會繼承父菜單的依賴關(guān)系。menu“Floatingpointemulation”configFPE_NWFPE……configFPE_NWFPE_XP…………endmenuLinux內(nèi)核及編程Kconfig基本要素choice條目:將多個類似的配置選項組合在一起,供用戶單選或多選,格式如下:“choice”<choiceoptions><choiceblock>“endchoice”choiceprompt“ARMsystemtype”defaultARCH_VERSATILEconfigARCH_AAEC2000…configARCH_INTEGRATOR…endchoiceLinux內(nèi)核及編程Kconfig基本要素comment條目:用于定義一些幫助信息,它在配置過程中出現(xiàn)在界面的第一行.并且這些幫助信息會出現(xiàn)在配置文件中(作為注釋),格式如下:“comment”<prompt><commentoptions>menu“Floatingpointemulation”comment“Atleastoneemulationmustbeselected”Linux內(nèi)核及編程Kconfig基本要素source條目:用于讀入另一個Kconfig文件,

格式如下:“source”<prompt>source“net/Kconfig”Linux內(nèi)核及編程.config文件分析是在進行內(nèi)核配置的時候,經(jīng)過配置后生成的內(nèi)核編譯參考文件。是由配置工具自動生成。記錄哪些部分被編譯入內(nèi)核、哪些部分被編譯為內(nèi)核模塊。位于源代碼的根目錄下。.config文件節(jié)選:1#

2#Automaticallygeneratedmakeconfig:don’tedit

3#

4CONFIG_X86=y

5CONFIG_MMU=y

6CONFIG_UID16=yLinux內(nèi)核及編程Kconfig、MakeFile、.config三者之間的聯(lián)系我們在內(nèi)核源碼下面執(zhí)行make命令,實際上是根據(jù)makefile來進行編譯的。

obj-$(CONFIG_ISDN)+=isdn.o中CONFIG_ISDN是一個變量,這個變量的賦值則是通過.config文件來集中賦值的。CONFIG_ISDN=y..config文件是通過Kconfig配置生成的。當更改Kconfig文件或者通過配置工具進行內(nèi)核配置的時候會自動更新.config中相應的值。這三者是怎樣配合工作的呢?Linux內(nèi)核及編程添加驅(qū)動程序到內(nèi)核1、拷貝test到drivers路徑下cp–frtestlinux_kernel_path/drivers2、為新增目錄創(chuàng)建Kconfig和MakefileLinux內(nèi)核及編程添加驅(qū)動程序到內(nèi)核3、修改新增目錄的父目錄的Kconfig和Makefile在drivers/Kconig中加入:source"drivers/test/Kconfig“在drivers/Makefile中加入:obj-$(CONFIG_TEST)+=test/在arch/arm/Kconfig里加入:source“drivers/test/Kconfig”4、增加了Kconfig和Makefile文件之后的新的test樹型目錄如下所示:

Linux內(nèi)核及編程Linux內(nèi)核的幾個概念(補充)驅(qū)動層程序包括:硬件抽象層HAL;板間升級包BSP;設備驅(qū)動程序。硬件抽象層:(HardwareAbstractionLayer)是位于操作系統(tǒng)內(nèi)核與硬件電路之間的接口層,操作系統(tǒng)中通過接口控制所有硬件電路如CPU、I/O、Memory等的操作。抽象層一般應包括相關(guān)硬件的初始化配置操作、數(shù)據(jù)的輸入/輸出操作、硬件設備操作等功能。Linux內(nèi)核及編程Linux內(nèi)核的幾個概念(補充)抽象層的特點硬件抽象層具有與硬件的密切相關(guān)性;硬件抽象層具有與操作系統(tǒng)的無關(guān)性;接口定義的功能應包含硬件或系統(tǒng)所需硬件支持的所有功能;接口定義簡單明了,太多接口函數(shù)會增加軟件模擬的復雜性;具有可測性的接口設計有利于系統(tǒng)的軟硬件測試和集成。Linux內(nèi)核及編程Linux內(nèi)核的幾個概念(補充)板間升級包板級支持包BSP(BoardSupportPackage)是介于主板硬件和操作系統(tǒng)中驅(qū)動程序?qū)又g的一層,一般認為它屬于操作系統(tǒng)的一部分,主要是實現(xiàn)對操作系統(tǒng)的支持,為上層的驅(qū)動程序提供訪問硬件設備寄存器的函數(shù)包,使之能夠更好的運行于硬件主板。另有說法:在WindowsCE中,BSP是驅(qū)動程序、OEM適應層、硬件抽象層以及啟動設備和使外設正常工作所需BIOS文件的集合。另外,每個公司的定義和標準可能不一樣。Linux內(nèi)核及編程Linux內(nèi)核的引導初始化代碼(啟動代碼)使處理器從復位狀態(tài)進入到操作系統(tǒng)能夠運行的狀態(tài)??蓜澐譃槿齻€階段:初始化硬件配置、診斷、引導。系統(tǒng)的啟動通常用的兩種方式:直接從flash啟動;將壓縮的內(nèi)存映像文件從Flash(為節(jié)省Flash資源,提高速度)中復制、解壓到RAM,再從RAM啟動Linux內(nèi)核及編程Linux內(nèi)核的引導X86PC上的Linux引導流程系統(tǒng)啟動運行init進程Bootloader的第一階段Bootloader的第二階段啟動內(nèi)核BIOSMBRLILO、GRUB內(nèi)核用戶空間上電/復位Linux內(nèi)核及編程Linux內(nèi)核的引導當上電或復位時,CPU會將PC指針賦值為一個特定的地址并執(zhí)行該地址處的指令,位于BIOS中,保存在ROM或Flash中。BIOS運行時按照CMOS的設置的啟動設備順序來搜索處于活動狀態(tài)并且可以引導的設備。主引導加載程序查找并加載次引導加載次引導程序。次引導加載程序加載Linux內(nèi)核和可選的初始RAM磁盤,將控制權(quán)交給Linux內(nèi)核源代碼。運行被加載的內(nèi)核,并啟動用戶空間應用程序。Linux內(nèi)核及編程Linux內(nèi)核的引導Bootloader著名的LinuxBootloader包括應用于PC的LILO和GRUB,應用于嵌入式系統(tǒng)的U-Boot、RedBoot。怎樣完成啟動內(nèi)核并運行用戶空間的init進程?當內(nèi)核映像被加載到RAM之后,Bootloader的控制權(quán)被釋放,內(nèi)核映像并不是完全可直接執(zhí)行的目標代碼,而是通過一個壓縮過的zImage或bzImage。Linux內(nèi)核及編程X86PC上的Linux引導流程/arch/i386/boot/head.SStart()Startup_32()Decompress_kernel()Startup_32()Startup_kernel()cpu_idle()/arch/i386/boot/compress/head.S/arch/i386/boot/compress/misc.c/arch/i386/kernel/head.S/init/main.c/init/main.cLinux內(nèi)核及編程Linux下C編程特點Linux編碼風格Linux命名習慣不同于Windows程序命名習慣和匈牙利法。下劃線大量使用,不采用首字母大寫以區(qū)分單詞的方式。代碼縮進使用“TAB”(8個字符)。對于結(jié)構(gòu)體、if/for/while/switch語句,{不另起一行。如果if、for循環(huán)后只有1行,不要加{}。if和else混用的情況下,else語句不另起一行。對于函數(shù),{另起一行。switch和case對齊。注意空格的應用,如for(i=0;i<10;i++){。Linux內(nèi)核及編程Linux下C編程特點GNUC與ANSICLinux上可用的C編譯器是GNUC編譯器,對標準C進行一系列擴展。可以定義零長度和變量長度數(shù)組,chardata[0],doublex[n]。把包含在括號中的復合語句看做是一個表達式,稱為語句表達式。typeof(x)語句可以獲得x的類型,借助這個可以重新定義宏。宏也可以接受可變數(shù)目的參數(shù),#definepr_debug(fmt,arg…)printk(fmt,##arg)。通過指定索引或結(jié)構(gòu)體成員名,允許初始化值可以順序出現(xiàn)。預定義了兩個標識符保存當前函數(shù)的名字。Linux內(nèi)核及編程Linux下C編程特點GNUC與ANSIC允許聲明函數(shù)、變量和類型的特殊屬性,以便進行手工的代碼優(yōu)化和定制代碼檢查的方法,在聲明后添加__attribute__((ATTRIBUTE)),ATTRIBUTE為屬性說明。Noreturn、format、unused、aligned、packed屬性的意義。提供了大量內(nèi)建函數(shù),大部分是標準C庫函數(shù),不屬于庫函數(shù)的其他內(nèi)建函數(shù)以__builtin開始。在使用gcc編譯C程序的時候,使用gcc–ansi–penantic–ctest.c,則會告訴編譯器不使用GNU擴展語法。Linux內(nèi)核及編程Linux下C編程特點struct

operators

{

void

(*read1)(char

*);

void

(*read2)(char

*);

void

(*read3)(char

*);

int

n;

};

void

read1(char

*data)

{

printf("read1:

%s/n",data);

}

void

read2(char

*data)

{}

void

read3(char

*data)

{}

int

main()

溫馨提示

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

最新文檔

評論

0/150

提交評論