0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式未來還是Linux的天下,并通過內(nèi)核學(xué)習(xí)來闡述kernel的機(jī)理

Q4MP_gh_c472c21 ? 2018-01-24 08:47 ? 次閱讀

首先闡述一下我為什么想學(xué)習(xí)一下Linux kernel。最早是因?yàn)閷?duì)嵌入式的一時(shí)腦熱,我買了開發(fā)板,買了不少資料,前前后后投進(jìn)去了1000多了。不過好歹還是有點(diǎn)回報(bào)的,雖然還沒有怎么著調(diào),但又似乎拓寬了不小的知識(shí)面。

慢慢的我發(fā)現(xiàn),對(duì)于從學(xué)軟件入手的我來說,硬件知識(shí)的薄弱是個(gè)不容忽視的缺陷,畢竟軟硬件間的代溝還是不小的,就像現(xiàn)在的老爹和fashion閨女一樣,鴻溝還是忽視不得的。這有點(diǎn)讓我望而卻步,不過多大的困難都無法阻擋我的前進(jìn)啊。我對(duì)策略稍作調(diào)整,因?yàn)槲野l(fā)現(xiàn),嵌入式無論是現(xiàn)在,還是未來一段時(shí)間都還是Linux的天下;另外是真正的做Linux的大牛們似乎也都有涉足embedded system 的經(jīng)歷。這就使得僅僅會(huì)管理Linux系統(tǒng)和服務(wù),簡單的用幾個(gè)Shell commands ,編譯安裝幾個(gè)Linux應(yīng)用,讀懂幾個(gè)Makefile……根本滿足不了需求;另外也為了不讓學(xué)習(xí)的OS知識(shí)只是空洞的理論。這都要求著自己必須有編寫自己Shell程序的能力;要求著可以在Linux做程序開發(fā)的能力;要求著可以自己往kernel中附加自定義的系統(tǒng)調(diào)用、重組內(nèi)核、添加自寫驅(qū)動(dòng)……的能力。這就要求著必須深入了解,正如任何一門技術(shù)一樣,接觸久了你就有種相地層實(shí)現(xiàn)挖掘的沖動(dòng)。

調(diào)整后的策略就是先把Linux這個(gè)OS的機(jī)制弄明白,才可以遷移定制滿足需求的系統(tǒng),才可以寫出高效率的Linux應(yīng)用。整體路線就是農(nóng)村包圍城市,不斷補(bǔ)充必要知識(shí),循序漸進(jìn),最終呈現(xiàn)星星之火可以燎原之勢。額,扯得夠遠(yuǎn)。廢話不多說,下面開始。

Kernel入門,要選本好的入門書籍,我從網(wǎng)上download一本《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》。這本書簡單易讀,有OS基礎(chǔ)和Linux應(yīng)用基礎(chǔ)的人一讀即懂,我現(xiàn)已閱過3章,感覺很不錯(cuò),另外配合《Linux操作系統(tǒng)內(nèi)核實(shí)習(xí)》效果更佳。我想盡可能通過更加通俗的形式向你闡述kernel的機(jī)理,讓我們一起如喝涼水般拿下kernel。

首先介紹一下內(nèi)核源碼的根目錄描述:

arch(architecture) 特定體系結(jié)構(gòu)的源碼

crypto crypto API

Documention 內(nèi)核源碼文檔

drivers 設(shè)備驅(qū)動(dòng)程序

fs VFS和各種文件系統(tǒng)

include 內(nèi)核頭文件

init 內(nèi)核引導(dǎo)和初始化

ipc 進(jìn)程間通訊代碼

kernel 像調(diào)度程序這樣的核心子系統(tǒng)

lib 通用內(nèi)核函數(shù)

mm 內(nèi)存管理子系統(tǒng)和VM

net 網(wǎng)絡(luò)子系統(tǒng)

scripts 編譯內(nèi)核所用到的腳本

security Linux安全模塊

sound 語音子系統(tǒng)

usr 早期用戶空間代碼(所謂的initramfs)

這里只是簡單闡述個(gè)目錄及系統(tǒng)模塊分布。隨著慢慢地學(xué)習(xí)我相信一定可以把它們搞明白是怎么一回事的。

另外,你需要明白一些Linux必備的一些常識(shí)性名詞解釋知識(shí),這里羅列一些名詞,不明白的不再一一闡述,自己百度,Google:管態(tài)、目態(tài)、內(nèi)核空間、用戶空間、POSIX、system V、GNU、GPL、GNOME、KDE、QT、GTK+、openGL、shell、awk、Makefile、CC、GCC、G++、GDB、Perl……

下面來介紹一下內(nèi)核開發(fā)和應(yīng)用程序開發(fā)的差別:

內(nèi)核編程時(shí)不能訪問C庫(因?yàn)長inux下很多C庫函數(shù)是對(duì)Linux系統(tǒng)調(diào)用的封裝,自身怎么可以調(diào)用自身呢?)

內(nèi)核編程時(shí)必須使用GNU C。

內(nèi)核編程時(shí)缺乏像用戶空間那樣的內(nèi)存保護(hù)機(jī)制。

內(nèi)核編程時(shí)浮點(diǎn)數(shù)很難使用。

內(nèi)核只有一個(gè)很小的定長堆棧。

由于內(nèi)核支持異步中斷、搶占和SMP,因此必須時(shí)刻注意同步和并發(fā)。

要考慮可移植性的重要性。

對(duì)以上這幾點(diǎn)進(jìn)行描述。

1、首先就是內(nèi)核不能訪問C庫的問題,你想啊Linux下很多C庫函數(shù)是對(duì)Linux系統(tǒng)調(diào)用的封裝,自身怎么可以調(diào)用自身呢?這里的系統(tǒng)調(diào)用學(xué)過OS的應(yīng)該都清楚,是系統(tǒng)應(yīng)用給用戶提供的編程接口,注意這里的對(duì)象是用戶。注意啦,程序員也是分等級(jí)的,在kernel級(jí)別的編程(這里指純kernel編程),你已經(jīng)看不到系統(tǒng)調(diào)用,此時(shí)你的職責(zé)可能就是為系統(tǒng)添加一個(gè)系統(tǒng)調(diào)用(后邊會(huì)講到),且C庫是應(yīng)用層對(duì)底層系調(diào)(系統(tǒng)調(diào)用,為了便于我打字,后邊可能會(huì)多次出現(xiàn))的封裝,從邏輯的角度你也該明白了吧。那么問題就出來了,沒有c庫怎么辦,還談什么模塊化,難不成都自己寫?這就是接下來的問題。

2、既然kernel不能調(diào)用C庫,那么它就得擁有自己獨(dú)立的c語言庫,這樣才能高內(nèi)聚低耦合,并且提升其安全性,所以就用了GNU C 。短小精悍效率高,畢竟是專才專用。這里需要注意一點(diǎn),內(nèi)核中沒有實(shí)現(xiàn)printf();但是有功能更為強(qiáng)大的printk();其實(shí)也談不上功能強(qiáng)大(因?yàn)閜rintf()本身就很強(qiáng)大,尤其是在調(diào)試時(shí),這里也顯出了printk的優(yōu)勢),它和printf()的顯著區(qū)別就是printk()允許通過指定一個(gè)標(biāo)志來設(shè)置優(yōu)先級(jí)。Syslog會(huì)根據(jù)這個(gè)優(yōu)先級(jí)標(biāo)志來決定什么地方顯示這條系統(tǒng)消息。如:

printk( KERN_ERR “This is an error!”); //不理解吧,我也不理解,后邊內(nèi)核調(diào)試時(shí)肯定還會(huì)將這東西,不怕。

3、內(nèi)核編程時(shí)缺乏像用戶空間那樣的內(nèi)存保護(hù)機(jī)制。

你在做什么?內(nèi)核好不好,這是一個(gè)OS的核心部分,控制著整個(gè)系統(tǒng)的運(yùn)轉(zhuǎn),自然要有處理協(xié)調(diào)整個(gè)系統(tǒng)的權(quán)利,在內(nèi)核coding的東西就是OS核心的一部分,是給別人或者自己在OS的上一層用的。既然你是把握這一切的,且又是在硬件基礎(chǔ)上的第一層抽象,另外還把握著全局,內(nèi)存的控制自然也不能束縛你,就像在公司工作一樣,領(lǐng)導(dǎo)要在可能的范圍內(nèi)盡可能的下放權(quán)力,下屬才能發(fā)揮他的極致,估計(jì)kernel也是這樣,內(nèi)存訪問,包括其他的內(nèi)核結(jié)構(gòu)都不對(duì)出于內(nèi)核的你進(jìn)行束縛,當(dāng)然也沒有進(jìn)行相應(yīng)的保護(hù)機(jī)制。因?yàn)檫@是的內(nèi)核是你的,你沒必要***到寫程序讓自己的系統(tǒng)崩潰吧,哈哈。這也留了一個(gè)問題,就是在coding過程中要斟酌好啊。

