亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 37103 | 回復(fù): 27
打印 上一主題 下一主題

學(xué)習(xí)Linux內(nèi)核和驅(qū)動(dòng)開發(fā)有終南捷徑嗎?歡迎來辯! [復(fù)制鏈接]

論壇徽章:
19
處女座
日期:2014-07-18 14:50:5415-16賽季CBA聯(lián)賽之北京
日期:2019-09-16 15:39:1415-16賽季CBA聯(lián)賽之上海
日期:2019-09-15 15:29:0415-16賽季CBA聯(lián)賽之山西
日期:2017-03-09 10:58:232017金雞報(bào)曉
日期:2017-02-08 10:33:212017金雞報(bào)曉
日期:2017-01-10 15:13:2915-16賽季CBA聯(lián)賽之深圳
日期:2016-12-15 17:55:53C
日期:2016-10-25 16:00:1515-16賽季CBA聯(lián)賽之新疆
日期:2016-07-21 14:02:0415-16賽季CBA聯(lián)賽之江蘇
日期:2016-06-30 12:15:04shanzhi
日期:2016-06-17 17:59:31平安夜徽章
日期:2015-12-26 00:06:30
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2015-08-15 11:09 |只看該作者 |倒序?yàn)g覽
獲獎(jiǎng)名單已公布:http://www.72891.cn/thread-4188427-1-1.html

話題背景
      這是一個(gè)連閱讀都被碎片化的時(shí)代,在這樣一個(gè)時(shí)代,人們趨向于激進(jìn)、浮躁。內(nèi)心的不安寧使我們極難靜下心來研究什么。許許多多的Linux工程師,他們的簡歷書寫著“精通”Linux內(nèi)核,有多年的工作經(jīng)驗(yàn),而他們的“精通”卻只是把某個(gè)寄存器從0改成1,從1改成0的不斷重復(fù);許許多多的Linux工程師終日埋頭苦干,敲打著自己的機(jī)器和電路板,卻從未冷靜下來思考,并不斷重構(gòu)和升華自己的知識體系。
      Linux內(nèi)核的版本更新達(dá)上千個(gè),代碼規(guī)模不斷增長,平均每個(gè)版本的新增代碼有4萬行左右。在源代碼的10個(gè)主要子目錄中,驅(qū)動(dòng)程序的代碼量呈線性增長趨勢。Linux各個(gè)子系統(tǒng)之間的關(guān)系錯(cuò)綜復(fù)雜,系統(tǒng)整體規(guī)模和復(fù)雜性分別呈超線性和接近線性增長趨勢,drivers和arch等模塊的快速變化是引起系統(tǒng)復(fù)雜性增加的主因。設(shè)備驅(qū)動(dòng)程序是連接計(jì)算機(jī)軟件和硬件的紐帶和橋梁,開發(fā)者在嵌入式操作系統(tǒng)的開發(fā)移植過程中,有將近70%~80%的精力都用在了驅(qū)動(dòng)程序的開發(fā)與調(diào)試方面。這就對設(shè)備驅(qū)動(dòng)程序開發(fā)人員提出了極高的要求。開發(fā)者不僅要同時(shí)具備軟件和硬件的知識和經(jīng)驗(yàn),而且還要不斷地學(xué)習(xí)、更新自己,以便跟上嵌入式系統(tǒng)日新月異的發(fā)展。在代碼量最多的驅(qū)動(dòng)程序中,有什么規(guī)律可循?最根本的又是什么?學(xué)習(xí)Linux內(nèi)核和驅(qū)動(dòng)開發(fā)有捷徑嗎?歡迎大家參與討論,分享Linux內(nèi)核和驅(qū)動(dòng)開發(fā)的經(jīng)驗(yàn)。


討論話題
從以下話題中任選一個(gè)或多個(gè)話題參與討論,這次討論的話題內(nèi)容不限于下面羅列的話題。
1. 分享Linux內(nèi)核學(xué)習(xí)和驅(qū)動(dòng)開發(fā)的經(jīng)驗(yàn)。
2. 您覺得Linux驅(qū)動(dòng)開發(fā)的難點(diǎn)是什么,有什么好的方法來克服?
3. Linux內(nèi)核有上百個(gè)驅(qū)動(dòng)子系統(tǒng),你研究過內(nèi)核各種驅(qū)動(dòng)子系統(tǒng)的共性,層次結(jié)構(gòu)設(shè)計(jì)嗎?分享學(xué)習(xí)一個(gè)Linux內(nèi)核子系統(tǒng)的經(jīng)驗(yàn),例如USB、I2C、HID等driver。
4. 您深入研究過Linux設(shè)備驅(qū)動(dòng)模型,關(guān)注過Linux內(nèi)核驅(qū)動(dòng)的設(shè)計(jì)思想嗎?
5. Android系統(tǒng)是基于Linux內(nèi)核的,傳統(tǒng)的Linux驅(qū)動(dòng)開發(fā)和Android驅(qū)動(dòng)開發(fā)有什么區(qū)別?


討論時(shí)間
2015-08-17至2015-09-15


活動(dòng)獎(jiǎng)勵(lì)
活動(dòng)結(jié)束后將選取4名討論精彩的童鞋,每人贈(zèng)送一本《Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解:基于最新的Linux 4.0內(nèi)核》圖書作為獎(jiǎng)勵(lì)。


獎(jiǎng)品簡介
   
作者: 宋寶華   
叢書名: 電子與嵌入式系統(tǒng)設(shè)計(jì)叢書
出版社:機(jī)械工業(yè)出版社
出版日期:2015 年8月
開本:16開
版次:1-1


內(nèi)容簡介:
     歷時(shí)8年,三次重構(gòu),內(nèi)窖愈加爐火純青。全部代碼更新至全新的Linux4.0版本。全面講解ARM Linux新版本內(nèi)核架構(gòu),如設(shè)備樹等。不僅僅注重知識和程序的講解,更注重程序的思想、演變、架構(gòu)和算法。
      本書首先介紹Linux設(shè)備驅(qū)動(dòng)的基礎(chǔ)。第1章簡要地介紹了設(shè)備驅(qū)動(dòng),并從無操作系統(tǒng)的設(shè)備驅(qū)動(dòng)引出了Linux操作系統(tǒng)下的設(shè)備驅(qū)動(dòng),介紹了本書所基于的開發(fā)環(huán)境。第2章系統(tǒng)地講解了Linux驅(qū)動(dòng)工程師應(yīng)該掌握的硬件知識,為工程師打下Linux驅(qū)動(dòng)編程的硬件基礎(chǔ),詳細(xì)介紹了各種類型的CPU、存儲器和常見的外設(shè),并闡述了硬件時(shí)序分析方法和數(shù)據(jù)手冊閱讀方法。第3章將Linux設(shè)備驅(qū)動(dòng)放在Linux 2.6內(nèi)核背景中進(jìn)行講解,說明Linux內(nèi)核的編程方法。由于驅(qū)動(dòng)編程也在內(nèi)核編程的范疇,因此,這一章實(shí)質(zhì)是為編寫Linux設(shè)備驅(qū)動(dòng)打下軟件基礎(chǔ)。
      其次,講解Linux設(shè)備驅(qū)動(dòng)編程的基礎(chǔ)理論、字符設(shè)備驅(qū)動(dòng)及設(shè)備驅(qū)動(dòng)設(shè)計(jì)中涉及的并發(fā)控制、同步等問題。第4、5章分別講解Linux內(nèi)核模塊和Linux設(shè)備文件系統(tǒng);第6~9章以虛擬設(shè)備globalmem和globalfifo為主線,逐步給其添加高級控制功能;第10、11章分別闡述Linux驅(qū)動(dòng)編程中所涉及的中斷和定時(shí)器、內(nèi)核和I/O操作處理方法。
      接著,剖析復(fù)雜設(shè)備驅(qū)動(dòng)的體系結(jié)構(gòu)以及塊設(shè)備、網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)。該篇講解了設(shè)備與驅(qū)動(dòng)的分離、主機(jī)控制器驅(qū)動(dòng)與外設(shè)驅(qū)動(dòng)的分離,并以大量實(shí)例(如input、tty、LCD、platform、I2C、SPI、USB等)來佐證。其中第12章和第17章遙相呼應(yīng),力圖全面地展示驅(qū)動(dòng)的架構(gòu)。Linux有100多個(gè)驅(qū)動(dòng)子系統(tǒng),逐個(gè)講解和學(xué)習(xí)都是不現(xiàn)實(shí)的,授人以魚不如授人以漁,因此我們將更多的焦點(diǎn)放在了架構(gòu)講解方面,以便讀者可以舉一反三。


樣章試讀:
文前.pdf (1.46 MB, 下載次數(shù): 209)
1-3z.txt (114.01 KB, 下載次數(shù): 132)

shupi.jpg (33.22 KB, 下載次數(shù): 387)

