導航:首頁 > 編程系統 > linux內核態編程

linux內核態編程

發布時間:2023-07-27 08:10:23

linux 系統編程, 驅動編程 , 內核編程 有什麼區別《UNIX高級編程》的內容是哪一類的

系統編程,注重性能,比如伺服器端的編程,一般最底層使用c,自己對內存管理版文件系統管理進行優化權
驅動編程,主要是為了把linux一直到嵌入式設備,linux內核是一個龐大的系統,但不是所有設備都用上這些,而且對於兼容性問題,還要做一些修改。比如在iphone出來之前,都是使用嵌入式設計一些PDA和山寨手機系統
至於內核編程,其實也是對性能的追求,但內核編程調用的API級別更高,相對來說系統編程,是標準的API
《U高級編程》一般沒太多說明,都是系統編程

② Linux內核編程的目錄

目錄
第1章概述1
1.1UNIX的歷史2
1.2標准和通用介面3
1.3自由軟體和開放源碼3
1.4Linux發布版概覽3
1.41Debian4
1.42Red Hat/Fedora 4
1.43Mandriva4
1.44SUSE4
1.45Gentoo4
1.46Yellow Dog5
1.47其他發布版5
1.5內核版本信息5
1.6基於Power的Linux5
1.7什麼是操作系統6
1.8內核組織7
1.9Linux內核概述7
1.9.1用戶介面7
1.9.2用戶標識符8
1.9.3文件和文件系統8
1.9.4進程12
1.9.5系統調用15
1.9.6Linux調度程序15
1.9.7Linux設備驅動程序15
1.10可移植性和體系結構的相關性16
1.11小結16
1.12習題16
第2章內核探索工具集18
2.1內核中常見的數據類型18
2.1.1鏈表18
2.1.2查找21
2.1.3樹22
2.2匯編24
2.2.1PowerPC24
2.2.2x8627
2.3匯編語言示例29
2.3.1x86中的匯編示例30
2.3.2PowerPC中的匯編示例31
2.4內聯匯編33
2.4.1輸出操作數34
2.4.2輸入操作數34
2.4.3已修改過的寄存器(已修改的元素列表) 34
2.4.4參數的編號方式34
2.4.5約束條件34
2.4.6asm35
2.4.7__volatile__35
2.5特殊的C 語言用法38
2.5.1asmlinkage38
2.5.2UL39
2.5.3內聯39
2.5.4const和volatile39
2.6內核探索工具一覽40
2.6.1objmp/readelf40
2.6.2hexmp41
2.6.3nm41
2.6.4obj42
2.6.5ar42
2.7內核發言:傾聽來自內核的消息42
2.7.1printk()42
2.7.2dmesg42
2.7.3/var/log/messages42
2.8其他奧秘43
2.8.1__init43
2.8.2likely()和unlikely()43
2.8.3IS_ERR和PTR_ERR44
2.8.4通告程序鏈44
2.9小結45
2.9.1項目:Hellomod45
2.9.2第一步:構造Linux模塊的框架45
2.9.3第二步:編譯模塊46
2.9.4第三步:運行代碼47
2.10習題48
第3章進程:程序執行的基本模型49
3.1程序51
3.2進程描述符52
3.2.1與進程屬性相關的欄位54
3.2.2與調度相關的欄位55
3.2.3涉及進程間相互關系的欄位58
3.2.4與進程信任狀相關的欄位59
3.2.5與進程權能相關的欄位60
3.2.6與進程限制相關的欄位61
3.2.7與文件系統及地址空間相關的欄位63
3.3進程的創建:系統調用fork()、vfork 和clone()64
3.3.1fork()函數65
3.3.2vfork()函數66
3.3.3clone()函數67
3.3.4do_fork()函數68
3.4進程的生命周期70
3.4.1進程的狀態70
3.4.2進程狀態的轉換71
3.5進程的終止74
3.5.1sys_exit()函數75
3.5.2do_exit()函數75
3.5.3通知父進程和sys_wait4()77
3.6了解進程的動態:調度程序的基本構架80
3.6.1基本結構80
3.6.2從等待中醒來或者激活81
3.7等待隊列86
3.7.1添加到等待隊列88
3.7.2等待事件89
3.7.3喚醒進程91
3.8非同步執行流程93
3.8.1異常93
3.8.2中斷95
3.9小結114
3.9.1項目:系統變數current114
3.9.2項目源碼115
3.9.3運行代碼116
3.10習題116
第4章內存管理117
4.1頁119
4.2內存管理區121
4.2.1內存管理區描述符122
4.2.2內存管理區操作輔助函數124
4.3頁面124
4.3.1請求頁面的函數124
4.3.2釋放頁面的函數126
4.3.3夥伴系統126
4.4Slab分配器130
4.4.1緩存描述符133
4.4.2通用緩存描述符135
4.4.3Slab描述符136
4.5Slab分配器的生命周期138
4.5.1與Slab分配器有關的全局變數138
4.5.2創建緩存139
4.5.3創建slab與cache_grow()144
4.5.4Slab的銷毀:退還內存與kmem_cache_destroy()146
4.6內存請求路徑147
4.6.1kmalloc()147
4.6.2kmem_cache_alloc()148
4.7Linux進程的內存結構149
4.7.1mm_struct150
4.7.2vm_area_struct152
4.8進程映像的分布及線性地址空間153
4.9頁表155
4.10缺頁156
4.10.1x86缺頁異常156
4.10.2缺頁處理程序157
4.10.3PowerPC缺頁異常164
4.11小結164
4.12項目:進程內存映射165
4.13習題166
第5章輸入/輸出167
5.1匯流排、橋、埠和介面的硬體實現167
5.2設備171
5.2.1塊設備概述172
5.2.2請求隊列和I/O 調度173
5.2.3示例:「通用」塊設備驅動程序180
5.2.4設備操作182
5.2.5字元設備183
5.2.6網路設備184
5.2.7時鍾設備184
5.2.8終端設備184
5.2.9直接存儲器存取184
5.3小結185
5.4項目:創建並口驅動程序185
5.4.1並口的硬體185
5.4.2運行在並口上的軟體187
5.5習題192
第6章文件系統194
6.1文件系統的基本概念194
6.1.1文件和文件名194
6.1.2文件類型195
6.1.3文件的附加屬性195
6.1.4目錄和路徑名196
6.1.5文件操作197
6.1.6文件描述符197
6.1.7磁碟塊、磁碟分區以及實現197
6.1.8性能198
6.2Linux虛擬文件系統198
6.2.1VFS的數據結構200
6.2.2全局鏈表和局部鏈表的引用211
6.3與VFS相關的結構212
6.3.1fs_struct結構212
6.3.2files_struct結構213
6.4頁緩存216
6.4.1address_space結構217
6.4.2buffer_head結構219
6.5VFS的系統調用和文件系統層221
6.5.1open()221
6.5.2close()227
6.5.3read()229
6.5.4write()244
6.6小結246
6.7習題246
第7章進程調度和內核同步247
7.1Linux的調度程序248
7.1.1選擇下一個進程248
7.1.2上下文切換253
7.1.3讓出CPU261
7.2內核搶佔269
7.2.1顯式內核搶佔269
7.2.2隱式用戶搶佔270
7.2.3隱式內核搶佔270
7.3自旋鎖和信號量272
7.4系統時鍾:關於時間和定時器274
7.4.1實時時鍾:現在幾點了274
7.4.2讀取PPC的實時時鍾276
7.4.3讀取x86的實時時鍾278
7.5小結280
7.6習題280
第8章內核引導281
8.1BIOS和Open Firmware282
8.2引導載入程序282
8.2.1GRUB283
8.2.2LILO286
8.2.3PowerPC和Yaboot286
8.3與體系結構相關的內存初始化287
8.3.1PowerPC的硬體內存管理287
8.3.2基於Intel x86體系結構的硬體內存管理296
8.3.3PowerPC和x86的代碼匯集305
8.4原始的RAM盤305
8.5開始:start_kernel()306
8.5.1調用lock_kernel()307
8.5.2調用page_address_init()309
8.5.3調用printk(linux_banner)311
8.5.4調用setup_arch311
8.5.5調用setup_per_cpu_areas()315
8.5.6調用smp_prepare_boot_cpu()316
8.5.7調用sched_init()317
8.5.8調用build_all_zonelists()319
8.5.9調用page_alloc_init319
8.5.10調用parse_args()320
8.5.11調用trap_init()322
8.5.12調用rcu_init()323
8.5.13調用init_IRQ()323
8.5.14調用softirq_init()324
8.5.15調用time_init()325
8.5.16調用console_init()326
8.5.17調用profile_init()326
8.5.18調用local_irq_enable()327
8.5.19配置initrd327
8.5.20調用mem_init()327
8.5.21調用late_time_init()333
8.5.22調用calibrate_delay()333
8.5.23調用pgtable_cache_init()334
8.5.24調用buffer_init()335
8.5.25調用security_scaffolding_startup()336
8.5.26調用vfs_caches_init()336
8.5.27調用radix_tree_init()343
8.5.28調用signal_init()344
8.5.29調用page_writeback_init()344
8.5.30調用proc_root_init()346
8.5.31調用init_idle()347
8.5.32調用rest_init()348
8.6init線程(或進程1)349
8.7小結353
8.8習題353
第9章構建Linux內核354
9.1工具鏈354
9.1.1編譯程序355
9.1.2交叉編譯355
9.1.3鏈接程序356
9.1.4ELF二進制目標文件356
9.2內核源代碼的構建360
9.2.1解釋源代碼360
9.2.2構建內核映像364
9.3小結369
9.4習題369
第10章向內核添加代碼371
10.1瀏覽源代碼371
10.11熟悉文件系統371
10.12filp和fops372
10.13用戶空間和內核空間374
10.14等待隊列375
10.15工作隊列及中斷378
10.16系統調用380
10.17其他類型的驅動程序380
10.18設備模型和sysfs文件系統383
10.2編寫代碼386
10.2.1設備基礎386
10.2.2符號輸出388
10.2.3IOCTL388
10.2.4輪詢與中斷391
10.2.5工作隊列和tasklet395
10.2.6增加系統調用的代碼396
10.3構建和調試398
10.4小結399
10.5習題400

③ 如何進行Linux Kernel 開發

  1. 學習匯編語言、C語言,這兩種語言是你進行Linux Kernel開發與維護的必備語言能力,這樣你才有能力閱讀與編寫Linux Kernel的能力。

  2. 下載Linux Kernel源代碼,建議下載先前的版本,因為目前的新版本代碼數量太龐大,技術太新,如果是進行Linux Kernel的開發的話,先從簡單的版本0.11或者1.XX.XX版本開始,以前的版本中沒有過多的新技術的代碼,適合入門Linux Kernel的學習。

  3. 當你熟悉了Linux Kernel了後,可以下載目前最新的版本Linux Kernel3.18版本的源代碼,裡麵包含了很多的新技術的知識,方便你了解與學習~~~


這是一篇很重要的文檔,它介紹了內核開發的方方面面。這篇文檔已被加入到內核源碼樹的Documentation文檔里(名字為HOWTO),你可以在最新的內核樹里找到它。盡管已經有網友翻譯過這篇文檔,但是我還是決定自己再翻譯一遍。翻譯完之後,我的感觸是如果依靠翻譯來進行學習,速度太慢了。以後的技術文檔直接看英文,適當的做做筆記即可。

山濤

-----------------------------------------------------

How to do Linux Kernel development

-----------------------------------------------------

關於如何進行Linux Kernel development,這篇文檔是最值得你閱讀的一篇。它指導你如何成為一名Linux內核開發者以及如何和Linux內核開發社區一同工作。盡管它不包含內核編程的技能方面的知識,但是本篇能夠給你正確的指導去做內核開發。

如果這篇文檔講述的任何東西已經過時了的話,請給這篇文檔的維護者發送你的更新。

Greg [email protected]

Introction

-----------------

你想成為一名Linux內核開發者嗎?或者你的老闆曾經告訴你:去給某個設備寫個Linux驅動程序。這篇文檔的目標是,通過描述你進行開發時需要經歷的一些流程規則去指導你如何與社區一起工作,教會你所需要的一切從而讓你實現你的目標(成為一名合格的內核開發者,或者寫出合格的令老闆滿意的驅動程序);這篇文檔也會說明內核社區工作的風格和原因。

內核絕大部分代碼是基於C語言編程,與體系結構有關的一小部分由匯編完成。很好的理解和掌握C語言,是內核開發的必備要求。匯編語言(不同的體系結構有不同的匯編語言)不是必需的,除非你計劃做體系結構相關的底層開發。如果你想加強C語言的掌握,很好的參考資料如下:

- "The C Programming Language" by Kernighan and Ritchie [Prentice Hall]
- "Practical C Programming" by Steve Oualline [O'Reilly]

Linux內核是使用GNU C和GNU工具鏈完成的。盡管它遵循ISO C89標准,但是內核的編寫也使用了許多的GNU C的擴展特性,這些特性不屬於標準的一部分。內核的C編程環境自成體系,不依賴於C標准庫,所以C標準的一部分特性沒有被支持:例如Arbitrary long long divisions和浮點指針不被支持。有時你會很難理解內核基於GNU工具鏈的一些假定以及內核使用的一些GNU C擴展,不幸的是對於這類問題沒有確定性的參考資料。如果你遇到這類問題,建議你查閱GCC的info pages來獲取相關的信息(在Linux PC上,通過命令info gcc可以獲得信息)。

請記住你正在學習如何與已經存在的內核開發社區一起工作。內核開發社區由全球不同地方的開發人員組成,它以代碼、風格、開發流程的高質量標准著稱。這些高質量的標准使內核開發社區(這個組織非常大,地理位置非常分散)能夠非常有效的進行。應當提早努力學習這些高質量標准(編程風格、代碼要求以及開發流程),它們有很好的文檔;不要期望內核開發社區別的開發人員會適應你自己的或者你公司的開發風格。

Legal Issues

------------------

Linux內核代碼基於GPL許可協議發布。請閱讀內核源碼樹的主目錄里的COPYING文件,它提供了GPL許可的詳細描述。如果你有關於GPL許可的進一步問題,請聯系一名律師,不要在Linux kernel mailing list里詢問。Linux kernel mailing list里的開發人員不是律師,所以你不應當聽取他們的任何關於法律事務的建議。

對於一些通常的關於GPL許可的問題和解答,請參考:

http://www.gnu.org/licenses/gpl-faq.html

Documentation

---------------------

Linux內核源碼樹里有大量的非常有用的文檔用於學習,使你與內核社區相互促進和共同發展。當一個新的特性要加入到內核里,建議相關的文檔也要加入到內核里,用於描述如何使用這個新特性;當一個內核的修改導致了內核提供給用戶的介面發生了變化,建議你發送信息或者一個補丁給[email protected],告訴manual pages的維護者用戶介面的變化。

這里羅列了一些內核源碼樹里的需要閱讀的文檔:

README

這篇文檔簡要的介紹了Linux內核的背景,描述了配置和build內核需要什麼。一個剛剛接觸內核的新手應當從這里開始。(註:build kernel,就是編譯內核源代碼,生成可供系統使用的內核二進制文件(vmlinux/zImage)的過程。

Documentation/Changes

這篇文檔給出了一個用於成功編譯和運行內核的各種軟體包的列表的最小集合。

Documentation/CodingStyle

這篇文檔描述了Linux內核編碼風格,和一些隱藏在背後的基本原理。所有的想加入內核的新代碼應當遵循這篇文檔的指導。絕大數的內核代碼維護者只願意接受那些符合這篇文檔描述的風格的補丁,許多內核開發者也只願意審查那些符合Linux內核編碼風格的代碼。

Documentation/SubmittingPatches

Documentation/SubmittingDrivers

這些文檔清楚而又詳細地告訴你如何成功的創建和向社區遞交一個補丁,包括:

----郵件內容

----郵件格式

----發送者和接收者

遵循文檔里提倡的規則並不一定保證你提交補丁成功(因為所有的補丁遭受詳細而嚴格的內容和風格的審查),但是不遵循它們,提交補丁肯定不成功。

其他的一些非常優秀的描述如何正確的創建補丁的文檔如下:

"The Perfect Patch"
http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt
"Linux kernel patch submission format"
http://linux.yyz.us/patch-format.html

Documentation/stable_api_nonsense.txt

這篇文檔描述了有意決定在內核里沒有固定內核API的基本原因,包含下面的討論主題:

---子系統的shim-layers(為了兼容性?)

---操作系統之間的驅動移植性

---減緩內核源碼樹的快速變化(或者說,防止快速變化)

這篇文檔對於理解Linux的開發哲學非常關鍵,也對於從其他操作系統轉移到Linux上的開發人員非常重要。

Documentation/SecurityBugs

如果你確知你在Linux Kernel里發現了security problem,請遵循這篇文檔描述的步驟,幫助通知內核的開發者們並解決這類問題。

Documentation/ManagementStyle

這篇文檔描述了Linux內核開發者們如何進行管理運作,以及運作方法背後的分享精神(shared ethos)。這篇文檔對於那些內核開發新手們(或者那些好奇者)值得一讀,因為它解決或解釋了很多對於內核維護者獨特行為的誤解。

Documentation/stable_kernel_rules.txt

這篇文檔描述了一個穩定的內核版本如何發布的規則,以及需要做些什麼如果你想把一個修改加入到其中的一個版本。

Documentation/kernel-docs.txt

關於內核開發的外部文檔列表。如果你在內核開發的內部文檔中找不到你想要的資料,請參考這篇文檔提供的資料鏈接。

Documentation/applying-patches.txt

這篇文檔很好地描述了什麼是補丁(patch),以及如何將它應用到內核的不同開發分支(branch)上。

內核里也有大量的由內核源碼自動生成的文檔。其中包括了內核內部API的全面描述,和如何處理好鎖的規則。這些文檔在Documentation/DocBook/下創建,格式可以是PDF、Postscritpt、HTML和man pages,在內核源碼主目錄下通過運行下面命令自動生成:

make pdfdocs

make psdocs

make htmldocs

make mandocs

附上出處鏈接:http://www.cppblog.com/flyonok/archive/2011/04/15/144316.html

④ linux內核編譯詳細教程及開發Linux系統

已發送到[email protected]

⑤ 如何讓linux的一段程序代碼進入內核態運行

需要讓linux的一段程序代碼進入內核態運行產生的方式有二:

  1. 被動式

  2. 主動式

所謂被動式就是產生中斷或者代碼產出異常,代碼不得不從用戶態進入內核態進行中斷操作或者是異常處理;

而主動式則是系統響應了程序對系統的一次調用過程,並且系統允許該運行級別的提升;

閱讀全文

與linux內核態編程相關的資料

熱點內容
組織文件內容是什麼 瀏覽:183
0基礎如何學習智能編程 瀏覽:366
java程序員全攻略下載 瀏覽:715
網路逆向教程 瀏覽:135
iso文件如何重裝系統 瀏覽:750
ghost鏡像文件路徑如何恢復 瀏覽:832
搭建網站需要多少錢啊 瀏覽:599
編程貓怎麼設置背景亮度 瀏覽:177
qq文件破損 瀏覽:414
javapoi配置 瀏覽:608
編程怎麼寫數據圖案同步 瀏覽:308
海康監控錄像回放丟數據怎麼回事 瀏覽:155
in後綴是什麼文件 瀏覽:142
linuxusb抓包工具 瀏覽:808
類似美團的app還有什麼 瀏覽:974
asp顯示資料庫 瀏覽:142
delphi逆向教程 瀏覽:63
資料庫怎麼把表名稱和欄位導出 瀏覽:910
桌面上文件變白刪不掉 瀏覽:968
更改項目的jdk版本 瀏覽:612

友情鏈接