linux 驱动 编译 ubuntu源码编译安装

大家好,感谢邀请,今天来为大家分享一下linux 驱动 编译的问题,以及和ubuntu源码编译安装的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

linux所有驱动都可以编译成模块吗

linux下编译运行驱动

嵌入式linux下设备驱动的运行和linux x86 pc下运行设备驱动是类似的,由于手头没有嵌入式linux设备,先在vmware上的linux上学习驱动开发。

按照如下方法就可以成功编译出hello world模块驱动。

1、首先确定本机linux版本

怎么查看Linux的内核kernel版本?

'uname'是Linux/unix系统中用来查看系统信息的命令,适用于所有Linux发行版。配合使用'uname'参数可以查看当前服务器内核运行的各个状态。

#uname-a

Linux whh 3.5.0-19-generic#30-Ubuntu SMPTue Nov 13 17:49:53 UTC 2012 i686 i686 i686 GNU/Linux

只打印内核版本,以及主要和次要版本:

#uname-r

3.5.0-19-generic

要打印系统的体系架构类型,即的机器是32位还是64位,使用:

#uname-p

i686

/proc/version文件也包含系统内核信息:

# cat/proc/version

Linux version 3.5.0-19-generic(buildd@aatxe)(gcc version 4.7.2(Ubuntu/Linaro 4.7.2-2ubuntu1))#30-UbuntuSMP Tue Nov 13 17:49:53 UTC 2012

发现自己的机器linux版本是:3.5.0-19-generic

2、下载机器内核对应linux源码

到下面网站可以下载各个版本linux源码

如我的机器3.5.0版本源码下载地址为:

下载完后,找一个路径解压,如我解压到/linux-3.5/

然后很重要的一步是:执行命令uname-r,可以看到Ubuntu的版本信息是3.5.0-19-generic

。进入linux源码目录,编辑Makefile,将EXTRAVERSION=修改为EXTRAVERSION=-19-generic。

这些都是要配置源码的版本号与系统版本号,如果源码版本号和系统版本号不一致,在加载模块的时候会出现如下错误:insmod: error inserting'hello.ko':-1 Invalid module format。

原因很明确:编译时用的hello.ko的kenerl不是我的pc的kenerl版本。

执行命令cp/boot/config-3.5.0-19-generic./config,覆盖原有配置文件。

进入linux源码目录,执行make menuconfig配置内核,执行make编译内核。

3、写一个最简单的linux驱动代码hello.c

/*======================================================================

Asimple kernel module:"hello world"

======================================================================*/

#include<linux/init.h>

#include<linux/module.h>

MODULE_LICENSE("zeroboundaryBSD/GPL");

static int hello_init(void)

{

printk(KERN_INFO"Hello World enter\n");

return0;

}

static void hello_exit(void)

{

printk(KERN_INFO"Hello World exit\n");

}

module_init(hello_init);

module_exit(hello_exit);

MODULE_AUTHOR("zeroboundary");

MODULE_DESCRIPTION("A simple HelloWorld Module");

MODULE_ALIAS("a simplestmodule");

4、写一个Makefile对源码进行编译

KERN_DIR=/linux-3.5

all:

make-C$(KERN_DIR) M=`pwd` modules

clean:

make-C$(KERN_DIR) M=`pwd` clean

obj-m+= hello.o

5、模块加载卸载测试

insmod hello.ko

rmmod hello.ko

然后dmesg|tail就可以看见结果了

最后,再次编译驱动程序hello.c得到hello.ko。执行insmod./hello.ko,即可正确insert模块。

使用insmod hello.ko将该Module加入内核中。在这里需要注意的是要用 su命令切换到root用户,否则会显示如下的错误:insmod: error inserting'hello.ko':-1 Operation not permitted

内核模块版本信息的命令为modinfo hello.ko

通过lsmod命令可以查看驱动是否成功加载到内核中

通过insmod命令加载刚编译成功的time.ko模块后,似乎系统没有反应,也没看到打印信息。而事实上,内核模块的打印信息一般不会打印在终端上。驱动的打印都在内核日志中,我们可以使用dmesg命令查看内核日志信息。dmesg|tail

可能还会遇到这种问题insmod: error inserting'hello.ko':-1 Invalid module format

用dmesg|tail查看内核日志详细错误

disagrees about version of symbolmodule_layout,详细看这里。

在X86上我的办法是:

make-C/usr/src/linux-headers-3.5.0-19-generic SUBDIRS=$PWD modules

linux下安装编译网卡驱动的方法

安装linux操作系统后发现没有网卡驱动,表现为

system→ Administration→ Network下Hardware列表为空。

以下为安装编译网卡驱动的过程,本人是菜鸟,以下是我从网上找的资料进行整理,并实际操作的过程,仅供借鉴。

一.检测linux系统内核版本和网卡类型,相关命令如下:

uname-r查看linux内核版本(uname-a可显示所有信息)

lsmod设备加载情况

ls/usr/share/hwdata查看硬件设备

lspci查看pci网卡设备 ethernet controller厂商和型号,modprobe********为网卡型号,例如 modprobe RTL8101E,如果出错,说明模块不存在,该型号不识别

我在这一步时查找不到网卡型号,无奈只能由同时采购的其他相同型号预装win7的电脑下查看网卡型号,是个笨办法,嘿嘿……

找到网卡型号后就到驱动之家下载了相应网卡的linux驱动,这些需要根据自己的实际情况下载,不多说了,重点是后面。

二.下载网卡驱动

Intel_e1000e-1.9.5.zip为我下载的所需的网卡驱动,这个在linux下需自己编译.

三.安装网卡驱动

1.检测编译需要用到内核的源代码包和编译程序gcc。所以如果没有的话,要先装。

[root@localhost~]# rpm-qa|grep kernel

kernel-xen-2.6.18-8.el5

kernel-xen-devel-2.6.18-8.el5

kernel-headers-2.6.18-8.el5

[root@localhost~]# rpm-qa|grep gcc

gcc-c++-4.1.1-52.el5

libgcc-4.1.1-52.el5

gcc-4.1.1-52.el5

gcc-gfortran-4.1.1-52.el5

如果缺少kernel-xen-devel-2.6.18-8.el5,可以去安装光盘的/Server/目录下,找到kernel-xen-devel-2.6.18-8.el5.i686.rpm文件安装。

我很幸运,安装的系统中已经安装好了,呵呵。

2.编译安装网卡驱动

将下载的网卡驱动放到/home目录下,解压Intel_e1000e-1.9.5.zip包

unzip Intel_e1000e-1.9.5.zip

进入解压后的目录并编译安装,命令如下:

# cd e1000e-1.9.5/src

# make install

一般情况下解压的目录中会有一个readme文件,里面详细写明了网卡安装的步骤,强烈建议先看readme,安装readme中步骤操作一般不会出现问题。

安装好的文件一般位于如下目录中(kernel version以我的为例)

/lib/modules/2.6.18-194.el5xen/kernel/drivers/net/e1000e/e1000e.ko

insmod e1000e.ko

安装完毕,成功后系统提示网络已连接,说明网卡驱动已经装好,也可以通过检查system→ Administration→ Network下Hardware列表。

备注(以下为网上资料,未实际验证):

如果操作系统启用了支持XEN的内核,“硬件”选项卡里会出现两个网卡,eth0和peth0。

eth0就是映射到peth0的;系统还会自动生成一个xenbr0的网卡;这个网卡是为guestOS做桥接的;vif0.0是指Domain0的第一块网;vif0.1指Domain0的第二块网卡;

如果不准备使用XEN虚拟机;可以在启动时选择没有xen的内核,就不会生成这些额外的网卡了:

步骤一:关闭xend进程,使之不随系统自启动。

1.使用ntsysv命令进入服务管理,关闭xend服务(空格键是选中或者取消)

2.使用chkconfig命令:

[root@localhost~]# chkconfig--level 1 xend off

[root@localhost~]# chkconfig--level 2 xend off

[root@localhost~]# chkconfig--level 3 xend off

[root@localhost~]# chkconfig--level 4 xend off

[root@localhost~]# chkconfig--level 5 xend off

[root@localhost~]# chkconfig--level 6 xend off

检查xend是否都是关闭状态:

[root@localhost~]# chkconfig--list|grep xend

xend 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭

