ubuntu下使用qemu模拟ARM(六)------驱动程序【转】
转自:http://blog.csdn.net/rfidunion/article/details/54709843
驱动程序分为在ubuntu上运行和在ARM开发板上运行两种,我们分别来进行测试
1.源码
- empty#include <linux init.h="">
- #include <linux module.h="">
- static int hello_init(void)
- {
- printk(KERN_EMERG "Enter Hello abc World!\n");
- return 0;
- }
- static void hello_exit(void)
- {
- printk(KERN_EMERG "Exit hello world!\n");
- }
- module_init(hello_init);
- module_exit(hello_exit);
- MODULE_AUTHOR("RFIDUNION");
- MODULE_LICENSE("GPL v2");
- MODULE_DESCRIPTION("A simple driver");
- MODULE_ALIAS("a simple test module");
- empty</linux></linux>
2.电脑上的Makefile
- ifneq ($(KERNELRELEASE),)
- module-objs := helloworld.o
- obj-m := helloworld.o
- else
- KERNELDIR := /lib/modules/$(shell uname -r)/build
- PWD := $(shell pwd)
- modules:
- $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
- endif
- clean:
- 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
- ifneq ($(KERNELRELEASE),)
- obj-m := helloworld.o
- else
- KDIR := /qemu_arm/linux-kernel/linux-3.16.39/
- all:
- make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
- clean:
- rm -f *.ko *.o *.mod.o *.mod.c *.symvers
- 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)
- book@book-virtual-machine:/qemu_arm/driver$ make
- make -C /lib/modules/4.8.0-34-generic/build M=/qemu_arm/driver modules
- make[1]: Entering directory '/usr/src/linux-headers-4.8.0-34-generic'
- CC [M] /qemu_arm/driver/helloworld.o
- Building modules, stage 2.
- MODPOST 1 modules
- CC /qemu_arm/driver/helloworld.mod.o
- LD [M] /qemu_arm/driver/helloworld.ko
- make[1]: Leaving directory '/usr/src/linux-headers-4.8.0-34-generic'
- book@book-virtual-machine:/qemu_arm/driver$
编译完成后用file命令查看下是否是在PC机上运行的模块,不要和ARM开发板上运行的搞混了。
- book@book-virtual-machine:/qemu_arm/driver$ file helloworld.ko
- helloworld.ko: ELF 32-bit LSB relocatable, <span style="color:#ff0000;">Intel 80386,</span> version 1 (SYSV), BuildID[sha1]=53c0e5e95e8d1c4683f92a7da49c23a5c4d205a8, not stripped
- book@book-virtual-machine:/qemu_arm/driver$
看到80386即是在电脑上使用。
加载模块
卸载模块
注意在控制台中无法开到printk打印的信息,原因不知。
可以用下面的命令来查看
dmesg | tail -8
6.在Qemu上模拟ARM开发板测试
将源码和Makefile两个文件放在同一个目录中,然后用make命令编译(注意此处的Makefile是用第3步中的Makefile)
- book@book-virtual-machine:/qemu_arm/driver$ make
- make -C /qemu_arm/linux-kernel/linux-3.16.39/ M=/qemu_arm/driver modules ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
- make[1]: Entering directory '/qemu_arm/linux-kernel/linux-3.16.39'
- CC [M] /qemu_arm/driver/helloworld.o
- Building modules, stage 2.
- MODPOST 1 modules
- CC /qemu_arm/driver/helloworld.mod.o
- LD [M] /qemu_arm/driver/helloworld.ko
- make[1]: Leaving directory '/qemu_arm/linux-kernel/linux-3.16.39'
- book@book-virtual-machine:/qemu_arm/driver$
编译完成后用file命令查看下是否是在ARM开发板上运行的模块,不要和PC机上运行的搞混了。
- book@book-virtual-machine:/qemu_arm/driver$ file helloworld.ko
- helloworld.ko: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), BuildID[sha1]=a8f903d9a908203d02cbdac6b23a9d258c21e783, not stripped
- 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
启动完成后在加载模块显示如下:
- / # insmod helloworld.ko
- Enter Hello World!
- / #
参考文章:
http://blog.chinaunix.net/uid-24219701-id-3035689.html 简单的驱动makefile解析
ubuntu下使用qemu模拟ARM(六)------驱动程序【转】的更多相关文章
- 【记录】尝试用QEMU模拟ARM开发板去加载并运行Uboot,kernel,rootfs【转】
转自:https://www.crifan.com/try_use_qemu_emulate_arm_board_to_load_and_run_uboot_kernel_rootfs/ [背景] 手 ...
- 【转帖】Linux系统上面qemu 模拟arm
零基础在Linux系统搭建Qemu模拟arm https://blog.csdn.net/weixin_42489042/article/details/81145038 自己没搞定 改天再试试 感谢 ...
- CentOS 7 利用qemu模拟ARM vexpress A9开发板
听说qemu用于仿真arm很不错,今日就来试了一把.由于刚刚开始,了解的并不多.本文仅仅记录Qemu装载Linux kernel和busybox根文件系统的过程.后续将会深入了解仿真的其他内容. 先上 ...
- centos下利用qemu搭建arm模拟器
有点繁琐,整理一下,系统环境centos6.6,虚拟机以及实际系统中测试通过. 一.交叉编译器的下载与安装1.下载地址:http://blog.csdn.net/dldw8816/article/de ...
- ubuntu12.04下使用qemu模拟mips处理器安装debian
注:ubuntu是不支持mips处理器的,只能在x86下安装运行第一步.安装qemu sudo apt-get install qemu qemu-system .执行 qemu-system-mip ...
- 基于 QEMU进行 arm 仿真开发 (以 vexpress-a9 为例)
背景 基于 QEMU 的仿真可以节省 硬件成本. 参考:<qemu-system-arm仿真vexpress-a9踩坑记>.<在Ubuntu下使用QEMU搭建arm开发环境(一)搭建 ...
- 一步步教你如何在Ubuntu虚拟机中安装QEMU并模拟模拟arm 开发环境(一)uImage u-boot(转)
初次接触qemu是因为工作的需要,有时候下了班,可能需要在家研究一些东西,因为博主用到arm环境,这时候博主比较小气,不愿花钱买开发板,当然博主在这里给大家的建议是,如果要真正学懂arm构架的相关知识 ...
- 一步步教你如何在ubuntu虚拟机中安装QEMU并模拟arm 开发环境(二)rootfs制作
过了,一天,周又到了,博主终于可以拿出时间来把上一次没有给大家展示完了的内容今天在这里一并展示给大家,希望和大家共同进步,共同学习,同时我也虔诚的希望各位业界的朋友把自己的工作经验拿出来大家一起分享, ...
- Qemu搭建ARM vexpress开发环境(一)
Qemu搭建ARM vexpress开发环境(一) 标签(空格分隔): Qemu ARM Linux 嵌入式开发离不开硬件设备比如:开发板.外设等,但是如果只是想学习研究Linux内核,想学习Linu ...
随机推荐
- Gson获取json串中的key-value
1.依赖包 <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson& ...
- 【刷题】BZOJ 2959 长跑
Description 某校开展了同学们喜闻乐见的阳光长跑活动.为了能"为祖国健康工作五十年",同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑运动.一时间操场上 ...
- 51nod 1208 窗上的星星 | 线段树 扫描线
51nod 1208 Stars In Your Window 题面 整点上有N颗星星,每颗星星有一个亮度.用一个平行于x轴和y轴,宽为W高为H的方框去套星星.套住的所有星星的亮度之和为S(包括边框上 ...
- 【codeforces 765F】 Souvenirs
http://codeforces.com/problemset/problem/765/F (题目链接) 题意 给出$n$个数的序列,$m$次询问,每次查询区间$[l,r]$之间相差最小的两个数的差 ...
- Bypass AV meterpreter免杀技巧
0x01 meterpreter简介 MetasploitFramework是一个缓冲区溢出测试使用的辅助工具,也可以说是一个漏洞利用和测试平台,它集成了各种平台上常见的溢出漏洞和流行的shellco ...
- Java EE之通过表单上传文件
public class Ticket { private String customerName; private String subject; private String body; priv ...
- python之旅:函数对象、函数嵌套、名称空间与作用域、装饰器
一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if de ...
- web页面的绝对路径
在JavaWeb开发中,常使用绝对路径的方式来引入JavaScript和CSS文件,这样可以避免因为目录变动导致引入文件找不到的情况,常用的做法如下:一.使用${pageContext.request ...
- Long与long的区别
Java的数据类型分两种:1.基本类型:long,int,byte,float,double,char2. 对象类型(类): Long,Integer,Byte,Float,Double,Char,S ...
- ACF/PACF,残差白噪声的检验问题
关于自相关.偏自相关: 一.自协方差和自相关系数 p阶自回归AR(p) 自协方差 r(t,s)=E[X(t)-EX(t)][X(s)-EX(s)] 自相关系数ACF ...