运行dmesg
并 grep[sda] Mode Sense:
返回一行,如下所示:
[sda] Mode Sense: 00 3a 00 00
这4个字节的数据代表什么00 3a 00 00
?
答案很可能包含在后续的输出行中,例如:
[sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
...但我想知道如何将数据映射到描述
答案1
它们是从模式检测命令返回的缓冲区中的前四个字节(请参阅 drivers/scsi/sd.c、sd_mode_sense())。可以通过查看 drivers/scsi/scsi_lib.c, scsi_mode_sense()) 来了解其含义:该例程返回一个名为“data”的结构,根据注释,该结构抽象了模式头数据;缓冲区中的前两个字节(00和3a)是“data”长度减2的高位/低位字节,第三个字节(00)是media_type,第四个字节是设备特定的:
data->length = buffer[0]*256 + buffer[1] + 2;
data->medium_type = buffer[2];
data->device_specific = buffer[3];
所以 data->length 是 0*256 + 0x3a + 2 = 60,medium_type 是 0,谁知道第四个字节意味着什么......(顺便说一句,printk
打印 Mode Sense: 行被标记,KERN_DEBUG
所以它实际上不适合经常消费)。
您可以使用包sg_modes
中的sg3_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
你提到的另一行:
Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
sd_read_cache_type
由中的例程产生drivers/scsi/sd.c
。它使用几个不同的来源来获取该信息:通过查看 modepage==8 缓冲区的特定字节来获取写入和读取缓存信息; DPO/FUA信息是从上述“数据”结构中获得的(尽管它不一定包含相同的数据:两次调用中使用的模式页可能不同)。
AFAICT,这一行的信息和上面调试行的信息是不是直接相关。