shupi.jpg

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [報(bào)告]
發(fā)表于 2015-08-17 15:31 |只看該作者
支持

求職 : Linux運(yùn)維
論壇徽章:
19
CU大;照
日期:2013-03-13 15:15:0815-16賽季CBA聯(lián)賽之山東
日期:2016-10-31 10:40:10綜合交流區(qū)版塊每日發(fā)帖之星
日期:2016-07-06 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-02-08 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-01-15 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-15 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-10 06:20:00黃金圣斗士
日期:2015-11-24 10:45:10IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-09-01 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-08-13 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-07-30 09:40:012015年亞洲杯之巴勒斯坦
日期:2015-05-05 10:19:03
3 [報(bào)告]
發(fā)表于 2015-08-17 16:37 |只看該作者
先支持意向,等想好了再寫討論內(nèi)容,不過我個(gè)人理解LINUX內(nèi)核很像進(jìn)化中的生命體,同時(shí)它的模塊化理念非常高級,每一個(gè)層次都在不斷的進(jìn)化和完善,同時(shí)不會影響全局的使用。

論壇徽章:
15
2015七夕節(jié)徽章
日期:2015-08-21 11:06:172017金雞報(bào)曉
日期:2017-01-10 15:19:56極客徽章
日期:2016-12-07 14:07:30shanzhi
日期:2016-06-17 17:59:3115-16賽季CBA聯(lián)賽之四川
日期:2016-04-13 14:36:562016猴年福章徽章
日期:2016-02-18 15:30:34IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-28 06:20:0015-16賽季CBA聯(lián)賽之新疆
日期:2016-01-25 14:01:34IT運(yùn)維版塊每周發(fā)帖之星
日期:2016-01-07 23:04:26數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-01-03 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-12-01 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-11-10 06:20:00
4 [報(bào)告]
發(fā)表于 2015-08-18 09:05 |只看該作者
沒深入搞過,亂談一番:
1. 分享Linux內(nèi)核學(xué)習(xí)和驅(qū)動(dòng)開發(fā)的經(jīng)驗(yàn)。
    驅(qū)動(dòng)開發(fā)其實(shí)有一定的模式,主要是要了解硬件的特性以及如何對接到驅(qū)動(dòng)的函數(shù)中,還有就是要適應(yīng)內(nèi)核編程的環(huán)境以及調(diào)試的方法

2. 您覺得Linux驅(qū)動(dòng)開發(fā)的難點(diǎn)是什么,有什么好的方法來克服?
    難點(diǎn)就是后面的調(diào)試

3. Linux內(nèi)核有上百個(gè)驅(qū)動(dòng)子系統(tǒng),你研究過內(nèi)核各種驅(qū)動(dòng)子系統(tǒng)的共性,層次結(jié)構(gòu)設(shè)計(jì)嗎?分享學(xué)習(xí)一個(gè)Linux內(nèi)核子系統(tǒng)的經(jīng)驗(yàn),例如USB、I2C、HID等driver。
    每一個(gè)子系統(tǒng)都巨大無比,沒那個(gè)能力去完全搞明白  

4. 您深入研究過Linux設(shè)備驅(qū)動(dòng)模型,關(guān)注過Linux內(nèi)核驅(qū)動(dòng)的設(shè)計(jì)思想嗎?
    個(gè)人理解設(shè)計(jì)思想就是回調(diào)函數(shù),給一個(gè)API讓你注冊,后面通過注冊ID找到對應(yīng)的回調(diào)函數(shù)進(jìn)行處理

5. Android系統(tǒng)是基于Linux內(nèi)核的,傳統(tǒng)的Linux驅(qū)動(dòng)開發(fā)和Android驅(qū)動(dòng)開發(fā)有什么區(qū)別?
    Android的驅(qū)動(dòng)就是要對C語言再進(jìn)行一層包裝,采用類似JNI/JNA機(jī)制向Android上層提供Java的API,這樣廠商可以決定驅(qū)動(dòng)的主要部分在C還是Java實(shí)現(xiàn)

求職 : Linux運(yùn)維
論壇徽章:
19
CU大;照
日期:2013-03-13 15:15:0815-16賽季CBA聯(lián)賽之山東
日期:2016-10-31 10:40:10綜合交流區(qū)版塊每日發(fā)帖之星
日期:2016-07-06 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-02-08 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-01-15 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-15 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-10 06:20:00黃金圣斗士
日期:2015-11-24 10:45:10IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-09-01 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-08-13 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-07-30 09:40:012015年亞洲杯之巴勒斯坦
日期:2015-05-05 10:19:03
5 [報(bào)告]
發(fā)表于 2015-08-18 20:45 |只看該作者
本帖最后由 niao5929 于 2015-08-18 20:45 編輯


