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

转载于:https://www.cnblogs.com/jiangu66/p/3184438.html

linux下编译运行驱动相关推荐

  1. linux下软件编译终止,[2018年最新整理]linux下编译运行程序命令大全.ppt

    [2018年最新整理]linux下编译运行程序命令大全 1. 项目课题引入 2. Vi编辑器的使用方法 3. Linux中C语言程序的编辑 4. Linux中C语言程序的运行 5. 现场演示案例 课题 ...

  2. Linux下编译运行C程序

    代码变成可执行文件叫做编译(compile):先编译这个还是先编译那个这个(即编译的安排)叫做构建(build) 我们在Linux环境下编译C语言需要gcc. 1.配置GCC 刚装好的系统已经有GCC ...

  3. 在linux下编译运行c语言程序

    Linux   中最重要的软件开发工具是   GCC.GCC   是   GNU   的   C   和   C++   编译器.实际上,GCC   能够编译三种语言:C.C++   和   Obje ...

  4. 如何在linux下编译运行c程序

    1.在终端下打开一个编辑器(我用的gedit),建立一个hello.c文件并保存, 2.关闭编辑器,在终端上输入 gcc -o hello hello.c编译c程序 3.输入./hello运行c程序

  5. Linux下编译运行Go程序

    编译 go build test.go 指定输出文件 go build -o release/mymain src/*.go 修改权限命令 chmod 777 程序名称 后台运行的命令(./mygam ...

  6. 解决 linux下编译运行.sh文件报错 “[: XXXX: unexpected operator” 问题

    上网查了资料发现,因为Ubuntu默认的sh是连接到dash的,而dash跟bash的不兼容所以出错.既然原因找到,那么就可以把默认连接改成bash即可 $ sudo dpkg-reconfigure ...

  7. Linux 下编译并运行C++程序

    1>新建一个C++新文件 ----helloworld.c #include<iostream> using namespace std; int main(){cout<&l ...

  8. Linux 下编译并运行C语言程序

    Linux下编译并运行C语言程序 ,以Centos 系统为例 1>新建一个hello.c文件 可以直接用图形用户界面新建也可以使用命令新建. 用命令行的话,要用到Linux下的vi编辑器的相关命 ...

  9. Linux下编译、链接、加载运行C++ OpenCV的两种方式及常见问题的解决

    Linux下编译.链接.加载运行C++ OpenCV的两种方式及常见问题的解决 在Linux下安装完OpenCV C++之后(还没有安装的读者请参考Ubuntu 18.04 安装OpenCV C++) ...

  10. linux网卡驱动rtl8188cu,linux下编译基于rtl8188cu控制芯片的USB无线网卡驱动 -电脑资料...

    本人因为实验的需要,需要在嵌入式linux环境下添加wifi功能,通过在网上调研,选择基于rtl8188cu控制芯片的水星NW150UM无线USB网卡,现简单记录下配置过程, 1.下载最新的rtl81 ...

最新文章

  1. Scrum立会报告+燃尽图(Beta阶段第二周第七次)
  2. MATLAB可以打开gms文件吗,GMS文件扩展名 - 什么是.gms以及如何打开? - ReviverSoft...
  3. 投影参数_智能投影仪参数如何去看,其实很简单
  4. 「SAP 技术」SAP BP显示供应商账户组时候的怪现象
  5. python3 字符串填充 清除
  6. pythonweb开发-Web | 浅谈用Python进行Web开发
  7. activiti集成spring
  8. 【模板/经典题型】并查集维护生成树
  9. 使用GeoTools创建一个具有纬度,经度和半径的圆
  10. 10-RabbitMQ-整合SpringBoot
  11. Okhttp对http2的支持简单分析
  12. Android中使用Notifaction无反应
  13. Windows部署solr服务,启动solr单机模式和solrCould模式
  14. 二分查找一个数首次与最后出现的位置
  15. 地图配色及网络地图比较
  16. matlab离群值处理,数据平滑和离群值检测
  17. 计算机体系架构(1)计算机组成原理
  18. app测试之--安卓手机安装测试包
  19. [IE]Win7下IE点击切换图标出现卡死的问题解决
  20. failed to allocate for range 0: no IP addresses available in range set:

热门文章

  1. Ubuntu 16.04上安装Code::Blocks
  2. docker 运行 php nginx_使用docker运行nginx
  3. php 按行读取并分割字符串
  4. C# richTextBox重刷最后一行,richTextBox只更新最后一行
  5. php mysql实现删除功能_这个PHP / MySQL删除功能是否安全?
  6. appnode报错_appnode
  7. dual mysql 获取序列_FASTJSON反序列化和构造函数之间的一点小秘密
  8. python surprise库_Python推荐系统库--Surprise实战
  9. python文本交换_有没有办法用python交换文本文件中的两行文本?
  10. apache netbeans ide为什么安装不了_Eclipse安装及常见的基于Eclipse的嵌入式集成开发环境...