Justchoose1 Asked: 2018-01-18 11:29:56 +0800 CST2018-01-18 11:29:56 +0800 CST 2018-01-18 11:29:56 +0800 CST dmesg 输出 - 模式感知 - 字节说明 772 运行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 ...但我想知道如何将数据映射到描述 linux scsi 1 个回答 Voted Best Answer NickD 2018-01-18T16:24:12+08:002018-01-18T16:24:12+08:00 它们是从模式检测命令返回的缓冲区中的前四个字节(请参阅 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]; 所以 data->length 是 0*256 + 0x3a + 2 = 60,medium_type 是 0,谁知道第四个字节是什么意思......(顺便说一句,printk打印 Mode Sense: line 的标签KERN_DEBUG,所以它真的不适合经常消费)。 您可以使用sg_modesfrom the sg3_utilspackage 来检查这样的内容,而无需费力地翻译它们: # 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,这一行的信息和上面调试行的信息没有直接关系。
它们是从模式检测命令返回的缓冲区中的前四个字节(请参阅 drivers/scsi/sd.c,sd_mode_sense())。通过查看drivers/scsi/scsi_lib.c, scsi_mode_sense()) 可以了解其含义:此例程返回一个名为“data”的结构,根据注释,该结构抽象了模式头数据;缓冲区中的前两个字节(00 和 3a)是“数据”长度减 2 的高位/低位字节,第三个字节 (00) 是 medium_type,第四个字节是设备特定的:
所以 data->length 是 0*256 + 0x3a + 2 = 60,medium_type 是 0,谁知道第四个字节是什么意思......(顺便说一句,
printk
打印 Mode Sense: line 的标签KERN_DEBUG
,所以它真的不适合经常消费)。您可以使用
sg_modes
from thesg3_utils
package 来检查这样的内容,而无需费力地翻译它们:您提到的另一行:
由 中的例程
sd_read_cache_type
产生drivers/scsi/sd.c
。它使用几个不同的来源来获取该信息:写入和读取缓存信息是通过查看 modepage==8 缓冲区的特定字节获得的;DPO/FUA 信息是从上述“数据”结构中获得的(尽管它不一定包含相同的数据:两个调用中使用的模式页可能不同)。AFAICT,这一行的信息和上面调试行的信息没有直接关系。