1. 分享Linux內(nèi)核學(xué)習(xí)和驅(qū)動(dòng)開發(fā)的經(jīng)驗(yàn)。
    讀代碼,編譯內(nèi)核的初級級別,自己沒社么經(jīng)驗(yàn)

2. 您覺得Linux驅(qū)動(dòng)開發(fā)的難點(diǎn)是什么,有什么好的方法來克服?
    難點(diǎn)就是建模和對底層硬件的深入了解

3. Linux內(nèi)核有上百個(gè)驅(qū)動(dòng)子系統(tǒng),你研究過內(nèi)核各種驅(qū)動(dòng)子系統(tǒng)的共性,層次結(jié)構(gòu)設(shè)計(jì)嗎?分享學(xué)習(xí)一個(gè)Linux內(nèi)核子系統(tǒng)的經(jīng)驗(yàn),例如USB、I2C、HID等driver。
    linux 模塊化的設(shè)計(jì)最讓人感到方便,這樣的設(shè)計(jì)可以非常方便的進(jìn)行模塊的替換和組裝,這也是LINUX非常有應(yīng)用廣度的一個(gè)方面。

4. 您深入研究過Linux設(shè)備驅(qū)動(dòng)模型,關(guān)注過Linux內(nèi)核驅(qū)動(dòng)的設(shè)計(jì)思想嗎?
   感覺LINUX因?yàn)樽杂珊烷_源的關(guān)系,她的進(jìn)化非常類似與生命的特點(diǎn)。自由開源軟件可以承載更多新思想和新技術(shù)。Linux內(nèi)核自4.1開始支持不停機(jī)的熱升級。這必然涉及到驅(qū)動(dòng)的動(dòng)態(tài)更新問題。這些新特性總是讓好奇的我想看個(gè)究竟。

5. Android系統(tǒng)是基于Linux內(nèi)核的,傳統(tǒng)的Linux驅(qū)動(dòng)開發(fā)和Android驅(qū)動(dòng)開發(fā)有什么區(qū)別?
    Android總感覺似乎需要用到很多JAVA的技術(shù),而目前JAVA確實(shí)已經(jīng)被ORACLE搞得非常的讓人擔(dān)憂。我覺得程序員或者編程愛好者都應(yīng)該學(xué)習(xí)更自由和開放的GO、PYTHON、D等等這些純的自由開源軟件,還是那句話:自由開源軟件可以承載更多新思想和新技術(shù)。

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2015-08-19 07:35 |只看該作者
cool,mark,
不過還是不想做驅(qū)動(dòng),還是搞搞網(wǎng)絡(luò)編程吧。

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2015-08-19 11:01 |只看該作者
本帖最后由 kartorz 于 2015-08-20 09:44 編輯

1. 分享Linux內(nèi)核學(xué)習(xí)和驅(qū)動(dòng)開發(fā)的經(jīng)驗(yàn)。

捷徑?jīng)]有,但是有合理的方法。

1)  首先,需要熟悉操作系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn),推薦大家看 MINIX作者的那部書,同時(shí)把MINIX的kernel代碼研讀一下。 不然,你不知道操作系統(tǒng)都有哪些模塊, 不知道操作系統(tǒng)要做些什么事情,提供什么功能。
      簡單地說,操作系統(tǒng)首先要驅(qū)動(dòng) CPU,然后提供那幾大管理(中斷,進(jìn)程,內(nèi)存),實(shí)現(xiàn)一,兩百個(gè)系統(tǒng)呼叫,提供驅(qū)動(dòng)接口。
      
2)  去intel的官網(wǎng),找一下 Intel® 64 and IA-32 Architectures Software Developer’s Manual , 了解一下 CPU的架構(gòu),工作模式,底層的編碼。否則, 你不知道 gdt, ldt,  page table, 實(shí)地址,保護(hù)模式,timer等中斷都是什么東西,為什么操作系統(tǒng)要這樣來設(shè)置寄存器。
      這塊基本上全是匯編語言,對CPU的初始化,寄存器設(shè)置,手冊上面都有嚴(yán)格的時(shí)序要求。 哪些操作需要屏蔽中斷,哪些需要在一個(gè)指令周期完成等等。

有了上面的基礎(chǔ)后,大概知道一個(gè)操作系統(tǒng)大概要做些什么事情, 如何驅(qū)動(dòng)底層的 CPU,這個(gè)時(shí)候閱讀 linux的kernel代碼,事半功倍。

kernel 分為兩個(gè)模塊:一個(gè)是 core : 驅(qū)動(dòng)cpu, 中斷,進(jìn)程,內(nèi)存幾大管理, 提供系統(tǒng)呼叫;   另一個(gè)是driver,  驅(qū)動(dòng)設(shè)備工作。 linux的driver 都是有架構(gòu)的,不需要從底層做起。 driver的架構(gòu)大概就是 char, block, net, video, audio, usb, 等等。 別看操作系統(tǒng)的代碼量大,其實(shí),把driver 占了估計(jì) 90%的代碼量, 這些都是不需要去看的。  driver 框架的設(shè)計(jì),也就是 微內(nèi)核 與 宏內(nèi)核的區(qū)別。

閱讀過程中,觀其大略即可,主要了解整個(gè)結(jié)構(gòu),以及程序的流程。 如: 系統(tǒng)呼叫的調(diào)用, 追一個(gè)就可以了! 看看,操作系統(tǒng)如何捕捉軟中斷, 根據(jù)中斷號,dispatch到相應(yīng)的服務(wù)程序,如何 保存現(xiàn)場, 完成后,又回到用戶態(tài)。 系統(tǒng)呼叫調(diào)用,核心 就是 dispatch的流程。 追完一支系統(tǒng)呼叫,其它的大概就知道怎么回事了。  driver 也就一樣的, 找個(gè)簡單的驅(qū)動(dòng)看看, 從驅(qū)動(dòng)層一直到驅(qū)動(dòng)的架構(gòu),流程清楚就可以了。 如 char 設(shè)備驅(qū)動(dòng), 追一下 register 以后, 驅(qū)動(dòng)框架如何 把該設(shè)備放入 list,當(dāng)有用戶請求的時(shí)候,它又如何 查找到 相應(yīng)的設(shè)備,調(diào)用 相應(yīng)的操作函數(shù)。 一路下來,流程大概知道就可以了。

不建議閱讀, 毛德操的 linux內(nèi)核源碼分析 之類的書, 會讓讀者一頭霧水。 正確的方法應(yīng)該是, 先了解相應(yīng)的背景知識后,再來閱讀源碼。 舉個(gè)例子,你想了解 ext4的文件系統(tǒng)驅(qū)動(dòng)代碼,首先你得去查資料,搞清楚 ext4文件系統(tǒng)是怎么回事,再來閱讀代碼。 之前,推薦初學(xué)者 先 閱讀 操作系統(tǒng)設(shè)計(jì)實(shí)現(xiàn), intel的編程手冊,就是這個(gè)道理。 只有了解了背景,再閱讀源碼時(shí),一切都 迎刃而解了。 不推薦 毛德操的書也是個(gè)道理,書里面告訴你,代碼一會跳到這里,一會又call back到注冊的函數(shù),一會又調(diào)用了什么,只見樹木,而不見森林。

評分

參與人數(shù) 1信譽(yù)積分 +10 收起 理由
shenlanyouyu + 10 贊一個(gè)!

查看全部評分

論壇徽章:
19
處女座
日期:2014-07-18 14:50:5415-16賽季CBA聯(lián)賽之北京
日期:2019-09-16 15:39:1415-16賽季CBA聯(lián)賽之上海
日期:2019-09-15 15:29:0415-16賽季CBA聯(lián)賽之山西
日期:2017-03-09 10:58:232017金雞報(bào)曉
日期:2017-02-08 10:33:212017金雞報(bào)曉
日期:2017-01-10 15:13:2915-16賽季CBA聯(lián)賽之深圳
日期:2016-12-15 17:55:53C
日期:2016-10-25 16:00:1515-16賽季CBA聯(lián)賽之新疆
日期:2016-07-21 14:02:0415-16賽季CBA聯(lián)賽之江蘇
日期:2016-06-30 12:15:04shanzhi
日期:2016-06-17 17:59:31平安夜徽章
日期:2015-12-26 00:06:30
8 [報(bào)告]
發(fā)表于 2015-08-19 13:26 |只看該作者
回復(fù) 7# kartorz


    分享有干貨,感謝分享。

論壇徽章:
1
天蝎座
日期:2013-10-23 21:11:03
9 [報(bào)告]
發(fā)表于 2015-08-19 14:28 |只看該作者
回復(fù) 1# shenlanyouyu


