- N +

linux內(nèi)核設(shè)計與實現(xiàn) linux內(nèi)核設(shè)計的藝術(shù)

大家好,linux內(nèi)核設(shè)計與實現(xiàn)相信很多的網(wǎng)友都不是很明白,包括linux內(nèi)核設(shè)計的藝術(shù)也是一樣,不過沒有關(guān)系,接下來就來為大家分享關(guān)于linux內(nèi)核設(shè)計與實現(xiàn)和linux內(nèi)核設(shè)計的藝術(shù)的一些知識點,大家可以關(guān)注收藏,免得下次來找不到哦,下面我們開始吧!

Linux的內(nèi)核及其作用

管理進程:內(nèi)核負責創(chuàng)建和銷毀進程,并處理它們與外部世界的聯(lián)系(輸入和輸出),不同進程間通訊(通過信號,管道,或者進程間通訊原語)對整個系統(tǒng)功能來說是基本的,也由內(nèi)核處理。另外,調(diào)度器,控制進程如何共享CPU,是進程管理的一部分。更通常地,內(nèi)核的進程管理活動實現(xiàn)了多個進程在一個單個或者幾個CPU之上的抽象。

管理內(nèi)存:計算機的內(nèi)存是主要的資源,處理它所用的策略對系統(tǒng)性能是至關(guān)重要的。內(nèi)核為所有進程的每一個都在有限的可用資源上建立了一個虛擬地址空間。內(nèi)核的不同部分與內(nèi)存管理子系統(tǒng)通過一套函數(shù)調(diào)用交互,從簡單的malloc/free對到更多更復(fù)雜的功能。

文件系統(tǒng):Unix在很大程度上基于文件系統(tǒng)的概念;幾乎Unix中的任何東西都可看作一個文件。內(nèi)核在非結(jié)構(gòu)化的硬件之上建立了一個結(jié)構(gòu)化的文件系統(tǒng),結(jié)果是文件的抽象非常多地在整個系統(tǒng)中應(yīng)用。另外,Linux支持多個文件系統(tǒng)類型,就是說,物理介質(zhì)上不同的數(shù)據(jù)組織方式。例如,磁盤可被格式化成標準Linux的ext3文件系統(tǒng),普遍使用的FAT文件系統(tǒng),或者其他幾個文件系統(tǒng)。

設(shè)備控制:幾乎每個系統(tǒng)操作終都映射到一個物理設(shè)備上,除了處理器,內(nèi)存和非常少的別的實體之外,全部中的任何設(shè)備控制操作都由特定于要尋址的設(shè)備相關(guān)的代碼來進行。這些代碼稱為設(shè)備驅(qū)動。內(nèi)核中必須嵌入系統(tǒng)中出現(xiàn)的每個外設(shè)的驅(qū)動,從硬盤驅(qū)動到鍵盤和磁帶驅(qū)動器。內(nèi)核功能的這個方面是本書中的我們主要感興趣的地方。

網(wǎng)絡(luò)管理:網(wǎng)絡(luò)必須由操作系統(tǒng)來管理,因為大部分網(wǎng)絡(luò)操作不是特定于某一個進程:進入系統(tǒng)的報文是異步事件。報文在某一個進程接手之前必須被收集,識別,分發(fā),系統(tǒng)負責在程序和網(wǎng)絡(luò)接口之間遞送數(shù)據(jù)報文,它必須根據(jù)程序的網(wǎng)絡(luò)活動來控制程序的執(zhí)行。另外,所有的路由和地址解析問題都在內(nèi)核中實現(xiàn)。

怎樣自制Linux系統(tǒng)

我們假設(shè)題主是想為特定的平臺定制一個特定的Linux系統(tǒng)。這樣的工具有很多,可以參考這篇文章:http://tinylab.org/linux-lab-full-rootfs/

介紹了七種制作Linux系統(tǒng)的工具:

Linux基金會為Rootfs制定了規(guī)范文檔:LinuxFHS,社區(qū)可以基于它開發(fā)自己的實現(xiàn),下面是社區(qū)的一些候選制作方法:

1.Busybox,BusyBoxcombinestinyversionsofmanycommonUNIXutilitiesintoasinglesmallexecutable.

