转自:http://blog.csdn.net/rfidunion/article/details/54709843

驱动程序分为在ubuntu上运行和在ARM开发板上运行两种,我们分别来进行测试

1.源码

  1. empty#include <linux init.h="">
  2. #include <linux module.h="">
  3. static int hello_init(void)
  4. {
  5. printk(KERN_EMERG "Enter Hello abc World!\n");
  6. return 0;
  7. }
  8. static void hello_exit(void)
  9. {
  10. printk(KERN_EMERG "Exit hello world!\n");
  11. }
  12. module_init(hello_init);
  13. module_exit(hello_exit);
  14. MODULE_AUTHOR("RFIDUNION");
  15. MODULE_LICENSE("GPL v2");
  16. MODULE_DESCRIPTION("A simple driver");
  17. MODULE_ALIAS("a simple test module");
  18. empty</linux></linux>

2.电脑上的Makefile

  1. ifneq ($(KERNELRELEASE),)
  2. module-objs := helloworld.o
  3. obj-m   := helloworld.o
  4. else
  5. KERNELDIR := /lib/modules/$(shell uname -r)/build
  6. PWD  := $(shell pwd)
  7. modules:
  8. $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
  9. endif
  10. clean:
  11. rm -rf *.o *~core.depend.*.cmd *.ko *.mod.c.tmp versions

KERNELRELEASE 内核顶层目录Makefile的一个变量。
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
内核源码树目录。
 
该Makefile 共读取两次,在输入Makefile时,$(KERNELDIR) 第一次读取KERNELRELEASE并没有被定义,然后就开始读取内核源码的目录,开始定义KERNELRELEASE,然后到当前模块的目录里面,M=$(PWD) 进入该Makefile时KERNELRELEAS已经被定义了,读取要编译的模块,然后再返回到modules
编译完成,产生.KO文件

3.ARM开发板上的Makefile

  1. ifneq ($(KERNELRELEASE),)
  2. obj-m := helloworld.o
  3. else
  4. KDIR := /qemu_arm/linux-kernel/linux-3.16.39/
  5. all:
  6. make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
  7. clean:
  8. rm -f *.ko *.o *.mod.o *.mod.c *.symvers
  9. endif

KDIR := /qemu_arm/linux-kernel/linux-3.16.39/
KDIR 指定开发板内核所在目录。
CROSS_COMPILE=arm-none-linux-gnueabi- 指定编译器

4.Makefile注意事项

Makefile的拼写不能出错,不是makefile,Makefile用要用Tab键

常见的错误:

提示:missing separator 在这一行要用Tab键开头

5.在电脑上测试驱动

将源码和Makefile两个文件放在同一个目录中,然后用make命令编译(注意此处的Makefile是用第2步中的Makefile)

  1. book@book-virtual-machine:/qemu_arm/driver$ make
  2. make -C /lib/modules/4.8.0-34-generic/build M=/qemu_arm/driver modules
  3. make[1]: Entering directory '/usr/src/linux-headers-4.8.0-34-generic'
  4. CC [M]  /qemu_arm/driver/helloworld.o
  5. Building modules, stage 2.
  6. MODPOST 1 modules
  7. CC      /qemu_arm/driver/helloworld.mod.o
  8. LD [M]  /qemu_arm/driver/helloworld.ko
  9. make[1]: Leaving directory '/usr/src/linux-headers-4.8.0-34-generic'
  10. book@book-virtual-machine:/qemu_arm/driver$

编译完成后用file命令查看下是否是在PC机上运行的模块,不要和ARM开发板上运行的搞混了。

  1. book@book-virtual-machine:/qemu_arm/driver$ file helloworld.ko
  2. helloworld.ko: ELF 32-bit LSB relocatable, <span style="color:#ff0000;">Intel 80386,</span> version 1 (SYSV), BuildID[sha1]=53c0e5e95e8d1c4683f92a7da49c23a5c4d205a8, not stripped
  3. book@book-virtual-machine:/qemu_arm/driver$

