我必须实现一个在系统中安装新内核扩展的功能。在安装扩展程序之前,我要检查是否已从其他位置安装了该扩展程序。由于我不知道其他位置,因此无法使用sysconfig库函数。
我已经检查了
truss genkex
查看其他工具如何完成此操作。唯一有趣的系统调用是read_sysconfig。不幸的是我没有找到文档。
有什么想法吗?
答案 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
(其中可能包含某些模块的负载