Linux内核模块编程与内核模块LICENSE -《详解(第3版)》预读
来源:互联网 发布:如何进行wifi网络认证 编辑:程序博客网 时间:2024/05/29 03:16
http://21cnbao.blog.51cto.com/109393/1433468
Linux内核模块简介
模块本身不被编译入内核映像,从而控制了内核的大小。
模块一旦被加载,它就和内核中的其他部分完全一样。
01 /*02 * a simple kernel module: hello03 *04 * Copyright (C) 2014 Barry Song (baohua@kernel.org)05 *06 * Licensed under GPLv2 or later.07 */0809 #include <linux/init.h>10 #include <linux/module.h>1112 static int __init hello_init(void)13 {14 printk(KERN_INFO "Hello World enter\n");15 return 0;16 }17 module_init(hello_init);1819 static void __exit hello_exit(void)20 {21 printk(KERN_INFO "Hello World exit\n ");22 }23 module_exit(hello_exit);2425 MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");26 MODULE_LICENSE("GPL v2");27 MODULE_DESCRIPTION("A simple Hello World Module");28 MODULE_ALIAS("a simplest module");
Module Size Used byhello 9 472 0nls_iso8859_1 12 032 1nls_cp437 13 696 1vfat 18 816 1fat 57 376 1 vfat...
$ cat /proc/moduleshello 12393 0 - Live 0xe67a2000 (OF)nls_utf8 12493 1 - Live 0xe678e000isofs 39596 1 - Live 0xe677f000vboxsf 42561 2 - Live 0xe6767000 (OF)...
root@barry-VirtualBox:/sys/module/hello# tree -a.├── coresize├── holders├── initsize├── initstate├── notes│ └── .note.gnu.build-id├── refcnt├── sections│ ├── .exit.text│ ├── .gnu.linkonce.this_module│ ├── .init.text│ ├── .note.gnu.build-id│ ├── .rodata.str1.1│ ├── .strtab│ └── .symtab├── srcversion├── taint└── uevent3 directories, 15 files
kernel/lib/cpu-notifier-error-inject.ko: kernel/lib/notifier-error-inject.kokernel/lib/pm-notifier-error-inject.ko: kernel/lib/notifier-error-inject.kokernel/lib/lru_cache.ko:kernel/lib/cordic.ko:kernel/lib/rbtree_test.ko:kernel/lib/interval_tree_test.ko:updates/dkms/vboxvideo.ko: kernel/drivers/gpu/drm/drm.ko
# modinfo hello.kofilename: hello.koalias: a simplest moduledescription: A simple Hello World Modulelicense: GPL v2author: Barry Song <21cnbao@gmail.com>srcversion: 081230411494509792BD4A3depends: vermagic: 3.8.0-39-generic SMP mod_unload modversions 686
Linux内核模块程序结构
模块加载函数
1 static int _ _init initialization_function(void)2 { 3 /* 初始化代码 */4 }5 module_init(initialization_function);
static int hello_data __initdata = 1;static int __init hello_init(void){ printk(KERN_INFO "Hello, world %d\n", hello_data); return 0;}module_init(hello_init);static void __exit hello_exit(void){ printk(KERN_INFO "Goodbye, world\n");}module_exit(hello_exit);
模块卸载函数
1 static void _ _exit cleanup_function(void)2 {3 /* 释放代码 */4 }5 module_exit(cleanup_function);
模块参数
static char *book_name = "dissecting Linux Device Driver";module_param(book_name, charp, S_IRUGO);static int book_num = 4000;module_param(book_num, int, S_IRUGO);
01 #include <linux/init.h>02 #include <linux/module.h>0304 static char *book_name = "dissecting Linux Device Driver";05 module_param(book_name, charp, S_IRUGO);0607 static int book_num = 4000;08 module_param(book_num, int, S_IRUGO);0910 static int __init book_init(void)11 {12 printk(KERN_INFO "book name:%s\n", book_name);13 printk(KERN_INFO "book num:%d\n", book_num);14 return 0;15 }16 module_init(book_init);1718 static void __exit book_exit(void)19 {20 printk(KERN_INFO "book module exit\n ");21 }22 module_exit(book_exit);2324 MODULE_AUTHOR("Barry Song <baohua@kernel.org>");25 MODULE_LICENSE("GPL v2");26 MODULE_DESCRIPTION("A simple Module for testing module params");27 MODULE_VERSION("V1.0");
# tail -n 2 /var/log/messagesJul 2 01:03:10 localhost kernel: <6> book name:dissecting Linux Device DriverJul 2 01:03:10 localhost kernel: book num:4000
# tail -n 2 /var/log/messagesJul 2 01:06:21 localhost kernel: <6> book name:GoodBookJul 2 01:06:21 localhost kernel: book num:5000Jul 2 01:06:21 localhost kernel: book num:5000
barry@barry-VirtualBox:/sys/module/book/parameters$ tree.├── book_name└── book_num
导出符号
01 #include <linux/init.h>02 #include <linux/module.h>0304 int add_integar(int a, int b)05 {06 return a + b;07 }08 EXPORT_SYMBOL_GPL(add_integar);0910 int sub_integar(int a, int b)11 {12 return a - b;13 }14 EXPORT_SYMBOL_GPL(sub_integar);1516 MODULE_LICENSE("GPL v2");
# grep integar /proc/kallsymse679402c r __ksymtab_sub_integar [export_symb]e679403c r __kstrtab_sub_integar [export_symb]e6794038 r __kcrctab_sub_integar [export_symb]e6794024 r __ksymtab_add_integar [export_symb]e6794048 r __kstrtab_add_integar [export_symb]e6794034 r __kcrctab_add_integar [export_symb]e6793000 t add_integar [export_symb]e6793010 t sub_integar [export_symb]
模块声明与描述
MODULE_AUTHOR(author);MODULE_DESCRIPTION(description);MODULE_VERSION(version_string);MODULE_DEVICE_TABLE(table_info);MODULE_ALIAS(alternate_name);
1 /* 对应此驱动的设备表 */2 static struct usb_device_id skel_table [] = {3 { USB_DEVICE(USB_SKEL_VENDOR_ID,4 USB_SKEL_PRODUCT_ID) },5 { } /* 表结束 */6 };78 MODULE_DEVICE_TABLE (usb, skel_table);
模块的使用计数
模块的编译
KVERS = $(shell uname -r)# Kernel modulesobj-m += hello.o# Specify flags for the module compilation.#EXTRA_CFLAGS=-g -O0build: kernel_moduleskernel_modules: make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modulesclean: make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
模块与GPL
0 0
- Linux内核模块编程与内核模块LICENSE -《详解(第3版)》预读
- Linux内核模块编程与内核模块LICENSE -《详解(第3版)》预读
- Linux内核模块编程与内核模块LICENSE
- Linux内核模块编程与内核模块LICENSE
- Linux内核模块编程
- Linux内核模块编程
- Linux内核模块编程
- linux内核模块编程
- Linux 内核模块编程
- Linux内核模块编程
- Linux内核模块编程
- Linux内核模块编程
- LINUX内核模块编程
- linux内核模块编程
- linux内核模块编程
- Linux内核模块编程
- Linux 内核模块 编程
- Linux内核模块编程
- 数据库设计三大范式
- 飘逸的python - 大数据TopK问题的quick select解法
- effective C++ 读书笔记 条款14和15
- 界面库学习,控件源码下载网站
- Linux 内存管理(3)paging_init(1)
- Linux内核模块编程与内核模块LICENSE -《详解(第3版)》预读
- Slave SQL: Error 'Incorrect string value Error_code: 1366
- hive中建表及put数据
- 编码与调制的区别
- 关于头文件中的 static inline函数
- MySQL存储过程语法及实例
- Excel VBA概念区分
- C语言清空输入缓冲区的N种方法对比
- 学习OpenGL-ES: 0 - 方法和资料