c - 传递给 sg_init_table() 函数的散点列表指针是否需要在之前分配?

标签 c linux-kernel linux-device-driver dma pci

在 linux 内核 PCI 驱动模块中。
我们有一个函数来初始化 dma 分散列表:
sg_init_table(struct scatterlist *sg, unsigned int nents);

对于散点列表指针sg,我们是否应该为它分配一些内存,比如使用kcalloc; 或者我们只是像这样声明它:struct scatterlist * sg 然后将它传递给 sg_init_table

感谢提前。

最佳答案

除了简单地用预期类型的​​参数填充函数的参数列表之外,将任何类型的未初始化或无效指针值传递给任何函数对调用者没有任何值(value)。调用者不会以这种方式向函数传递任何有效信息,也不会为函数提供返回任何信息的机制。特别是,它没有提供被调用函数可以代表调用者分配内存的机制。与任何其他参数一样,指针通过传递,因此当函数修改其参数之一时,调用者看不到。

您提供的函数签名仅对初始化 struct scatterlist 类型的现有对象,或此类对象的数组,或用于保存此类对象的分配内存有意义对象或数组。如果该结构需要动态分配,那么是的,调用者必须执行分配并传递指向结果的指针。

然而,在某些情况下,调用者可能适合声明一个本地 struct 对象,并传递其地址,如下所示:

struct scatterlist sl;

sg_init_table(&sl, DEFAULT_NENTS);

或者也许

struct scatterlist sl[DEFAULT_NENTS];

sg_init_table(sl, DEFAULT_NENTS);

,具体取决于 sg_init_table() 的行为方式的详细信息。

同样,传递全局 结构的地址可能是合适的。请注意局部对象的生命周期——除非声明为 static,否则局部对象在声明它们的函数调用结束后不会继续存在。

关于c - 传递给 sg_init_table() 函数的散点列表指针是否需要在之前分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37276803/

相关文章:

用于更复杂功能的 C 宏

c - 使 C 代码运行得更快

c - 内核如何探测驱动程序

linux - 了解内核消息 'nobody cared (try booting with the "irqpoll"option)'

c - linux IO端口是软件抽象还是真正的硬件端口

c - 与 C 实现相比,GNU Radio 的 I/O 速度较慢

c - ELF 二进制文件中默认信号处理程序的代码在哪里?

c - 使用 pthread_exit 和 pthread_join。 pthread_exit 不会终止调用函数

linux-kernel - 如何将平台特定数据从一个平台设备/驱动程序传递到另一个平台设备/驱动程序

c - 有人会解释如何在 linux 中使用 pci_enable_device()