驱动模块的加载

来源:互联网 发布:linux 打开一个目录 编辑:程序博客网 时间:2024/04/30 09:45

进入生成的目录, 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");//包含打印级别