?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

頂級貴賓會app下載:包你能學會的技術:Linux內核入門集

?

步驟一:獲取內核代碼

這歲首,Linux成了一個時髦詞。自詡對電腦玩的精曉的門生和IT人士們,沒有哪個不在自己的電腦上安裝一、兩個Linux,并自覺遇上了時髦。然而,在Ubuntu或SUSE的論壇中,常常有這樣的對話:

“你學Linux學了這么久,都學到了什么?”

“哦,我現在Linux的安裝、進級、桌面美化都很純熟!你看我這是最新版的Ubuntu,桌面很漂亮吧!”

“……”

Linux社區中有一句名言:假如你進入你的操作系統不知道該做什么,那最好照樣關掉落電腦,必然有更緊張的事等著你去做。說真的,假如對 Linux敕令不純熟,真的不能算是學過Linux。然而另一方面,Linux內核雖然是一樣平常用戶可學可不學的內容,但可以說卻是Linux操作系統中最 好玩的部分。尤其對付開拓者而言,Linux內核開拓絕對是最抱負的檢驗場所。51CTO編輯不停覺得,國外之以是IT技巧大年夜拿林立,和他們從小打仗類 UNIX系統、把玩內核開拓是脫不了關系的。

下面是Linux內核開拓者Robert Love寫的一篇入門文章,號稱“包教會”,保舉對Linux內核開拓感興趣的門生、Linux喜歡者、開拓者以及系統治理員們必然不要錯過。當然,雖然標題說是包教會,你可能必要必然的Linux敕令以及C說話的根基。

以下是正文內容:

Linux內核不停都被視為進修Linux最難的一塊,信托大年夜家也必然看過不少關于內核的文章,但捫心自問,你現在究竟掌握了若干?本文將從零開始先容被視為高妙的Linux內核,內容涉及內核源代碼的下載,編譯,安裝,以及內核開拓相關的內容。

若何獲取Linux內核源代碼

下載Linux內核當然要辭官方網站了,網站供給了兩種文件下載,一種是完備的Linux內核,另一種是內核增量補丁,它們都是tar歸檔壓縮包。除非你有特其余緣故原由必要應用舊版本的Linux內核,否則你應該老是進級到最新版本。

應用Git

由Linus領頭的內核開拓步隊從幾年前就開始應用Git版本節制系統治理Linux內核了(參考涉獵:什么是Git?),而Git項目本身也 是由Linus創建的,它和傳統的CVS不一樣,Git是散播式的,是以它的用法和事情流程很多開拓職員可能會認為很陌生,但我強烈建議應用Git下載和 治理Linux內核源代碼。

你可以應用下面的Git敕令獲取Linus內核代碼樹的最新“推送”版本:

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

然后應用下面的敕令將你的代碼樹與Linus的代碼樹最新狀態同步:

$ git pull

安裝內核源代碼

內核包有GNU zip(gzip)和bzip2款式。Bzip2是默認和首選款式,由于它的壓縮比平日比gzip更好,bzip2款式的 Linux內核包一樣平常采納linux-x.y.z.tar.bz2形式的文件名,這里的x.y.z是內核源代碼的詳細版本號,下載到源代碼包后,解壓和抽 取就很簡單了,假如你下載的是bzip2包,運行:

$ tar xvjf linux-x.y.z.tar.bz2

假如你下載的是gzip包,則運行:

$ tar xvzf linux-x.y.z.tar.gz

無論履行上面哪一個敕令,著末都邑將源代碼解壓和抽取到linux-x.y.z目錄下,假如你應用Git下載和治理內核源代碼,你不必要下載tar包,只必要運行git clone敕令,它就會自動下載和解壓。

內核源代碼平日都邑安裝到/usr/src/linux下,但在開拓的時刻最好不要應用這個源代碼樹,由于針對你的C庫編譯的內核版本平日也鏈接到這里的。

利用補丁

Linux內核開拓職員會將自己的改動做成補丁與其它職員分享,而且補丁是增量的,增量補丁是從一個內核樹移動到另一個內核樹的有效措施,不用 下載完備的內核包就可以進級內核,不僅可節省帶寬,也節省了內核進級光陰,利用補丁之前先輩入內核源代碼樹所在目錄,然后運行:

$ patch –p1內核源代碼樹先容

內核源代碼樹分為許多目錄,它們下面又包孕許多子目錄,源代碼樹的頂級目錄及其描述拜見下表。

在源代碼樹的根目錄下還有很多文件必要闡明,COPYING是內核許可描述文件(即GNU GPL v2),CREDITS是介入Linux內 核的開拓職員名單,MAINTAINERS列出了掩護各個子系統和驅動的小我,Makefile是內核Makefile的根基。

天生內核

天生內核著實很簡單,以致比編譯和安裝其它系統級組件,如glibc還要簡單,從2.6版本開始,Linux內核引入了一個新的設置設置設備擺設擺設和天生系統,它使臨盆內核的操作變得加倍簡單了。

設置設置設備擺設擺設內核

既然已經拿到內核源代碼,那我們在開始編譯前就可以根據必要自行設置設置設備擺設擺設和定制,可以編譯你指定的功能和想要的驅動,設置設置設備擺設擺設內核是天生內核必須的一 步,由于內核供給了大年夜量的功能,支持各類不合的硬件,有很多都必要設置設置設備擺設擺設,內核設置設置設備擺設擺設是由設置設置設備擺設擺設選項節制的,設置設置設備擺設擺設選項都有CONFIG前綴,例如,對稱多處置懲罰 (SMP)是由CONFIG_SMP設置設置設備擺設擺設選項設置設置設備擺設擺設的,假如設置了這個選項,SMP就被啟用了,反之則被禁用,設置設置設備擺設擺設選項可以確定會天生哪個文件,也可以經由過程 預處置懲罰指令操控代碼。

設置設置設備擺設擺設選項可以節制天生歷程要么是布爾型,要么是三態型,布爾型便是“是”或“否”,大年夜部分內核設置設置設備擺設擺設選項都屬于布爾型,如 CONFIG_PREEMPT,而三態型則在“是”和“否”的根基上,又增添一個“模塊”選項,模塊選項表示設置設置設備擺設擺設選項被設置了,但著末會編譯成模塊,而不 是直接編譯進內核,模塊可以理解為可自力動態載入的工具,一樣平常來說,驅動設置設置設備擺設擺設平日都是三態型。

設置設置設備擺設擺設選項也可所以字符串或整數,這樣的選項不會節制天生歷程,指定的值由內核源代碼造訪預處置懲罰宏時應用,例如,可以為某個設置設置設備擺設擺設選項指定靜態分配數組的大年夜小。

Linux廠商也會隨發行版供給預編譯的內核,如Canonical為Ubuntu,或Red Hat為Fedora供給的內核,這樣的內核通 常只啟用了必要的內核功能,險些所有驅動都被編譯成模塊了,這樣的內核供給了一個優越的根基內核和廣泛的硬件模塊支持,無論若何,想要成為內核高手,你應 該編譯自己的內核。

值得榮耀的是,內核供給了很多對象簡化設置設置設備擺設擺設 ,最簡單的對象是基于文本敕令行的實用法度榜樣,如:

$ make con頂級貴賓會app下載fig

這個對象會一個選項一個選項地設置設置設備擺設擺設,但用戶必要介入,如指定“是(y)”,“否(m)”照樣“模塊(m)”,全部設置設置設備擺設擺設歷程必要很長的光陰,因 此,除非是有人按小時計費請你進級內核,其實找不出其余來由用這種最原始的措施設置設置設備擺設擺設內核了,相反,有現成的基于ncurses的圖形化對象可以代替。

$ make menuconfig

或是基于gtk+的圖形化對象

$ make gconfig

上述三個對象都將設置設置設備擺設擺設選項分成多個種別,如“處置懲罰器類型和特性”,你可以在這些種別上往返移動,查看內核選項,當然也可以改動它們的設置了。

下面這個敕令會根據你的架構創建一個默認的設置設置設備擺設擺設根基。

$ make defconfig

雖然默認設置設置設備擺設擺設頂級貴賓會app下載有些堅定(在i386上,默認設置設置設備擺設擺設是由Linus設置設置設備擺設擺設的),但假如你從未設置設置設備擺設擺設過內核,它供給了一個優越的起頭。

設置設置設備擺設擺設選項存儲在源代碼樹根目錄下一個名叫。config的文件中,你可以打開這個文件手工編輯此中的設置設置設備擺設擺設選項,改動后或要在新的內核源代碼樹上利用現有設置設置設備擺設擺設文件,你可以應用下面的敕令驗證和更新設置設置設備擺設擺設:

$ make oldconfig

在天生內核之前必須運行這個敕令。

設置設置設備擺設擺設選項CONFIG_IKCONFIG_PROC指定了完備的內核設置設置設備擺設擺設文件壓縮包位置,默認是/proc/config.gz,這樣在天生新 內核時要克隆現有的設置設置設備擺設擺設就變得異常簡單了。假如你當前的內核開啟了這個選項,你可以從/proc拷貝該設置設置設備擺設擺設文件,然后在此根基上天生新的內核:

$ zcat /proc/config.gz > .config   $ make oldconfig

內核設置設置設備擺設擺設好后,應用下面的敕令進行天生:

$ make

和2.6曩昔的內核不一樣,在天生內核前不再必要履行make dep敕令了,依附樹會自動掩護,也不必要再指定特定的天生類型,如bzImage,或自力天生模塊,默認Makefile規則會自動處置懲罰好統統。

將滋擾信息最小化

在天生歷程中會遭到警告和差錯的滋擾。最小化滋擾信息的一個訣竅是重定向make的輸出,但仍舊會看到一些警告和差錯:

$ make > /detritus

假如你想查看天生輸出,你可以事后涉獵這個文件,假如你完全不想看到任何輸出,那么就重定向到/dev/null:

$ make > /dev/null

同時履行多個天生功課

Make敕令供給了一個功能可以將天生歷程拆分成多個平行的功課,這些功課可以自力運行,也可以并交運行,在多處置懲罰器系統上可以極大年夜地前進天生速率,也前進了處置懲罰器使用率,由于天生大年夜型源代碼樹會呈現大年夜量的I/O等待光陰。

默認環境下,make只能拆分成一個功課,由于Makefiles經常會包孕不精確的依附信息,假如然是這樣,多個并行履行的功課將會引起紛亂,終極會導致天生歷程掉敗,假如Makefiles中的依附信息無誤,那么完全可以拆分成多個功課履行,如:

$ make –jn

這里的n表示拆分的功課數量,平日按每個處置懲罰器拆分成1-2個功課,例如,在一個16核心的機械上 ,你可以運行:

$ make -j32 > /dev/null

應用distcc或ccache等優秀的對象也可以大年夜大年夜前進天生速率。

安裝新內核

內核天生好之后,你必要安裝它,若何安裝于系統架構和向導加載法度榜樣有關,我們以x86架構,grub向導加載法度榜樣為例進行闡明。

首先將arch/i386/boot/bzImage拷貝到/boot,重命名為vmlinuz- version,這里的version也是 版本號,然后編輯/boot/grub/grub.conf,為新內核添加響應的項目,假如是應用LILO向導裝載法度榜樣,則改動/etc /lilo.conf文件,然后運行lilo。

模塊的安裝與系統架構無關,都是自動完成的,以root用戶運行:

% make modules_install

這個敕令會將所有編譯好的模塊安裝到/lib/modules下對應的子目錄中。

天生歷程會在源代碼樹根目錄下創建一個System.map文件,它包孕一個符號查找表,映射內核符號到它們的肇端地址,在調試時代可以用它將內存地址轉換成函數和變量名。

可能會碰到的問題

與通俗用戶空間的利用法度榜樣比擬,Linux內核有多頂級貴賓會app下載個特殊的屬性,下面是我覺得最緊張的一些不合:

◆內核既不造訪C庫也不造訪標準C頭;

◆內核是用GNU C編碼的;

◆內核缺少用戶空間供給的內存保護;

◆內核不能輕易地履行浮點運算;

◆內核有一個小型的固定大年夜小的進程客棧;

◆因為內核支持異步中斷和SMP,是以同步和并發是內核主要擔心的問題;

◆可移植性也很緊張。

下面我們就逐個來懂得一下這些問題,所有內核開拓職員都必須記著它們。

無libc或標準頭

和用戶空間利用法度榜樣不一樣,內核并沒有鏈接到標準的C庫,也沒有鏈接到任何其它的庫,這樣設計的緣故原由有很多,包括如先有雞照樣先有蛋的問題,但主要緣故原由照樣速率和內核大年夜小,不要說完備的C庫,便是它的一個子集也夠大年夜,內核太大年夜只會導致效率低下。

不要擔心,許多常用的libc函數都在內核中實現了,例如,常見的字符串操作函數就位于lib/string.c中,只必要包括它的頭文件就可以了。

這里的頭文件指的是內核源代碼樹中的頭文件,內核也只能應用樹內的頭文件,根基文件位于源代碼根目錄的include/目錄下,例如,頭文件就位于include/linux/inotify.h。

與架構相關的頭文件則位于arch//include/asm,例如,假如在x86架構下編譯,與你 架構相關的文件便是arch/x86/include/asm,只必要在引用這些頭的地方加上asm/前綴即可,如。

遺漏落的大年夜部分都是類似printf()這樣的函數,內核不會應用printf(),但它供給了printk()函數,其體現毫不比 printf()差,printk()會拷貝款式化的字符串到內核日志緩沖區,syslog法度榜樣便是從這里讀守信息的,其用法也和printf()類似:

printk("Hello world! A string '%s' and an integer '%d'n", str, i);

printf()和printk()之間最大年夜的不合是,printk()容許你指定一個優先級標記,syslogd應用這個標記確定在哪里顯示內核消息,下面是一個應用優先級標記的示例:

printk(KERN_ER頂級貴賓會app下載R "this is an error!n");

留意在KERN_ERR和打印的消息之間沒有逗號,這是有意這么設計的,優先級應用一個預定義的字符定義,在編譯時代它與打印的信息是串聯的。

GNU C

和許多Unix內核類似,Linux內核也是用C編寫的,但大概會讓人很意外,內核不是用嚴謹的ANSI C編寫的,內核開拓職員用的卻是gcc(GNU編譯器集,包孕了編譯內核和Linux C法度榜樣的C編譯器)中的各類說話擴展。

內核開拓職員同時應用了C說話的ISO C99和GNU C擴展,這些變更讓Linux內核與gcc結合得更慎密,但近來又呈現了一個編譯 器 – 英特爾的C編譯器 – 也對gcc的功能支持得相稱好,是以也可以用它來編譯Linux內核。最低支持的gcc版本是3.2,建議采納 gcc 4.4或更高的版本編譯。應用ISO C99擴展也是可以的,由于C99是C說話的官方版本。

內聯函數

C99和GNU C都支持內聯函數,內聯函數是直接插入到每個函數調用的位置的,打消了函數調用和返回的開銷,容許進一步優化,由于編譯器可以 同時優化調用者和被調用函數,但它也有毛病,代碼大年夜小會增添,由于函數的內容被直接復制到所調用者內部了,是以也會增添內存耗損和指令緩存空間。內核開拓 職員一樣平常在小型光陰很關鍵的函數中才會應用內聯函數。

定義函數時,應用static和inline關鍵字聲明內聯函數,例如:

static inline void wolf(unsigned long tail_size)

函數必須先聲明后應用,否則編譯器就不能使函數內聯,一樣平常做法是將內聯函數放在頭文件中,由于它們被標記為static,不會創建輸出函數,假如內聯函數僅在一個文件中應用,可以放在該文件的頂部。

在內核中,與繁雜的宏比擬,出于安然和可讀性方面斟酌,內聯函數是首選。

內聯匯編

Gcc C編譯器容許在C函數中嵌入匯編指令,asm()編譯器指令用于內聯匯編代碼,例如,這個內聯匯編指令履行x86處置懲罰器的rdtsc指令,返回光陰戳寄存器(tsc)的值:

unsigned int low, high;

asm volatile("rdtsc" : "=a" (low), "=d" (high));

/* low and high now contain the lower and upper 32-bits of the 64-bit tsc */

Linux內核是用C和匯編說話混雜編寫的,與底層硬件相關的代碼很多都是用匯編說話寫的,剩下的大年夜部分內核代碼都是直接用C編寫的。

分支評釋

Gcc C編譯器內置了一個指令優化前提分支,內核將這個打包成易于應用的宏 -likely()和unlikely()。

先看下面這樣的if語句:

if (error) { /* … */ }

將這個分支標記為異常弗成能采納

/* we predict 'error' is nearly always zero … */ if (unlikely(error)) { /* … */ }

相反,將這個分支標記為異??赡懿杉{

/* we predict 'success' is nearly always nonzero … */ if (likely(success)) { /* … */ }

當分支指令已經知道一個優先級,或你想在一種環境下優化另一種環境時應該應用上述指令,最緊張的是,當分支精確標記時,這些指令會提升機能,但假如分支標記差錯則會低落機能,在內核代碼中,unlikely()要應用得更多,由于if語句傾向于表示一種特殊環境。

無內存保護

當用戶空間的利用法度榜樣考試測驗一個不法的內存造訪時,內核可以捕捉履新錯,發送SIGSEGV旌旗燈號,殺掉落進程,假如內核考試測驗一個不法的內存造訪時,結果就不受節制了,由于誰也無法去節制內核,這也是內核最主要的掉誤。

此外,內核內存也是弗因素頁的,是以你耗損的每個內存字節都比物理內存的一個字節要少。

不能(輕易)應用浮點數

當用戶空間進程應用浮點指令時,內核要認真處置懲罰從整型到浮點模式的轉換。

與用戶空間不一樣,內核不能無縫支持浮點數,由于它自己不能隨意馬虎地捕捉到自己,在內核中應用浮點數必要手動保存和規復浮點數寄存器,是以除非卻有需要,否則只管即便不要在內核中做浮點運算。

小型,固定大年夜小的客棧

用戶空間可以靜態分配許多不合的客棧,包括巨型布局和千元數組,這個行徑是合法的,由于用戶空間有很大年夜的客棧,并可以動態增長。

內核客棧不大年夜也不是動態的,相反,它很小且是固定的,內核客棧的正確大年夜小根據架構有所不合,在x86上,客棧大年夜小是在編譯時確定的,一樣平常是 4KB或8KB,歷史上,內核客棧有2頁,平日表示它處于32位架構上,大年夜小是8KB,假如是16KB就表示是64位架構,總之大年夜小是固定的,每個進程接 收它自己的客棧。

同步和并發

內核最輕易受競爭前提影響,和一個單線程的用戶空間利用法度榜樣不一樣,有許多內核特點容許同時造訪共享資本,是以必要同步以防止競爭,分外是:

◆Linux是一種搶占式多義務操作系統,進程是由內核的進程調整器隨意調整和再次調整的,內核必須在這些義務之間同步;

◆Linux支持頂級貴賓會app下載對稱多處置懲罰(SMP),是以,假如沒有適當的保護,在兩個或多個處置懲罰器上同時履行的內核代碼可能會同時造訪相同的資本;

◆中斷是異步發生的,是以,假如沒有適當的保護,在造訪資本時代也可能發生中斷,中斷處置懲罰法度榜樣可能就會造訪到相同的資本;

◆Linux是有優先權的,是以,假如沒有適當的保護,內核代碼可能會優先履行,造訪其它代碼正在應用的資本。

辦理這些問題的一樣平常措施是自旋鎖和旌旗燈號量。

可移植性的緊張性

雖然用戶空間利用法度榜樣一樣平常不會太注重可移植性,但Linux切實著實是一個可移植性操作系統,應該維持同等,這意味著與架構無關的C代碼必須在大年夜量的系統上精確地編譯和運行,與架構相關的代碼必須在內核源代碼樹中應用特定的目錄分隔開。

總結

可以肯定,內核有它獨特的性子,它有它自己的一些原則,不過,內核的繁雜性和障礙與其它大年夜型軟件項目比擬,并沒有什么大年夜的不合,Linux開拓蹊徑上最緊張的一步是熟識到內核并弗成怕,不認識?當然!弗成超越?當然不是!

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

快三平台开户