小编Con*_* Li的帖子

“ get_user_pages”如何工作(对于Linux驱动程序)

在Linux PCI驱动程序上工作,现在我正尝试使用分散/聚集为DMA编写代码。

到目前为止,我已经了解到,要直接从用户空间访问DMA数据,我们需要将用户空间页面固定到内核空间。

为此,我们拥有get_user_pages,其完整定义如下:

int get_user_pages(struct task_struct * tsk,  
    struct mm_struct * mm,  
    unsigned long start,  
    int nr_pages,  
    int write,  
    int force,  
    struct page ** pages,  
    struct vm_area_struct ** vmas);
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是关于struct page ** pages。在这里,我们需要为分配内存(kcalloc用于ex),pages然后再调用get_user_pages吗?

我的第二个问题是关于unsigned long start,在手册页上说“起始用户地址”,这是否意味着,如果我在用户空间中声明一个指针,例如int *p,我应该传递给内核空间的“起始用户地址”是p

我的第三个问题也与有关unsigned long start,如果我对第二个问题的理解正确,那么我们如何确保该地址恰好在页面的开头?

所以这三个问题,谢谢你的推进。

c linux kernel-module linux-device-driver linux-kernel

6
推荐指数
1
解决办法
5199
查看次数

MSI 中断在 Linux 驱动程序中如何工作?

目前正在研究 PCI 设备驱动程序。设备的编程如下:
当 DMA 传输完成时,设备向 PC 发送 MSI 中断,其中包含 MSI 数据“001”二进制。

现在我正在为这个 pci 设备编写一个驱动程序,对于 MSI 部分,我有一些问题。

在维基百科中,它说:

MSI允许设备将少量中断描述数据写入特殊的内存映射I/O地址,然后芯片组将相应的中断传递给处理器。

Q1:那么就我而言,是small amount of interrupt-describing data"001"pci 设备发送到 PC 的吗?

在我的驱动程序代码中,MSI irq 的注册方式如下:

err = pci_enable_msi(my_pci_dev);  
err = request_irq(my_pci_dev->irq, irq_handler, 0, "PCI_FPGA_CARD", NULL);  
Run Code Online (Sandbox Code Playgroud)

irq_handler定义如下:

static irqreturn_t irq_handler(int irq, void *dev_id)  
{  
  printk(KERN_INFO "(irq_handler):  Called\n");  
  return IRQ_HANDLED;
}  
Run Code Online (Sandbox Code Playgroud)

Q2:有了上面的3个内核函数,我们如何获取消息呢"001"
Q3: PCI 设备最多支持 8 个 MSI 矢量,因此要使用所有这 8 个矢量,我应该使用下面的代码,否则都不正确:

err = pci_enable_msi_block(my_pci_dev,8);
err = request_irq(my_pci_dev->irq, irq_handler, 0, …
Run Code Online (Sandbox Code Playgroud)

linux interrupt linux-device-driver dma pci

6
推荐指数
1
解决办法
1万
查看次数

使用ModelSim,在将信号添加到波形窗口之前如何获取所有信号的仿真数据?

背景:ModelSim v10.4d与quartus v16.0一起安装

我是 Cadence Incisive 用户,现在必须转至导师 ModelSim,但使用 ModelSim,我无法找到一种方法来获取所有信号数据,然后再将它们添加到波形窗口。

例如,

在 .do(tcl) ModelSim 仿真脚本中,典型流程可能是:

1,vcom : compile all sources files and testbench
2,vsim : load testbench for simulation
3,view structure/signals/wave : open some windows
4,add wave : add signals to waveform window
5,run xx us : run simulation for a certain time
Run Code Online (Sandbox Code Playgroud)

通过此流程,每次向波形窗口添加信号时,我都必须重新执行步骤 5,否则它将显示新添加的信号“无数据”。

所以我想知道我们是否可以跳过步骤4,只执行步骤5一次以获得所有信号的模拟数据,然后我们选择信号发送到波形窗口,并且我们获得每个信号的数据而无需重新进行“运行”。

verilog vhdl modelsim intel-fpga

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