检查内核扩展是否已加载

时间:2019-11-25 13:57:41

标签: aix kernel-extension

我必须实现一个在系统中安装新内核扩展的功能。在安装扩展程序之前,我要检查是否已从其他位置安装了该扩展程序。由于我不知道其他位置,因此无法使用sysconfig库函数。

我已经检查了

truss genkex

查看其他工具如何完成此操作。唯一有趣的系统调用是read_sysconfig。不幸的是我没有找到文档。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这里有一个示例函数,可打印所有已加载的内核扩展:

#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 );
    }
}

答案 1 :(得分:0)

您搜索的功能是 SYS_QUERYLOAD sysconfig 操作,here您可以找到有关此功能的更多信息

  

SYS_QUERYLOAD sysconfig操作执行查询操作以   确定是否已加载给定的目标文件。该目标文件是   由传入的cfg_load结构中的path字段指定   parmp参数。此操作使用相同的cfg_load   为SYS_KLOAD(SYS_KLOAD sysconfig指定的结构   操作)。

     

如果未加载指定的目标文件,则在   cfg_load结构在返回时设置为0。否则,   在kmid字段中返回模块的内核模块ID。如果   该模块的多个实例已加载到内核中,   返回最近加载的模块ID。

     

cfg_load结构中的libpath字段不用于此目的   选项。

您还可以使用此脚本检查odm数据库中的对象。

for i in 1 2 3
do
    odmget -q phase=$i Config_Rules
done

并检查文件/sbin/rc.boot(其中可能包含某些模块的负载