linux下怎么编译安装驱动
在宿主机上安装开发工具和下载linux源码(要求版本号和目标机上的linux内核版本一致)。开发工具主要有gcc、gdb、make等,这些工具在redhat或fc中默认就安装了,在debian或Ubuntu中可以通过下面这个命令安装:
apt-get install build-essential
linux源码可以通过以下几种途径获得:
将源码解压到/usr/src/目录后,进入linux-source-(版本号)目录中执行下面几个命令:
make oldconfig
make prepare
make scripts
直接去www.kernel.org下载
通过包管理工具下载源码,在debian和Ubuntu中可以通过下面这个命令下载,
apt-get install linux-source-(版本号) ,下载后的文件在/usr/src目录中,解压到该目录即可
编写Linux驱动程序,以一个最简单的hello.c为例,hello.c的内容如下:
#include "linux/init.h"
#include "linux/mole.h"
static int hello_init(void)
{
printk(KERN_ALERT "Hello World linux_driver_mole\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbey linux_driver_mole\n");
}
mole_init(hello_init);
mole_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("lpj");
写Makefile文件,一个示例如下,里面各项参数根据实际情况更改:
#sample driver mole
obj-m := hello.o
KDIR = /usr/src/linux-source-2.6.24/
all:
$(MAKE) -C $(KDIR) M=$(PWD)
.PHONY:clean
clean:
rm -f *.mod.c *.mod.o *.ko *.o *.tmp_versions
编译,在hello.c和Makefile所在目录下执行 make 即可,编译后在当前目录生成hello.ko文件
加载并测试:加载使用insmod或modprobe命令来实现,如在当前路径执行如下代码:
insmod hello.ko 或 modprobe hello
注意,如果在虚拟终端加载内核的话,将看不到内核打印信息,因为内核打印信息不会输出到虚拟终端,而是输出到/proc/kmsg文件中,所以可以通过以下方式查看内核信息:
cat /proc/kmsg 会一直打印,需要Ctrl-C手动终止
dmesg 或 dmesg | tail -N ,N为一数字,表示显示最后N行
卸载:使用rmmod命令卸载驱动模块,如 rmmod hello
② 如何编译一个linux下的驱动模块
首先,我们要了解一下模块是如何别被构造的。模块的构造过程与用户空间
的应用程序的构造过程有显着不同;内核是一个大的、独立的程序
,
对于它的各
个部分如何组合在一起有详细的明确的要求。
Linux2.6
内核的构造过程也与以
前版本的内核构造过程不同;
新的构造系统用起来更加简单,
并且可产生更加正
确的结果
,
但是它看起来和先前的方法有很大不同。内核的构造系统非常复杂
,
我们所看到的只是它的一小部分。
如果读者想了解更深入的细节,
则应阅读在内
核源码中的
Document/kbuild
目录下的文件。
在构造内核模块之前,
有一些先决条件首先应该得到满足。
首先,
读者要保证你
有适合于你的内核版本的编译器、模块工具
,
以及其他必要工具。在内核文档目
录下的文件
Documentation/Changes
里列出了需要的工具版本;
在开始构造内
核前,
读者有必要查看该文件,
并确保已安装了正确的工具。
如果用错误的工具
版本来构造一个内核
(
及其模块
)
,可能导致许多奇怪的问题。另外也要注意
,
使
用太新版本的编译器偶尔可能也会导致问题。
一旦做好了上面的准备工作之后
,
其实给自己的模块创建一个
makefile
则非常
简单。实际上
,
对于本章前面展示的
" hello world"
例子
,
下面一行就够了
:
obj-m := hello.o
如果读者熟悉
make
,
但是对
Linux2.6
内核构造系统不熟悉的话
,
可能奇怪这个
makefile
如何工作。毕竟上面的这一行不是一个传统的
makefile
的样子。问
题的答案当然是内核构造系统处理了余下的工作。上面的赋值语句
(
它利用了由
GNU make
提供的扩展语法
)
说明有一个模块要从目标文件
hello.o
构造,而从
该目标文件构造的模块名称为
hello.ko.
如果我们想由两个源文件
(
比如
file1.c
和
file2.c )
构造出一个名称为
mole.ko
的模块
,
则正确的
makefile
可如下编写
:
obj-m := mole.o
mole-objs := file1.o file2.o
为了让上面这种类型的
makefile
文件正常工作
,
必须在大的内核构造系统环境
中调用他们。假设读者的内核源码数位于
~/kernel-2.6
目录
,
用来建立你的模
块的
make
命令
(
在包含模块源代码和
makefile
的目录下键入
)
应该是
:
make -C ~/kernel-2.6 M=`pwd` moles
这个命令首先是改变目录到用
-C
选项指定的位置
(
即内核源代码目录
)
,其中保
存有内核的顶层
makefile
文件。这个
M=
选项使
makefile
在构造
moles
目
标前
,
返回到模块源码目录。
然后,
moles
目标指向
obj-m
变量中设定的模块,
在上面的例子里,我们将该变量设置成了
mole.o
。
上面这样的
make
命令对于多个文件的编译显得不是很方便
,
于是内核开发者就
开发了一种
makefile
方式
,
这种方式使得内核树之外的模块构造变得更加容易。
代码清单
1.4
展示了
makefile
的编写方法:
代码清单
1.4 makefile
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /source/linux-2.6.13
PWD := $(shell pwd)
moles:
$(MAKE) -C $(KERNELDIR) M=$(PWD) moles
moles_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) moles_install
clean:
rm -rf *.o *~ core .depend .*. *.ko *.mod.c .tmp_versions
.PHONY: moles moles_install clean
else
obj-m := hello.o
endif
我们再次看到了扩展的
GNU
make
语法在起作用。在一个典型的构造过程中,这
个
makefile
将被读取两次。当从命令行中调用这个
makefile ,
它注意到
KERNELRELEASE
变量尚未设置。我们可以注意到,已安装的模块目录中存在一
个符号连接,
它指向内核的构造树,
这样这个
makefile
就可以定位内核的源代
码目录。如果读者时间运行的内核并不是要构造的内核,则可以在命令行提供
KERNELDIR=
选项或者设置
KERNELDIR
环境变量
,
或者修改
makefile
中设置
KERNELDIR
的那一行。在找到内核源码树
,
这个
makefile
会调用
default:
目
标
,
这个目标使用先前描述过的方法第二次运行
make
命令
(
注意,在这个
makefile
里
make
命令被参数化成
$(MAKE))
,以便运行内核构造系统。在第二
次读取
makefile
时,
它设置了
obj-m,
而内核的
makefile
负责真正构造模块。
这种构造模块的机制看起来很繁琐,可是,一旦我们习惯了使用这种机制
,
则会
欣赏内核构造系统带给我们的便利。需要注意的是
,
上面
makefile
并不完整,
一个真正的
makefile
应包含通常用来清除无用文件的目标
,
安装模块的目标等
等。一个完整的例子可以参考例子代码目录的
makefile
。
③ Ubuntu linux如何安装硬件驱动
inux的驱动一般有两种格式,分别为:tar和rpm格式。
rpm安装步骤:
1.将驱动程序文件bcm5700-.src.rpm复制到一个临时目录中,并在此目录中运行以下命令:
rpm –ivh bcm5700-.src.rpm
2.运行以下命令切换到驱动目录中:
cd /usr/src/redhat/SPECS/
3.此目录中会生成一个名字为bcm5700.spec的文件,运行以下命令对驱动程序进行编译:
rpmbuild –bb bcm5700.spec (对4.x.x版本的RPM适用)或 rpm -bb bcm5700.spec
4.运行以下命令切换到RPM目录中:
cd /usr/src/redhat/RPMS/i386/
5.运行以下命令安装驱动程序:
rpm –ivh bcm5700-.i386.rpm (对于Red Hat 7.2, 7.3, 2.1AS和其他包含老版本驱动的系统需要使用--force的参数,强制用新的驱动替换系统自带的老版本驱动)
6.运行以下命令加载驱动模块:
insmod bcm5700
7.运行kudzu命令,系统会自动搜索到硬件,进行配置即可。
或者重新启动系统,启动过程中系统会自动找到硬件,进行相应配置即可。
tar格式安装步骤:
1. 将驱动程序压缩文件bcm5700-.tar.gz复制到一个临时目录中,并使用以下命令解压缩:
tar xvzf bcm5700-.tar.gz
2.构建驱动程序为运行内核可加载模块
cd bcm5700-/src
make
3.加载测试
insmod bcm5700
4.加载驱动程序
make install
5.重新启动系统,启动过程中找到硬件,进行相应配置。
或者直接运行kudzu命令,系统会自动搜索到硬件,进行配置即可。
④ 高手进阶:Linux操作系统驱动编译与运行
一、手工加载测试
1、insmod
./key_test.ko
加载驱动模块到内核
2、cat
/proc/moles
|grep
key_test
查看key_test模块在内核中的地址,不加过滤器可以看到全部加载的模块。
3、lsmod
显示模块,这时可以看到所有的模块名字,后面跟的是主设备号和次设备号。
4、rmmod
key_test
把模块从内核里卸载。
二、动态加载
1、把key_test.c源代码放到内核源代码的/drives/char/下,因为这是属字符型驱动,放在这编译到zImage中。
2、这时我们make
menuconfig
编译内核是看不到key_test这个选项的。我们把这个选项写到菜单里面才行。在内核源代码的/drives/char/下有一个Kconfig文件,打开
(1)
vi
Kconfig
加几行到里面:
config
ConFig_key_test
bool
"key
test"
//前面那个bool换成tristate就是支持模块化编译
上面句是在make
menuconfig时会出现key
test这个选项在drive/char子菜单下,bool前面是TAB键
------help----------
这句是出现在菜单选项下面的
This
key
test
help.
这句是你的驱动的说明会出现在help里面
(2)在/drivers/char目录下的Makefile文件里加上一句:
obj-$(CONFIG_key_test)
+=
key_test.o
上面这句是让Make时把key_test编译到内核中.
(3)
make
menuconfig
把key_test选项选取上
(4)
make
zImage
生成zImage文件,重启动加载这个新编的内核。
3、lsmod就能看到key_test了,但是还不能用,没有接口,也就是/dev下面没有
4、mknod
/dev/key_test
c
121
0
这是创建设备到/dev下,使普通程序可以调用了,121是在源代码里定义的它的主设备号,0是次设备号。
5、cat
/dev/key_test
这是相当于open这个设备了,或者写一个程序直接调用open、write等函数。
fd=("/dev/key_test",ORW);
⑤ 在linux系统中如何安装各种硬件的驱动
看格式,如果是自己开发的驱动,就是****.ko格式
使用如下指令挂载:
insmod ****.ko
如果是官方提供的,常见有两种,一种是可执行的(在linux终端下绿色,用ll看,该文件有x属性),直接到那个目录下执行
./****.bin
如果是gz,很可能需要编译和安装,那个就是
./configure
make
make install
⑥ 如何编写Linux 驱动程序
以装载和卸载模块为例:
1、首先输入代码
#include <linux/init.h>
#include <linux/mole.h>
⑦ linux系统下安装usb网卡驱动图文
确认usb-wifi设备型号 , 根据确认结果选择驱动信息。
安装驱动 mt7601u , 如果已经自带跳过此步骤
配置驱动启动后自动加载。
重启验证是否成功的自动加载驱动模块。
确认usb-wifi设备型号 , 根据确认结果选择驱动信息。
## 初始USB接入时加载显示
lsusb| grep Ralink
Bus 001 Device 003: ID 148f:2878 Ralink Technology, Corp.
## lsusb执行后显示信息中有 usb-wifi设备时继续执行如下命令,进行模式切换(对于存在多模式设备可以正确显示出wifi设备的真实型号)
usb_modeswitch -KW -v 148f -p 2878
## 模式切换后加载显示
lsusb| grep Ralink
Bus 001 Device 003: ID 148f:7601 Ralink Technology, Corp.
可以看到型号为 7601 ,据此我们选择 mt7601u 驱动进行‘安装。
安装驱动 mt7601u , 如果已经自带跳过此步骤
方法1:有可能系统内核已经集成好了你需要的驱动模块,只需要手工加载以下验证是否有效,如果无效再选择方法2.
方法2:github 搜索型号的驱动源码,手动编译安装 。
安装完毕后,需要配置下 wlan0 的配置信息, 创建一个ifcfg-wlan0文件(如果使用的是 NetworkManager 服务可能不需要配置就可以使用了)
$ cat /etc/sysconfig/network/ifcfg-wlan0
BOOTPROTO='dhcp'
BROADCAST=''
DHCLIENT_SET_DEFAULT_ROUTE='yes'
ETHTOOL_OPTIONS=''
IPADDR=''
MTU=''
NAME=''
NETMASK=''
NETWORK=''
REMOTE_IPADDR=''
STARTMODE='auto'
WIRELESS_AP=''
WIRELESS_AP_SCANMODE='1'
WIRELESS_AUTH_MODE='psk'
WIRELESS_BITRATE='auto'
WIRELESS_CA_CERT=''
WIRELESS_CHANNEL=''
WIRELESS_CLIENT_CERT=''
WIRELESS_CLIENT_KEY=''
WIRELESS_CLIENT_KEY_PASSWORD=''
WIRELESS_DEFAULT_KEY='0'
WIRELESS_EAP_AUTH=''
WIRELESS_EAP_MODE=''
WIRELESS_ESSID='CPE_05010'
WIRELESS_FREQUENCY=''
WIRELESS_KEY=''
WIRELESS_KEY_0=''
WIRELESS_KEY_1=''
WIRELESS_KEY_2=''
WIRELESS_KEY_3=''
WIRELESS_KEY_LENGTH='128'
WIRELESS_MODE='Managed'
WIRELESS_NICK=''
WIRELESS_NWID=''
WIRELESS_PEAP_VERSION=''
WIRELESS_POWER='no'
WIRELESS_WPA_ANONID=''
WIRELESS_WPA_IDENTITY=''
WIRELESS_WPA_PASSWORD=''
WIRELESS_WPA_PSK='Abcd1234'
配置驱动启动后自动加载。
具体配置方法可以参考 man moles-load.d 信息可以详细理解。
创建一个 mt7601u.conf 文件, 内容如下
# echo "mt7601u" > /etc/moles-load.d/mt7601u.conf
# cat /etc/moles-load.d/mt7601u.conf
mt7601u
重启验证是否成功的自动加载驱动模块。
⑧ 如何通过命令行为Linux安装驱动程序
在Linux下安装驱动程序的实施步骤如下:
第一步:首先使用lsmod|grep "*" *为你需要查看的驱动模块;
第二步:首先去相应设备提供商官网下载相应的Linux版本驱动程序包,可以是rpm包也可以是源码包,下载完毕后使用rpm或者make命令进行编译安装;
第三步:使用insmod或者modprobe将安装后的模块加载到内核中去即完成了驱动程序的安装。
最后一步在加载模块时主机维护人员可能会碰到成功安装后无法加载到内核的问题,现我详细介绍一下inmod和modprobe的用法。
1)modprobe:
在挂载某个内核模块的同时,这个模块所依赖的模块也被同时挂载;这是于insmod挂载模块有区别的地方。当然modprobe也有列出内核所有模块的功能modprobe -l,还有移除模块的功能modprobe -r 模块名称;
2)insmod:
insmod挂载模块这个工具和modprobe有点类似,但功能上没有modprobe强,modprobe在挂载模块是不用指定模块文件的路径,也不用带文件的后缀.o 或.ko;而insmod需要的是模块的所在目录的绝对路径,并且一定要带有模块文件名后缀。
在以后管理员使用modprobe工具无法加载安装的模块时用建议可以使用insmod或者modprobe -f进行强制加载。
⑨ linux如何安装驱动
在Intel网站直接下载的Linux驱动是e1000-5.2.52.tar.gz(版本可能会有改变),这个压缩包里面没有编译好的.o的文件,需要在Linux系统下编译之后才能使用,
因为网卡需要编译,所以要先确认将内核源文件安装好,下面是关于内核源文件的安装
● Linux下添加内核源文件
1. 用rpm –qa|grep kernel-source查看是否安装了这个包;
如果返回结果中有kernel-source-xxx(其中xxx为当前redhat的内核版本,如rhel3为2.4.21-4EL), 即已经 安装。如无返回结果则需要安装kernel-source包。到安装光盘中找到kernel-source-xxx.i386.rpm,用下面命令安装此rpm包:
2.如果安装了用rpm -V kernel-source校验是否有文件丢失,如果没有输出,表示文件完整;
3.如果有丢失用rpm -ivh --force kernel-source-xxxx...把包重新安装一下;
这个kernel-source包,在您的RH安装光盘中,在Redhat/RPMS中,如果以前没有安装过这个包,那么用rpm -ivh kernel-source-xxxx...来安装,如果安装过,需要覆盖安装,使用rpm -ivh --force kernel-source-xxxx...这个命令强制安装。
注:AS 4 开始,没有kernel-source这个包了,取而代之的是kernel-dev这个包,检查这个包有没有安装的方法同上
● 驱动安装步骤:
1. 把这个tar文件拷贝到用户自己定义的目录中,例如:
/home/username/e1000 or /usr/local/src/e1000
2. 用tar命令解这个压缩包:
tar zxf e1000-5.2.52.tar.gz
3. 切换到驱动的src目录下:
cd e1000-5.2.52/src/
4. 编译这个驱动模块:
make
然后安装这个模块
make install
这个二进制元将被安装到如下位置:
/lib/moles//kernel/drivers/net/e1000.o
以上的路径是默认的安装位置,在某些linux版本中可能是其他位置,具体信息可以查看在驱动的 tar压缩包中的ldistrib.txt文件.
5. 安装模块:
insmod e1000 (2.6以上的版本最好使用全路径安装 P insmod /lib/moles//kernel/drivers/net/e1000/e1000.ko)
6. 设定网卡IP地址:
ifconfig ethx <IP_address> x是网卡接口的号
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
若多个网卡的芯片相同可以cp ifcfg-eth0 ifcfg-eth1~~~~~~
修改下里面的drive名称就OK
!!!!!!!!!!!!!!!!!!!
在网卡的编译中很可能不能进行下去~这个原因除了kernel的开发包没有安装外还可能是由于开发环境不完全所引起的!
这时就需要你讲开发环境安装完成,最简单的办法就是通过 sysconfig-config-packet 安装gcc
安装完成后继续执行 make ;make install
了解更多开源相关,去LUPA社区看看吧
⑩ LINUX下怎么安装各种驱动。(已经解决,谢谢)
通常的硬件驱动安装盘自带,安装时会检测硬件,然后对应安装。特殊的硬件就要到硬件商的网站上下载对应当驱动程序来安装,还不行的话,重新编译内核。