看到80386即是在电脑上使用。

加载模块

卸载模块

注意在控制台中无法开到printk打印的信息,原因不知。

可以用下面的命令来查看

dmesg | tail -8

6.在Qemu上模拟ARM开发板测试

将源码和Makefile两个文件放在同一个目录中,然后用make命令编译(注意此处的Makefile是用第3步中的Makefile)

  1. book@book-virtual-machine:/qemu_arm/driver$ make
  2. make -C /qemu_arm/linux-kernel/linux-3.16.39/ M=/qemu_arm/driver modules ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
  3. make[1]: Entering directory '/qemu_arm/linux-kernel/linux-3.16.39'
  4. CC [M]  /qemu_arm/driver/helloworld.o
  5. Building modules, stage 2.
  6. MODPOST 1 modules
  7. CC      /qemu_arm/driver/helloworld.mod.o
  8. LD [M]  /qemu_arm/driver/helloworld.ko
  9. make[1]: Leaving directory '/qemu_arm/linux-kernel/linux-3.16.39'
  10. book@book-virtual-machine:/qemu_arm/driver$

编译完成后用file命令查看下是否是在ARM开发板上运行的模块,不要和PC机上运行的搞混了。

  1. book@book-virtual-machine:/qemu_arm/driver$ file helloworld.ko
  2. helloworld.ko: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), BuildID[sha1]=a8f903d9a908203d02cbdac6b23a9d258c21e783, not stripped
  3. book@book-virtual-machine:/qemu_arm/driver$

看到ARM即是用在开发板上的。

将编译好的helloworld.ko文件拷到根文件系统中,然后用Qemu模拟运行,

qemu-system-arm -M vexpress-a9 -m 512M -kernel /qemu_arm/linux-kernel/linux-3.16.39/arch/arm/boot/zImage -nographic -append "root=/dev/mmcblk0  console=ttyAMA0" -sd /qemu_arm/root_system/a9rootfs.ext3
启动完成后在加载模块显示如下:

  1. / # insmod helloworld.ko
  2. Enter Hello  World!
  3. / #

参考文章:
http://blog.chinaunix.net/uid-24219701-id-3035689.html   简单的驱动makefile解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 http://blog.csdn.net/rfidunion/article/details/54709843

ubuntu下使用qemu模拟ARM(六)------驱动程序【转】的更多相关文章

  1. 【记录】尝试用QEMU模拟ARM开发板去加载并运行Uboot,kernel,rootfs【转】

    转自:https://www.crifan.com/try_use_qemu_emulate_arm_board_to_load_and_run_uboot_kernel_rootfs/ [背景] 手 ...

  2. 【转帖】Linux系统上面qemu 模拟arm

    零基础在Linux系统搭建Qemu模拟arm https://blog.csdn.net/weixin_42489042/article/details/81145038 自己没搞定 改天再试试 感谢 ...

  3. CentOS 7 利用qemu模拟ARM vexpress A9开发板

    听说qemu用于仿真arm很不错,今日就来试了一把.由于刚刚开始,了解的并不多.本文仅仅记录Qemu装载Linux kernel和busybox根文件系统的过程.后续将会深入了解仿真的其他内容. 先上 ...

  4. centos下利用qemu搭建arm模拟器

    有点繁琐,整理一下,系统环境centos6.6,虚拟机以及实际系统中测试通过. 一.交叉编译器的下载与安装1.下载地址:http://blog.csdn.net/dldw8816/article/de ...

  5. ubuntu12.04下使用qemu模拟mips处理器安装debian

    注:ubuntu是不支持mips处理器的,只能在x86下安装运行第一步.安装qemu sudo apt-get install qemu qemu-system .执行 qemu-system-mip ...

  6. 基于 QEMU进行 arm 仿真开发 (以 vexpress-a9 为例)

    背景 基于 QEMU 的仿真可以节省 硬件成本. 参考:<qemu-system-arm仿真vexpress-a9踩坑记>.<在Ubuntu下使用QEMU搭建arm开发环境(一)搭建 ...

  7. 一步步教你如何在Ubuntu虚拟机中安装QEMU并模拟模拟arm 开发环境(一)uImage u-boot(转)

    初次接触qemu是因为工作的需要,有时候下了班,可能需要在家研究一些东西,因为博主用到arm环境,这时候博主比较小气,不愿花钱买开发板,当然博主在这里给大家的建议是,如果要真正学懂arm构架的相关知识 ...

  8. 一步步教你如何在ubuntu虚拟机中安装QEMU并模拟arm 开发环境(二)rootfs制作

    过了,一天,周又到了,博主终于可以拿出时间来把上一次没有给大家展示完了的内容今天在这里一并展示给大家,希望和大家共同进步,共同学习,同时我也虔诚的希望各位业界的朋友把自己的工作经验拿出来大家一起分享, ...

  9. Qemu搭建ARM vexpress开发环境(一)

    Qemu搭建ARM vexpress开发环境(一) 标签(空格分隔): Qemu ARM Linux 嵌入式开发离不开硬件设备比如:开发板.外设等,但是如果只是想学习研究Linux内核,想学习Linu ...

