更改所检测到第三方手机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厂商信息的更多相关文章

  1. 039_显示 CPU 厂商信息

    #!/bin/bash# 找到包含vendor_id的行打印第3列去重显示 awk '/vendor_id/{print $3}' /proc/cpuinfo | uniq

  2. Firefox 的User Agent 将移除 CPU 架构信息

    Mozilla 计划从 Firefox 的 User Agent(用户代理)和几个支持的 API 中移除 CPU 架构信息,以减少 Firefox 用户的“数字指纹”.Web 浏览器会自动向用户在应用 ...

  3. linux系统从pci.ids文件获取硬件设备详细厂商信息

    机器采样: [root@ht24 hwdata]# cat /etc/redhat-release ; uname -r CentOS Linux release 7.9.2009 (Core) 3. ...

  4. CPU相关信息

    unit untCpuInfo;interface{ 获取 CPU 制造商 }function GetCpuFactory: String;{ 获取 CPU 家族系统 }function GetCpu ...

  5. Linux系统CPU相关信息查询

    Linux系统CPU相关信息查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.lscpu常用参数介绍 1>.查看帮助信息 [root@node105 ~]# lscpu ...

  6. aix 查看内存,CPU 配置信息

    内存lsattr -El mem0cpu lsdev -C |grep procCPU的信息lsattr -El proc0   #bootinfo -r查看物理内存     使用命令#  lsdev ...

  7. 统计cpu相关信息

    我的cpu为i3310m 适用类型:笔记本 CPU系列:酷睿i3 3代系列 CPU主频:2.4GHz 三级缓存:3MB 插槽类型:FCBGA1023,FCPGA988 封装大小:37.5×37.5mm ...

  8. top命令之你不一定懂的cpu显示信息

    %st(Steal time) 是当 hypervisor 服务另一个虚拟处理器的时候,虚拟 CPU 等待实际 CPU 的时间的百分比. ------------------------------- ...

  9. CentOS命令top下你不一定懂的cpu显示信息

    在使用top命令的时候会看到这么一行: 里面的各个值分别是什么意思呢? 今天被问到这个问题,发现答的不是很清楚.果然啊,天天用最多的top命令都还没摸透...惭愧...于是就查了些资料: 官方解释 C ...

随机推荐

  1. 单页应用Scrat实践

    单页应用Scrat实践 1.开始 随着前端工程化深入研究,前端工程师现在碉堡了,甚至搞了个自己的前端网站http://div.io/需要邀请码才能注册,不过里面的技术确实牛.距离顶级的前端架构,目前博 ...

  2. iOS8指纹识别TouchID

    苹果在2014年6月3日的WWDC2014开幕式上推出了新版iOS8系统,界面上iOS8与iOS7相比变化不大,只是在功能方面进行了完好.iOS8通知中心更加强大,支持消息直接回复操作,并支持Quic ...

  3. 硬盘重装Ubuntu12.04的感受

    好久没更blog了,最近这两天系统也出了问题,win7蓝屏,ubuntu进不去-.后来win7整好了,ubuntu依旧顽固.用惯了linux,就不想在转到win7下面了,估计是习惯了各种敲命令的感觉吧 ...

  4. UpdataData

    MFC中有一个UpdataData函数,有二个参数:TRUE和FLASE,二个参数什么时候用, 开始的时候我也迷糊,后来才发现: UpdataData(TRUE):是把控件上的值刷新到变量中: Upd ...

  5. [C++]函数参数浅析

    Date:2014-1-9 Summary: 函数参数相关记录 Contents:1.形参实参 形参:用于接收值的变量被称为形参 实参:传递给函数的值被称为实参 2.函数的参数传递之后2种 a).值传 ...

  6. - Shell - sort处理大文件(页 1) - ChinaUnix.net

    - Shell - sort处理大文件(页 1) - ChinaUnix.net sort处理大文件

  7. JavaScript 中的继承(读书笔记思维导图)

    继承是 OO 语言中的一个最为人津津乐道的概念.许多 OO 语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.由于函数没有签名,在 ECMAScript ...

  8. DataTable数据转换为实体

    我们在用三层架构编写软件时,常常会遇到例如以下问题,就是三层之间的參数传递问题:假设我们在D层查询出数据是DataTable类型的,那么我们在B层甚至U层使用这条数据时,就要用DataTable类型来 ...

  9. PowerDesigner中SQL文件、数据库表反向生成PDM

    1      反向生成PDM 1)        创建一个空的PDM模型(选择相应的DBMS): 2)        选择[Database]--[Update Model from Database ...

  10. 新浪SAE数据库信息

    此账号仅能在SAE平台上使用,不能从外部连接我们建议开发者使用SaeMysql操作数据库 如果您想自己实现数据库相关操作,可以使用以下常量: 用户名  : SAE_MYSQL_USER 密 码 : S ...