更改CPU厂商信息
更改所检测到第三方手机CPU制造商型号,于kernel\arch\arm\mach-msm以下适当Board-*.c更改文件。例如我们8226的CPU。必要的Board-8226.c在里面DT_MACHINE_START(MSM8226_DT, "Qualcomm MSM 8226 (Flattened Device Tree)") 这里的8226改成客户指定的型号。比方要改成8926。就要这么改:
DT_MACHINE_START(MSM8226_DT, "Qualcomm MSM 8926 (Flattened Device Tree)"),这里改动的值。实际上是 proc/cpuinfo这个文件中的值. 网上有的人说是要改ro.boot.hardware这个属性值。改这个值。确实是改变了CPU的厂商信息,详细到代码,也就是改了CPU的hardware信息,可是这样改的话。是会导致手机找不到相应的init.hardware.rc文件,比方我们8226的芯片。假设你把hardware改成了8926,那么开机时会找不到init.8926.rc这个文件。而导致开不了机。第三方检測工具,比方安兔兔,都是直接读的cpuinfo这个文件的内容,
详细的和CPU厂商名,即cpu的hardware相关的开机流程梳理下,就会明确了。
我们手机开机时。载入完linux内核后。会立即调用用户空间的第一个程序:init.在init程序的主函数main里。我们仅仅须要关注以下三个函数:
property_init();
get_hardware_name(hardware, &revision);
process_kernel_cmdline();
当中property_init主要是为属性分配一些存储空间,该函数并非核心。
只是当我们查看init.rc文件时会发现该文件開始部分用一些import语句导入了其它的配置文件,比如,/init.usb.rc。大多数配置文件都直接使用了确定的文件名称,仅仅有例如以下的代码使用了一个变量(${ro.hardware})运行了配置文件名称的一部分。那么这个变量值是从哪获得的呢?
import /init.${ro.hardware}.rc
首先要了解init.${ro.hardware}.rc配置文件的内容通常与当前的硬件有关。 如今我们先来关注get_hardware_name函数。代码例如以下:
[cpp] view plaincopy
void get_hardware_name(char *hardware, unsigned int *revision)
{
char data[1024];
int fd, n;
char *x, *hw, *rev;
/* 假设hardware已经有值了。说明hardware通过内核命令行提供。直接返回 */
if (hardware[0])
return;
// 打开/proc/cpuinfo文件
fd = open("/proc/cpuinfo", O_RDONLY);
if (fd < 0) return;
// 读取/proc/cpuinfo文件的内容
n = read(fd, data, 1023);
close(fd);
if (n < 0) return;
data[n] = 0;
// 从/proc/cpuinfo文件里获取Hardware字段的值
hw = strstr(data, "\nHardware");
rev = strstr(data, "\nRevision");
// 成功获取Hardware字段的值
if (hw) {
x = strstr(hw, ": ");
if (x) {
x += 2;
n = 0;
while (*x && *x != '\n') {
if (!isspace(*x))
// 将Hardware字段的值都转换为小写,并更新hardware參数的值
// hardware也就是在init.c文件里定义的hardware数组
hardware[n++] = tolower(*x);
x++;
if (n == 31) break;
}
hardware[n] = 0;
}
}
if (rev) {
x = strstr(rev, ": ");
if (x) {
*revision = strtoul(x + 2, 0, 16);
}
}
}
从get_hardware_name方法的代码能够得知,该方法主要用于确定hardware和revision的变量的值。Revision这里先不讨论,仅仅要研究hardware。
获取hardware的来源是从Linux内核命令行或/proc/cpuinfo文件里的内容。
Linux内核命令行暂且先不讨论(由于非常少传递该值),先看看/proc/cpuinfo。该文件是虚拟文件(内存文件)。运行cat /proc/cpuinfo命令会看到该文件里的内容。我们如今8226的手机,输入这命令后显示的信息为:Hardware
: Qualcomm MSM 8926 (Flattened Device Tree)。 假设程序就到此为止的话,那么与硬件相关的配置文件名称就是:init.QualcommMSM8926(FlattenedDeviceT.rc,于与中间为什么是“QualcommMSM8926(FlattenedDeviceT”,大伙能够自己看下get_hardware_name这个函数是怎么定义的就知道了。
如今我们的这套高通的代码,在运行完get_hardware_name函数后面又调用了process_kernel_cmdline函数。代码例如以下:
[cpp] view plaincopy
static void process_kernel_cmdline(void)
{
/* don't expose the raw commandline to nonpriv processes */
chmod("/proc/cmdline", 0440);
// 导入内核命令行參数
import_kernel_cmdline(0, import_kernel_nv);
if (qemu[0])
import_kernel_cmdline(1, import_kernel_nv);
// 用属性值设置内核变量
export_kernel_boot_props();
}
在process_kernel_cmdline函数中除了使用import_kernel_cmdline函数导入内核变量外。基本的功能就是调用export_kernel_boot_props函数通过属性设置内核变量,比如,通过ro.boot.hardware属性设置hardware变量,也就是说能够通过ro.boot.hardware属性值能够改动get_hardware_name函数中从/proc/cpuinfo文件里得到的hardware字段值。以下看一下export_kernel_boot_props函数的代码。
[cpp] view plaincopy
static void export_kernel_boot_props(void)
{
char tmp[PROP_VALUE_MAX];
const char *pval;
unsigned i;
struct {
const char *src_prop;
const char *dest_prop;
const char *def_val;
} prop_map[] = {
{ "ro.boot.serialno", "ro.serialno", "", },
{ "ro.boot.mode", "ro.bootmode", "unknown", },
{ "ro.boot.baseband", "ro.baseband", "unknown", },
{ "ro.boot.bootloader", "ro.bootloader", "unknown", },
};
// 通过内核的属性设置应用层配置文件的属性
for (i = 0; i < ARRAY_SIZE(prop_map); i++) {
pval = property_get(prop_map[i].src_prop);
property_set(prop_map[i].dest_prop, pval ?
: prop_map[i].def_val);
}
// 依据ro.boot.console属性的值设置console变量
pval = property_get("ro.boot.console");
if (pval)
strlcpy(console, pval, sizeof(console));
/* save a copy for init's usage during boot */
strlcpy(bootmode, property_get("ro.bootmode"), sizeof(bootmode));
/* if this was given on kernel command line, override what we read
* before (e.g. from /proc/cpuinfo), if anything */
// 获取ro.boot.hardware属性的值
pval = property_get("ro.boot.hardware");
if (pval)
// 这里通过ro.boot.hardware属性再次改变hardware变量的值
strlcpy(hardware, pval, sizeof(hardware));
// 利用hardware变量的值设置设置ro.hardware属性
// 这个属性就是前面提到的设置初始化文件名称的属性,实际上是通过hardware变量设置的
property_set("ro.hardware", hardware);
snprintf(tmp, PROP_VALUE_MAX, "%d", revision);
property_set("ro.revision", tmp);
/* TODO: these are obsolete. We should delete them */
if (!strcmp(bootmode,"factory"))
property_set("ro.factorytest", "1");
else if (!strcmp(bootmode,"factory2"))
property_set("ro.factorytest", "2");
else
property_set("ro.factorytest", "0");
}
从export_kernel_boot_props函数的代码能够看出,该函数实际上就是来回设置一些属性值。而且利用某些属性值改动console、hardware等变量。
当中hardware变量(就是一个长度为32的字符数组)在get_hardware_name函数中已经从/proc/cpuinfo文件里获得过一次值了,在export_kernel_boot_props函数中又通过ro.boot.hardware属性设置了一次值。最后用hardware变量设置ro.hardware属性,我们8226的代码里的这个值性值ro.boot.hardware为:qcom,所以最后的初始化文件名称为init.qcom.rc。到此就分析完了。至于怎样查看ro.boot.hardware的值。能够用adb命令,进入到/dev/socket文件夹后,。进getprop命令,能够看到的所有属性值
版权声明:本文博主原创文章,博客,未经同意不得转载。
更改CPU厂商信息的更多相关文章
- 039_显示 CPU 厂商信息
#!/bin/bash# 找到包含vendor_id的行打印第3列去重显示 awk '/vendor_id/{print $3}' /proc/cpuinfo | uniq
- Firefox 的User Agent 将移除 CPU 架构信息
Mozilla 计划从 Firefox 的 User Agent(用户代理)和几个支持的 API 中移除 CPU 架构信息,以减少 Firefox 用户的“数字指纹”.Web 浏览器会自动向用户在应用 ...
- linux系统从pci.ids文件获取硬件设备详细厂商信息
机器采样: [root@ht24 hwdata]# cat /etc/redhat-release ; uname -r CentOS Linux release 7.9.2009 (Core) 3. ...
- CPU相关信息
unit untCpuInfo;interface{ 获取 CPU 制造商 }function GetCpuFactory: String;{ 获取 CPU 家族系统 }function GetCpu ...
- Linux系统CPU相关信息查询
Linux系统CPU相关信息查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.lscpu常用参数介绍 1>.查看帮助信息 [root@node105 ~]# lscpu ...
- aix 查看内存,CPU 配置信息
内存lsattr -El mem0cpu lsdev -C |grep procCPU的信息lsattr -El proc0 #bootinfo -r查看物理内存 使用命令# lsdev ...
- 统计cpu相关信息
我的cpu为i3310m 适用类型:笔记本 CPU系列:酷睿i3 3代系列 CPU主频:2.4GHz 三级缓存:3MB 插槽类型:FCBGA1023,FCPGA988 封装大小:37.5×37.5mm ...
- top命令之你不一定懂的cpu显示信息
%st(Steal time) 是当 hypervisor 服务另一个虚拟处理器的时候,虚拟 CPU 等待实际 CPU 的时间的百分比. ------------------------------- ...
- CentOS命令top下你不一定懂的cpu显示信息
在使用top命令的时候会看到这么一行: 里面的各个值分别是什么意思呢? 今天被问到这个问题,发现答的不是很清楚.果然啊,天天用最多的top命令都还没摸透...惭愧...于是就查了些资料: 官方解释 C ...
随机推荐
- Swift - 文本标签(UILabel)的用法
1,标签的创建 1 2 3 4 5 6 7 8 9 10 import UIKit class ViewController: UIViewController { override func ...
- Swift - 控制流/控制结构说明(if,switch,for,while)
1,if语句 1 2 3 4 5 if count >=3 { println("yes") }else{ println("no") } ...
- WM_ERASEBKGND官方解释(翻译),以及Delphi里所有的使用情况(就是绘制窗口控件背景色,并阻止进一步传递消息)
#define WM_ERASEBKGND 0x0014 Parameters wParam A handle to the device context. // ...
- 如何debug ruby
how to debug ruby: 1. 第一种方法,直接使用ruby内建的debug在命令行调试,这个个gdb或者pdb的命令差不多. ruby -r debug yourubyfile.rb 2 ...
- NET平台机器学习组件-Infer.NET
NET平台机器学习组件-Infer.NET(三) Learner API—数据映射与序列化 阅读目录 关于本文档的说明 1.基本介绍 2.标准数据格式的映射 3.本地数据格式映射 4.评估数据格式映射 ...
- 编程算法 - 萨鲁曼的军队(Saruman's Army) 代码(C)
萨鲁曼的军队(Saruman's Army) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 直线上有N个点, 每个点, 其距离为R以内的区域里 ...
- nginx & flup & django & python3.x @ window7配置备忘录
最近考虑原Prism建筑(非职业.半专业人士认为C/S建筑)至B/S迁移,主要是由于部署问题,包括两个因素:已经做,虽然一键安装和部署的一个因素,心存顾虑,虽然我一再声明这是一个绿色软件.还有一个因素 ...
- 《windows核心编程系列》十八谈谈windows钩子
windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...
- linux的tr命令
tr(translate缩写)主要用于删除文件中的控制字符,或进行字符转换. 语法 tr [ -c | -cds | -cs | -C | -Cds | -Cs | -ds | -s] [ -A] S ...
- android中file的使用实例
File是android的4种存储方式的一种.File就是文件的意思一个文件,你无非是想进行读写操作.所以这就用到两个流.一个数输入流,一个是输出流.FileOutstream,和FileInputS ...