随机推荐

  1. Eclipse报错Project configuration is not up-to-date with pom.xml

    1.问题 Description Resource Path Location Type Project configuration is not up-to-date with pom.xml. S ...

  2. hihocoder1639 图书馆 [数学]

    已知数组a[]及其和sum, 求sum! / (a1!a2!...an!) 的个位数的值. 求某数的逆元表写成了求某数阶乘的逆元表,故一直没找到错误. P 是质数的幂B 表示质数,P 表示模数,cal ...

  3. 【BZOJ2989】数列(二进制分组,主席树)

    [BZOJ2989]数列(二进制分组,主席树) 题面 BZOJ 权限题啊... Description 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即g ...

  4. BZOJ2530 [Poi2011]Party 【贪心】

    题目链接 BZOJ2530 题解 如果我们删去一对不连边的仍然存在的点的话,这对点肯定不同时在那个\(\frac{2}{3}n\)的团中,也就是说,每次删点至少删掉一个外点,至多删掉一个内点 那么我们 ...

  5. 【bzoj4011】 HNOI2015—落忆枫音

    http://www.lydsy.com/JudgeOnline/problem.php?id=4011 (题目链接) 题意 给出一个拓扑图,再加入一条边,问树形图个数. Solution 右转题解→ ...

  6. 单点登录(四)-----遇到问题-----cas server 源码部署tomcat运行报错ClassNotFoundException: org.jasig.cas.CasEnvironmentCo

    情况 cas单点登录 cas server 源码部署tomcat运行报错 把cas server的代码下载下来后使用gradle插件或者maven插件以及转化成eclipse·后导入发现部署到tomc ...

  7. 【bzoj4337】【Bjoi2015】树的同构

    题解 无标号树的HASH: 找到树的重心,以重心为根求出括号序列: 由于树的重心最多只有两个,取字典序的最小括号序列HASH即可 树的括号序列$s_{u}="(s_{v_{1}},s_{v_ ...

  8. 4:JAVA UUID 生成

    GUID是一个128位长的数字,一般用16进制表示.算法的核心思想是结合机器的网卡.当地时间.一个随即数来生成GUID.从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义 ...

  9. HDU 3943 数位dp+二分

    K-th Nya Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) ...

  10. ElasticStack系列之六 & 版本冲突处理之乐观锁

    悲观并发控制(PCC) 这一点在关系数据库中被广泛使用.假设这种情况很容易发生,我们就可以阻止对这一资源的访问.典型的例子就是当我们在读取一个数据前先锁定这一行,然后确保只有读取到数据的这个线程可以修 ...