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源码https://www.kernel.org/

如我的机器3.5.0版本源码下载地址为:https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.5.tar.bz2

下载完后,找一个路径解压,如我解压到/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,详细看这里。

http://www.ibm.com/developerworks/cn/linux/l-cn-kernelmodules/index.html

在X86上我的办法是:

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

linux下编译运行驱动的更多相关文章

  1. linux下编译运行TIGL Viewer步骤

    linux下编译运行TIGL Viewer步骤(仅为了正确编译安装的话直接跳到步骤3) 1. linux发行版选择:由于linux发行版众多,不同版本包含的库版本可能存在差别,因此需要选择正确的版本. ...

  2. DPM检测模型 VoC-release 5 linux 下编译运行

    (转载请注明作者和出处 楼燚(yì)航的blog :http://www.cnblogs.com/louyihang-loves-baiyan/ 未经允许请勿用于商业用途) DPM目前使非神经网络方法 ...

  3. 在linux下编译运行C++程序

    头一回...把windows下的程序挪到linux下,代码见这篇随笔 1.编译ZTHREAD,使用./configure失败,直接编译的,方法还是上面提到的那篇随笔 2.编译源码,最开始用的cc,后来 ...

  4. linux下编译运行C程序

    GCC是Linux操作系统下一个非常重要的源代码编译工具,有着许多重要的选项,支持许多不同语言的编译,如C.C++.Ada.Fortran.Objective.Perl.Python.Ruby以及Ja ...

  5. 如何用javac 和java 编译运行整个Java工程 (转载)【转】在Linux下编译与执行Java程序

    如何用javac 和java 编译运行整个Java工程 (转载)  http://blog.csdn.net/huagong_adu/article/details/6929817 [转]在Linux ...

  6. Linux程序在Windows下编译运行_MinGW和Cygwin

    linux要在windows下编译运行,需要win下的gcc编译器,一般有两种:MinGW和Cygwin. 但某些函数在windows没有,即使使用两种工具也编译不过,需要查询windows函数并使用 ...

  7. Linux下的硬件驱动——USB设备(转载)

    usb_bulk_msg函数 当对usb设备进行一次读或者写时,usb_bulk_msg 函数是非常有用的; 然而, 当你需要连续地对设备进行读/写时,建议你建立一个自己的urbs,同时将urbs 提 ...

  8. linux下编译gcc6.2.0

    linux下编译gcc6.2.0 在archlinx的下gcc已经更新到6.2.1了,win10的WSL下还是gcc4.8.官方源没有比较新的版本,于是自己编译使用. GCC6的几个新特性 GCC 6 ...

  9. 如何在Kali Linux下编译Windows Exploit

    前言 微软的Windows在企业或是个人应用领域占据着最大的市场份额,在渗透测试过程中你会经常遇到很多Windows的工作站和服务器.另一方面,大多数渗透测试人员主要使用基于Linux的发行版渗透测试 ...

随机推荐

  1. JavaScript中的单引号和双引号报错的解决方法

    在使用JavaScript显示消息或者传递字符数据的时候,经常会碰到数据中夹杂单引号(')或者双引号("),这种语句往往会造成JavaScript报错.对此一般采用/'或者/"的解 ...

  2. jmeter之GUI运行原理

    一.一语道破jmeter       大家都知道我们在应用jmeter的图形化界面来进行操作,保存后生成的是一个.jmx文件.     那么这个.jmx文件中都是些什么呢.   <?xml ve ...

  3. 阐述linux IPC(五岁以下儿童):system V共享内存

    [版权声明:尊重原创.转载请保留源:blog.csdn.net/shallnet 要么 .../gentleliu,文章学习交流,不用于商业用途]         system V共享内存和posix ...

  4. Java 异常归纳总结

    1.异常的分类 1) Checked exception: 这类异常都是Exception的子类 .异常的向上抛出机制进行处理,如果子类可能产生A异常,那么在父类中也必须throws A异常.可能导致 ...

  5. 安装SQL Server 2008 - 初学者系列 - 学习者系列文章

    本文介绍SQL Server 2008数据库的安装 1.从下列地址获取SQL Server 2008的副本 thunder://QUFlZDJrOi8vfGZpbGV8Y25fc3FsX3NlcnZl ...

  6. 基于C# 语言的两个html解析器

    基于C# 语言的两个html解析器 1)Html Agility Pack http://nsoup.codeplex.com/ 代码段示例: HtmlDocument doc = new HtmlD ...

  7. c#自带压缩类实现数据库表导出到CSV压缩文件

    c#自带压缩类实现数据库表导出到CSV压缩文件的方法 在导出大量CSV数据的时候,常常体积较大,采用C#自带的压缩类,可以方便的实现该功能,并且压缩比例很高,该方法在我的开源工具DataPie中已经经 ...

  8. Angularjs学习---ubuntu12.04中karma安装配置

    Angularjs学习---ubuntu12.04中karma安装配置中常见的问题总结   karma启动时出现了很多问题: 1.安装karma前提条件 安装karma首先要安装nodejs,npm然 ...

  9. JAVA中ClassPath妙用

    初学java的人肯定都配置过java三大环境变量 . JAVA_HOME:JDK目录 PATH:jdkbin目录  jre目录 CLASSPATH:一般指向类库lib,也可自定义使用 以下例子是个小例 ...

  10. 转载Mvc的多层架构

    Mvc的多层架构 分享一个Mvc的多层架构,欢迎大家拍砖斧正   多层架构是什么? 多层架构是开发人员在开发过程当中面对复杂且易变的需求采取的一种以隔离控制为主的应对策略,关于多层架构的标准,我认为有 ...