Всем привет!
Решил задать вопрос в связи с тем, что застопорился на одной проблеме уже. Пишу C-ный софт под Линукс. Это не драйвер, софт работает в User Space под root'ом с AHCI-контроллером и SATA-дисками, подключенными к нему через 4 SATA-порта. Все пытаюсь делать согласно спецификации Интела:
http://www.intel.com/content/www/us/en/io/serial-ata/serial-ata-ahci-spec-rev1_3.html и с подсказками на этой wiki-странице:
http://wiki.osdev.org/AHCIЯ успешно получил физический адрес ABAR5 и замаппил через mmap его на структуру HBA_MEM. Все порты у меня работают и обновляют свое состояние в уже виртуальной памяти, выделенной mmap. То есть у порта при подключении/отключении диска обновляется ряд регистров: например, меняется PxTFD, в котором показываются регистры статуса и ошибки диска.
ПРОБЛЕМА:
Не получается отправить Register FIS через PxCLB. При чем до отправки дело даже не до ходит. Не могу доступиться к памяти, на которую указывает поле порта PxCLB. Это физический адрес, на все попытки маппинга, которого через mmap, у меня приходит MAP_FAILED (то есть -1). Так же пытался выделить память через memalign и проставить туда указатель на нее, как это делается в OSDev Wiki AHCI, но так как софт работает в User Space, это в корни не верно...
Как же все таки доступиться к памяти по адресу PxCLB, чтобы записать туда Registry FIS?