近期在做Android双系统开发和维护工作,可能以后也不会涉及到这块了,做个记录!刚接触还是很难的,所以以后有同学如果能做到这块,不要着急,任何技术都是需要时间积累,就这么三两个月能开始修改内核的代码,多少还是觉得有些意思的!
selinux是最近工作的重点,有好些总结的点:
1、是selinux在userdebug版本上调试方便,你甚至可以在userdebug上配置permissive,但验证必须在user版本上,原因是user上有更严格的策略校验,必须user版本验证通过,才表示selinux的策略配置没有问题;
2、selinux策略单独编译,userdebug版本调试方法:
a、单独编译selinux的te策略命令:
make selinux_policy
生成策略数据文件路径,如下:
\out\target\product\lito\system\etc\selinux
\out\target\product\lito\vendor\etc\selinux
b、userdebug版本更新te策略到/system/etc和/vender/etc:
adb push out\target\product\lito\system\etc\selinux /system/etc/
adb push out\target\product\lito\vendor\etc\selinux /vendor/etc/
c、重启系统,dmesg查看配置策略是否生效;
但是发现如果是增加新的文件标签的时候,这种方法不生效,原因没有调查,全编一个system.img,刷机后就可以了!
3、开关selinux;
cat 0 > /sys/fs/selinux/enforce
cat 1 > /sys/fs/selinux/enforce
4、子目录或者子文件的selinux标签跟随父路径走,运行时修改,需要重新打标签,比方通过setcon或者restorecon,restorecon会根据原有的标签定义重新打标签;
5、给某个目录添加标签,目录名后面不能加/ ,如下两个标签是不一样的:
/data/abc u:object_r:abc:s0
/data/abc/ u:object_r:abc:s0
内核修改实现根据启动参数将应用程序绑定到固定核,这个网上参考的方法很多,主要的思路就是两个:
1、修改内核启动参数,增加预留核id;
2、修改代码,配置cpu亲和性;
cpu_set_t mask; CPU_ZERO(&mask); CPU_SET(5, &mask); sched_setaffinity(0, sizeof(&mask), &mask);
内核启动参数:
BOARD_KERNEL_CMDLINE := androidboot.selinux=permissive isolcpus=5 查看被隔离cpu核: # cat /sys/devices/system/cpu/isolated 5
高通在内核msm-419增加的类似cpu负载均衡的功能,会根据cpu负载情况主动保留一些核,这个功能可能会影响内核启动参数中配置的预留核,所以需要特殊处理,具体文件是msm-4.19/kernel/sched/core.c中的sched_isolate_cpu方法,如果保留的正好是你预留的核,可能你就不能通过配置亲和性使用你预留的核了,修改思路就是从启动参数中读取到你预留的核,如果sched_isolate_cpu函数传递的cpu参数就是你的核,直接报错返回即可;
Linux Cgroup 入门教程:cpuset,参考https://zhuanlan.zhihu.com/p/121588317
配置该pid到cgroup中,这样该pid的所有线程都会绑定到指定的cpu核上
int pid = getpid(); char cmd[128] = { 0 }; Utils::createDir("/dev/cpuset/abc"); system("echo 0 > /dev/cpuset/abc/mems"); system("echo 5 > /dev/cpuset/abc/cpus"); sprintf(cmd, "echo %d > /dev/cpuset/abc/tasks", pid); system(cmd);
-------------------广告线---------------
项目、合作,欢迎勾搭,邮箱:promall@qq.com
本文为呱牛笔记原创文章,转载无需和我联系,但请注明来自呱牛笔记 ,it3q.com