从Android源码修改cpu信息

cpuinfo

网上的文章都是怎么查看/proc/cpuinfo,一直以为这种东西没法改呢,我还是太天真了。/proc/cpuinfo是个特殊文件,想直接写肯定不行的。今天研究了一下,发现它的输出逻辑在:
kernel/[品牌]/[机型代号]/arch/[cpu架构]/kernel/setup.c,修改c_show(struct seq_file *m, void *v)方法,用seq_printf,想输出啥都可以。特地下Linux内核源码下来看,不止Android,其他Linux路径都是类似的。

cpu频率

平常我们通过shell命令查看cpu频率的办法,都是读取/sys/devices/system/cpu/cpu0/cpufreq下的cpuinfo_min_freqcpuinfo_max_freq,它们分别代表cpu的最小频率和最大频率,这个几个文件也是可以修改的,修改后并不是你的cpu就会变快,而是可以骗过某些软件,修改方法如下:在kernel/[品牌]/[型号]/drivers/cpufreq/cpufreq.c找到

show_one(cpuinfo_min_freq, cpuinfo.min_freq);
show_one(cpuinfo_max_freq, cpuinfo.max_freq);

把它们注释掉,修改成以下两行

show_cpu_min_freq(cpuinfo_min_freq, cpuinfo.min_freq);
show_cpu_max_freq(cpuinfo_max_freq,cpuinfo.max_freq);

上面的show_one其实是一个宏定义,那我们也要创建相应的宏。

#define show_cpu_min_freq(file_name, object)			\
static ssize_t show_##file_name				\
(struct cpufreq_policy *policy, char *buf)		\
{							\
	return sprintf(buf, "%u\n", 307200);	\
}

#define show_cpu_max_freq(file_name, object)			\
static ssize_t show_##file_name				\
(struct cpufreq_policy *policy, char *buf)		\
{							\
	return sprintf(buf, "%u\n", 1593600);	\
}

上面的307200和1593600就是我们要修改成的最小频率和最大频率。

cpu核心数

通常,我们想知道cpu核心数是通过读取内核文件得到的,读取方法如下:
cpu可用核心数:cat /sys/devices/system/cpu/possible
cpu总核心数:cat /sys/devices/system/cpu/present
如果想要修改,在Android源码的kernel/kernel/cpu.c文件中:
void set_cpu_possible(unsigned int cpu, bool possible)方法用于设置可用核心数
void set_cpu_present(unsigned int cpu, bool present)方法用于设置总核心数

但是,修改这些信息很有可能会导致无法启动,如有需求,请尝试动态修改!

测试

在Android,修改后执行make bootimage编译内核源码,编译成功后会生成boot.img。让手机进fastboot模式,在源码目录执行fastboot flash boot $OUT/boot.img就把boot.img刷入手机了,重启手机就可以测试。

你可能感兴趣的:(Linux)