xendomains 0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭

修改完毕重启系统。

步骤二:进入系统->管理->网络,已经能看到网卡,可以配置IP和DNS。

然后修改绑定MAC地址:

1.网卡相关的TCP/IP网络配置文件是:/etc/sysconfig/network-scripts/ifcfg-ethx。其中x从0开始,第一个以太网配置文件即:/etc/sysconfig/network-scripts/ifcfg-eth0。使用vi编辑器修改这个文件,也可以修改网卡MAC地址。

把 HWADDR=ff:ff:ff:ff:ff

改为 MACADDR=00:1F:D0:64:9B:B7 MACADDR后面是自己的mac地址

2./etc/sysconfig/networking/profiles/default/ ifcfg-eth0

把 HWADDR=ff:ff:ff:ff:ff

改为 MACADDR=00:1F:D0:64:9B:B7 MACADDR后面是自己的mac地址

重启生效。

怎么将驱动源代码编译进linux系统

一、驱动程序编译进内核的步骤

在 linux内核中增加程序需要完成以下三项工作:

1.将编写的源代码复制到 Linux内核源代码的相应目录;

2.在目录的 Kconfig文件中增加新源代码对应项目的编译配置选项;

3.在目录的 Makefile文件中增加对新源代码的编译条目。

bq27501驱动编译到内核中具体步骤如下:

1.先将驱动代码bq27501文件夹复制到 ti-davinci/drivers/目录下。

确定bq27501驱动模块应在内核源代码树中处于何处。

设备驱动程序存放在内核源码树根目录 drivers/的子目录下,在其内部,设备驱动文件进一步按照类别,类型等有序地组织起来。

a.字符设备存在于 drivers/char/目录下

b.块设备存放在 drivers/block/目录下

c. USB设备则存放在 drivers/usb/目录下。

注意:

(1)此处的文件组织规则并非绝对不变,例如: USB设备也属于字符设备,也可以存放在 drivers/usb/目录下。

(2)在 drivers/char/目录下,在该目录下同时存在大量的 C源代码文件和许多其他目录。所有对于仅仅只有一两个源文件的设备驱动程序,可以直接存放在该目录下,但如果驱动程序包含许多源文件和其他辅助文件,那么可以创建一个新子目录。

(3) bq27501的驱动是属于字符设备驱动类别,虽然驱动相关的文件只有两个,但是为了方面查看,将相关文件放在了bq27501的文件夹中。在drivers/char/目录下增加新的设备过程比较简单,但是在drivers/下直接添加新的设备稍微复杂点。所以下面首先给出在drivers/下添加bq27501驱动的过程,然后再简单说明在drivers/char/目录下添加的过程。

2.在/bq27501下面新建一个Makefile文件。向里面添加代码:

obj-$(CONFIG_BQ27501)+=bq27501.o

此时,构建系统运行就将会进入 bq27501/目录下,并且将bq27501.c编译为 bq27501.o

3.在/bq27501下面新建Kconfig文件。添加代码:

menu"bq27501 driver"

config BQ27501

tristate"BQ27501"

default y

---help---

Say'Y' here, it will be compiled into thekernel; If you choose'M', it will be compiled into a module named asbq27501.ko.

endmenu

注意:help中的文字不能加回车符,否则make menuconfig编译的时候会报错。

4.修改/drivers目录下的Kconfig文件,在endmenu之前添加一条语句‘source drivers/bq27501/Kconfig’对于驱动程序,Kconfig通常和源代码处于同一目录。若建立了一个新的目录,而且也希望 Kconfig文件存在于该目录中的话,那么就必须在一个已存在的 Kconfig文件中将它引入,需要用上面的语句将其挂接在 drivers目录中的Kconfig中。

5.修改/drivers目下Makefile文件,添加‘obj-$(CONFIG_BQ27501)+=bq27501/’。这行编译指令告诉模块构建系统在编译模块时需要进入 bq27501/子目录中。此时的驱动程序的编译取决于一个特殊配置 CONFIG_BQ27501配置选项。

6.修改arch/arm目录下的Kconfig文件,在menu"Device Drivers……endmenu"直接添加语句

source"drivers/bq27501/Kconfig"

阅读剩余
THE END