实现内核驱动程序模块
来源:互联网 发布:2016年淘宝数据分析 编辑:程序博客网 时间:2024/06/14 11:23
个人体会:在学习第二章之前应该把《Linux设备驱动程序》这本书至少前四章要读一遍,理解一些基础概念和背景知识,不过这本书还是略旧,比如sysfs就没有解释,多google吧。
本书第二章要理解透了再往下进行,因为这个简单的例子从下往上贯穿了Android系统各层,是理解后面各章的基础。
下面列出我遇到的问题和解决办法。
三类文件系统接口的关系、作用分别是什么?
它实现了proc文件系统接口、传统的设备文件系统接口和devfs文件系统接口。
类Unix系统有一条基本的设计哲学:几乎所有的数据实体都被抽象成统一的接口——文件来看待。procfs、devfs和sysfs都是这种设计的体现。
/dev目录下每一个文件对应一个设备,通过操作这些文件可以实现与内核的交互,但devfs存在一些缺点,如命名不灵活,不能任意指定文件名,而且所有文件都在/dev/根目录下。进而演生出sysfs,它把实际连接到系统上的设备组织成一个分级的文件体系,比devfs更清晰更便于管理,sysfs挂载在/sys下面。
/proc文件系统中主要包含三大类内容:进程相关部分、系统信息部分和系统自信息部分。显然在本例中,procfs和sysfs部分的接口,作为入门第一个样例来说并不必要。
因此我打算只实现传统设备文件系统接口的部分,sysfs和procfs暂不实现。我认为依然可以完整地正常工作。
编译问题
- 每次编译和运行模拟器之前需要把各环境变量重设一遍:
$ cd WORKING_DIRECTORY$ source build/envsetup.sh$ lunch aosp_arm-eng$ cd kernel$ cd goldfish$ export ARCH=arm$ export SUBARCH=arm$ export CROSS_COMPILE=arm-eabi-$ export PATH=WORKING_DIRECTORY/prebuilts/gcc/darwin-x86/arm/arm-eabi-4.8/bin:$PATH$ make goldfish_armv7_defconfig$ make menuconfig$ make -j8$ emulator -kernel arch/arm/boot/zImage &
在__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 &
动态加载模块
当在make menuconfig中选择了动态加载模块,编译、启动emulator,需要通过adb把.ko模块push到emulator:
# 启动emulator$ emulator -kernel arch/arm/boot/zImage &# 把刚刚编译的freg.ko拷贝到emulator的/data下$ adb push drivers/freg/freg.ko /data$ adb shell ls -l /data/freg.ko-rw-rw-rw- root root 5281 2016-02-21 01:45 freg.ko# 加载freg.ko模块$ adb shell insmod /data/freg.ko
- 实现内核驱动程序模块
- 开发android硬件驱动程序-实现内核驱动程序模块
- linux内核模块和驱动程序
- linux内核模块和驱动程序的编写
- 将驱动程序模块添加到内核
- linux内核模块和驱动程序的编写
- 开发板上驱动程序模块的实现
- linux内核模块和驱动程序的编写之初探
- Linux 内核模块和驱动程序的详细编写
- Linux的设备驱动程序应是一个内核模块
- Linux驱动程序设计之一---- Linux内核模块设计
- 嵌入式linux 内核驱动程序模块编译及其操作流程
- SPI模块的HAL访问Linux内核驱动程序
- linux 内核模块编程之LED驱动程序(六)
- SPI模块的HAL访问Linux内核驱动程序【转】
- 将设备驱动程序模块源码添加到Linux内核模块源码中
- Linux驱动程序开发基础, -->内核模块编程,内核的调试方法
- 内核驱动程序中实现设备节点的自动创建
- 写一个Android输入法02——候选窗、转换
- article元素
- Android源码、内核编译
- 关于CRTP(Curiously Recurring Template Prattern)的使用
- 工欲善其事——Sublime Text
- 实现内核驱动程序模块
- Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面
- 海啸的数学模型
- android碰见的问题(1)
- Hibernate之Hibernate与触发器协调使用
- 【字符串处理算法】回文判断的算法设计及C代码实现
- instancetype、id、NSObject的区别
- java数组与容器
- New Activity探索(序)