linux 内核驱动.c,详细说明Linux驱动程序

dfbd6c2d0aaf28e6c9b01c0f7021ce37.png

一个编写Linux驱动程序

1.创建Linux驱动程序框架

Linux内核在使用驱动程序时需要加载和卸载驱动程序

加载驱动程序:创建设备文件,分配内存地址空间等; module_init函数处理驱动程序初始化

卸载驱动程序:删除设备文件,释放内存地址空间等; module_exit函数处理退出

包含这两个函数的两个宏的C程序文件也可以视为Linux驱动程序的框架

2.注册和注销设备文件

任何Linux驱动程序都需要一个设备文件,否则该应用程序将无法与该驱动程序进行交互。

建立设备文件:这是在处理第一步编写的Linux初始化工作的函数中完成的。 misc_register函数

删除设备文件:这是在第一步中编写的处理Linux退出的函数中完成的。 misc_deregister函数

3.指定驱动程序相关信息

驱动程序是自描述的,驱动程序作者的姓名,使用的开源协议,别名,驱动程序描述和其他信息。这些信息需要在驱动程序源代码中指定。

MODULE_AUTHOR,MODULE_LICENSE,MODULE_ALLS,MODULE_DESCRIPION和其他宏可以指定与驱动程序相关的信息

4.指定回调函数

驱动程序不一定指定所有回调函数,回调函数将通过相关机制进行注册

5.编写业务逻辑

特定的业务逻辑与驱动程序的功能有关。业务逻辑可能由多个功能,多个文件甚至多个Linux驱动程序模块组成

6.写入Makefile文件

Linux内核源代码的编译规则由Makefile定义。因此,需要一个Makefile来编写新的Linux驱动程序

7.编译Linux驱动程序

它可以直接编译到内核中,也可以作为模块单独编译

8.安装和卸载Linux驱动程序

21-810-jpg_6-1080-0-0-1080.jpg

如果将Linux驱动程序编译到内核中,只要Linux使用内核,该驱动程序将自动重新打印

如果Linux驱动程序作为单独的模块存在,请使用insmod或modprode命令加载Linux驱动程序模块,并使用rmmod命令卸载Linux驱动程序模块

第二个,第一个Linux驱动程序,以word_count为例

([一)基本写作代码

#mkdir -p / root / drivers / ch06 / word_count创建用于存储Linux驱动程序的目录

#cd / root / drivers / ch06 / word_count

#echo''> word_count.c创建驱动程序源代码文件

#echo'obj-m:= word_count.o'> Makefile写入Makefile文件make命令会将Linux驱动程序源代码目录中的word_count.c或word_count.s文件编译为word_count.o文件

obj-m表示将Linux驱动程序编译为模块(.ko文件),将word_count.o链接到word_count.ko文件中,然后使用insmod或modprode命令加载word_count.ko

obj-y意味着将Linux驱动程序编译到Linux内核中,word_count.o将被链接到Built-in.o文件中,最后被链接到内核中

Linux系统将内存分为用户空间和内核空间。无法直接访问两个空间中的程序。 printk函数在内核空间中运行,而printf函数在用户空间中运行。因此,属于内核程序的Linux驱动程序无法直接访问printf。功能。

#make -C / usr / src / linux-headers- 3. 0.0-15-generic M = / root / driver / ch06 / word_count编译Linux驱动程序源代码

#insmod word_count.ko加载驱动程序

#lsmod | grep word_count检查word_count是否安装成功

#rmmod word_count卸载Linux驱动程序

#dmesg | grep word_count | tail -n 2查看Linux驱动程序输出的日志信息

([二)添加有关指定信息的代码

在模块上:MODULE_AUTHOR(“衬里”);

模块描述:MODULE_DESCRPTION(“字数统计。”);

模块别名:MODULE_ALIAS(“单词计数模块。”);

开放源代码协议:MODULE_LICENSE(“ GPL”);

#define DEVICE_NAME“ wordcount” //定义设备文件名

4da15b61ecc471692273bdd631436598.png

//描述与设备文件触发的事件相对应的回调函数指针

// owner:设备事件回调魔术适用于哪个驱动器模块,THIS_MODULE表示将其应用于当前驱动器模块

静态结构file_operations dev_fops = {。owner = THIS_MODULE};

//描述设备文件的信息

// minor:次设备号MISC_DYNAMIC_MINOR ,:动态生成的次设备号名称:设备文件名

// fops:file_operations结构变量指针

static struct miscdevice misc = {。minor = MISC_DYNAMIC_MINOR,.name = DEVICE_NAME,.fops =&dev_fops};

//初始化Linux驱动程序

静态int word_count_init(void)

{int ret;

ret = misc_register(&misc);

printk(“ word_count_init_success \ n”);

返回ret;

}

//卸载Linux驱动程序

静态无效word_count_exit(void)

{misc_deregister(&misc);

printk(“ word_inti_exit_success \ n”);

}

由于内核空间中的程序无法直接访问用户空间中的数据,因此有必要在word_count_read(从设备文件中读取数据)和word_count_write(将数据写入设备文件)中使用copy_to_user和copy_from_user函数)函数从内核中删除数据。将空间复制到用户空间或从用户空间复制到内核空间

([三)加载和卸载驱动程序

检查word_count驱动程序是否正常工作

4d836690abba166cb276137880f1b3f0.png

#dmesg |尾-n 1

#modinfo word_count.ko

检测Linux驱动程序模块的依赖性

#depmod /root/drivers/ch06/word_count/word_count.ko

调用命令以加载Linux驱动程序

#modprode word_count

注意:insmod和modprode命令都可以加载驱动程序,后者可以检查驱动程序模块的依赖性

三种测试Linux驱动程序的方法

([一)使用Ubuntu Linux测试Linux驱动程序

您需要编写一个专门用于测试的程序,例如test_word_count.c

#gcc test_word_count.c -o test_word_count

#test_word_count

#test_word_count“。”

输出结果:字符串:。

字字节显示:0,0,0,3

字数:3

([二)通过android模拟器上的本机C程序测试Linux驱动程序

#cd〜/内核/金鱼

#make menuconfig

3b368f254e3ea946451bef167bdd8b9d.png

2673f2924848b5083fe4410d19c6a486.png

如图所示进行设置,然后重新编译Linux内核。成功编译内核后,Android可以使用可用性生成的zImage内核文件动态加载Linux驱动程序模块。

9d15fc2e193bdd89d5271622ce7e4982.png

满足两个条件,普通的Linux程序可以直接运行:android,开发板或手机需要root许可;可执行文件需要使用交叉编译器来编译test_word_count.c文件,建立Android.mk来设置编译参数,然后使用make命令进行编译

#mm编译相应目录中的.c文件

#adb push ./emulator/test_word_count / data / local上传到Android

执行以下命令以测试驱动器

#chmod 777 / data / local / test_word_count设置可执行权限

#/ data / local / test_word_count

#/ data / local / test_word_count'a bb ccc ddd eee'

输出结果:5,表示测试成功

([三)使用Android NDK测试

([四)使用开发板进行测试

([五)将驱动程序编译到Linux内核中进行测试

eclipse中Linux驱动程序的四大开发

第一步:创建一个C项目

步骤2:建立C源代码文件链接新建>源文件夹文件夹名称输入src,导入word_count.c文件

第3步:设置包含路径。单击菜单项属性,“ C / C ++常规”>“路径和符号”,选择“包含”的GNU C项,然后添加两个路径:/ root / kernel / goldfish / include和/ root / kernel / goldfish / arch / arm /包含

第4步:编译Linux驱动程序

测试Linux驱动程序

第一步:导入test_word_count.c文件

第2步:设置包含路径

第3步:创建目标创建目标>创建,在“目标名称”文本框中输入word_count_eclipse_test,然后单击“确定”

第4步:构建项目Make Target> Build,选择第三步中创建的文件,然后单击Build

第5步:运行测试程序“运行方式”>“本地C / C ++应用程序”

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-337189-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
0.基础的基础 |-学习WIN64驱动开发的硬件准备 |-配置驱动开发环境 ------------------------------ 1.驱动级HelloWorld |-配置驱动测试环境 |-编译和加载内核HelloWorld ------------------------------ 2.内核编程基础 |-WIN64内核编程的基本规则 |-驱动程序与应用程序通信 |-内核里使用内存 |-内核里操作字符串 |-内核里操作文件 |-内核里操作注册表 |-内核里操作进线程 |-驱动里的其它常用代码 ------------------------------ 3.内核HOOK与UNHOOK |-系统调用、WOW64与兼容模式 |-编程实现突破WIN7的PatchGuard |-系统服务描述表结构详解 |-SSDT HOOK和UNHOOK |-SHADOW SSDT HOOK和UNHOOK |-INLINE HOOK和UNHOOK ------------------------------ 4.无HOOK监控技术 |-无HOOK监控进线程启动和退出 |-无HOOK监控模块加载 |-无HOOK监控注册表操作 |-无HOOK监控文件操作 |-无HOOK监控进线程句柄操作 |-使用对象回调监视文件访问 |-无HOOK监控网络访问 |-无HOOK监视修改时间 ------------------------------ 5.零散内容 |-驱动里实现内嵌汇编 |-DKOM隐藏进程+保护进程 |-枚举和隐藏内核模块 |-强制结束进程 |-强制读写进程内存 |-枚举消息钩子 |-强制解锁文件 |-初步探索PE32+格式文件 ------------------------------ 6.用户态HOOK与UNHOOK |-RING3注射DLL到系统进程 |-RING3的INLINE HOOK和UNHOOK |-RING3的EAT HOOK和IAT HOOK ------------------------------ 7.反回调 |-枚举与删除创建进线程回调 |-枚举与删除加载映像回调 |-枚举与删除注册表回调 |-枚举与对抗MiniFilter |-枚举与删除对象回调
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值