臨時(shí)想起一些說一下吧:


1. 分享Linux內(nèi)核學(xué)習(xí)和驅(qū)動(dòng)開發(fā)的經(jīng)驗(yàn)。

內(nèi)核學(xué)習(xí)

Linux 內(nèi)核功能越來越完善,如果沒有充裕的時(shí)間,深入內(nèi)核并不是很現(xiàn)實(shí)。所以建議先讀一本內(nèi)核的書,
第一遍是讀,會讀的很迷糊;之后反省一下,然后再瀏覽一下;可以想象一個(gè) OS 是如何運(yùn)行的,這樣可以不
陷入 Linux 內(nèi)核的細(xì)節(jié);最后可以深入自己感興趣或者需要的那一子系統(tǒng)

        推薦 《Linux Kernel Development》

即便是子系統(tǒng),也是很龐大的。一個(gè)省力的方式是網(wǎng)上搜一些相關(guān)的文章,便于快速了解這個(gè)子系統(tǒng)的運(yùn)作;
然后結(jié)合代碼,形成自己的認(rèn)知,最后做一下總結(jié)。如果僅僅是快速了解某一子系統(tǒng)的運(yùn)作,可以參考一些早期
代碼的注解書籍,再深入的時(shí)候看看最新的代碼實(shí)現(xiàn)

對內(nèi)核的認(rèn)知是一個(gè)反復(fù)的過程,一開始并不完善,可能需要反復(fù)糾正。不要陷入這種糾錯(cuò)中;而是以后繼續(xù)
使用和學(xué)習(xí)過程中,發(fā)現(xiàn)了沒有弄清楚的地方再深入,畢竟 Linux 內(nèi)核是不斷變化的

還有一個(gè)很好的方式是,從系統(tǒng)調(diào)用入手,現(xiàn)在這方面的數(shù)據(jù)不少,而且對系統(tǒng)調(diào)用的語義都有講解,這樣可以
間接了解 Linux 系統(tǒng)的一些概念。對系統(tǒng)調(diào)用熟悉了,可以根據(jù)系統(tǒng)調(diào)用的執(zhí)行過程,來大體了解內(nèi)核的一個(gè)
運(yùn)作過程;但是跟蹤系統(tǒng)調(diào)用的時(shí)候要注意抓主線,現(xiàn)在內(nèi)核系統(tǒng)很復(fù)雜,一些 code path 上可能會涉及多個(gè)
子系統(tǒng),可以從名字上猜測它們是干什么的,不需要深入,否則會發(fā)現(xiàn)精力完全被分散掉了

學(xué)習(xí) Linux 內(nèi)核,一個(gè)很重要的是抽象的能力,所謂的抽象這里僅僅是指分清接口和接口的實(shí)現(xiàn)。因?yàn)?Linux
內(nèi)核子系統(tǒng)很多,有很多子系統(tǒng)相互滲透,這樣 code path 看上去很復(fù)雜。閱讀代碼的時(shí)候,為了排除干擾,
需要分清哪些是自己需要看的,哪些是其它子系統(tǒng)的接口,對于其它子系統(tǒng)的接口,先當(dāng)作它們功能完善不會
出問題好了,這樣可以關(guān)注重點(diǎn);打個(gè)比方,一個(gè)應(yīng)用程序的代碼可能量很大,比如一個(gè) apache 項(xiàng)目,它
包含很多組件,有時(shí)候閱讀代碼的時(shí)候會看到不同組件的 API,深入看相關(guān)組件實(shí)現(xiàn)并不現(xiàn)實(shí),這時(shí)候分清主次
對于代碼的閱讀就很有幫助了,總不能看到了 malloc 就要先把它的實(shí)現(xiàn)弄清楚吧,系統(tǒng)調(diào)用多者呢

推薦書籍
        OReilly.Linux.System.Programming.2nd.Edition
        The.Linux.Programming.Interface


驅(qū)動(dòng)開發(fā)

一直圍繞服務(wù)器做,接觸的比較多的是網(wǎng)卡驅(qū)動(dòng)。最開始想著從上到下,好好學(xué)習(xí)協(xié)議棧,后來發(fā)現(xiàn)內(nèi)容太多,
進(jìn)展太慢。后來參考一些驅(qū)動(dòng)開發(fā)方面的書籍,把驅(qū)動(dòng)獨(dú)立開,使用內(nèi)核提供的接口,就類似寫應(yīng)用的時(shí)候很多
情況下只需要了解系統(tǒng)接口和庫函數(shù)的原型描述而不需要繼續(xù)深入一樣。這樣把自己從內(nèi)核復(fù)雜的實(shí)現(xiàn)細(xì)節(jié)中解
放出來,可以重點(diǎn)看網(wǎng)卡的特性部分;之后可以再深入了解設(shè)備的運(yùn)作過程,比如網(wǎng)卡的收發(fā)包在協(xié)議棧中的
位置和運(yùn)作

個(gè)人感覺如果工作中能接觸驅(qū)動(dòng)開發(fā)最好,否則很多情況下,有的設(shè)備并不常見,比如 Infiniband 卡

現(xiàn)在民用設(shè)備越來越廣泛,可以選擇自己感興趣而手頭又容易有的設(shè)備進(jìn)行研究,比如無線網(wǎng)卡、wifi 等
驅(qū)動(dòng)開發(fā),一定要先專注一個(gè)設(shè)備,從頭到尾熟悉一遍,然后總結(jié)驅(qū)動(dòng)開發(fā)是怎樣的、驅(qū)動(dòng)是如何關(guān)聯(lián)到系統(tǒng)中
的、Linux 采用什么樣的分層模式來提供對多種多樣設(shè)備的支持,如類似 VFS 一樣的抽象分層

推薦
        linux device driver, 3rd edition
        Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解



2. 您覺得Linux驅(qū)動(dòng)開發(fā)的難點(diǎn)是什么,有什么好的方法來克服?

Linux 內(nèi)核對各種設(shè)備的驅(qū)動(dòng)開發(fā)提供了完善的框架支持,對應(yīng)某個(gè)驅(qū)動(dòng),把對外的接口弄清楚就可以了。打個(gè)
比方,一個(gè)設(shè)備可能在不同的 OS 上需要支持,比如 FreeBSD/Windows 等,每個(gè) OS 都有自己定義的接口,
設(shè)備的驅(qū)動(dòng)定義好與這些 OS 接口的連接,剩下的就是設(shè)備本身的特性管理以及驅(qū)動(dòng)接口中對設(shè)備管理函數(shù)的調(diào)
用了,比如寄存器訪問、配置管理、緩沖區(qū)管理、數(shù)據(jù)收發(fā)等,比較重要的中斷和同步的控制,要避免數(shù)據(jù)處理的
時(shí)候的死鎖。

比如網(wǎng)卡驅(qū)動(dòng),基本的要求是提供內(nèi)核需要的接口,這樣網(wǎng)卡驅(qū)動(dòng)才能掛接到系統(tǒng)中,剩下的就是接口需要調(diào)用
網(wǎng)卡驅(qū)動(dòng)的內(nèi)部函數(shù),來對網(wǎng)卡進(jìn)行控制、數(shù)據(jù)收發(fā)和管理等

Linux 支持的設(shè)備種類繁多,不可能所有都掌握,某一子系統(tǒng)也只能是熟悉,因?yàn)橥愒O(shè)備還有許多自由的特性。
寫驅(qū)動(dòng)的步驟可以概括為:
        1) 閱讀設(shè)備規(guī)范,對設(shè)備的運(yùn)行機(jī)理有所了解
           為了減少干擾,不考慮要支持的 OS,獨(dú)立與 OS 考慮基本的功能如何實(shí)現(xiàn)
        2) 參考同類設(shè)備在 Linux 內(nèi)核中的驅(qū)動(dòng)架構(gòu)
        3) 提供基本的 Linux 設(shè)備驅(qū)動(dòng)接口和實(shí)現(xiàn)設(shè)備的基本功能,比如網(wǎng)卡收發(fā)小數(shù)據(jù)量
        4) 在性能上逐步提示,比如網(wǎng)卡傳輸?shù)臄?shù)據(jù)量加大、中斷及時(shí)處理、避免死鎖等
        5) 對邊界條件進(jìn)行完善,網(wǎng)卡上就是對一些特殊大小的數(shù)據(jù)包傳輸完善等
        6) 對設(shè)備進(jìn)行更高級控制的支持,比如網(wǎng)卡支持 ethtool 等工具
        7) 反復(fù)調(diào)試、改進(jìn)和優(yōu)化



