+ -
当前位置:首页 → 问答吧 → 怎么知道加载了哪些kernal module ?

怎么知道加载了哪些kernal module ?

时间:2004-04-06

来源:互联网

我只要知道它的名字就可以了,谢谢。

作者: incarnation   发布时间: 2004-04-06

lsmod

另:你的头像不怕人家告你侵权?
http://www.tianyaclub.com

作者: Eg_zm   发布时间: 2004-04-06

谢谢,能登陆后看吗?我一时找不到怎么做?
另:还没找到那图 :o ,关于版权问题,:o :o

作者: incarnation   发布时间: 2004-04-06

唉,真是有点悲哀,也就几个月没用而已,我把这些都忘了,看我这脑子

我也在极力找着答案,可是怎么也找不到,郁闷

作者: 216   发布时间: 2004-04-06

use "kldstat" under BSD .

作者: werix   发布时间: 2004-04-06

还有个奇怪的现象,在系统引导时unload kernel, 加载上旧的内核,启动,到了界面,就不能听歌了,是/dev/sond/* 失败,原来一切正常的,两个声音模块是。
snd_ich.ko AND snd_pcm.ko

kldstat能知道一个模块的状态,#kldstat MODULE_NAME是知道该模块的状态

其实我这贴的目的是想知道一个模块名,然后在程序中使用用modstat,OR kldstat()。
找到了一个modfind()的使用的例子,modfind()的作用是返回一个模块的modid.
这程序来自:
/usr/share/examples/kld/syscall/test/call.c
代码:
#include <stdio.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <sys/module.h>
static void usage (void);
static void
usage (void)
{
 fprintf (stderr, "call syscall-number\n");
 exit (1);
}
int
main(int argc, char **argv)
{
 char *endptr;
 int syscall_num;
 struct module_stat stat;
 stat.version = sizeof(stat);
 modstat(modfind("syscall"), &stat);/*modfind()里的参数是一个模块的名字*/
 syscall_num = stat.data.intval;
 return syscall (syscall_num);
}
编译通过,但不知道怎么运行,还请指教。
自己写了个
代码:
#include <sys/param.h>
#include <sys/module.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
 struct module_stat stat ;
 if(modstat(modfind("syscall"),&stat)<0) {
 printf("modstat error\n");
 return(1);
 }
 printf("version is %d,name is %s,refs is %d ,modspecific_t is %s \n",
 stat->version,stat->refs,stat->data);
 return(0);
}
根据最上面的程序,知道了modfind()里的参数可以是syscall,
但我设置为syscall,snd_ich.ko snd_pcm.ko kernel都输出:modstat error , why ?

如果不能在BSD版解决,请版主把整个主题复制到程序设计版,谢谢!!

作者: incarnation   发布时间: 2004-04-07

简单说吧,在这个目录/usr/share/examples/kld/syscall/下有两个子目录,一个是module,另外一个是test,它们的目的是让大家明白内核怎样调用模块,正确的方法是先编译module下的syscall.c(用Makefile在/usr/share/examples/kld/syscall/也可以,省事儿),编译好后就可以调用,方法如下:

引用:
bash-2.05b#kldload /usr/share/examples/kld/syscall/module/syscall.ko
bash-2.05b#kldstat
Id Refs Address Size Name
1 9 0xc0400000 5e16d8 kernel
2 1 0xc09e2000 51ac8 acpi.ko
3 1 0xc2235000 19000 linux.ko
4 1 0xc259d000 2000 syscall.ko
然后回到test目录编译好,执行

引用:
bash-2.05b# ./call
这样你的程序才不会出错误,因为在call.c里面调用的syscall模块的名字,你没在
系统里加载,call它当然不会顺利。

为了更好的理解,最好的办法是复制几个syscall.c( syscall1, syscall2, syscall3 etc...) 编译好后统统加载到内核里,再改你的程序,打印每一个syscall的ID,name,refs, version,data .... 奇怪的是我以linux.ko,acpi.ko 用call.c都说找不到。。。。其它我加载的却可以。。。

另外你程序有问题,应该是stat.version ...而不是 stat->version。。。

可惜明天我出门,下星期二后才会来,咱们回来再联系。。。

作者: werix   发布时间: 2004-04-07

我和你一样,8能分析出KERNEL MODULE ,郁闷。。。。:( :(
在/modules/试了,难到在/dev/ *

作者: incarnation   发布时间: 2004-04-07

Use kldstat to display the dynamic modules you have loaded.Under FreeBSD,the loadable modules are in this directory:/boot/kernel,you can load any of those by the command kldload xxxx.ko.By the way,Modules must have an extension of .ko.

Good Luck!^_^

作者: Freebird   发布时间: 2004-04-07

help me !!thank

作者: incarnation   发布时间: 2004-04-13

引用:
最初由 Freebird 发表
Use kldstat to display the dynamic modules you have loaded.Under FreeBSD,the loadable modules are in this directory:/boot/kernel,you can load any of those by the command kldload xxxx.ko.By the way,Modules must have an extension of .ko.

Good Luck!^_^

他的问题不是怎么调用模块,而是用examples里的范例后,可以调用一个(例如syscall.c)syscall的模块,再用modstat,modfind等库函数去显示这个syscall模块的各个信息(范例是call.c)。问题在于如果我们自己编译几个内核模块,加载以后,可以用modstat,modfind看到这些模块的信息,但是我们不能用modstat, modfind显示系统里事先加载的模块,例如linux.ko,acpi.ko等等。我当时写了几个小程序去测试,也没搞清楚为什么会这样,因为放假出游就放下了。

另外incarnation说的也不清楚,我猜了半天才明白他要说什么。。。真不明白怎么
问问题都不说明白了。。。

作者: werix   发布时间: 2004-04-13

引用:
bash-2.05b# kldstat
Id Refs Address Size Name
1 7 0xc0400000 5e16d8 kernel
2 1 0xc09e2000 51ac8 acpi.ko
3 1 0xc223a000 19000 linux.ko
bash-2.05b# kldload /usr/share/examples/kld/syscall/module/mycall.ko
bash-2.05b# kldstat
Id Refs Address Size Name
1 8 0xc0400000 5e16d8 kernel
2 1 0xc09e2000 51ac8 acpi.ko
3 1 0xc223a000 19000 linux.ko
4 1 0xc253a000 2000 mycall.ko
引用:
bash-2.05b# kldload /usr/share/examples/kld/syscall/module/syscall.ko
bash-2.05b# kldstat
Id Refs Address Size Name
1 9 0xc0400000 5e16d8 kernel
2 1 0xc09e2000 51ac8 acpi.ko
3 1 0xc223a000 19000 linux.ko
4 1 0xc253a000 2000 mycall.ko
5 1 0xc253c000 2000 syscall.ko
引用:
bash-2.05b# ./call
linux modules modfind is -1
linux modstat -1, ID 671404961 , name ì&iquest;&iquest;
mycall modules modfind is 326
mycall modstat is 0, ID 326 , name mycall
syscall modfind is 327
syscall modstat is 0, ID 327 , name syscall

可以看出用一样的函数去显示信息,mycall,syscall都可以,但是linux.ko却是回false值

作者: werix   发布时间: 2004-04-13

谢谢werix ,问题有待解决!!

作者: incarnation   发布时间: 2004-04-29