❶ 求教怎麼學習linux內核驅動
1.首先要了解為什麼要學習內核?下圖已表明,如果要從事驅動開發或系統研究,就要學習內核。
2.內核的知識就像下面的繩結一樣,一環扣一環,我們要解開它們,就必須要先找到線頭也就是內核中的函數介面。初學階段,我們一般不深入的研究內核代碼,會使用內核的介面函數就不錯了。
3.下面提供了如何學習這些內核函數的方法,就像解繩子一樣
4.學習內核的四步法則,思維導圖的設計尤為重要,這也是能否學習好內核的關鍵
5.語言基礎也需要扎實,所以需要把C語言鞏固鞏固
❷ 如何調整Linux內核啟動中的驅動初始化順序
【問題】 此處我要實現的是將晶元的ID用於網卡MAC地址,網卡驅動是enc28j60_init。 但是,讀取晶元ID的函數,在as352x_afe_init模塊中,所以要先初始化as352x_afe_init。 此處,內核編譯完之後,在生成的system.map中可以看到, enc28j60_init在as352x_afe_init之前,所以,無法去讀晶元ID。 所以我們的目標是,將as352x_afe_init驅動初始化放到enc28j60_init之前, 然後才能讀取晶元ID,才能用於網卡初始化的時候的,將晶元ID設置成網卡MAC地址。
【解決過程】
【1】
最簡單想到的,是內核裡面的
archarmmach-as352xcore.c
中,去改devices設備列表中的順序。
enc28j60_init對應的是ssp_device,因為網卡初始化用到的是SPI驅動去進行和通訊的。
as352x_afe_init對應的是afe_device。
原先是:
把afe改到最前面:
但是,實際結果是,沒有任何影響,連systemp.map生成的,那麼模塊初始化順序,都沒有任何變化。 也就說明,想要實現驅動載入順序的改變,改core.c裡面的設備列表順序是沒有用的。
更多linux內核視頻教程文檔資料免費領取後台私信 【內核】 自行獲取.
Linux內核源碼/內存調優/文件系統/進程管理/設備驅動/網路協議棧-學習視頻教程-騰訊課堂
【2】
在網上看到很多帖子,其說明的也很清楚了,就是:
Linux內核為不同驅動的載入順序對應不同的優先順序,定義了一些宏:
includelinuxinit.h
把自己的驅動的函數名用這些宏去定義之後, 就會對應不同的載入時候的優先順序。
其中,我們寫驅動中所用到的mole_init對應的是 #define mole_init(x) __initcall(x); 而 #define __initcall(fn) device_initcall(fn) 所以,驅動對應的載入的優先順序為6
在上面的不同的優先順序中, 數字越小,優先順序越高。 同一等級的優先順序的驅動,載入順序是鏈接過程決定的,結果是不確定的,我們無法去手動設置誰先誰後。 不同等級的驅動載入的順序是先優先順序高,後優先順序低,這是可以確定的。
所以,像我們之前在驅動中用:
所以,大家都是同一個優先順序去初始化,
最後這些驅動載入的順序,可以查看在根目錄下,
生成的system.map:
此處就是由於 c0019920 t __initcall_i2c_dev_init6 c0019924 t __initcall_as352x_afe_i2c_init6 c0019928 t __initcall_as352x_afe_init6 在c00198e4 t __initcall_enc28j60_init6之前,所以我這里才要去改。。。 知道原理,能想到的,就是要麼把as352x_afe_init改到enc28j60_init之前一級,即優先順序為5。即在驅動中,調用:fs_initcall(as352x_afe_init);要麼把enc28j60_init改到as352x_afe_init之後,即優先順序為7即在驅動中,調用:late_initcall(enc28j60_init);但是,此處麻煩就麻煩在,如果把as352x_afe_init改到enc28j60_init之前一級,發現後面網卡初始化enc28j60_init中,雖然讀取晶元ID對了,但是後面的IP-auto configure 有問題。所以放棄。 如果把enc28j60_init改到as352x_afe_init之後,但是,從system.map中看到的是,優先順序為7的驅動中,明顯有幾個驅動,也是和網卡初始化相關的,所以,這樣改,嘗試後,還是失敗了。 所以,沒法簡單的通過調整現有的驅動的順序,去實現順序的調整。最後,被逼無奈,想到了一個可以實現我們需求的辦法,那就是,單獨定義一個優先順序,把afe相關的初始化都放到那裡面去,這樣,就可以保證,其他沒什麼相關的沖突了。最後證實,這樣是可以實現目的的。
具體添加一個新的優先順序的步驟如下: 1.定義新的優先順序 includelinuxinit.h中:
2.用對應新的宏,定義我們的驅動:
做到這里,本以為可以了,但是編譯後,在system.map中,發現之前優先順序為7的那幾個函數,被放到system.map最後了,而不是預想的,在優先順序7之後,在
之前。最後,發現時沒有把對應的鏈接文件中的宏加進去:
3.includeasm-genericvmlinux.lds.h
最後,再重新編譯,就可以實現我們要的,和afe相關的驅動初始化,都在網卡enc28j60_init之前了。也就可以在網卡裡面讀晶元ID了。當然,對應編譯生成的system.map文件中,對應的通過mole_init定義的驅動,優先順序也都變成7了。而late_initcall對應優先順序8了。 註:當前開發板arm的板子,所以,對應的load 腳本在:
linux-2.6.28.4archarmkernelvmlinux.lds 看起來,應該是這個文件: linux-2.6.28.4archarmkernelvmlinux.lds.S 生成上面那個腳本的。vmlinux.lds中的這一行:
就是將之前那些對應的init類型的函數,展開,放到這對應的位置。
【3】 不過,最後的最後,竟然發現網卡還是工作不正常,結果第二天,無意間發現是網卡地址設置導致網卡工作不正常的。 也就是說,實際是直接將afe設置到原先的優先順序5就可以的,而不用這么麻煩去改系統的東西的...
不過,至少這也是一種辦法,雖然不是那麼的好...
❸ 在linux系統下如何安裝網卡驅動
不知道你是不是已經找到網卡的驅動了啊 ,如果沒有的話就根據網卡的型號到主板的官方或是主板的驅動盤上找一下,應該可以找到對應的linux 驅動,然後按照以下步驟做,不要說我是抄的,我自己親自照著這個做過並且成功了才保存下來的。
希望能夠給像我這樣的新手提供掌握安裝網卡驅動的捷徑
1 確認系統的內核版本
[root@localhost ~]# uname -r
2.6.18-8.el5PAE
我的內核版本是2.6.18-8.el5PAE
2 確認系統是否已經安裝下列包
由於編譯需要用到內核的源代碼包和編譯程序gcc.所以如果沒有的話,要先裝.
查看:
檢查是否已經安裝內核源碼
[root@localhost ~]# rpm -qa|grep kernel
kernel-doc-2.6.18-8.el5
kernel-xen-2.6.18-8.el5
kernel-2.6.18-8.el5
kernel-PAE-2.6.18-8.el5
kernel-headers-2.6.18-8.el5
kernel-PAE-devel-2.6.18-8.el5
kernel-devel-2.6.18-8.el5
檢查是否已經安裝編譯用到的gcc
[root@localhost ~]# rpm -qa|grep gcc
gcc-gfortran-4.1.1-52.el5
gcc-java-4.1.1-52.el5
libgcc-4.1.1-52.el5
gcc-c++-4.1.1-52.el5
compat-gcc-34-c++-3.4.6-4
compat-gcc-34-3.4.6-4
gcc-4.1.1-52.el5
compat-gcc-34-g77-3.4.6-4
compat-libgcc-296-2.96-138
一般情況下如果安裝了內核源碼的話源碼目錄一般都在/usr/src/rRedHat目錄下
如果沒有的話就用安裝盤裡面的文件進行安裝
3 驅動程序編譯及安裝
通過官方網站獲取相應的驅動程序,我用的是Intel的e1000e的網卡驅動程序
相應的驅動程序包為e1000e-0.5.8.2.tar.gz將驅動程序包拷貝到/usr/src目錄下解壓縮
cd /usr/src
tar zxvf e1000e-0.5.8.2.tar.gz
完畢以後轉到 cd e1000e-0.5.8.2/src目錄下准備編譯安裝
在src目錄下依次執行 make (編譯驅動程序源碼) make install(安裝相應的驅動程序)
安裝完畢以後將驅動程序生成的*.o拷貝到/lib/moles/2.6.18-8.el5PAE/kernel/drives/net目錄下
cp e1000e.o /lib/moles/2.6.18-8.el5PAE/kernel/drivers/net
然後執行depmod -a載入驅動程序
4 驅動程序測試
我們可以通過modprobe e1000e進行載入 如果沒有提示錯誤信息證明驅動程序已經載入
同時可以通過lsmod查看已經載入的驅動程序
如果在顯示的驅動程序中能夠看到e1000e的字樣說明驅動程序已經載入成功
❹ 如何在ubuntu(也就是Linux)下安裝網卡驅動
大多數人都是下載ubuntu-16.04-desktop-amd64.iso 這種iso包用u盤安裝的,把iso包解壓:按照這個路徑找到這個文件 ubuntu-16.04-desktop-amd64 -> pool -> restricted -> b -> bcmwl -> bcmwl-kernel-source_6.30.223.248+bdcom-0ubuntu8_amd64.deb ,這就是無線網卡的驅動安裝包了。
4.然後再重新安裝一遍那個網卡驅動包:
sudo dpkg -i bcmwl-kernel-source_6.30.223.248+bdcom-0ubuntu8_amd64.deb
然後還有最後一步,點擊 wifi 圖標,勾掉啟動Wi-Fi,在重啟Wi-Fi,你就會神奇的發現可以搜索到
WIFI了。
❺ 求助,在linux環境下如何安裝網卡驅動
首先根據網卡的型號到主板的官方或是主板的驅動盤上找一下,應該可以找到對應的linux驅動。
1 確認系統的內核版本
[root@localhost ~]# uname -r
2.6.18-8.el5PAE
我的內核版本是2.6.18-8.el5PAE
2 確認系統是否已經安裝下列包
由於編譯需要用到內核的源代碼包和編譯程序gcc.所以如果沒有的話,要先裝.
查看:
檢查是否已經安裝內核源碼
[root@localhost ~]# rpm -qa|grep kernel
kernel-doc-2.6.18-8.el5
kernel-xen-2.6.18-8.el5
kernel-2.6.18-8.el5
kernel-PAE-2.6.18-8.el5
kernel-headers-2.6.18-8.el5
kernel-PAE-devel-2.6.18-8.el5
kernel-devel-2.6.18-8.el5
檢查是否已經安裝編譯用到的gcc
[root@localhost ~]# rpm -qa|grep gcc
gcc-gfortran-4.1.1-52.el5
gcc-java-4.1.1-52.el5
libgcc-4.1.1-52.el5
gcc-c++-4.1.1-52.el5
compat-gcc-34-c++-3.4.6-4
compat-gcc-34-3.4.6-4
gcc-4.1.1-52.el5
compat-gcc-34-g77-3.4.6-4
compat-libgcc-296-2.96-138
一般情況下如果安裝了內核源碼的話源碼目錄一般都在/usr/src/rRedHat目錄下
如果沒有的話就用安裝盤裡面的文件進行安裝
3 驅動程序編譯及安裝
通過官方網站獲取相應的驅動程序,我用的是Intel的e1000e的網卡驅動程序
相應的驅動程序包為e1000e-0.5.8.2.tar.gz將驅動程序包拷貝到/usr/src目錄下解壓縮
cd /usr/src
tar zxvf e1000e-0.5.8.2.tar.gz
完畢以後轉到 cd e1000e-0.5.8.2/src目錄下准備編譯安裝
在src目錄下依次執行 make (編譯驅動程序源碼) make install(安裝相應的驅動程序)
安裝完畢以後將驅動程序生成的*.o拷貝到/lib/moles/2.6.18-8.el5PAE/kernel/drives/net目錄下
cp e1000e.o /lib/moles/2.6.18-8.el5PAE/kernel/drivers/net
然後執行depmod -a載入驅動程序
4 驅動程序測試
我們可以通過modprobe e1000e進行載入 如果沒有提示錯誤信息證明驅動程序已經載入
同時可以通過lsmod查看已經載入的驅動程序
如果在顯示的驅動程序中能夠看到e1000e的字樣說明驅動程序已經載入成功
❻ ubuntu linux 怎麼裝網卡驅動啊
首先,你要去下載網卡驅動的安裝包 RPM文件。
常見的Intel、BroadCom、Realtek等公司,都有Linux網卡驅動下載。
以下,以BroadCom網卡驅動為例進行說明。
BroadCom網卡設備名為 tg3,所以你會看到命令中有很多tg3
1)安裝網卡驅動
rpm -ivh RPMS/i386/tg3-<驅動版本>.i386.rpm
2)檢查內核中是否被成功安裝驅動
ls /lib/moles/<kernel_version>/kernel/drivers/net/tg3.o
或者 ls /lib/moles/<kernel_version>/kernel/drivers/net/tg3.ko
3)裝載驅動
一般執行 modprobe tg3 , 也有些Linux 執行 insmod tg3.o
4)查看網卡
ifconfig -a
❼ 如何在linux下安裝網卡驅動
一、查看網卡型號和機器位數
1、查看網卡型號
linux系統下通過以下命令,可以查看當前的網卡驅動信息;
[box color="white" icon="none"]
[root@localhost zhangy]# lspci |grep -i eth
03:00.0 Ethernet controller: Realtek Semiconctor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 06)
[/box]
2、查看機器位數
驅動程序是要區分系統是32位系統還是64位系統的, 所以通過以下linux命令,就可以知道操作系統的位數了;
[box color="white" icon="none"]
[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.18-308.13.1.el5PAE #1 SMP Tue Aug 21 17:50:26 EDT 2012 i686 i686 i386 GNU/Linux
[/box]
下載前先看一下你的網卡驅動,如果是最新的就不用在重新裝了。
[box color="white" icon="none"]
[root@localhost zhangy]# ethtool -i eth0
driver: r8169
version: 2.3LK-1-NAPI
firmware-version:
bus-info: 0000:03:00.0
[/box]
RTL8111/8168B就是網卡的型號,這樣你可以網卡的型號來找一下網卡驅動的官方網站,然後下載最新的網卡驅動,驅動分64位和32位的,i386,i686是32位的機器,x86_64表示是64位的機器,不要選錯驅動了。
二、下載驅動,並安裝
1、解壓
[box color="white" icon="none"]
[root@localhost download]# tar jxvf r8168-8.032.00.tar.bz2
[/box]
2、安裝
[box color="white" icon="none"]
[root@localhost r8168-8.032.00]# make && make install
[/box]
如果報以下錯誤
make -C /lib/moles/2.6.18-308.8.2.el5PAE/build SUBDIRS=/home/zhangy/r8168-8.032.00/src INSTALL_MOD_DIR=kernel/drivers/net moles_install
make: *** /lib/moles/2.6.18-308.8.2.el5PAE/build: 沒有那個文件或目錄。 停止。
make: *** [install] 錯誤 2
說明你kernel源碼沒有安裝。安裝kernel源碼
[box color="white" icon="none"]
[root@localhost r8168-8.032.00]# yum install kernel-xen kernel-xen-devel kernel
> kernel-PAE kernel-PAE-devel kernel-devel kernel-headers
[/box]
安裝完以後,一定要重啟機器。不然下面操作就過不去了,會報FATAL: Mole r8168 not found.
[box color="white" icon="none"]
[root@localhost r8168-8.032.00]# depmod -a
[root@localhost r8168-8.032.00]# modprobe r8168
[/box]
編輯配置文件/etc/modprobe.cof,如果以前沒有添加alias eth0 r8168,如果已經有了修改一下成alias eth0 r8168。
查一下驅動是不是載入了,如果有以下內容說明驅動安裝成功了。
[box color="white" icon="none"]
[root@localhost r8168-8.032.00]# lsmod |grep r8168
r8168 231132 0
[/box]
必須重新啟動一下機器,用ethtool查看驅動才會改變,不然還是老樣子。下面是新的驅動。
[box color="white" icon="none"]
[root@localhost ~]# ethtool -i eth0
driver: r8168
version: 8.032.00-NAPI
firmware-version:
bus-info: 0000:02:00.0
[/box]
❽ linux系統的網卡驅動 怎麼安裝
不知道你是不是已經找到網卡的驅動了啊 ,如果沒有的話就根據網卡的型號到主板的官方或是主板的驅動盤上找一下,應該可以找到對應的linux 驅動,然後按照以下步驟做,不要說我是抄的,我自己親自照著這個做過並且成功了才保存下來的。 希望能夠給像我這樣的新手提供掌握安裝網卡驅動的捷徑 1 確認系統的內核版本 [root@localhost ~]# uname -r 2.6.18-8.el5PAE 我的內核版本是2.6.18-8.el5PAE 2 確認系統是否已經安裝下列包 由於編譯需要用到內核的源代碼包和編譯程序gcc.所以如果沒有的話,要先裝. 查看: 檢查是否已經安裝內核源碼 [root@localhost ~]# rpm -qagrep kernel kernel-doc-2.6.18-8.el5 kernel-xen-2.6.18-8.el5 kernel-2.6.18-8.el5 kernel-PAE-2.6.18-8.el5 kernel-headers-2.6.18-8.el5 kernel-PAE-devel-2.6.18-8.el5 kernel-devel-2.6.18-8.el5 檢查是否已經安裝編譯用到的gcc [root@localhost ~]# rpm -qagrep gcc gcc-gfortran-4.1.1-52.el5 gcc-java-4.1.1-52.el5 libgcc-4.1.1-52.el5 gcc-c++-4.1.1-52.el5 compat-gcc-34-c++-3.4.6-4 compat-gcc-34-3.4.6-4 gcc-4.1.1-52.el5 compat-gcc-34-g77-3.4.6-4 compat-libgcc-296-2.96-138 一般情況下如果安裝了內核源碼的話源碼目錄一般都在/usr/src/rRedHat目錄下 如果沒有的話就用安裝盤裡面的文件進行安裝 3 驅動程序編譯及安裝 通過官方網站獲取相應的驅動程序,我用的是Intel的e1000e的網卡驅動程序 相應的驅動程序包為e1000e-0.5.8.2.tar.gz將驅動程序包拷貝到/usr/src目錄下解壓縮 cd /usr/src tar zxvf e1000e-0.5.8.2.tar.gz 完畢以後轉到 cd e1000e-0.5.8.2/src目錄下准備編譯安裝 在src目錄下依次執行 make (編譯驅動程序源碼) make install(安裝相應的驅動程序) 安裝完畢以後將驅動程序生成的*.o拷貝到/lib/moles/2.6.18-8.el5PAE/kernel/drives/net目錄下 cp e1000e.o /lib/moles/2.6.18-8.el5PAE/kernel/drivers/net 然後執行depmod -a載入驅動程序 4 驅動程序測試 我們可以通過modprobe e1000e進行載入 如果沒有提示錯誤信息證明驅動程序已經載入 同時可以通過lsmod查看已經載入的驅動程序 如果在顯示的驅動程序中能夠看到e1000e的字樣說明驅動程序已經載入成功
❾ linux系統如何安裝網卡驅動
linux系統如何安裝網卡驅動
很多初學者都覺得能夠在自己的筆記本上安裝linux系統是一件很酷的事情,結果兩個小時安裝好linux系統,卻發現缺少各種驅動, 為了讓各位少走一些彎路,我在這里把linux如何安裝有線網卡驅動的方法整理了下,方便大家學習。
場景:聯想筆記本電腦安裝的centos系統,安裝完成後發現缺少網卡驅動
1. 檢查是否安裝網卡驅動
執行命令:lspci | grep -i eth
終端顯示的結果為:02:00.0 Ethernet controller: Qualcomm Atheros AR8161 Gigabit Ethernet (rev 08)
接著再執行一下命令:ifconfg
終端顯示的連接中沒有eth0的相關信息,只有一個lo 和virbr0
很明顯,網卡驅動沒有裝好。我是這樣來解決的.。
注意:我電腦是聯想Y400 網卡是上面的Atheros AR8161這個,網卡驅動下載鏈接 http://pan..com/s/1gd3hNvd
下載後解壓得到: alx-linux-v2.0.0.6 目錄
2. 檢查自己的系統環境
gcc
kernel-headers 和 kernel-devel 是否已經安裝,我安裝系統時候就安裝了開發組件和桌面,所以這里沒必要再安裝。
如果沒有安裝開發組件,可以進行如下操作(用yum前需要提前配好yum源)
yum install gcc
yum install kernel-headers
yum install kernel-devel
3. 編譯:
進入 alx-linux-v2.0.6的目錄
執行make
此時在src文件件夾中產生了一個alx.ko文件
4. 配置文件的修改:
mkdir /lib/moles/2.6.32-358.6.2.el6.x86_64/kernel/net/wired //創建文件夾wired
在vi /lib/moles/2.6.32-358.6.2.el6.x86_64/moles.networking 文件里添加 alx.ko
執行命令:vi /etc/sysconfig/moles/alx.moles
在alx.moles中添加如下腳本內容:
#!/bin/sh
if [ ! -c /dev/input/alx.ko ] ; then
exec /sbin/modprobe alx >/dev/null 2>&1
fi
5.最後執行其他命令:
首先執行命令:depmod -a
接著執行命令:modprobe alx
此時用ifconfig 就可以找到eth0 了
6.如果還是找不到
執行ifconfig -a //這樣就可以發現eth0了(eth0是第一個,如果你有其他網卡,就會有eth1,2,3...)
ifconfig eth0 up //啟動eth0
好了。到此為止,網卡驅動已經安裝好了,接下來開始配置網路文件,開始愉快的玩耍吧!
不過我還是要強烈呼籲初學者,不要安裝雙系統,不要在筆記本安裝linux系統。用windows+虛擬機的模式來學習是最快的學習方式。
❿ linux下無線網卡如何驅動
linux下無線網卡具體驅動的操作方法如下:
1、首先需要確定網卡的類型,打開linux的輸入窗口,然後繼續在linux終端下輸入lsusb命令,此時在輸出欄的第一行可以查看網卡類型,記錄下來。