Я пытаюсь сделать mmap для PCI CSR bar. Mmap не работает с ошибкой EINVAL. Ниже приведен мой фрагмент кода.
</p>
<pre><code>snprintf(csr_bar_path,256,"/sys/bus/pci/devices/0000:16:00.0/resource2");
csr_fd = open(csr_bar_path,O_RDWR | O_SYNC);
if(csr_fd < 0)
{
printf("Cannot open CSR bar file %s\n",csr_bar_path);
}
if(fstat(csr_fd,&sb) == -1)
{
printf("CSR file size = %d\n",sb.st_size);
close(csr_fd);
}
printf("CSR file size OK = %d\n",sb.st_size);
csr_bar = (unsigned char *)mmap(NULL,sb.st_size,PROT_READ |
PROT_WRITE,MAP_SHARED,csr_fd,0);
if(csr_bar == (void *) -1)
{
printf("mmap failed for CSR bar %s %d\n",strerror(errno),errno);
close(csr_fd);
}
Значение, полученное для sb.st_size, равно 65536. Но mmap не удалось выполнить со строкой ошибки «Неверный аргумент». Тот же фрагмент кода отлично работает в RHEL 7.2, но не работает в операционной системе SLES15.