1. 程式人生 > >Linux核心原始碼簡單分析(如何深入研究原始碼)

Linux核心原始碼簡單分析(如何深入研究原始碼)

第11章Linux核心原始碼
本章講述在Linux核心原始碼中,應該從何處開始查詢特定的核心函式。
本書並不要求讀者具有C語言程式設計能力,也不要求讀者有一份可參閱的Linux核心原始碼,
事實上,通過檢視核心原始碼可以在一定深度上理解Linux作業系統,同時這也是一個很好的實
踐機會。本章給出了對核心原始碼的概覽:它們是如何編排的以及從何處開始查詢特定程式碼。
11.1怎樣得到Linux核心原始碼
所有主要的Linux系統(Craftworks、Debian、Slackware、RedHat等等)都包含有核心原始碼,
通常所安裝的Linux系統都是通過這些原始碼建立的。由於Linux總是不斷更新,因此使用者所安
裝的Linux可能已過時,不過從附錄A所列的站點上可得到最新的原始碼,所有這些站點地址都
可在ftp://ftp.cs.helsinki.fi

上查到。
Linux核心原始碼的版本號表示方法非常簡單:所有偶數版(如2.0.30)都是已發行的穩定版;
所有奇數版(如2.1.42)都是測試版,本書是基於2.0.30版撰寫的。測試版包含所有的新特徵,
並支援所有的新裝置,雖然測試版並不穩定,並且可能提供了一些使用者不想要的東西,但對
於Linux與使用者溝通而言,測試新的核心是很重要的。不過請注意,在嘗試非產品型的測試版
之前,最好先完全備份系統。
對核心原始碼的修改是作為patch檔案出現的,patch工具提供了一組對原始碼檔案的編輯。例
如,若想把2.0.29原始碼升級為2.0.30版,則要使用patch檔案來完成對原始碼的編輯,操作如下:
這樣做可以避免對所有原始碼檔案的拷貝。在http://www.linuxhq.com
站點上可找到很好的
核心原始碼的patch。
11.2核心原始碼的編排
在原始碼目錄樹的最頂端(/usr/src/linux)可看到如下一些目錄:
*archarch子目錄包含所有的特定體系結構的核心原始碼,它的子目錄分別對應著一種
Linux所支援的體系結構,例如i386和alpha。
*includeinclude子目錄包含大部分的編譯核心原始碼所需檔案。
*init此目錄下包含了核心的初始化程式碼,由此可以很好地開始瞭解核心是如何工作的。
*mm此目錄下包含了所有記憶體管理程式碼,特定體系結構的記憶體管理程式碼在arch/*/mm目
錄下。
*drivers此目錄下包含了系統所有的裝置驅動程式,其下子目錄各針對不同的裝置驅動
程式類。
*ipc此目錄下包含了核心的內部程序通訊程式碼。
*modules此目錄只是用來儲存建立的模組。

*fs所有檔案系統程式碼,其下子目錄各針對不同的系統所支援的檔案系統。
*kernel核心主程式碼,特定體系結構核心程式碼儲存在arch/*/kernel中。
*net核心的網路程式碼。
*lib此目錄包含核心庫程式碼,特定體系結構的庫程式碼儲存在arch/*/lib目錄下。
*scripts此目錄包含了核心設定時用到的指令碼。
11.3從何處看起
像Linux這樣複雜的大程式,探究起來使人迷茫,這就像一個找不出頭緒的大線團。要查
看核心的某一部分通常會被引向許多其他的相關檔案,最後甚至忘記了最初的動機。下面給
出了一些提示,根據這些提示,對於給定的內容即可找到最好的開始閱讀程式碼部分。
1.系統啟動和初使化
在基於Intel的系統中,通常先執行loadlin.exe或LILO,由這兩個程式將核心載入記憶體並啟
動核心,之後便由核心控制系統。在arch/i386/kernel/head.s中可找到這一部分,head.s先進行
一些特定體系結構的安裝,然後跳轉到init/main.c中的main()例程。
2.記憶體管理
有關記憶體管理的程式碼大部分都在mm中,但與特定體系結構相關的部分則儲存在
arch/*/mm中,記憶體缺頁處理程式碼在mm/memory.c中,記憶體對映和頁緩衝程式碼在mm/filemap.c
中,實現緩衝區快取部分程式碼在mm/buffer.c中,頁交換程式碼在mm/swap_state.c和
mm/swapfile.c中。
3.核心
大部分通用核心程式碼在kernel中,與特定體系結構相關的程式碼在arch/*/kernel中,排程進
程程式碼在kernel/sched.c中,建立子程序程式碼在kernel/fork.c中,BottomHalf控制程式程式碼在
include/linux/interrupt.h中,task_struct資料結構的定義在include/linux/sched.h中。
4.PCI
PCI偽驅動程式在drivers/pci/pci.c中,系統全域性定義在include/linux/pci.h中。每種體系結
構都有其特定的PCIBIOS程式碼,如AlphaAxp的程式碼在arch/alpha/kernel/bios32.c中。
5.內部程序間通訊
所有相關程式碼都在ipc中,所有的SystemVIPC物件都有一個ipc_perm資料結構,在
include/linux/ipc.h中有該資料結構的定義。SystemV的訊息機制程式碼在ipc/msg.c中,共享內
存程式碼在ipc/shm.c中,訊號量程式碼在ipc/sem.c中,管道程式碼在ipc/pipe.c中。
6.中斷處理
核心的中斷處理程式碼幾乎都與特定微處理器相關。Intel的中斷處理程式碼在
arch/i386/kernel/irq.c中,並且定義在include/asm-i386/irq.h中。
7.裝置驅動程式
大部分的Linux核心原始碼行在裝置驅動程式中,所有裝置驅動程式程式碼在drivers中,並分
為如下幾類:
*/block塊裝置驅動程式(如ide.c)。若要了解其初始化過程,參看drivers/block/genhd.c中
的device_setup()函式,該函式不僅能初始化硬碟,也可以初始化網路。塊裝置包括IDE
和SCSI裝置。

