【发布时间】:2020-03-20 20:17:16
【问题描述】:
我必须实现一个在系统中安装新内核扩展的函数。在安装扩展之前,我想检查它是否已经从另一个位置安装。由于我不知道其他位置,我无法使用 sysconfig 库函数。
我查过了
truss genkex
看看其他工具是如何做到这一点的。唯一有点有趣的系统调用是 read_sysconfig。不幸的是,我没有找到文档。
有什么想法吗?
【问题讨论】:
标签: aix kernel-extension
我必须实现一个在系统中安装新内核扩展的函数。在安装扩展之前,我想检查它是否已经从另一个位置安装。由于我不知道其他位置,我无法使用 sysconfig 库函数。
我查过了
truss genkex
看看其他工具是如何做到这一点的。唯一有点有趣的系统调用是 read_sysconfig。不幸的是,我没有找到文档。
有什么想法吗?
【问题讨论】:
标签: aix kernel-extension
这里我有一个示例函数,它打印所有加载的内核扩展:
#define BUFF_SIZE 10241024U
static void testExtension() {
void *buffer = calloc( 1, BUFF_SIZE );
if( buffer ) {
struct ld_info *xInfo;
int result = loadquery(L_GETKERNINFO, buffer, BUFF_SIZE);
xInfo = buffer;
while( xInfo ) {
printf( ">>>>>>> >%s< %d\n", xInfo->ldinfo_filename, result );
uint offset = xInfo->ldinfo_next;
xInfo = offset ? (char*)xInfo + offset : NULL;
}
free( buffer );
}
}
【讨论】:
你搜索的函数是SYS_QUERYLOAD sysconfig操作和here你可以找到更多的信息
SYS_QUERYLOAD sysconfig 操作执行查询操作以 确定是否已加载给定的目标文件。这个目标文件是 由传入的 cfg_load 结构中的路径字段指定 parmp 参数。此操作使用相同的 cfg_load 为 SYS_KLOAD (SYS_KLOAD sysconfig 操作)操作。
如果指定的目标文件没有加载,则 cfg_load 结构在返回时设置为值 0。否则,该 模块的内核模块 ID 在 kmid 字段中返回。如果 模块的多个实例已加载到内核中, 返回最近加载的模块 ID。
cfg_load 结构中的 libpath 字段不用于此 选项。
您还可以使用此脚本检查 odm 数据库中的对象。
for i in 1 2 3
do
odmget -q phase=$i Config_Rules
done
并检查文件/sbin/rc.boot(其中可能包含某些模块的负载
【讨论】: