将安卓中kernel 内加载的模块从.o转化为.ko加载进vendor_boot分区
时间: 2024-02-09 22:07:52 浏览: 26
将安卓中kernel内加载的模块从.o转化为.ko并加载进vendor_boot分区的步骤如下:
1. 首先,在内核源码目录下执行`make menuconfig`命令,进入内核配置界面,确保已经开启了“支持模块”的选项。
2. 编译内核源码,生成.o文件。可以执行`make modules`命令来编译内核模块。
3. 将.o文件转化为.ko文件。可以通过执行如下命令来完成:
```bash
$ cd /path/to/kernel/source
$ make INSTALL_MOD_STRIP=1 modules_install
```
其中,`INSTALL_MOD_STRIP=1`参数表示在安装模块时去掉符号表和调试信息,以减小模块文件的大小。执行该命令后,会在`/lib/modules/$(uname -r)/`目录下生成对应的.ko文件。
4. 将.ko文件拷贝到vendor_boot分区。可以通过以下命令将.ko文件拷贝到vendor_boot分区:
```bash
$ adb push my_module.ko /dev/block/bootdevice/by-name/vendor_boot
```
其中,`/dev/block/bootdevice/by-name/vendor_boot`是vendor_boot分区的设备节点。
5. 修改vendor_boot分区中的ramdisk,以便加载模块。可以通过以下步骤完成:
- 解压vendor_boot分区的ramdisk,例如:
```bash
$ mkdir ramdisk
$ cd ramdisk
$ gzip -dc /dev/block/bootdevice/by-name/vendor_boot | cpio -i
```
- 在ramdisk目录下创建/etc/modules-load.d目录,并在该目录下创建一个名为my_module.conf的文件,内容如下:
```text
my_module
```
其中,my_module是要加载的模块的名称。
- 重新打包ramdisk,例如:
```bash
$ find . | cpio -o -H newc | gzip > ../new_ramdisk.gz
```
- 将新的ramdisk写入vendor_boot分区,例如:
```bash
$ cd ..
$ adb shell
$ su
# dd if=new_ramdisk.gz of=/dev/block/bootdevice/by-name/vendor_boot bs=4M count=1
```
6. 重启设备,模块就会被加载到内核中了。
需要注意的是,修改vendor_boot分区需要root权限,并且操作不当可能会造成设备无法启动。因此,在进行这些操作前,一定要备份好原始的vendor_boot分区和ramdisk,以便在出现问题时可以还原。