linux內核驅動
⑴ 求教怎麼學習linux內核驅動
1.首先要了解為什麼要學習內核?下圖已表明,如果要從事驅動開發或系統研究,就要學習內核。
2.內核的知識就像下面的繩結一樣,一環扣一環,我們要解開它們,就必須要先找到線頭也就是內核中的函數介面。初學階段,我們一般不深入的研究內核代碼,會使用內核的介面函數就不錯了。
3.下面提供了如何學習這些內核函數的方法,就像解繩子一樣
4.學習內核的四步法則,思維導圖的設計尤為重要,這也是能否學習好內核的關鍵
5.語言基礎也需要扎實,所以需要把C語言鞏固鞏固
⑵ Linux內核開發與Linux驅動開發有什麼關系
驅動裝在系統上,有的會跟內核有交互,但是驅動一般是針對設備
⑶ 怎麼學linux內核驅動
怎麼學linux內核驅動?1. 分享Linux內核學習和驅動開發的經驗。
內核學習
Linux 內核功能越來越完善,如果沒有充裕的時間,深入內核並不是很現實。所以建議先讀一本內核的書,
第一遍是讀,會讀的很迷糊;之後反省一下,然後再瀏覽一下;可以想像一個 OS 是如何運行的,這樣可以不
陷入 Linux 內核的細節;最後可以深入自己感興趣或者需要的那一子系統
推薦 《Linux Kernel Development》
即便是子系統,也是很龐大的。一個省力的方式是網上搜一些相關的文章,便於快速了解這個子系統的運作;
然後結合代碼,形成自己的認知,最後做一下總結。如果僅僅是快速了解某一子系統的運作,可以參考一些早期
代碼的註解書籍,再深入的時候看看最新的代碼實現
對內核的認知是一個反復的過程,一開始並不完善,可能需要反復糾正。不要陷入這種糾錯中;而是以後繼續
使用和學習過程中,發現了沒有弄清楚的地方再深入,畢竟 Linux 內核是不斷變化的
還有一個很好的方式是,從系統調用入手,現在這方面的數據不少,而且對系統調用的語義都有講解,這樣可以
間接了解 Linux 系統的一些概念。對系統調用熟悉了,可以根據系統調用的執行過程,來大體了解內核的一個
運作過程;但是跟蹤系統調用的時候要注意抓主線,現在內核系統很復雜,一些 code path 上可能會涉及多個
子系統,可以從名字上猜測它們是干什麼的,不需要深入,否則會發現精力完全被分散掉了
學習 Linux 內核,一個很重要的是抽象的能力,所謂的抽象這里僅僅是指分清介面和介面的實現。因為 Linux
內核子系統很多,有很多子系統相互滲透,這樣 code path 看上去很復雜。閱讀代碼的時候,為了排除干擾,
需要分清哪些是自己需要看的,哪些是其它子系統的介面,對於其它子系統的介面,先當作它們功能完善不會
出問題好了,這樣可以關注重點;打個比方,一個應用程序的代碼可能量很大,比如一個 apache 項目,它
包含很多組件,有時候閱讀代碼的時候會看到不同組件的 API,深入看相關組件實現並不現實,這時候分清主次
對於代碼的閱讀就很有幫助了,總不能看到了 malloc 就要先把它的實現弄清楚吧,系統調用多者呢
⑷ linux下內核,驅動有什麼關聯嗎
1 驅動程序需要載入到內核中才能運行 。
2 編譯驅動模塊時,驅動需要調用內核中有關函數。
內核和驅動程序都是運行在內核空間。
⑸ linux內核驅動佔用時間多久會導致內核崩潰
設置
1.安裝kexec-tools工具,至於如何安裝,在此不再多 說。
2.編譯支持kmp的系統內核,我們叫他primary kernel。
確認以下內核選項已經被打開並重編內核。
1) 使能"kexec system call => Processor type and features." ,使內核支持kexec系統調用
CONFIG_KEXEC=y
2) 使能"Filesystem" => "Pseudo
filesystems."=> "sysfs file system support"
CONFIG_SYSFS=y
注意:如果"General Setup."=>"Configure standard kernel features (for small system)" 沒有打開的話,"sysfs file system support"可能並不會在"Pseudo
filesystems."中出現,如果是 這種情況,可以直接檢nfig文件,確認CONFIG_SYSFS是不是已經開啟。
grep 'CONFIG_SYSFS'nfig
3)使能"Kernel hacking."=>"Compile the kernel with debug info" ,保證編譯出的內核帶有調試符號。因為mp分析工具在讀取和分析mp文件時需要這些調試符號。
CONFIG_DEBUG_INFO=Y
3. 編譯mp-capture kernel
針對不同的架構,內核選項也有不同,但是不論哪種架構,以下兩個選項是必選的
"Processor type and features"=> "kernel crash mps"
CONFIG_CRASH_DUMP=y
"Filesystems" => "Pseudo filesystems"=>"/proc/vmcore support"
CONFIG_PROC_VMCORE=y
(當 CONFIG_CRASH_DUMP 被選中時,CONFIG_PROC_VMCORE會被自動選中)
下面我們看一下針對不同的架構,編 譯內核還有哪些特殊的選項
1)i386 和x86_64
*在i386上,使能高內存支持"Processor type and features"=>"high memory support"
CONFIG_HIGHMEM64G=y
or
CONFIG_HIGHMEM4G
* 在i386 和x86_64上,關閉"Processor type and features"=>"symmetric multi-processing support"
CONFIG_SMP=n
如果沒有將該選項設為n,則需要在載入mp- capture kernel時指定參數maxcpus=1。
*如果想編譯一個載入地址可浮動的內核,則選中"Processor type and features"=>"Build a relocatable kernel"
CONFIG_RELOCATABLE=y
* 設置合適的值給"Processor type and features"=>"Physical address where the kernel is loaded"
該值的設置與內核載入地址是否是可浮動的(即是否選中CONFIG_RELOCATABLE)有關。
如 果內核載入地址不可浮動, 則該值必須與crashkernel=Y@X中的X相同(至於crashkernel=Y@X的含義即如何使用將在後面講到),例 如:crashkernel=64M@16M,則CONFIG_PHYSICAL_START=0x100000
0。
如果內核載入地址可 浮動,則CONFIG_PHYSICAL_START的值便可不必在意,使用默認的即可。不過為了保險起見,為了能使kmp正確執 行,CONFIG_PHYSICAL_START的值不論在何時,都要於X的值相同。
2)ppc64
除了前面兩個必須的選項,其 余選項默認即可。
3)ia64
除了前面兩個必須的選項,其餘選項默認即可。
4.准備好兩個內核後,即可按如下步 驟使用kmp
1)使用primary kernel啟動系統,但是要在啟動參數中加入「crashkernel=Y@X」,Y表示為mp-capture kernel 預留了多少內存空間,X該段空間的起始地址,即內核選項中CONFIG_PHYSICAL_START的值。
對於x86和x86_64架構,一般 使用crashkernel=64M@16M,CONFIG_PHYSICAL_START=0x1000000
對於ppc64架構,一般使用 crashkernel=128M@32M,CONFIG_PHYSICAL_START=0x2000000
對於ia64架構,通常使用 crashkernel=256M@256M。
2)載入mp-capture kernel
系統啟動後,即可載入mp- capture kernle。
不同的架構,可以選擇使用為壓縮的mp-capture kernle (vmlinux) 或者壓縮過的mp-capture kernle(bzImage/vmlinuz)。
i386 和x86_64:
如果mp-capture kernel編譯時未選中CONFIG_RELOCATABLE,則只能使用vmlinux
如果mp-capture kernel編譯時打開了CONFIG_RELOCATABLE,則可以使用bzImage/vmlinuz
ppc64 :
只能使用vmlinux
ia64:
可以使用vmlinux或者vmlinuz.gz
載入方法:
kexec -p <mp-capture-kernel-vmlinux-image> \
--initrd=<initrd-for-mp-capture-kernel> --args-linux \
--append="root=<root-dev> <arch-specific-options>"
mp- capture-kernel-vmlinux-image:表示存放mp-capture kernel 的路徑
initrd-for- mp-capture-kernel:表示initrd的路徑,如果沒有,可以省略該參數
--args-linux:表示Pass linux kernel style options,沒看明白什麼意思,但是ia64架構不需要加這個參數,其他架構都要有。
--append: 該參數後跟內核啟動參數。
arch-specific-options:內核啟動參數的一部分,該處根據不同架構,填寫不同參數。 i386, x86_64 和 ia64 填"1 irqpoll maxcpus=1 reset_devices",ppc64填"1 maxcpus=1 noirqdistrib reset_devices"。
註:
默認情況下,ELF文件頭採用ELF64格式存儲以支持那些擁有超過 4GB內存的系統。但是可以指定「--elf32-core-headers」標志以 強制使用ELF32格式的ELF文件頭。這個標志是有必要注意的,一個重要的原因就是:當前版本的GDB不能在一個32位系統上打開一個使用ELF64格 式的vmcore文件。ELF32格式的文件頭不能使用在一個「沒有物理地址擴展」(non-PAE)的系統上。(即是說,少於4GB內存的系統)
1 這個參數,將啟動「轉儲捕捉內核」到一個沒有網路支持的單用戶模式。如果你希望有網路支持,那麼使用「init 3」
maxcpus=1,這個前 面說過,如果CONFIG_SMP=n,則需要在啟動參數中加入maxcpus=1。
irqpoll 的啟動參數可以減低由於在「轉儲捕獲內核」中使用了「共享中斷」技術而導致出現驅動初始化失敗這種情況發生的概率。
舉例:
kexec -p /boot/vmlinux_capture --args-linux --append="root=/dev/nfs rw nfsroot=128.224.149.6:/tftpboot/cxu/15554/rootfs ip=dhcp console=ttyS0,115200 1 maxcpus=1 noirqdistrib reset_devices"
3)測試 kmp是否成功
手動產生一個crash:echo c > /proc/sysrq-trigger。
或者可以些一個強制產生 crash的模塊。
如果成功,系統將會進入熱啟動過程,系統啟動完成後,可以執行一下uname -a ,看看內核的名字是不是有-kmp的標簽呢?
然後就可以把生成的轉儲文件vmcore拷貝出來了,直接cp即可:
cp /proc/vmcore <anywhere>
也可以通過/dev/oldmem這個設備將其考出:
cd ~
mknod /dev/oldmem c 1 12
dd if=/dev/oldmem of=oldmem.001
成功將vmcore 拷貝出來後即可重啟系統了。
4)分析vmcore文件
在開始分析「轉儲文件」之前,應該確定重啟到一個穩定的內核。
可以 使用GDB在『轉儲文件』上做有限的分析。分析的時候需要「帶有調試信息的vmlinux文件」(編譯的時候帶有-g選項),運行如下命令:
gdb vmlinux vmcore
注意:GDB不能分析x86平台上以ELF64格式產生的「內核轉儲文件」。在一個最大內存為4GB的系統上,可 以通過在「轉儲捕捉內核」上指定「--elf32-core-headers」標志來使用ELF32格式的文件頭。
也可以使用Crash工具集來 分析Kmp產生的「內核轉儲文件」,crash 工具可以到網上下載:
~anderson/
以上文檔主要是翻譯自內核自帶文檔linux/Documentation/kmp/kmp.txt,部分使用自己的語言表達。如有錯誤,請指正。
標簽: 內核崩潰轉儲機制 Linux
⑹ 嵌入式linux內核驅動。怎麼辦
第一:前景是很好的,可是不是那麼容易就能學好的,你所說的培訓不知道是哪種?假如高質量的培訓都有嚴格的入學要求,估計這樣一來就刷掉一大批人吧,假如是那普通的培訓又學不到啥,再者培訓費目前木有低於1W的,首先你得有這資金,有時間。
第二:培訓出來後是啥?這個不敢說,看你學的怎麽樣吧,看你是不是這方面比較擅長。嵌入式內核驅動(Drive)出來的不能叫程序員了吧,那太局限了,應當叫工程師了,程序員精通的編程,而工程師既要編程又要熟悉硬體,因此說起來2個不能混為一談。
第三:研究內核的實用性不大(個人認為,除了科研),去公司不能整天讓你研究開發內核吧,關鍵是要熟悉了解里邊的進程調度,資源分配等,這現對於普通的編程而言難度又要加大。
總之,前景是好,可是學起來也不容易,設計知識面廣,核心東東比較難懂。以上僅代表個人看法。
⑺ 如何分析一個linux內核驅動
首先,要理解操作系統的概念,操作系統是用戶和硬體之間的一層媒介程序。不管是Linux還是Windows或者安卓、IOS,它的主要功能有兩點:1、有效管理硬體。
2、方便用戶操作。
其次,Linux內核是Linux系統的核心程序,主要完成任務調度、內存管理、IO設備管理等等功能,主要目的是為了應用程序提供一個穩定良好的運行環境,這是一個基礎。
再次,驅動程序是操作系統有效管理硬體的一個途徑。應用程序是方便用戶操作提供的程序,比如Shell,Linux中的bash shell以及KDE、gnome等圖形Shell都是應用程序。 你可以簡單的理解為驅動程序實現了操作系統對硬體的有效管理,應用程序實現了操作系統方便用戶操作的目的。
最後,從編程角度來看,Linux內核就是一個調用庫,應用程序通過調用Linux提供的API函數來實現操作,Linux內核通過與驅動通信實現對硬體的有效管理。具體的編程細節,需要自己在實踐編程中體會。這是一個整體的描述。
⑻ 什麼叫Linux驅動程序
linux發行版本是什麼呢,一般來說無需格外安裝,都完美解決
⑼ 什麼叫內核驅動 LINUX 內核驅動
上海尚觀Linux嵌入式研究室:內核是用於管理系統資源的程序。內核將應用程序與系統硬體隔離,並為它們提供基本系統服務,如輸入/輸出 (input/output, I/O) 管理、虛擬內存和調度。內核由需要時動態裝入內存的對象模塊組成。
Linux內核在邏輯上可分為兩個部分: 第一部分稱為內核,用於管理文件系統、調度和虛擬內存。第二部分稱為 I/O 子系統,用於管理物理組件。
內核提供了一組介面,供可通過系統調用訪問的應用程序使用。Reference Manual Collection 的第 2 部分對系統調用進行了介紹。某些系統調用用於調用設備驅動程序以執行 I/O 操作。設備驅動程序是可裝入的內核模塊,用於管理數據傳輸,同時將內核的其餘部分與設備硬體隔離。為了與操作系統兼容,設備驅動程序需要能夠提供多線程、虛擬內存定址以及 32 位和 64 位操作之類的功能。
⑽ linux內核,驅動,應用程三者的概念和之間的關系
首先,要理解操作系統的概念,操作系統是用戶和硬體之間的一層媒介程序。不管是Linux還是Windows或者安卓、IOS,它的主要功能有兩點:
1、有效管理硬體。
2、方便用戶操作。
其次,Linux內核是Linux系統的核心程序,主要完成任務調度、內存管理、IO設備管理等等功能,主要目的是為了應用程序提供一個穩定良好的運行環境,這是一個基礎。
再次,驅動程序是操作系統有效管理硬體的一個途徑。應用程序是方便用戶操作提供的程序,比如Shell,Linux中的bash shell以及KDE、gnome等圖形Shell都是應用程序。 你可以簡單的理解為驅動程序實現了操作系統對硬體的有效管理,應用程序實現了操作系統方便用戶操作的目的。
最後,從編程角度來看,Linux內核就是一個調用庫,應用程序通過調用Linux提供的API函數來實現操作,Linux內核通過與驅動通信實現對硬體的有效管理。具體的編程細節,需要自己在實踐編程中體會。這是一個整體的描述。