上一章我们学习了如何在内核中写驱动程序,我们创建了三种不同的文件节点供用户来访问,分别是传统设备/dev/hello、proc文件系统/proc/hello和devfs系统属性访问/sys/class/hello/hello/val。但是我们没有去真正的验证程序的有效性,这一章我们一起来学习一下,如何在用户C空间写一个C的程序来访问hello驱动。
用户C空间的进程都被放在/system/bin中,例如我们常用的logcat、logd、rild等进程都能在其中找到。
Tianger:~ getianger$ adb shell
root@android:/ # cd system/bin
root@android:/system/bin # ls
接下来开始来实现这个C的进程,我们把这个进程取名为hello。
1.进入到external目录,创建hello目录
Tianger:Android root# cd external/
Tianger:external root# mkdir hello
2.进入到hello目录,新建hello.c:
1 | #include <stdio.h> |
该hello.c程序,主要作用:通过传统设备访问方法,打开/dev/hello,读取寄存器val的值,然后重新赋值寄存器值为5,并把新的寄存器值写入到hello驱动中,再去验证是否写入成功。
3.编译环境:
在hello目录中创建Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := hello
LOCAL_SRC_FILES := $(call all-subdir-c-files)
include $(BUILD_EXECUTABLE)
注:LOCAL_MODULE表示我们要编译的模块名称,BUILD_EXECUTABLE表示我们编译的是可执行程序.
4.编译:
mmm ./external/hello
编译成功后,可以在out/target/product/gerneric/system/bin目录下看到hello了.
5.启动模拟器
adb shell
cd /system/bin
./hello
输出结果:
Read the original value:
0.
Write value 5 to /dev/hello.
Read the value again:
5.
到这里我们一个最普通的C的进程访问驱动程序就完成了。
注:kernel这边的程序,主要是参考老罗的Android之旅来完成。