*/char字元裝置驅動程式,例如ttys、串列埠和滑鼠。
*/cdromLinux的所有CDROM程式碼。在此可找到特定的CDROM裝置(如SoundblasterCD
ROM),請注意,ideCD驅動程式在drivers/block下的ide-cd.c中,而SCSICD驅動程式在
drivers/scsi中的scsi.c中。
*/pciPCI偽驅動程式程式碼,由此可瞭解PCI子系統是如何對映和初始化的,arch/alpha
/kernel/bios32.c中的AlphaPCI固化程式碼也值得一看。
*/scsi所有的SCSI程式碼,以及Linux所支援的所有scsi裝置驅動程式程式碼。
*/net所有網路裝置驅動程式程式碼。
*/sound所有音效卡驅動程式程式碼。
8.檔案系統
EXT2檔案系統的程式碼都在fs/ext2/目錄下,其資料結構定義在include/linux/ex2_fs.h、
ext2_fs_i.h和ext2_fs_sb.h中,虛檔案系統(VirtualFileSystem)資料結構在include/linux/fs.h中,
程式碼在fs/*中,緩衝區快取程式碼在fs/buffer.c中。
9.網路
網路部分程式碼在net中,其大部分的include檔案在include/net中,BSD套接字程式碼在
net/socket.c中,IP版本4INET套接字程式碼在net/ipv4/af_inet.c中,常用的協議支援程式碼(包括
sk_buff控制例程)在net/core中,TCP/IP網路程式碼在net/ipv4中,而網路裝置驅動程式在
drivers/net中。
10.模組
核心模組程式碼一部分在kernel中,另一部分在模組包中,核心程式碼都在kernel/mcdules.c中,
其資料結構和核心守護程式kerneld訊息分別在include/linux/module.h和include/linux/kerneld.h
中,ELF物件檔案的結構定義在include/linux/elf.h中。

相關推薦

Linux核心原始碼簡單分析(如何深入研究原始碼)

第11章Linux核心原始碼 本章講述在Linux核心原始碼中,應該從何處開始查詢特定的核心函式。 本書並不要求讀者具有C語言程式設計能力,也不要求讀者有一份可參閱的Linux核心原始碼, 事實上,通過檢視核心原始碼可以在一定深度上理解Linux作業系統,同時這也是一個

【小家java】SortedMap和NavigableMap的使用介紹---TreeMap的原始碼簡單分析

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

簡單分析springboot的原始碼

springboot的pom檔案的起步依賴以及功能依賴 每一個版本的起步依賴中,都集成了相應的一整套的功能依賴,所需要的一套依賴 springboot的起步依賴註解@SpringBootApplication簡單分析 @SpringBootApplication註解包含以下主要的

H264編碼器5( x264原始碼簡單分析:x264_slice_write() 與H264 編碼簡介)

  x264原始碼簡單分析:x264_slice_write() 來自:https://blog.csdn.net/leixiaohua1020/article/details/45536607     H264 編碼簡介 https://blo

H264編碼器4( x264原始碼簡單分析:概述)

來自:https://blog.csdn.net/leixiaohua1020/article/details/45536607   ===================================================== H.264原始碼分析文章列表:

spring、mybatis整合原始碼簡單分析

配置 <bean id="localDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">

基於OK6410開發板Uboot原始碼簡單分析

2018-04-07 OK6410開發板是基於三星S3C6410晶片設計的一款開發板,資源比較豐富,可是想要使用這些資源就需要編寫相應的啟動載入程式,即BootLoader。當然,想要自己憑空寫出BootLoader那簡直就是天方夜譚,所以我們需要參考行業中現有的BootLoader,在其

FFmpeg原始碼簡單分析 avio open2

                =====================================================FFmpeg的庫函式原始碼分析文章列表:【架構圖】【通用】【解碼】【編碼】【其它】【指令碼】【H.264】=================================

FFmpeg原始碼簡單分析 avcodec encode video

                =====================================================FFmpeg的庫函式原始碼分析文章列表:【架構圖】【通用】【解碼】【編碼】【其它】【指令碼】【H.264】=================================

Tomcat原始碼簡單分析

前言 Tomcat是目前應用比較多的servlet容器,有複雜的結構,想要了解它,就應該順著開發者設計之初的思路來,先了解整體的結構,對整體有了一定的掌控後,再逐個分析,瞭解感興趣的細節。 架構設計   簡單介紹各個模組: Server:伺服器的意思,代表

live555 原始碼簡單分析1:主程式

live555是使用十分廣泛的開源流媒體伺服器,之前也看過其他人寫的live555的學習筆記,在這裡自己簡單總結下。 live555原始碼有以下幾個明顯的特點: 1.標頭檔案是.hh字尾的,但沒覺得和.h字尾的有什麼不同 2.採用了面向物件的程式設計思路,裡面各種物件 好

react-navigation 原始碼簡單分析以及徒手擼react-navigation簡易版

目標簡單做個導航效果的Navigator 在接觸ReactNative中 渲染檢視最重要即render方法去渲染,對於react-navigation如何快取之前的檢視物件,以及如何在一個容器裡面做到跳轉效果(Acitvity 的概念),以及回退了 之前物件還是

ffmpeg 原始碼簡單分析 : av_read_frame()

此前寫了好幾篇ffmpeg原始碼分析文章,列表如下: ============================ ffmpeg中的av_read_frame()的作用是讀取碼流中的音訊若干幀或者視訊一幀。例如,解碼視訊的時

ffmpeg 原始碼簡單分析 : av_register_all()

此前寫了好幾篇ffmpeg原始碼分析文章,列表如下: ============================ 前一陣子看了一下ffmpeg的原始碼,並且做了一些註釋,在此貼出來以作備忘。 本文分析一下ffmpeg註冊

FFmpeg與libx264介面原始碼簡單分析

=====================================================H.264原始碼分析文章列表:【編碼 - x264】【解碼 - libavcodec H.264 解碼器】================================

FFmpeg原始碼簡單分析:makefile

=====================================================FFmpeg的庫函式原始碼分析文章列表:【架構圖】【通用】【解碼】【編碼】【其它】【指令碼】【H.264】================================

ReentrantLock可重入鎖的理解和原始碼簡單分析

import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; /** * @author admin * @date 2018/1/16 12:16 * ReentrantLock 可重入

FFmpeg原始碼簡單分析:結構體成員管理系統-AVClass

=====================================================FFmpeg的庫函式原始碼分析文章列表:【架構圖】【通用】【解碼】【編碼】【其它】【指令碼】【H.264】================================

FFmpeg的H.264解碼器原始碼簡單分析:概述

=====================================================H.264原始碼分析文章列表:【編碼 - x264】【解碼 - libavcodec H.264 解碼器】================================

FFmpeg原始碼簡單分析:avcodec_open2()

=====================================================FFmpeg的庫函式原始碼分析文章列表:【架構圖】【通用】【解碼】【編碼】【其它】【指令碼】【H.264】================================