如何在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的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义构建的 Android 模拟器不接受键盘输入

如何制作“Hello world”内核

使用自定义构建器使用 Android 创建发布构建

如何将内核调试信息构建为单独的文件?

android开发 百度地图3.0以上版本,如何显示自定义标记图标?

如何在现代环境中构建 android 内核