dmesg 输出 - 模式检测 - 字节说明

Jus*_*se1 4 linux scsi

运行dmesg并 grep[sda] Mode Sense:返回如下一行:

[sda] Mode Sense: 00 3a 00 00
Run Code Online (Sandbox Code Playgroud)

4 个字节的数据代表00 3a 00 00什么?

答案很可能包含在输出的后续行中,例如:

[sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
Run Code Online (Sandbox Code Playgroud)

...但我想知道如何将数据映射到描述

Nic*_*ckD 5

它们是从模式检测命令返回的缓冲区中的前四个字节(参见drivers/scsi/sd.c、sd_mode_sense())。可以通过查看drivers/scsi/scsi_lib.c、scsi_mode_sense())了解其含义:该例程返回一个名为“data”的结构,根据注释,该结构抽象了模式头数据;缓冲区中的前两个字节(00 和 3a)是“数据”长度减 2 的高位/低位字节,第三个字节 (00) 是 medium_type,第四个字节是特定于设备的:

        data->length = buffer[0]*256 + buffer[1] + 2;
        data->medium_type = buffer[2];
        data->device_specific = buffer[3];
Run Code Online (Sandbox Code Playgroud)

所以 data->length 是 0*256 + 0x3a + 2 = 60,medium_type 是 0,谁知道第四个字节是什么意思......(顺便说一句,printk打印 Mode Sense: 行的那个被标记了KERN_DEBUG所以它真的不适合经常食用)。

您可以使用sg_modesfromsg3_utils包来检查这样的事情,而不必费力去翻译它们:

 # sg_modes -a /dev/sg0
    ATA       SAMSUNG MZ7LN512  4L0Q   peripheral_type: disk [0x0]
Mode parameter header from MODE SENSE(10):
  Mode data length=60, medium type=0x00, WP=0, DpoFua=0, longlba=0
  Block descriptor length=8
> Direct access device block descriptors:
   Density code=0x0
 00     00 00 00 00 00 00 02 00

>> Read-Write error recovery, page_control: current
 00     01 0a 80 00 00 00 00 00  00 00 00 00
>> Caching, page_control: current
 00     08 12 04 00 00 00 00 00  00 00 00 00 00 00 00 00
 10     00 00 00 00
>> Control, page_control: current
 00     0a 0a 02 00 00 00 00 00  ff ff 00 1e
Run Code Online (Sandbox Code Playgroud)

你提到的另一行:

Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
Run Code Online (Sandbox Code Playgroud)

由常规生产sd_read_cache_typedrivers/scsi/sd.c。它为该信息使用了几个不同的来源:通过查看 modepage==8 缓冲区的特定字节获取写入和读取缓存信息;DPO/FUA信息是从上述“数据”结构中获取的(虽然不一定包含相同的数据:两次调用中使用的modepages可能不同)。

AFAICT,此行上的信息和上面调试行上的信息没有直接关系。