2011-01-16 4 views
1

Коллеги,ATA Доверенных команд в Linux

Я реализует поддержку ATA доверенных команды

0x5C, TRUSTED RECEIVE, 
0x5D, TRUSTED RECEIVE DMA, 
0x5E, TRUSTED SEND 
0x5F, TRUSTED SEND DMA, 

для Linux (два хоста, Fedora 12 и 14) для поддержки самошифрования дисков. Я взял код с этой страницы http://www.jukie.net/bart/blog/ata-via-scsi в качестве базового кода. Для доверенного получить (на этом слое он идентичен ОПРЕДЕЛИТЬ, 0xEC):

sg_io.interface_id = 'S'; 
sg_io.cmdp   = cdb; 
sg_io.cmd_len   = sizeof(cdb); 
sg_io.dxferp   = data_in_buffer; 
sg_io.dxfer_len  = data_in_length;   // multiple of 512 
sg_io.dxfer_direction = SG_DXFER_FROM_DEV; 
sg_io.sbp    = sense; 
sg_io.mx_sb_len  = sizeof(sense); 
sg_io.timeout   = 5000;     // 5 seconds 


cdb[0] = 0x85;   // pass-through ATA16 command (no translation) 
cdb[1] = (4 << 1);  // data-in 
cdb[2] = 0x2e;   // data-in 
cdb[4] = feature_id;  // ATA feature ID 
cdb[6] = 1;    // number of sectors 
cdb[7] = lba_low >> 8; 
cdb[8] = lba_low; 
cdb[9] = lba_mid >> 8; 
cdb[10] = lba_mid; 
cdb[11] = lba_high >> 8; 
cdb[12] = lba_high; 
cdb[14] = 0x5C;   // TRUSTED RECEIVE 

rc = ioctl (fd, SG_IO, &sg_io); 

Он отлично работает для Идентифицировать и все другие команды, но не для доверенных команд. Когда я подключаю анализатор протоколов, я вижу, что эти команды не отправляются на шину SATA. Адаптер способен отправлять их, потому что они идут ОК под Windows (не мой код, но я думаю, используя ATA_PASS_THROUGH). И да, я запускаю этот код как root.

Пожалуйста, помогите решить эту загадку :)

+0

какие lba_low, lba_mid и lba_high .. Как я могу найти информацию о настройке этих переменных? – Nick

ответ

4

См /usr/src/linux/drivers/ata/libata-scsi.c:

/* 
* Filter TPM commands by default. These provide an 
* essentially uncontrolled encrypted "back door" between 
* applications and the disk. Set libata.allow_tpm=1 if you 
* have a real reason for wanting to use them. This ensures 
* that installed software cannot easily mess stuff up without 
* user intent. DVR type users will probably ship with this enabled 
* for movie content management. 
* 
* Note that for ATA8 we can issue a DCS change and DCS freeze lock 
* for this and should do in future but that it is not sufficient as 
* DCS is an optional feature set. Thus we also do the software filter 
* so that we comply with the TC consortium stated goal that the user 
* can turn off TC features of their system. 
*/ 
if (tf->command >= 0x5C && tf->command <= 0x5F && !libata_allow_tpm) 
     goto invalid_fld; 
+0

Благодарю вас, спасибо, Ephemient! –

+0

Кажется, что «modprobe libata allow_tpm = 1» не работает на моей Fedora 14. –

+0

@Dmitry: он не работает, если 'libata' уже загружен. Вам нужно будет загрузиться с 'libata.allow_tpm = 1' в командной строке ядра или с' options libata allow_tpm = 1' в '/ etc/modprobe.conf' или' /etc/modprobe.d/*. Conf' , в зависимости от того, как система настроена. – ephemient