4、內(nèi)核編程時(shí)浮點(diǎn)數(shù)很難使用。這里你需要知道的是在用戶空間的進(jìn)程進(jìn)行浮點(diǎn)操作時(shí),kernel會(huì)完成從整數(shù)到浮點(diǎn)數(shù)的模式轉(zhuǎn)換,一般是通過捕獲陷阱并作相應(yīng)的處理的實(shí)現(xiàn)的。//陷阱可以算是一種特殊的異常,是從用戶態(tài)進(jìn)入內(nèi)核態(tài)的途徑,以后會(huì)進(jìn)一步介紹。

與用戶空間不同的是,kernel并不能完美的支持浮點(diǎn)操作,因?yàn)樽陨聿荒芟萑胱陨怼T趉ernel中使用浮點(diǎn)數(shù)時(shí),除了要人工保存和恢復(fù)浮點(diǎn)寄存器,還有很多瑣碎的事要做。直截了的說就是:不要在kernel中使用浮點(diǎn)數(shù)?。。?/p>

5、內(nèi)核只有一個(gè)很小的定長堆棧。在x86上,kernel的棧是在編譯時(shí)配置的,可為4k或者8k,且每個(gè)處理器都有自己的棧。為什么這么小呢?大了不可以么?我的理解是,現(xiàn)在都在追求微內(nèi)核,這是一方面原因,還有就是內(nèi)核也是一個(gè)軟件,只不過是包含了硬件抽象且富含大量系統(tǒng)管理功能的進(jìn)程,而其他功能的進(jìn)程(系統(tǒng)調(diào)用,其他內(nèi)核進(jìn)程),在調(diào)度是,存在內(nèi)核搶占和代替內(nèi)核執(zhí)行的情況,這是要將要執(zhí)行的進(jìn)程的上下文切換過來,當(dāng)然這些數(shù)據(jù)都會(huì)出現(xiàn)在棧里邊,你想如果棧很大,那么操作時(shí)內(nèi)存訪問地址會(huì)很長,訪問時(shí)占內(nèi)存且費(fèi)時(shí)間,會(huì)降低效率,所以要盡可能的小且靈活……

6、由于內(nèi)核支持異步中斷、搶占和SMP,因此必須時(shí)刻注意同步和并發(fā)。這不僅僅是linux kernel ,是所有現(xiàn)有的多進(jìn)程/多線程并發(fā)OS都要注意的,包括多線程編程也一樣,你就把kernel想成是一個(gè)多線程的執(zhí)行程序就OK了,不難理解。

7、要考慮可移植性的重要性。這個(gè)更不用多說了,因?yàn)檫@是linux的一個(gè)灰常顯著的特征,大到企業(yè)的服務(wù)器,小到嵌入式的android,IP camera……等很多東西不同平臺(tái)構(gòu)架的cpu……應(yīng)該是目前跑的平臺(tái)最多的OS了,所以他的內(nèi)核要有足夠的可移植性,似乎有點(diǎn)java的感覺......

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5045

    文章

    18815

    瀏覽量

    298442
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1336

    瀏覽量

    40082
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207889
  • Kernel
    +關(guān)注

    關(guān)注

    0

    文章

    48

    瀏覽量

    11094

