小编mhk*_*mhk的帖子

使用mmap进行PCI-e内存空间访问

我在飞思卡尔MPC8308处理器(基于PowerPC架构)上使用PCI-e端口,尝试使用它时遇到一些问题。端点PCI-e设备的内存空间等于256 MB。通过使用“ pciutils”包,我可以轻松读写端点设备的配置空间。

在配置寄存器中写入正确的值并获得访问内存空间的权限后;我试图通过在C语言中使用“ mmap()”函数来访问内存空间,并使用位于以下位置的文件描述符:

“ /sys/devices/pci0000:00/0000:00:00.0/resource0”

这恰好是256 MB(等于端点设备的内存空间),因此看来我在使用正确的文件描述符路径。在这里,您可以使用https://github.com/billfarrow/pcimem中提到的“ mmap()”找到我的代码:

https://github.com/billfarrow/pcimem/blob/master/pcimem.c

但是不幸的是,当我尝试通过使用“ mmap()”函数的返回地址来使用内存空间时;我无法正确读取端点设备的只读寄存器。另外,当我读取大于“ 0x7FFFFFC”的地址时,MPC8308重新启动。考虑到上述情况,我是否错过任何初始化PCI-e接口的步骤?我应该更改Linux内核映像或U-Boot代码中的任何内容吗?通过mmap()使用PowerPC PCI-e有什么不同吗?您是否有任何示例代码可以帮助我读取PCI-e内存空间?

谢谢

linux mmap memory-mapping pci-e

5
推荐指数
1
解决办法
5003
查看次数

c sendto函数在linux2.6.29中设置“网络不可访问” errno

我有一个类似于 sendto函数设置“网络无法访问”的问题,errno 和(不太像UDP广播sendto失败:Linux 2.6.30上的“网络无法访问”,但是由于此问题未得到回答并且很老,我尝试过在此重新说明它们,以期得到答案。

我有一个UDP服务器和客户端,客户端在其中广播活动消息,服务器捕获它们(代码如下)。当我在ubuntu14.04、16.04,fedora6等几个不同的台式机linux上运行它们时,它们工作正常。但是,当我尝试从mpib8308板上的ltib嵌入式Linux运行它们时,服务器正常工作(从其他计算机接收消息),但客户端将errno设置为“网络不可访问”,因为它调用sendto。
我尝试了wireshark,但客户端没有板载接口上的数据包,并且我在板上使用tcpdump测试了系统,并且那里没有生成的数据包。

这是客户端的代码:

  int clientSocket, portNum, nBytes;
  char buffer[1024];
  struct sockaddr_in serverAddr;
  socklen_t addr_size;

  /*Create UDP socket*/
  clientSocket = socket(AF_INET, SOCK_DGRAM, 0);
  int broadcastEnable=1;
  int retsockopts=setsockopt(clientSocket, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable));
  /*Configure settings in address struct*/
  serverAddr.sin_family = AF_INET;
  serverAddr.sin_port = htons(12021);
  serverAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
  memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);  

  /*Initialize size variable to be used later on*/
  addr_size = sizeof serverAddr;

  while(1){
    sprintf(buffer,"I AM ALIVE");

    nBytes = strlen(buffer) + 1;

    int err;
    err …
Run Code Online (Sandbox Code Playgroud)

c sockets linux networking network-programming

4
推荐指数
1
解决办法
5414
查看次数