进入生成的目录, insmod ./hello.ko 装载驱动。
Module Size Used by
hello 9472 0
nls_iso8859_1 12032 0
nls_cp437 13696 0
vfat 18816 0
fat 58272 1 vfat
usb_storage 82880 0
isofs 39844 1
lsmod 列出所有驱动。lsmod 读取并分析 /proc/modules 文件。
cat /proc/modules
nls_iso8859_1 12032 0 - Live 0xe1bc6000
nls_cp437 13696 0 - Live 0xe1bba000
vfat 18816 0 - Live 0xe1bad000
fat 58272 1 vfat, Live 0xe1b50000
内核中已加载模块的信息存在于sys/module目录
进入/sys/module目录 tree -a 可以得到目录树:
usb_storage
| |-- drivers
| | `-- usb:usb-storage -> ../../../bus/usb/drivers/usb-storage
| |-- holders
| |-- initstate
| |-- notes
| | `-- .note.gnu.build-id
| |-- parameters
| | |-- delay_use
| | |-- option_zero_cd
| | `-- swi_tru_install
| |-- refcnt
| |-- sections
| | |-- .bss
| | |-- .data
| | |-- .exit.text
| | |-- .gnu.linkonce.this_module
| | |-- .init.text
| | |-- .note.gnu.build-id
| | |-- .parainstructions
| | |-- .rodata
| | |-- .rodata.str1.1
| | |-- .rodata.str1.4
| | |-- .smp_locks
| | |-- .strtab
| | |-- .symtab
| | |-- .text
| | |-- __bug_table
| | `-- __param
| `-- srcversion
l/drivers/hello# modinfo hello.ko
filename: hello.ko
alias: a simplest module
description: A simple Hello World Module
license: Dual BSD/GPL
author: Barry Song <21cnbao@gmail.com>
srcversion: 3FE9B0FBAFDD565399B9C05
depends:
vermagic: 2.6.28-11-generic SMP mod_unload modversions 586
modprobe挂载新模块以及新模块相依赖的模块modprobe我们常用的功能就是挂载模块,在挂载某个内核模块的同时,这个模块所依赖的模块也被同时挂载;这是于insmod挂载模块有区别的地方。当然modprobe也有列出内核所有模块,还有移除模块的功能;下在我们举个例子说一说咱们常用的功能和参数;
modprobe-codprobe-c可以查看modules的配置文件,比如模块的别名是什么等;
modprobe -l 是列出内核中所有的模块,包括已挂载和未挂载的;通过modprobe-l,
读文件:/lib/modules/`uname -r`/modules.dep
我们能查看到我们所需要的模块,然后根据我们的需要来挂载;
[root@localhostbeinan]#modprobe 模块名 注:挂载一个模块;
[root@localhostbeinan]#modprobe-r 模块名 注:移除已加载的模块,和rmmod功能相同;
ifneq ($(KERNELRELEASE),) # KERNELRELEASE 不为空,第二次进入时成立。
obj-m:=hello.o
hello-objs:=main.o add.o
else
KDIR:=/lib/modules/2.6.18-53/build
all :
make -C $(KDIR) M=$(PWD)modules #进入KDIR目录执行make modules
clean :
rm -f *.ko *.o
endif
内核模块参数 :在insmode 执行安装模块时在带在后面传进去。
module_param(name,type,perm) 参数名,参数类型,访问权限
perm 常见值:S_IRUGO :任何用户都对/sys/module中出现的该参数具有读权限
S_IWUSR :ROOT用户对/sys/module中出现的该参数具有读权限
int a=3;//初始化默认值。
module_param(a,int,S_IWUSER);
在内核中就可以使用此参数。
在A模块中实现了的 function必须使用EXPORT_SYMBOL导出它才能被其他模块调用,导出的列表在proc/kallbyms文件中。
EXPORT_SYMBOL(function);
内核模块与应用的差别在于 内核安装了之后,一直会驻留在内存中,作为一个服务,服务于将来的某一个请求,直到卸载
函数被调用。
printk(KERN_EMER," EMERGC");//包含打印级别