在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

嵌入式未來還是Linux的天下,并通過內核學習來闡述kernel的機理

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

首先闡述一下我為什么想學習一下Linux kernel。最早是因為對嵌入式的一時腦熱,我買了開發板,買了不少資料,前前后后投進去了1000多了。不過好歹還是有點回報的,雖然還沒有怎么著調,但又似乎拓寬了不小的知識面。

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

調整后的策略就是先把Linux這個OS的機制弄明白,才可以遷移定制滿足需求的系統,才可以寫出高效率的Linux應用。整體路線就是農村包圍城市,不斷補充必要知識,循序漸進,最終呈現星星之火可以燎原之勢。額,扯得夠遠。廢話不多說,下面開始。

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

首先介紹一下內核源碼的根目錄描述:

arch(architecture) 特定體系結構的源碼

crypto crypto API

Documention 內核源碼文檔

drivers 設備驅動程序

fs VFS和各種文件系統

include 內核頭文件

init 內核引導和初始化

ipc 進程間通訊代碼

kernel 像調度程序這樣的核心子系統

lib 通用內核函數

mm 內存管理子系統和VM

net 網絡子系統

scripts 編譯內核所用到的腳本

security Linux安全模塊

sound 語音子系統

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

這里只是簡單闡述個目錄及系統模塊分布。隨著慢慢地學習我相信一定可以把它們搞明白是怎么一回事的。

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

下面來介紹一下內核開發和應用程序開發的差別:

內核編程時不能訪問C庫(因為Linux下很多C庫函數是對Linux系統調用的封裝,自身怎么可以調用自身呢?)

內核編程時必須使用GNU C。

內核編程時缺乏像用戶空間那樣的內存保護機制。

內核編程時浮點數很難使用。

內核只有一個很小的定長堆棧。

由于內核支持異步中斷、搶占和SMP,因此必須時刻注意同步和并發。

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

對以上這幾點進行描述。

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

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

printk( KERN_ERR “This is an error!”); //不理解吧,我也不理解,后邊內核調試時肯定還會將這東西,不怕。

3、內核編程時缺乏像用戶空間那樣的內存保護機制。

你在做什么?內核好不好,這是一個OS的核心部分,控制著整個系統的運轉,自然要有處理協調整個系統的權利,在內核coding的東西就是OS核心的一部分,是給別人或者自己在OS的上一層用的。既然你是把握這一切的,且又是在硬件基礎上的第一層抽象,另外還把握著全局,內存的控制自然也不能束縛你,就像在公司工作一樣,領導要在可能的范圍內盡可能的下放權力,下屬才能發揮他的極致,估計kernel也是這樣,內存訪問,包括其他的內核結構都不對出于內核的你進行束縛,當然也沒有進行相應的保護機制。因為這是的內核是你的,你沒必要***到寫程序讓自己的系統崩潰吧,哈哈。這也留了一個問題,就是在coding過程中要斟酌好啊。

4、內核編程時浮點數很難使用。這里你需要知道的是在用戶空間的進程進行浮點操作時,kernel會完成從整數到浮點數的模式轉換,一般是通過捕獲陷阱并作相應的處理的實現的。//陷阱可以算是一種特殊的異常,是從用戶態進入內核態的途徑,以后會進一步介紹。

與用戶空間不同的是,kernel并不能完美的支持浮點操作,因為自身不能陷入自身。在kernel中使用浮點數時,除了要人工保存和恢復浮點寄存器,還有很多瑣碎的事要做。直截了的說就是:不要在kernel中使用浮點數!!!

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

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

7、要考慮可移植性的重要性。這個更不用多說了,因為這是linux的一個灰常顯著的特征,大到企業的服務器,小到嵌入式的android,IP camera……等很多東西不同平臺構架的cpu……應該是目前跑的平臺最多的OS了,所以他的內核要有足夠的可移植性,似乎有點java的感覺......

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5127

    文章

    19458

    瀏覽量

    313509
  • 內核
    +關注

    關注

    3

    文章

    1405

    瀏覽量

    40991
  • Linux
    +關注

    關注

    87

    文章

    11432

    瀏覽量

    212446
  • Kernel
    +關注

    關注

    0

    文章

    48

    瀏覽量

    11510

原文標題:嵌入式未來一段時間還是Linux天下,一位嵌入式er初探Linux kernel經驗

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    嵌入式資料 Kernel__LINUX內核設計與實現(第二版)

    嵌入式資料Kernel__LINUX內核設計與實現(第二版)
    發表于 11-11 21:46

    學習嵌入式LINUX的筆記和體會

    結構的模式學習嵌入式linux將會是我們認識更清晰,簡單可行使應用具有彈性。 快速入門 最簡單的建立
    發表于 06-23 18:37

    嵌入式開發板的學習方法

    ,C語言編程基礎,就可以學習嵌入式linux的基本框架了, 學習路線:單片機,C語言編程基礎Linux基礎框架:(BootloaderKer
    發表于 03-30 17:21

    作為新人要如何學習嵌入式Linux

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

    如何通過網絡升級嵌入式系統的linux內核

    通過網絡升級嵌入式系統的linux內核1、首先修改u-boot分配兩個kernel分區,kernel
    發表于 12-16 06:48

    嵌入式Linux內核實時性研究及改進

    分析了嵌入式Linux 存在實時性缺陷的原因,從Linux 調度機制入手提出了可行的改進方案,詳細闡述了代碼實現。經測試,改進后的
    發表于 07-30 10:13 ?8次下載

    嵌入式linux學習誤區

      隨著計算機嵌入式的普遍應用,越來越多的人選擇投向嵌入式領域,但嵌入式學習有接一些誤區,接下來尚觀教育小編分析一下同學們的幾種常見的嵌入式
    發表于 08-30 17:04 ?580次閱讀

    嵌入式Linux系統和驅動開發

    開發。  學完這些知識點通過相關實驗驗證后,嵌入式Linux系統和驅動的開發就算掌握了差不多了,能夠勝任絕大部分基于linux平臺的驅動開
    發表于 10-11 11:11 ?898次閱讀

    嵌入式linux內核的編譯步驟

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

    嵌入式Linux內核驅動開發學習路線圖

    嵌入式Linux內核驅動開發學習路線圖(嵌入式開發軟件工程師)-嵌入式
    發表于 07-30 13:51 ?12次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>內核</b>驅動開發<b class='flag-5'>學習</b>路線圖

    嵌入式LINUX系統內核內核模塊調試

    嵌入式LINUX系統內核內核模塊調試(嵌入式開發和硬件開發)-嵌入式
    發表于 07-30 13:55 ?10次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>LINUX</b>系統<b class='flag-5'>內核</b>和<b class='flag-5'>內核</b>模塊調試

    嵌入式】構建嵌入式Linux系統(uboot、內核、文件系統)

    嵌入式Linux系統知識架構及層次嵌入式Linux系統構成及啟動略析嵌入式Linux三劍客之ub
    發表于 10-20 18:20 ?42次下載
    【<b class='flag-5'>嵌入式</b>】構建<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>系統(uboot、<b class='flag-5'>內核</b>、文件系統)

    Linux嵌入式學習過程

    Linux嵌入式學習過程循序漸進學習嵌入式開發技術一、練好基本功二、嵌入式
    發表于 10-21 11:07 ?6次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>嵌入式</b><b class='flag-5'>學習</b>過程

    嵌入式Linux內核編譯

    實驗環境VMware Workstation PlayerUbuntu16.04kernel-3.2.tar.bz2Linux內核編譯在ubuntu上編譯嵌入式Linux
    發表于 11-01 17:07 ?19次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>的<b class='flag-5'>內核</b>編譯

    學習嵌入式的開發線路,新手怎么學習嵌入式

    作為新人,要如何學習嵌入式Linux?首先您要具備基本的C語言基礎,然后,您要想好學習嵌入式Linux
    發表于 11-03 14:21 ?12次下載
    <b class='flag-5'>學習</b><b class='flag-5'>嵌入式</b>的開發線路,新手怎么<b class='flag-5'>學習</b><b class='flag-5'>嵌入式</b>?
    主站蜘蛛池模板: 亚洲精品精品一区 | 免费无遮挡很爽很污很黄 | 黄鳝钻进下面好爽小说 | 亚洲视频黄| 亚洲综合一区二区 | 国产精品亚洲玖玖玖在线靠爱 | 99成人国产精品视频 | 中文在线资源链接天堂 | 思思99re66在线精品免费观看 | 亚洲国产欧美日韩一区二区三区 | 艹逼免费视频 | 久久福利影视 | 三级网站国产 | 天天综合网在线 | 真人实干一级毛片aa免费 | 天堂视频在线观看 | gav久久 | 国产精品视频久久久久久 | 亚洲专区一 | 欧美xxxxbbbb在线播放 | 欧美性猛交ⅹxxx乱大交免费 | 涩综合| 三级黄色片免费观看 | 天天免费看片 | 男人资源网 | 天天躁夜夜躁狠狠躁2021西西 | 日本免费色 | 国产三级黄色录像 | 黄色小网站在线观看 | 国产成人精品亚洲日本在线观看 | 午夜一区二区免费视频 | 天天噜夜夜操 | 欧美二级黄色片 | 四虎在线观看免费视频 | 日本成人免费在线视频 | 成人精品视频在线观看播放 | 农村的毛片丨级 | 黄色超污网站 | 亚洲黄色三级网站 | 日韩精品一区二区三区免费视频 | 美日毛片 |