man 2 read
говорит:
EINVAL fd прикреплен к объекту, который не подходит для чтения;или файл был открыт с флагом O_DIRECT, и либо адрес, указанный в buf, значение, указанное в count, либо текущее смещение файла, не выровнен надлежащим образом.
Non-direct I/O
не имеет таких ограничений, но почему прямой ввод / вывод требует выравнивания?