Ale*_*kov 2 linux linux-kernel
dir中有文件product_uuid和product_serial文件/sys/class/dmi/id/.
它是如何生成的?
这些值在内核代码中生成.您可以git grep在内核源目录中使用命令(使用您感兴趣的关键字)轻松找到它们:
$ git grep --all-match -n -e '\bdmi\b' -e product_uuid -e product_serial
Run Code Online (Sandbox Code Playgroud)
因此,product_uuid和product_serial在创建的sysfs节点的驱动/固件/ DMI-id.c:
DEFINE_DMI_ATTR_WITH_SHOW(product_serial, 0400, DMI_PRODUCT_SERIAL);
DEFINE_DMI_ATTR_WITH_SHOW(product_uuid, 0400, DMI_PRODUCT_UUID);
Run Code Online (Sandbox Code Playgroud)
根据DEFINE_DMI_ATTR_WITH_SHOW定义,您可以看到两个属性都是通过sys_dmi_field_show()函数访问的,而函数又调用dmi_get_system_info(),它只返回dmi_ident数组中的相应元素.此表填充在dmi_decode()例程中:
dmi_save_ident(dm, DMI_PRODUCT_SERIAL, 7);
dmi_save_uuid(dm, DMI_PRODUCT_UUID, 8);
Run Code Online (Sandbox Code Playgroud)
因此product_uuid在dmi_save_uuid()函数中生成.只需阅读其代码即可了解它是如何完成的.
product_serial在dmi_save_ident()函数中生成.归结为代码如下:
(struct dmi_header *)(dmi_base)[7];
Run Code Online (Sandbox Code Playgroud)
其中dmi_base是DMI表的地址(显然重新映射到虚拟内存),并且7对应于DMI_PRODUCT_SERIAL常量.
为了更好地理解这一点,请参阅SMBIOS规范,具体来说Table 9 – System Information (Type 1) Structure,它对应于此命令:
# dmidecode --type 1
Run Code Online (Sandbox Code Playgroud)
有什么不同?
至于product_uuid- 看看SMBIOS规范,部分7.2.1 System - UUID.它有描述,也有这个数字的每个部分的解释表.使用该表,您可以解码您的UUID并从中提取一些信息,如时间戳等.
至于product_serial- 我相信这是不言自明的,它只是您设备的序列号.您通常可以在计算机上的贴纸上找到它.例如,对于我的笔记本电脑,它位于底部.它与我看到的字符串相同/sys/class/dmi/id/product_serial.
我可以更改这些文件吗?
这些文件实际上不是真正的文件,而只是内核函数的接口.阅读有关sysfs的详细信息.因此,为了"更改"这些文件,您需要相应地编辑所提到的内核文件,然后重建整个内核并启动它(而不是您的发行版提供的内核).
另外,正如@ChristopheVu-Brugier在评论中提到的那样,您可以在DMI表中更改这些值(虽然有些棘手).但我不推荐它.这些值肯定有一定的含义,在某些情况下可能有用(如果不适合你,那么对于PC中的某些软件).
重新安装操作系统后会保存一个值吗?
这些值实际上是从DMI表获得的,DMI表与BIOS一起硬编码到永久存储器(主板上带有BIOS的闪存芯片),你只需通过读取这些文件就可以使用内核函数从这个DMI表中读取这些值.
| 归档时间: |
|
| 查看次数: |
5755 次 |
| 最近记录: |