您的位置:首页 > 其它

更改CPU厂商信息

2015-10-26 12:57 393 查看
更改所检测到第三方手机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
= 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
= 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命令,能够看到的所有属性值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: