如何在android自定义内核中构建Hello World
Posted
技术标签:
【中文标题】如何在android自定义内核中构建Hello World【英文标题】:How to build Helloword in android custom kernel 【发布时间】:2021-09-25 22:15:52 【问题描述】:insmod: failed to load hello.ko: Function not implemented
在内核构建以注销消息(例如“hello world”)期间,我遇到了这样的错误,以下步骤将重现该错误:
1)我从git clone https://android.googlesource.com/kernel/goldfish/ -b android-goldfish-3.18
下载了金鱼内核
2)还使用git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.9
下载了上述仓库附带的工具链
3)我将目录更改为 goldfish 并创建了文档中提到的路径 (github)
4) 然后我尝试使用内核目录 (goldfish) 中的 sudo make ARCH=x86_64 CROSS_COMPILE=/home/ana/x86_64-linux-android-4.9-nougat-dev/bin/x86_64-linux-android-
构建内核并设置 LOADABLE_MODULES=y
5)下一步,我在helloKernel目录下创建了hello.c文件和与之相关的Makefile。
你好.c
#include<linux/module.h>
#include<linux/init.h>
#include<linux/kernel.h>
MODULE_AUTHOR("Robert P. J. Day");
MODULE_LICENSE("Dual BSD/GPL");
MODULE_VERSION("2:1.0") ;
MODULE_DESCRIPTION("You have to start somewhere.");
static int hello_init(void)
printk(KERN_ALERT "Hello TheLittleNaruto it’s your first driver.\n");
return 0;
static void hello_exit(void)
printk(KERN_INFO "Goodbye TheLittleNaruto No point in keeping this driv er running.\n");
module_init(hello_init);
module_exit(hello_exit);
生成文件
obj-m := hello.o
KERNELDIR := /home/ana/goldfish/
PWD :=$(shell pwd)
ARCH=x86_64
CROSS_COMPILE=/home/ana/x86_64-linux-android-4.9-nougat-dev/bin/x86_64-linux-android-
CC=$(CROSS_COMPILE)gcc
LD=$(CROSS_COMPILE)ld
CFLAGS_MODULE=-fno-pic
modules:
make -C $(KERNELDIR) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) modules
clean:
rm *.o *.ko *.mod.c *.order *.symvers
-
在同一个目录中我用这个
sudo make ARCH=x86_64 CROSS_COMPILE=/home/ana/x86_64-linux-android-4.9-nougat-dev/bin/x86_64-linux-android-
创建了hello.ko
7) 然后我使用 sudo adb push hello.ko /data/local
将 hello.ko 复制到 android 模拟器
8) 然后我在/data/local
中尝试insmod hello.ko
我收到上述错误,请帮我解决这个问题。提前谢谢
【问题讨论】:
【参考方案1】:在代码中添加两件事
函数进入和退出例程 模块初始化(初始化模块); module_exit(cleanup_module); 让 init_module 函数返回 0 而不是 1,因为 0 表示我们很好。【讨论】:
我添加了上面的函数但我得到了同样的错误 能否再给我们看一下完整的代码 你认为是模拟器中内核执行错误的问题还是我的hello.c? 以前从未见过这样的错误,但是如果它启用了 CONFIG_MODULES=y 和 CONFIG_MODULE_UNLOAD=y 选项,您可以检查您的内核 .config 是的,启用但我认为我的内核有问题,因为在我使用自定义内核运行模拟器后,我在模拟器上看到了深色图像以上是关于如何在android自定义内核中构建Hello World的主要内容,如果未能解决你的问题,请参考以下文章