更改所检测到第三方手机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. ubuntu12.10下arm-linux-gcc交叉编译环境的搭建

    交叉编译环境搭建的原因:通俗上讲,因为嵌入式系统可用资源比较少:几十M的ARM 二三百M的flash相对我们的pc机来说资源真的没法比.所以,为了解决这种局面就将PC机等作为主机,搭建开发环境,进行编 ...

  2. 高级Bash脚本编程指南(27):文本处理命令(三)

    高级Bash脚本编程指南(27):文本处理命令(三) 成于坚持,败于止步 处理文本和文本文件的命令 tr 字符转换过滤器. 必须使用引用或中括号, 这样做才是合理的. 引用可以阻止shell重新解释出 ...

  3. sqlserver 自学笔记 函数实训 学分学期转换函数的设计

    设计目的: 1.运用sql基本知识,编写学期转换函数. 2.运用sql基本知识,编写学分转换函数,将考试成绩转换为学分 3.通过上述函数的编写与调试,熟练掌握 sql函数的编写.调试与使用方法. 设计 ...

  4. NetBSD是个开源到源码的系统

    How to get NetBSD NetBSD is an Open Source operating system, and as such it is freely available for ...

  5. codeforces 325B Stadium and Games

    这道题思路很简单,设刚开始队伍数为d=2^p*x,其中x是奇数,则比赛场次n=(2^p-1)*x+(x-1)*x/2,然后从0开始枚举p的值,接着解一元二次方程x^2+(2^(p+1)-3)x-2*n ...

  6. Android开发技术周报

    Android开发技术周报 原文  http://androidweekly.cn/android-dev-weekly-issue48/ 教程 深入理解Android之Gradle Gradle是当 ...

  7. 201215-03-19---cocos2dx内存管理--具体解释

    因为cocos2dx我们的使用c++写的,所以内存管理就是一个绕只是去的坎,这个你不懂内存仅仅懂业务逻辑的话,还玩什么c++,今天看了半天这个东西,事实上本质上是理解的,可是就是有一个过不去的坎,最终 ...

  8. sdbntrjm57k

    http://www.zhihu.com/collection/24337307 http://www.zhihu.com/collection/24337259 http://www.zhihu.c ...

  9. atitit.高级编程语言的特性 and 未来趋势与进化.doc

    atitit.高级编程语言的特性 and 未来趋势与进化.doc 1 编程语言的发展历程 1 1.1 编程语言的进化,起始发现背后的思想 :不论什么两个系统之间的复杂性,都能够通过加入一个抽象层要屏蔽 ...

  10. 跟我extjs5(38--单个模块的设计[6获得模块列表数据])

    跟我extjs5(38--单个模块的设计[6获得模块列表数据])         在程序的前一个表以及,据的执行过程. 在菜单中选择 "系统管理"--"模块分组" ...