2.Buildroot,asimple,efficientandeasy-to-usetooltogenerateembeddedLinuxsystemsthroughcross-compilation.

3.Openembedded,thebuildframeworkforembeddedLinux.

4.Yocto,NOTANEMBEDDEDLINUXDISTRIBUTION,ITCREATESACUSTOMONEFORYOU.

5.LFS,aprojectthatprovidesyouwithstep-by-stepinstructionsforbuildingyourowncustomLinuxsystem,entirelyfromsourcecode.

6.CLFS,aprojectthatprovidesyouwithstep-by-stepinstructionsforcrossbuildingyourowncustomizedLinuxsystementirelyfromsource.

7.Distributions,top10mostpopularlinuxdistributionscompared

Busybox小巧輕靈,本身提供了常見Unix工具集的tiny實現(xiàn),麻雀雖小,五臟俱全,進行微小的調(diào)整就可以制作一個隨Linux內(nèi)核啟動的符合FHS的文件系統(tǒng),特別適合入門嵌入式Linux開發(fā),不需要花很多時間,就可以了解Linux文件系統(tǒng)的組織結(jié)構(gòu)和啟動引導(dǎo)過程。

Buildroot,看名字主要是制作Rootfs,集成了Busybox,uclibc等大量輕量級的工具、代碼庫,可以用熟悉的內(nèi)核配置工具來配置,用于制作面向嵌入式環(huán)境的根文件系統(tǒng),所以之前就用它來制作了LinuxLab的minirootfs。它不僅提供了多種架構(gòu)預(yù)先編譯的交叉編譯工具鏈,本身也可以用來制作交叉編譯工具,還可以用來編譯內(nèi)核、Qemu等。為什么不用Buildroot來制作fullrootfs呢?最重要的是,它沒有包管理,需要有一個基礎(chǔ)的下載和編譯過程,這個是有點費時間。但是,如果需要制作比較小的嵌入式系統(tǒng),這個過程是值得的,首次編譯以后,后面就相對比較輕松。

Openembedded,提供了更靈活的配置功能,引入了“菜譜”這樣的概念,引入了專門的配置工具:Bitbake,也增加了可擴展性,但是復(fù)雜度和編譯時間大大增加。相比而言,Buildroot隱藏了這些細節(jié)。

Yocto,相比Openembedded在配置性和可擴展性上更進一步,甚至通過引入BSPs,支持真實的機器和開發(fā)板,也可以通過配置加入包管理工具,所以它有能力通過大量預(yù)制的“菜譜”制作一個完整的LinuxDistribution。Yocto和Openembedded之間共享Bitbake和openembedded-core,它們是Openembedded的構(gòu)建系統(tǒng),Yocto基于此做了自己的構(gòu)建工具:Poky。Yocto和Buildroot的更完整比較請看:Buildrootv.s.Openembedded/YoctoProject。

LFS,LinuxFromScratch,從名字就可以理解,它是從頭開始制作一個Linux,manually,step-by-step,相比Busybox,它包含了各種normal-size的包,本身還會制作工具鏈,制作代碼庫,Busybox帶了tiny-size的代碼庫,但是沒有工具鏈。

CLFS,CrossLFS,這里主要體現(xiàn)是交叉編譯,就是在一個架構(gòu)上step-by-step完成另外一個架構(gòu)的LFS過程。

Distributions,Linux世界的發(fā)行版百花齊放,不同主題、不同桌面、不同領(lǐng)域、不同更新頻次、不同包管理工具讓人眼花繚亂,目前業(yè)界還在常用的有這么幾種:Ubuntu、Debian、ArchLinux、CentOS、Android。Ubuntu現(xiàn)在被各大企業(yè)廣泛使用,每年4月和10月各發(fā)行一個版本;Debian更新更慢,可能也更為穩(wěn)定;ArchLinux的package滾動更新,比較快能拿到單個軟件的新版本;CentOS基本是Redhat的社區(qū)版;Android面向手機。Distributions的好處是有預(yù)編譯的工具鏈、工具以及Qemu,還有各種代碼庫,比較適合聚焦應(yīng)用開發(fā)。不過并不是所有發(fā)行版都支持多種架構(gòu),這里頭Ubuntu和Debian是特例,它們都支持ARM、PowerPC和S390,Debian還支持MIPS。除了CD包,Ubuntu還提供了Ubuntu-base(非?;A(chǔ))和Ubuntu-core(功能更豐富)的文件系統(tǒng)的壓縮包,14.10以后只提供制作好的img,之前有純粹的壓縮包。另外,Ubuntu和Debian都提供了debootstrap機制,允許直接拉一個base系統(tǒng),然后在之上安裝其他的package。

