kmod_load 内核服务

用途

将对象文件装入到内核中或查询已装入的对象文件。

语法

#include <sys/ldr.h>
#include <sys/types.h>
#include <sys/errno.h>

int kmod_load (pathp,  
flags,libpathp, kmidp)
caddr_t  pathp;
uint  flags;
caddr_t
libpathp;
mid_t * kmidp;

参数

描述
帕普 指向一个字符串,该字符串包含要装入或查询的对象文件的路径名。
标志 指定一组装入程序标志,用于描述要调用的装入程序选项。 定义了以下标记:
LD_USRPATH
帕普 利布塔普 参数所指向的字符串在用户地址空间中。 如果未设置 LD_USRPATH 标志,那么假定字符串位于内核或系统中的空格内。
LD_KERNELEX
将此对象文件的导出符号放入 /usr/lib/boot/unix 名称空间中。 由于指定文件的符号解析而装入的其他对象文件未将其导出符号放置在内核名称空间中。
LD_SINGLELOAD
如果设置了此标志,那么仅当尚未装入具有相同路径名的对象文件时,才会将 帕普 参数指定的对象文件装入到内核中。 如果已装入具有相同路径名的对象文件,那么将返回其模块标识 (使用 克米德普 参数) ,并且其装入计数将递增。 如果尚未装入对象文件,那么此服务将执行装入操作,就像未设置标志一样。

此选项在支持全局内核例程时很有用,在这些例程中只能存在一个副本及其数据。 通常,导出要添加到内核名称空间的符号的例程是此类型的。

注: 完成路径名比较,以确定是否已装入同一对象文件。 如果对象文件的路径名的表达方式与先前装入请求中的表达方式不同,那么此服务将错误地将对象文件的新副本装入到内核中。

如果既未设置此标志也未设置 LD_QUERY 标志,那么此服务会将对象文件的新副本装入到内核中。 即使先前已装入对象文件的其他副本,也会发生这种情况。

LD_QUERY
此标志指定查询操作将确定是否装入了 帕普 参数指定的对象文件。 如果未装入,那么将使用 克米德普 参数来返回 0 模块标识 0。 否则,将返回分配给对象文件的内核模块标识。

如果此文件的多个实例已装入到内核中,那么将返回最近装入的对象文件的内核模块标识。

不将 利布塔普 参数用于此选项。

注: 完成路径名比较,以确定是否已装入同一对象文件。 此服务会错误地返回not loaded条件 (如果对象文件的路径名的表达方式不同于先前装入请求中的路径名)。

如果设置了此标志,那么不会装入任何对象文件,并且会忽略 LD_SINGLELOADLD_KERNELEX 标志 (如果设置)。

利布塔普 指向一个字符串,该字符串包含要用于查找完成此装入的符号解析所需的对象文件的搜索路径。 如果该参数为空,那么将根据 帕普 参数指定的对象文件的对象文件头中的规范来设置搜索路径。
克米德普 指向一个区域,在该区域将返回与指定模块的此装入相关联的内核模块标识。 如果 kmod_load 服务返回非零返回码,那么此区域中的数据将无效。

描述

kmod_load 内核服务将由 帕普 参数指定的内核扩展对象文件装入到内核中。 此服务将返回该模块实例的内核模块标识。

您可以指定标志以请求单个装入,这将确保只将对象文件的一个副本装入到内核中。 另一个选项仅仅是查询给定的对象文件 (由 path-name 指定)。 这允许用户确定模块是否已装入,然后访问分配给它的内核模块标识。

kmod_load 服务还提供已装入模块的已导入符号的装入时符号解析。 kmod_load 服务会装入其他内核对象模块 (如果需要进行符号解析)。

装入程序符号绑定支持

从内核名称空间导入的符号将使用在装入时内核名称空间中存在的符号进行解析。 (在链接编辑时,通过将 #!/unix 字符串指定为导入列表中的第一个字段来从内核名称空间导入符号。)

内核模块也可以从其他内核对象模块导入符号。 如果需要这些其他内核对象模块来解析导入的符号,那么这些内核对象模块将与指定的对象模块一起装入。

如果 标志 参数设置了 LD_KERNELEX 标志,那么由指定内核对象模块导出的任何符号都将添加到内核名称空间。 这使符号可用于其他后续装入的内核对象模块。 以指定内核对象模块的名义装入的内核对象模块 (用于解析导入的符号) 未将其导出的符号添加到内核名称空间。

使用主模块的导出列表中的 SYSCALL 关键字指定的内核导出符号 (在链接编辑时) 将添加到系统调用表中。 这些内核导出符号可作为系统调用提供给应用程序。

查找用于解析符号引用的共享对象模块

如果 利布塔普 参数为空,那么搜索路径搜索字符串将从 帕普 参数指定的对象模块的模块头中获取。 将使用由 帕普 参数指定的对象模块的模块头。

如果模块头包含符号的未限定基本文件名 (名称中没有/[斜杠] 字符) ,那么将使用搜索字符串来查找解析导入所需的共享对象模块的位置。 此搜索字符串可以从两个位置中的一个获取。 如果对 kmod_load 服务的调用上的 利布塔普 参数不为空,那么它将指向一个字符串,该字符串指定要使用的搜索路径。 但是,如果 利布塔普 参数为空,那么将从由 帕普 参数指定的对象模块的模块头中获取搜索路径。

未使用装入以解析导入符号的对象模块中找到的搜索路径规范。 内核装入器服务不支持延迟符号解析。 如果无法解析任何导入的符号,那么内核模块的装入将终止并返回错误。

执行环境

仅可从 流程环境 调用 kmod_load 内核服务。

返回值

如果在没有错误的情况下装入对象文件,那么模块标识将在 克米德普 参数指向的位置返回,并且返回码设置为 0。

错误代码

如果发生错误,那么不会装入该模块,并且不会返回任何内核模块标识。 返回码将设置为下列其中一个返回值:

返回值 描述
EACCES 指示要装入的对象模块不是普通文件,或者该对象模块文件的方式拒绝只读访问。
EACCES 对路径前缀的组件的搜索许可权被拒绝。
EFAULT 指示当设置了 LD_USRPATH 标志时,调用进程没有足够的权限来访问 帕普利布塔普 参数描述的数据区。 如果访问此区域中的数据时发生 I/O 错误,那么也会返回此错误代码。
ENOEXEC 指示程序文件具有相应的访问许可权,但具有 XCOFF 指示符,该指示符在其头中无效。 kmod_load 内核服务仅支持装入 XCOFF (扩展的公共对象文件格式) 对象文件。 如果装入器无法解析导入的符号,那么也会返回此错误代码。
EINVAL 指示程序文件的头中有有效的 XCOFF 指示符,但该头对于要装入该文件的机器是损坏的或不正确的。
ENOMEM 指示装入需要的内核内存超过系统施加的最大值所允许的内核内存量。
ETXTBSY 指示该对象文件当前已打开以供某个进程写入。
ENOTDIR 指示路径前缀的某个组件不是目录。
ENOENT 指示不存在此类文件或目录,或者 path-name 为空。
ESTALE 指示调用者的根目录或当前目录位于已卸装的虚拟文件系统中。
ELOOP 指示在转换 路径利布塔普 参数时迂到过多的符号链接。
ENAMETOOLONG 指示路径名的组件超过了 255 个字符,或整个路径名超过了 1023 个字符。
EIO 指示在操作期间发生了 I/O 错误。