近期工作小结

2023-05-02 15:30:26 浏览数 (1)

近期在做Android双系统开发和维护工作,可能以后也不会涉及到这块了,做个记录!刚接触还是很难的,所以以后有同学如果能做到这块,不要着急,任何技术都是需要时间积累,就这么三两个月能开始修改内核的代码,多少还是觉得有些意思的!

selinux是最近工作的重点,有好些总结的点:

1、是selinux在userdebug版本上调试方便,你甚至可以在userdebug上配置permissive,但验证必须在user版本上,原因是user上有更严格的策略校验,必须user版本验证通过,才表示selinux的策略配置没有问题;

2、selinux策略单独编译,userdebug版本调试方法:

a、单独编译selinux的te策略命令:

make selinux_policy

生成策略数据文件路径,如下:

outtargetproductlitosystemetcselinux 

outtargetproductlitovendoretcselinux 

b、userdebug版本更新te策略到/system/etc和/vender/etc:

adb push  outtargetproductlitosystemetcselinux  /system/etc/ 

adb push  outtargetproductlitovendoretcselinux /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亲和性;

代码语言:javascript复制
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(5, &mask);
sched_setaffinity(0, sizeof(&mask), &mask);

内核启动参数:

代码语言:javascript复制
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核上

代码语言:javascript复制
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);

0 人点赞