PCIe 设备的注册过程通常涉及到多个函数的调用栈。以下是一个可能的函数调用栈示例:
pci_register_driver:此函数用于注册 PCI 驱动程序,它的参数包括指向 pci_driver 结构体的指针和驱动程序的名称等信息。在函数中,首先会调用 pci_register_driver 函数来注册驱动程序。
probe 函数:当内核检测到一个新的 PCIe 设备时,会调用该设备对应驱动程序中的 probe 函数。在 probe 函数中,驱动程序会执行一些初始化操作,并向系统注册设备。
pci_enable_device:此函数用于启用 PCIe 设备,并开启设备的中断。在 probe 函数中,驱动程序通常会调用 pci_enable_device 函数来启用设备。
pci_request_regions:该函数用于请求 PCIe 设备的 I/O 资源。在 probe 函数中,驱动程序会调用 pci_request_regions 函数来请求设备的 I/O 资源。
pci_iomap:此函数用于映射 PCIe 设备的 I/O 空间到内核地址空间。在 probe 函数中,驱动程序会调用 pci_iomap 函数来映射设备的 I/O 空间。
cdev_add:此函数用于向内核注册一个字符设备。在 probe 函数中,驱动程序会调用 cdev_add 函数来向系统注册设备所需的字符设备节点。
open 函数:当用户打开设备节点时,内核会调用设备对应驱动程序中的 open 函数。在 open 函数中,驱动程序会执行一些初始化操作,并向系统注册设备。
mmap 函数:当用户在设备节点上执行 mmap 操作时,内核会调用设备对应驱动程序中的 mmap 函数。在 mmap 函数中,驱动程序会将设备的 I/O 空间映射到用户空间。
read 和 write 函数:当用户从设备节点读取数据或向设备节点写入数据时,内核会调用设备对应驱动程序中的 read 和 write 函数来处理数据传输。
总之,PCIe 设备的注册过程需要经过多个函数的调用,并涉及到设备的启用、资源分配、映射等操作。函数调用栈的具体形式取决于驱动程序的实现和设备的属性。