Android L1版本上的kernel module加载:sepolicy, kernel, .ko

本文详细探讨了在Android L1版本中,如何通过sepolicy来管理和控制kernel module的加载过程。理解这一过程对于确保系统的安全性至关重要,涉及到内核与用户空间之间的交互以及权限管理。

背景在Android KK 4.4 版本后,Google 有正式有限制的启用SELinux, 来增强android 的安全保护。
SELinux 分成enforcing mode 和 permissive mode, enforcing mode 会强制性限制访问; 而
permissve mode 只审查权限, 但不限制, 即不会产生实质性影响.
KK 版本, Google 只有限制的启用SELinux, 即只有针对netd, installd, zygote, vold 以及它们
直接fork 出的child process 使用enforcing mode, 但不包括zygote fork的普通app.
从L版本起,全面开启SELinux, 几乎所有的process 都使enforcing mode。
项目修改原因1. 项目新增红外设备;
2. IR驱动是作为ko加载;

上述两项,都会因为SELinux而出现失败情况。
修改方法设备:device/mediatek/common/sepolicy/device.te
 type mmcblk1_block_device, dev_type;
 type mmcblk1p1_block_device, dev_type;
 type spm_device, dev_type;
+type ir_scx_device, dev_type;
 
 
工厂测试模式中的设备:device/mediatek/common/sepolicy/factory.te
 allow factory mtd_device:chr_file rw_file_perms;
 allow factory self:capability sys_resource;
 allow factory pro_info_device:chr_file { read write ioctl open};
+
+# Date 2015.9.22
+# Add by 
+allow factory ir_scx_device:chr_file { read write ioctl open };
 
 
文件系统中的设备:device/mediatek/common/sepolicy/file_contexts
 /dev/ttyACM0        u:object_r:ttyACM_device:s0
 /dev/hrm       u:object_r:hrm_device:s0
+### Add by 
+/dev/ir_scx(/.*)? u:object_r:ir_scx_device:s0
 
 
META测试中的设备:device/mediatek/common/sepolicy/meta_tst.te
 # Date: WK15.18
 # Purpose: CCT open lens driver fail
 allow meta_tst lens_device:chr_file { read write open ioctl };
+
+# Date 2015.9.22
+# Add by 
+allow meta_tst ir_scx_device:chr_file { read write ioctl open };
 
 
给予system process操作设备的权限:device/mediatek/common/sepolicy/system_server.te
 allow system_server nvdata_file:dir search;
 allow system_server nvdata_file:file { read getattr open };
+# Date: 2015.9.22
+# add by 
+allow system_server ir_scx_device:chr_file { read write ioctl open };
设置ueventd的设备属性:device/{vendor}/{project}/ueventd.{chip}.rc
 /dev/devmap             0440   root         system
 /dev/mali0              0666   system      graphics
 /dev/gps                0660   gps          system
+/dev/ir_scx                            0660   system           system
 
在init.project.rc中执行insmod操作:device/{vendor}/{project}/init.project.rc
     chmod 0660 /dev/ttyMT2
     chown system system /dev/ttyMT2
# Add for Consumer IR
    chmod 0777 /system/lib/modules/ir_scx.ko
    insmod /system/lib/modules/ir_scx.ko
ko insmod操作:device/mediatek/common/sepolicy/init.te
allow init frp_block_device:blk_file relabelto;
allow init userdata_block_device:blk_file relabelto;
# Date : 2015.9.23
# Operation : Migration 
# Purpose : support to load kernel modules.
allow init self:capability { sys_module };

Rebuild target 'Target 1' assembling STARTUP.A51... compiling main.c... compiling delay.c... compiling uart.c... linking... *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: COUNT MODULE: .\Objects\main.obj (MAIN) *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: RECV MODULE: .\Objects\main.obj (MAIN) *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: COUNT MODULE: .\Objects\main.obj (MAIN) ADDRESS: 00E2H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: COUNT MODULE: .\Objects\main.obj (MAIN) ADDRESS: 00E4H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: COUNT MODULE: .\Objects\main.obj (MAIN) ADDRESS: 00E6H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: COUNT MODULE: .\Objects\main.obj (MAIN) ADDRESS: 00EEH *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: COUNT MODULE: .\Objects\main.obj (MAIN) ADDRESS: 00F0H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: COUNT MODULE: .\Objects\main.obj (MAIN) ADDRESS: 00F4H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: COUNT MODULE: .\Objects\main.obj (MAIN) ADDRESS: 00F9H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: RECV MODULE: .\Objects\main.obj (MAIN) ADDRESS: 004AH *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: RECV MODULE: .\Objects\main.obj (MAIN) ADDRESS: 004CH *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: RECV MODULE: .\Objects\uart.obj (UART) *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: RECV MODULE: .\Objects\uart.obj (UART) ADDRESS: 001DH Program Size: data=12.0 xdata=0 code=393 creating hex file from ".\Objects\mcu51"... ".\Objects\mcu51" - 0 Error(s), 13 Warning(s). Build Time Elapsed: 00:00:02
最新发布
07-31
在Keil C51项目中,如果链接阶段报告“Unresolved external symbol COUNT”和“REFCV”(假设RECV拼写错误为REFCV),这通常意味着链接器在所有目标文件和库中找不到这些符号的定义。以下是可能导致此问题的原因和解决方法: ### 1. **变量或函数未正确定义** 确保`COUNT`和`RECV`在某个C源文件中被正确定义。例如: ```c // 在某个 .c 文件中定义 unsigned int COUNT; // 或者 extern unsigned int COUNT; 如果是外部变量 char RECV; // 或类似定义 ``` 如果仅在头文件中使用了`extern`声明但没有在任何源文件中实际定义,链接器将无法找到它们的地址,从而导致未解析的外部符号错误[^2]。 ### 2. **源文件未添加到项目中** 检查包含`COUNT`和`RECV`定义的`.c`文件是否已添加到Keil项目中的`Source Group`中。如果未添加,Keil将不会编译和链接该文件,导致符号未解析。请右键点击`Source Group 1`,选择 **Add Existing Files to Group 'Source Group 1'...**,并添加相关源文件[^3]。 ### 3. **拼写错误或大小写不一致** 确认在声明、定义和引用中`COUNT`和`RECV`的拼写完全一致。C语言是区分大小写的,例如`Count`和`COUNT`会被视为不同的符号。 ### 4. **模块化编程中未正确声明外部变量** 如果`COUNT`和`RECV`是在另一个模块中定义的全局变量,必须在使用它们的文件中使用`extern`关键字进行声明: ```c // 在使用 COUNT 和 RECV 的 .c 文件中 extern unsigned int COUNT; extern char RECV; ``` 同时确保这些变量在**一个且仅一个**源文件中被定义[^4]。 ### 5. **函数名拼写错误或未实现** 如果`COUNT`或`RECV`是函数名,请确认它们是否已在某个源文件中实现。例如: ```c // 声明(通常在头文件中) void COUNT(void); char RECV(void); // 定义(必须在某个 .c 文件中) void COUNT(void) { // 函数体 } char RECV(void) { return 'A'; } ``` 如果只声明而未定义,链接器将报错[^2]。 ### 6. **目标文件未正确链接** 确保所有涉及的`.c`文件都成功编译,并生成了对应的目标文件(`.obj`)。如果某文件编译失败或未生成目标文件,链接器将无法找到相关符号。 ### 7. **使用库文件时未正确包含** 如果`COUNT`和`RECV`来自某个静态库(`.lib`),请确认该库已添加到项目中,并且链接器的设置中包含了该库的路径。此外,确保库中确实包含所需的符号。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值