如何在android自定义内核中构建Helloword

问题描述

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

下载了上述 repo 附带的工具链

3) 我将目录更改为金鱼并创建了文档中提到的路径 (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。

hello.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
  1. 在同一个目录中,我用这个 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) 然后我在 insmod hello.ko

中尝试 /data/local

我得到了上述错误,请帮我解决这个问题。提前致谢

解决方法

要在代码中添加两件事

  • 函数进入和退出例程 模块初始化(init_module); module_exit(cleanup_module);
  • 让 init_module 函数返回 0 而不是 1,因为 0 意味着我们很好。