3. Linux內(nèi)核有上百個(gè)驅(qū)動(dòng)子系統(tǒng),你研究過內(nèi)核各種驅(qū)動(dòng)子系統(tǒng)的共性,層次結(jié)構(gòu)設(shè)計(jì)嗎?分享學(xué)習(xí)一個(gè)Linux內(nèi)核子系統(tǒng)的經(jīng)驗(yàn),例如USB、I2C、HID等driver。

        每一個(gè)子系統(tǒng)都巨大無比,而且涉及各種硬件規(guī)范,很難去搞明白所有。只能是遇到問題的時(shí)候,
        能對某一部分深入下去。之前了解過 SCSI 的架構(gòu),最上層的抽象,中間層的橋梁,最底層的設(shè)備
        驅(qū)動(dòng)控制
        如果僅僅是做 driver 的工作,可以把精力放在設(shè)備特性上,Linux 內(nèi)核部分只需要了解驅(qū)動(dòng)
        接口和同步、內(nèi)存管理等基本功能



4. 您深入研究過Linux設(shè)備驅(qū)動(dòng)模型,關(guān)注過Linux內(nèi)核驅(qū)動(dòng)的設(shè)計(jì)思想嗎?

        Linux 設(shè)備驅(qū)動(dòng)模型是從分類的角度來看待設(shè)備,分類是多維的,所以 /sys 下也是多個(gè)目錄
        另外,設(shè)備驅(qū)動(dòng)模型給出了系統(tǒng)中設(shè)備布局信息,比如根據(jù)總線地址可以定位對應(yīng)的設(shè)備目錄等

        Linux 內(nèi)核驅(qū)動(dòng)可以都是遵循一個(gè)逐層抽象的架構(gòu):
                最上層的抽象層便于系統(tǒng)軟件的訪問,
                中間層的實(shí)現(xiàn)硬件協(xié)議細(xì)節(jié),同時(shí)提供上下兩層連接的接口,
                對于最下層的 driver 來說就是要定義底層驅(qū)動(dòng)要實(shí)現(xiàn)的接口和實(shí)際的設(shè)備控制
        由于 Linux 內(nèi)核各類驅(qū)動(dòng)的框架支持,driver 可以更加關(guān)注設(shè)備本身的特性
       


5. Android系統(tǒng)是基于Linux內(nèi)核的,傳統(tǒng)的Linux驅(qū)動(dòng)開發(fā)和Android驅(qū)動(dòng)開發(fā)有什么區(qū)別?

        傳統(tǒng)的 Linux 內(nèi)核驅(qū)動(dòng)開發(fā),只需要定義好 Linux 需要的驅(qū)動(dòng)接口就好了,之后
        專注與設(shè)備本身的特性
        而 Android 驅(qū)動(dòng)開發(fā),需要將設(shè)備操作接口繼續(xù)封裝,提供上層使用的 Java API;
        driver 部分可以使用 C 代碼,一些更復(fù)雜的操作可以用 Java 實(shí)現(xiàn),然后 driver
        提供對復(fù)雜操作的接口支持
        一個(gè)很重要的方面是功能的分離定義,比如哪些是 driver 實(shí)現(xiàn)的,哪些是上層實(shí)現(xiàn)的,
        它們之間的接口是怎樣的,定義好這些,就可以按照傳統(tǒng) driver 的實(shí)現(xiàn)方式來做了;
        從某種程度上,可以看作是傳統(tǒng) driver 跟相關(guān) tools 轉(zhuǎn)換成了 Android driver
        和上層 Java 接口


評分

參與人數(shù) 1信譽(yù)積分 +10 收起 理由
shenlanyouyu + 10 很給力!

查看全部評分

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2015-08-19 18:43 |只看該作者
本帖最后由 lyl19 于 2015-08-19 18:44 編輯

回復(fù) 1# shenlanyouyu

我覺得設(shè)備驅(qū)動(dòng) 開發(fā)對kernel的掌握還算是次要的,最重要的是對arch, 以及硬件的理解。
印象中發(fā)生了太多的case, 與arch相關(guān)的,比如說memory barrier,都要花比較大的氣力解決。
而與硬件相關(guān)的,比如說DMA hung之類的,中斷不觸發(fā)之類的,這個(gè)時(shí)候,單純從軟件來很難解決,一般都是WAR,比如復(fù)位啥的。但如果有機(jī)會去讀到硬件的RTL, 這個(gè)時(shí)候你對這類的問題將不再是恐懼,而是心里會有數(shù)。

所以個(gè)人認(rèn)為,設(shè)備驅(qū)動(dòng)的編寫絕不是單純軟件的事情,必須要熟悉該設(shè)備的RTL,如果你能夠得到的話。





   
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP