实现内核驱动程序模块
事例是以《Android系统源代码情景分析》第二章抄过来的,在学习培训的全过程中還是碰到了许多 的难题。
本人感受:在学习培训第二章以前应当把《Linux设备驱动程序》这本书最少前四章需读一遍,了解一些基本定义和情况专业知识,但是这本书還是略旧,例如sysfs就沒有表述,多google吧。
这书第二章要了解透了再向下开展,由于这一简易的事例从下往上围绕了Android系统软件各层,是了解后边每章的基本。
下边列举我碰到的难题和解决方案。
-
三类系统文件插口的关联、功效各自是啥?
它完成了proc系统文件插口、传统式的机器设备系统文件插口和devfs文件系统软件插口。
类Unix系统软件有一条基础的设计方案社会学:基本上全部的数据信息实体线都被抽象性成统一的插口——文档来对待。procfs、devfs和sysfs全是这类设计方案的反映。
/dev文件目录下每一个文档相匹配一个机器设备,根据实际操作这种文档能够完成与核心的互动,但devfs存有一些缺陷,如取名不灵便,不可以随意特定文件夹名称,并且全部文档都是在/dev/根目录下。从而演长出sysfs,它把具体联接到系统软件上的机器设备机构成一个等级分类的文档管理体系,比devfs更清楚更方便管理,sysfs初始化在/sys下边。
/proc系统文件中关键包括三大类內容:过程有关一部分、系统信息一部分和系统软件自信息内容一部分。显而易见在本例中,procfs和sysfs一部分的插口,做为新手入门第一个示例而言并多余。
因而我准备只完成传统式机器设备系统文件插口的一部分,sysfs和procfs暂未完成。我觉得仍然能够详细地一切正常工作中。
-
编译程序难题
-
在__freg_setup_dev涵数中,对涵数init_MUTEX的启用编译程序打错,这是由于该涵数早已被开启,改为以下就可以:
sema_init(&(dev->sem), 1);
- 改动核心Kconfig文件。我编译程序的核心是3.4,必须在drivers/Kconfig中加上
source "drivers/freg/Kconfig"
而不是在arch/arm/Kconfig中。
-
配备
- 在Mac OSX,启用make menuconfig的情况下打错,解决方案早已升级到《Android源码、内核编译》这篇博闻里了。
- 进到make menuconfig配备页面后,假如要设定Enable loadable module support,这方面的互动有点儿坑人。第一次进到页面是那样的,Enable loadable module support沒有被选定:
假如立即回车键进到子莱单,发觉前边是—,是不可以被改动的:
原以为是自身的内核版本有什么问题,折腾了大半天才搞清楚:应当在一级页面中先对Enable loadable module support按住Y,使之选定:
随后再回车键进到才可以见到并改动子项目內容:
一万头草尼马奔流而过,害孔子科学研究大半天……
-
调节
-
查询核心log
我将控制模块编译程序到核心中,最初却在/dev下边找不着freg文件,务必要调节编码看在哪儿一步出了错。freg.c源代码空出启用printk涵数写了日志,我还在每条日志字符串头顶部加了[freg]的字眼,以下:
printk(KERN_ALERT"[freg]Initializing freg device.\n");
便于在浩瀚无垠的核心日志中挑选出freg的日志。
-
方式一:能够应用dmesg查询核心打印信息,再相互配合grep以下:
$ adb shell $ dmesg | grep "\[freg\]" [freg]Initializing freg device. [freg]Succeeded to initialize freg device.
- 方式二:能够在运作emulator的情况下加-show-kernel主要参数:
$ emulator -kernel arch/arm/boot/zImage -show-kernel &