- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在这里列出我的问题。
我有一部 Google Nexus one a.k.a.“passion”手机。手机安装了fastboot和adb工具。并且引导加载程序已解锁。
我的任务:我必须向 Android 内核添加一个 linux 内核模块。
我做了什么:
我遵循了 http://source.android.com/source/initializing.html 中的步骤并下载了 android-2.3.6_r1 (passion) 的内核并构建了它。我也可以在手机上刷入它,新的 android 内核也可以正常工作。现在我想要的是修改内核,加入自己的内核模块,然后刷到手机上,这样手机上的内核就是我修改后的内核。
现在我遇到了两种方法来做到这一点。
1)
使用 android 内核交叉编译我的内核模块,并使用 adb 命令将其推送到设备上。我在内核中使用的Makefile如下。
VERSION = 2
PATCHLEVEL = 3
SUBLEVEL = 6
EXTRAVERSION = -00054-g5f01537
obj-m += hello-1.o
KDIR=/home/apurva/android_dir
PWD := $(shell pwd)
all:
make -C $(KDIR) ARCH=arm CROSS_COMPILE=/home/apurva/android_dir/prebuilt/linux- x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- SUBDIRS=$(PWD) modules
clean:
make -C $(KDIR) ARCH=arm CROSS_COMPILE=/home/apurva/android_dir/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- SUBDIRS=$(PWD) clean
现在无法生成新的 hello-1.ko。我不知道为什么,我猜 VERSION、PATCHLEVEL、SUBLEVEL 和 EXTRAVERSION 值有问题。这些有必要吗?我也尝试了 android-2.3.6_r1 中的这些值,但仍然不起作用。我不确定这个 EXTRAVERSION 值是多少?
我什至尝试在我的 ubuntu 中使用编译器生成的 hello-1.ko。我使用以下 adb 命令将这个 hello-1.ko 推送到模拟器中。
/root/bin/src/out/host/linux-x86/bin/adb shell mount
/root/bin/src/out/host/linux-x86/bin/adb push hello-1.ko /data
/root/bin/src/out/host/linux-x86/bin/adb insmod /data/hello-1.ko
但是 hello-1.ko 无法 insmod,我得到以下错误。insmod : init_module() 错误 hello-1.ko 函数未实现
而 hello-1.c 非常简单:
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
int init_module(void)
{
printk(KERN_INFO "Hello world 1.\n");
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye world 1.\n");
}
2)
第二种方法是将我的内核模块源文件放在android的内核目录中。可能在系统目录或其他地方,并要求 make 与其他源一起构建这些源文件。但我不确定在哪里要求 make 过程这样做。我尝试在 main.mk 中这样做,并在我的源文件的源目录中创建了一个 Android.mk 文件,但它没有用。可能这是一个更好的解决方案,但我找不到任何帮助。
完成此操作后,我的内核模块应该能够控制 android 手机的 wnic(无线网络接口(interface)设备)。它应该能够将 wnic 置于 sleep 模式,然后在从我的内核模块接收到命令后将其唤醒。如果您对如何执行此操作有一些指示,那将是一个帮助。我发现在 Android 上它是通过 wpa_supplicant 私有(private)驱动程序控制的。命令,例如:
wpa_cli driver powermode 0 - auto
wpa_cli driver powermode 1 - active
可以完成我的任务,但我不确定,因为我没有尝试过。我还没到那个阶段。
请对此进行调查并提供一些帮助/指导。
谢谢,
阿普尔瓦
最佳答案
内核模块 (KO's) 比静态内核更容易使用 - 只要内核启用了它们。最简单的判断方法是执行“adb shell lsmod”。其次是查看内核.config是否启用了CONFIG_MODULES=y和CONFIG_MODULE_UNLOAD=y。网上有很多关于 linux KO 开发的信息。
嗯,你很接近,但看起来 makefile 很奇怪。首先尝试在您的主机上构建 hello KO 以进行单元测试,然后在您的目标上构建。这是我在运行 gingerbread 的 OMAP36xx 上使用的示例 makefile:
# Makefile for trivial android kernel module
obj-m += mod_hello.o
CROSS_COMPILE=/opt/distros/ARM/bin/arm-none-linux-gnueabi-
TARG_KDIR ?= /opt/android/dal/nook_kernel
HOST_KDIR=/lib/modules/$(shell uname -r)/build
# target creates:
# .<obj>.o: CC command line for the .o, including dependencies
# .<obj>.mod.o.cmd: CC command line for the mod.o, including dependencies
# .<obj>.ko.cmd: LD command line which links the .o and .mod.o to create the .ko
target:
@echo "Make module for target arm"
make -C $(TARG_KDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) modules
host:
@echo "Make module for host"
make -C $(HOST_KDIR) M=$(PWD) modules
clean:
@echo "cleaning target"
make -C $(TARG_KDIR) M=$(PWD) clean
@echo "cleaning host"
make -C $(HOST_KDIR) M=$(PWD) clean
关于android - 在Android内核中加载内核模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9431560/
我正在开发一个需要能够平均三个数字的 Facebook 应用程序。但是,它总是返回 0 作为答案。这是我的代码: $y = 100; $n = 250; $m = 300; $number = ($y
我只是无法弄清楚这一点,也找不到任何对我来说有意义的类似问题。我的问题:我从数据库中提取记录,并在我的网页上以每个面板 12 条的倍数显示它们。因此,我需要知道有多少个面板可以使用 JavaScrip
我是一名优秀的程序员,十分优秀!