原文標(biāo)題:嵌入式未來一段時(shí)間還是Linux天下,一位嵌入式er初探Linux kernel經(jīng)驗(yàn)

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式資料 Kernel__LINUX內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)(第二版)

    嵌入式資料Kernel__LINUX內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)(第二版)
    發(fā)表于 11-11 21:46

    學(xué)習(xí)嵌入式LINUX的筆記和體會(huì)

    結(jié)構(gòu)的模式學(xué)習(xí)嵌入式linux將會(huì)是我們認(rèn)識(shí)更清晰,簡單可行使應(yīng)用具有彈性。 快速入門 最簡單的建立
    發(fā)表于 06-23 18:37

    嵌入式開發(fā)板的學(xué)習(xí)方法

    ,C語言編程基礎(chǔ),就可以學(xué)習(xí)嵌入式linux的基本框架了, 學(xué)習(xí)路線:單片機(jī),C語言編程基礎(chǔ)Linux基礎(chǔ)框架:(BootloaderKer
    發(fā)表于 03-30 17:21

    作為新人要如何學(xué)習(xí)嵌入式Linux

    作為新人,要如何學(xué)習(xí)嵌入式Linux?首先您要具備基本的C語言基礎(chǔ),然后,您要想好學(xué)習(xí)嵌入式Linux
    發(fā)表于 11-08 09:27

    如何通過網(wǎng)絡(luò)升級(jí)嵌入式系統(tǒng)的linux內(nèi)核

    通過網(wǎng)絡(luò)升級(jí)嵌入式系統(tǒng)的linux內(nèi)核1、首先修改u-boot分配兩個(gè)kernel分區(qū),kernel
    發(fā)表于 12-16 06:48

    嵌入式Linux內(nèi)核實(shí)時(shí)性研究及改進(jìn)

    分析了嵌入式Linux 存在實(shí)時(shí)性缺陷的原因,從Linux 調(diào)度機(jī)制入手提出了可行的改進(jìn)方案,詳細(xì)闡述了代碼實(shí)現(xiàn)。經(jīng)測試,改進(jìn)后的
    發(fā)表于 07-30 10:13 ?8次下載

    嵌入式linux學(xué)習(xí)誤區(qū)

      隨著計(jì)算機(jī)嵌入式的普遍應(yīng)用,越來越多的人選擇投向嵌入式領(lǐng)域,但嵌入式學(xué)習(xí)有接一些誤區(qū),接下來尚觀教育小編分析一下同學(xué)們的幾種常見的嵌入式
    發(fā)表于 08-30 17:04 ?426次閱讀

    嵌入式Linux系統(tǒng)和驅(qū)動(dòng)開發(fā)

    開發(fā)?! W(xué)完這些知識(shí)點(diǎn)通過相關(guān)實(shí)驗(yàn)驗(yàn)證后,嵌入式Linux系統(tǒng)和驅(qū)動(dòng)的開發(fā)就算掌握了差不多了,能夠勝任絕大部分基于linux平臺(tái)的驅(qū)動(dòng)開
    發(fā)表于 10-11 11:11 ?739次閱讀

    嵌入式linux內(nèi)核的編譯步驟

    編譯嵌入式Linux內(nèi)核都是通過make的不同命令實(shí)現(xiàn)的,它的執(zhí)行配置文件是Makefile。Linu
    發(fā)表于 06-19 09:30 ?2743次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>linux</b><b class='flag-5'>內(nèi)核</b>的編譯步驟

    嵌入式Linux內(nèi)核驅(qū)動(dòng)開發(fā)學(xué)習(xí)路線圖

    嵌入式Linux內(nèi)核驅(qū)動(dòng)開發(fā)學(xué)習(xí)路線圖(嵌入式開發(fā)軟件工程師)-嵌入式
    發(fā)表于 07-30 13:51 ?12次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>驅(qū)動(dòng)開發(fā)<b class='flag-5'>學(xué)習(xí)</b>路線圖

    嵌入式LINUX系統(tǒng)內(nèi)核內(nèi)核模塊調(diào)試

    嵌入式LINUX系統(tǒng)內(nèi)核內(nèi)核模塊調(diào)試(嵌入式開發(fā)和硬件開發(fā))-嵌入式
    發(fā)表于 07-30 13:55 ?9次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>LINUX</b>系統(tǒng)<b class='flag-5'>內(nèi)核</b>和<b class='flag-5'>內(nèi)核</b>模塊調(diào)試

    嵌入式】構(gòu)建嵌入式Linux系統(tǒng)(uboot、內(nèi)核、文件系統(tǒng))

    嵌入式Linux系統(tǒng)知識(shí)架構(gòu)及層次嵌入式Linux系統(tǒng)構(gòu)成及啟動(dòng)略析嵌入式Linux三劍客之ub
    發(fā)表于 10-20 18:20 ?41次下載
    【<b class='flag-5'>嵌入式</b>】構(gòu)建<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>系統(tǒng)(uboot、<b class='flag-5'>內(nèi)核</b>、文件系統(tǒng))

    Linux嵌入式學(xué)習(xí)過程

    Linux嵌入式學(xué)習(xí)過程循序漸進(jìn)學(xué)習(xí)嵌入式開發(fā)技術(shù)一、練好基本功二、嵌入式
    發(fā)表于 10-21 11:07 ?4次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>嵌入式</b><b class='flag-5'>學(xué)習(xí)</b>過程

    嵌入式Linux內(nèi)核編譯

    實(shí)驗(yàn)環(huán)境VMware Workstation PlayerUbuntu16.04kernel-3.2.tar.bz2Linux內(nèi)核編譯在ubuntu上編譯嵌入式Linux
    發(fā)表于 11-01 17:07 ?16次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>的<b class='flag-5'>內(nèi)核</b>編譯

    學(xué)習(xí)嵌入式的開發(fā)線路,新手怎么學(xué)習(xí)嵌入式

    作為新人,要如何學(xué)習(xí)嵌入式Linux?首先您要具備基本的C語言基礎(chǔ),然后,您要想好學(xué)習(xí)嵌入式Linux
    發(fā)表于 11-03 14:21 ?12次下載
    <b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>嵌入式</b>的開發(fā)線路,新手怎么<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>嵌入式</b>?