我想學(xué)習x86下的linux內(nèi)核,該怎么起步

如何學(xué)習內(nèi)核及編程,我覺得可以從內(nèi)核的引導(dǎo)啟動開始:

1.不防從引導(dǎo)程序(bootloader)開始,可以選擇u-boot,熟悉u-boot啟動代碼,比如初始化內(nèi)存、啟動的匯編代碼是如何跳轉(zhuǎn)至C程序的、bootloader引導(dǎo)Linux有哪些要求(基于CPU架構(gòu)不同而不同,比如ARM引導(dǎo)Linux可參考《BootingARMLinux》http://www.simtec.co.uk/products/SWLINUX/files/booting_article.html)、啟動后是如何傳遞參數(shù)給Linux內(nèi)核的、;

2.bootloader將內(nèi)核映像載入物理內(nèi)存后,壓縮的內(nèi)核映像是如何自解壓、head.S文件中對MMU操作、單/多核是如何跑起來的、start_kernel;btw.內(nèi)核引導(dǎo)啟動這個過程建議結(jié)合一些操作系統(tǒng)的理論知識一起熟悉,比如MMU頁表的建立,若不熟悉對應(yīng)CPU架構(gòu)下的MMU,即使懂匯編但代碼看起來可能比較吃力。

熟悉內(nèi)核的引導(dǎo)過程,個人覺得將大學(xué)時學(xué)的操作系統(tǒng)理論知識與實踐相結(jié)合起來了,好多上學(xué)時模糊的概念一下清晰了許多。

接下來再來說下內(nèi)核編程:

1.makemenuconfig等配置內(nèi)核,構(gòu)建及更新內(nèi)核;

2.熟悉內(nèi)核Makefile文件;

3.從HelloWorld開始學(xué)習模塊編程,熟悉file_operations嘗試編程簡單的驅(qū)動;

4.掌握(熟悉使用、區(qū)別)內(nèi)核提供競爭方面的API,spinlock/semaphore/rw_semaphore/completion/rw_lock/mutex,以及RCU等;

5.內(nèi)核態(tài)下動態(tài)內(nèi)存API,get_free_pages/kmalloc/vmalloc等(關(guān)于內(nèi)存管理這塊可暫時先了解接口的使用,后續(xù)有精力再去熟悉Linux內(nèi)存管理,里面太多東西太復(fù)雜了,呵呵,我也是略知皮毛);

6.內(nèi)核線程的創(chuàng)建,內(nèi)核與用戶進程的通信方式;

7.網(wǎng)絡(luò)方面可以先從Socket的實現(xiàn)慢慢熟悉,比如recv系統(tǒng)調(diào)用是如何經(jīng)過傳輸層、網(wǎng)絡(luò)層把鏈路層的數(shù)據(jù)包一層一層傳回應(yīng)用程序的;

8.網(wǎng)絡(luò)驅(qū)動的編寫等;

這里給大家推薦一個學(xué)習linux內(nèi)核的地址https://ke.qq.com/course/431590?flowToken=1013767

Linux服務(wù)器開發(fā)的免費學(xué)習地址:https://ke.qq.com/course/417774?flowToken=1013300

linux內(nèi)核推薦書

《深入理解Linux內(nèi)核》是一本經(jīng)典的關(guān)于Linux內(nèi)核的推薦書籍,作者是DanielP.Bovet和MarcoCesati。該書詳細介紹了Linux內(nèi)核的結(jié)構(gòu)、設(shè)計和運行機制,對于想要深入了解Linux內(nèi)核的讀者來說是不可或缺的參考資料。

Linux內(nèi)核開發(fā)與Linux驅(qū)動開發(fā)有什么關(guān)系

Linux內(nèi)核包括系統(tǒng)調(diào)用接口、進程管理、內(nèi)存管理、虛擬文件系統(tǒng)、網(wǎng)絡(luò)堆棧、設(shè)備驅(qū)動,Linux內(nèi)核開發(fā)就包括上面的每一個模塊了。

Linux還分為用戶空間和內(nèi)核空間,2者基本關(guān)系如下圖所示:

Linux驅(qū)動開發(fā)屬于Linux內(nèi)核開發(fā)的一部分,手機、平板底層LCD、Camera、G-sensor等硬件驅(qū)動都需要Linux驅(qū)動開發(fā)來完成。作為驅(qū)動工程師需要掌握如下Linxu驅(qū)動開發(fā):

1.Linux系統(tǒng)下的Uboot移植2.Linux系統(tǒng)下的kernel移植

3.Linux

系統(tǒng)下的各外設(shè)驅(qū)動開發(fā)

字符設(shè)備驅(qū)動

lcd設(shè)備驅(qū)動程序

觸摸屏設(shè)備驅(qū)動程序

input輸入子系統(tǒng)驅(qū)動

Camear驅(qū)動開發(fā)

塊設(shè)備驅(qū)動、Audio驅(qū)動、USB驅(qū)動開發(fā)等

以上就是Linux內(nèi)核開發(fā)與Linux驅(qū)動開發(fā)的說明,希望對你理解有幫助!

怎樣快速調(diào)試linux內(nèi)核有哪些需要注意的問題

謝謝邀請,

這個問題就比較專業(yè)了,linux內(nèi)核調(diào)試還是在調(diào)試內(nèi)核驅(qū)動的時候用過,涉及的程度不是特別深,但是可以說下大致的思路,linux雖然貴為操作系統(tǒng),但是歸根到底還是一個程序,既然是程序就能用debug的方式去調(diào)試,只不過由于環(huán)境的差異,使用的方法和工具不盡相同,在linux下面常見的調(diào)試工具gdb,在windows上面更多的調(diào)試工具是界面化的,直接對應(yīng)的中間變量的數(shù)值以及申請內(nèi)存的地址都會直觀的展示出來,在linux上主要是通過命令的方式查看,開始會覺得很不習慣,覺得很深奧,其實就是命令的行的使用也就是常見的幾個命令。

回到正題linux內(nèi)核調(diào)試用的kgdb,一種專門針對linux內(nèi)核的調(diào)試工具,所謂的內(nèi)核的調(diào)試,主要還是在嵌入式板卡上用的比較多,需要掌握一個概念交叉編譯,這個是玩嵌入式的必備概念,通俗點講,在主機電腦上將程序編譯好,然后放在嵌入式板卡里面運行,在這就不一一舉例如何去運行,這種教科書般的教程隨手就能在網(wǎng)上獲取,現(xiàn)在只是把一些關(guān)鍵技術(shù)步驟或者細節(jié)點歸納幾條分享給大家:

1.生成的調(diào)試庫以及驅(qū)動ko文件都會比較大,所以準備的磁盤空間至少20G左右

2.需要讓內(nèi)核支持支持kgdb調(diào)試功能,需要打開配置開關(guān),正常的編譯內(nèi)核用makemenuconfig,進入kernelhacking一項

3.在編譯工程中注意文件的備份,一旦生成有問題,可以拿著之前的版本進行恢復(fù)

4.linux內(nèi)核的調(diào)試其實就是vmlinux的調(diào)試,在這涉及到一個很關(guān)鍵的概念,遠程調(diào)試,內(nèi)核的調(diào)試一般采用串口連接的方式,現(xiàn)在linux應(yīng)用遠程調(diào)試用網(wǎng)絡(luò)的居多

5.調(diào)試內(nèi)核,很多命令使用還是基于gdb完成,gdb的命令還是要熟悉

簡單呢歸納到這里,希望能幫到你。

好了,本文到此結(jié)束,如果可以幫助到大家,還望關(guān)注本站哦!

返回列表
上一篇:
下一篇: