开发者学堂课程【物联网开发 - Linux 驱动开发实操演练:内核模块4】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/657/detail/10872
内核模块4
内容介绍:
一、模块的使用
二、使用过程中重要的6个命令和1个选项
一、模块的使用
第一:将内核模块加载到内核中,和内核形成一个整体,来运行。
第二:将内核中的内核模块从内核中卸载出来。
以上两个使用方法,由两个命令来实现。
二、使用过程中重要的6个命令和1个选项
1.查看内核模块信息
命令:modinfo 如图:
edu@edu-T:~/work/test
edu@edu-T:-/work/test$ 1s
demo.cdemo.ko demo.mod.c demo.mod.o demo.o
Makefile modules.order Module.symvers edu@edu-T:-/work/tests modinfo
demo.ko
filename: demo.ko
license: GPL
srcversion: CF96C788C51FEFA1CF2C9CD
depends:
vermagic: 3.2.0-29-generic-pae SMP mod_unload modversions 686
edu@edu-T:-/work/tests
复制下来之后,进行粘贴
5 obj-m:=demo.o
7 all:
8 make -C $(KERNDIR) M=$(PWD) modules
10 clean:
11 make -C S(KERNDIR) M=(PWD) clean
模块的使用:
查看内核模块信息的命令:
modinfo
$ modinfo demo.ko
demo.ko
Ifilename:
license: GPL
srcversion: CF96C788C51FEFA1CF2C9CD
depends:
vermagic: 3.2.0-29-generic-pae SMP mod_unload modversions 686
对于模块信息,三要素有文件名,遵循的GPL申明协议,版本说明和依赖。上图中,demo 无依赖,因此 depends 为空。
还可能会有作者申明和功能描述,这俩者可以省略不写。但是模块三要素,是必须写明。
模块的使用:
查看内核模块信息的命令:
modinfoI
Smodinfo demo.ko
filename: demo.ko
license: GPL
srcversion: CF96C788C51FEFA1CF2C9CD
depends:
vermagic: 3.2.0-29-generic-pae SMP mod_unload modversions 686
作者:
描述:
将内核模块加载到内核中,和内核形成一个整体,运行。
将内核中的内核模块,从内核中卸载出来。
2、查看当前内核中已经插入的动态模块
命令:lsmod 里面包括模块名,大小,和被使用的个数
3、将编写的内核模块加载到内核中的命令:insmod
insmod(8) insmod(8)
NANE
insmod -pimple program to insert a module into the Linux Kernel 无
SYNOPSIS
insmod [filename] [module options ...]
无
DESCRIPTION
insmod is a trivial program to insert a module into the kernel:if the filename is a hyphen, the module is taken from standard input. Most users will want to use modprobe(8) instead, which is more clever and can handle module dependen- cies.
Only the most general of error messages are reported:as the work of trying to link the module is now done inside the kernel, the dmesg usually gives more information about errors.
COPYRIGBT
This manual page originally Copyright 2002, Rusty Russell, IBM Corporation. Maintained by Jon Masters and others. SEE ALSO
modprobe(8),Tmmod(8),1smod(8) modinfo(8)
insmod(8)
将内核模块插入到内核里面,格式为 insmod+文件名。
edueedu-T:-/work/tests1s
demo.c demo.ko demo.mod.c demo.mod.o demo.o Makefile
modules.order Module.symvers
edu@edu-T:-/work/tests insmoddemo.ko
insmod:error inserting'demo.ko':-1 Operation notpermitted
edu@edu-T:-/work/tests
如上图,发现系统报错,无权限执行。因为如果需要将内核模块插入到内核里面,和内核形成一个整体,此操作需要管理员权限。
如需执行此操作,则需要临时赋予管理员权限:
u@edu-1.-work/cest
edu@edu-T:-/work/tests1s
demo.c demo.ko demo.mod.c demo.mod.o demo.o Makefile
modules.order Module.symvers
edu@edu-T:-/work/tests insmoddemo.ko
insmod:errorinserting 'demo.ko':-1 Operation not permitted
edu@edu-T:-/work/tests sudo insmod demo.ko
4、查看内核的日志信息的命令:dmesg
l./woIk/teat
5.291606] [drm] Multimon.
5.291608] [drm] Pitchlock.
5.291609] [drm] Irq mask.
5.291610] [drm] Display Topology.
GMR.
5.2916121 【drm]
5.291613][drm]MaxGMR ids is 64
5.291615] [drm] MaxGMR descriptors is 4096
5.291616][drm]VRAM at Oxf0000000 size is 32768 KiB
5.291618][drm]
5.2916211 amm0size is 2048 kiB
5.291792] global init.
[TTM] Zone kernel:Available graphics memory:420394 kiB.
5.291797】 [TTM]Zone[highmem:Available graphics memory:2060782 kiB.
5.291800] [TTM]Initializing pool allocator.
5.292083] [drm] width 640
5.292110][drm] height 480
5.292125] [drm】 bpp 32
5.295310] [drm] Fifo max0x00200000 min Ox00001000 cap Ox0000007f
5.295581】 [drm] Not using screen objects, missing cap SCREEN OBJECT_2
5.295603】 [drm]Supports vblank timestamp caching Rev 1 (10.10.2010).
5.295605] [drm]No driver support for vblank timestamp query.
5.295656] [drm] Detected no device 3D availability.
5.295951] fbcon:svgadrmfb (fb0) is primary device
5.296021]Console:switching to colour frame buffer device 100x37
5.296081] [drm] Initialized vmwgfx 2.3.0 20111025 for 0000:00:0f.0 on minor 0
16.085300]eth0:no IPv6 routers present
60.5732331 ---/home/edu/work/test/demo.c---demo init---7---
70.9820491---/home/edu/work/test/demo.c---demo exit---14---
76.0939281---/home/edu/work/test/demo.c---demo init---7---
79.2016391---/home/edu/work/test/demo.c---demo exit---14---
506.067836]---/home/edu/work/test/demo.c---demo init---7---
du@edu-T:-/work/tests
基本使用 19:23
上图,将内核的信息全部打印出来。第七行的 demo.init 已经执行。
5、选项:-c 清楚当前内核信息
执行完成后重新加载发现,仅剩下当前信息:
@edu-T:~/work/test
eduledu-T:-/work/tests 1s
demo.c demo.ko demo.mod.c demo.mod.o demo.o Makefile modules.orderModule.symvers
eduledu-T:-/work/tests sudo insmod demo.ko
edu@edu-T:-/work/tests dmesg
[ 623.0232961 一. /home/edu/work/test/demo.c---demo init---7---
edu@edu-T:-/work/tests
6、将内核模块从内核中卸载出来的命令:rmmod
执行完 rmmod 之后,会发现第14行的 demo.exit 已经执行,则说明执行的函数为卸载函数,加载的时候是一个模块的全名,卸载时去掉后缀,卸载的时候会执行入口或加载函数会被调用。
执行卸载的时候会调用卸载函数,如图为卸项:
S dmesg
623.023296] ---/home/edu/work/test/demo.c---demo
init---7---699.863850] ---/home/edu/work/test/demo.c---demo
exit---14---
特点:
内核模块加载的时候执行加载函数并只会执行一次,在内核模块卸载时执行卸载函数也只执行一次。