❶ 求教怎么学习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命令,此时在输出栏的第一行可以查看网卡类型,记录下来。