文章目录
嵌入式驱动开发
第二章 内核模块
2.1第一个内核程序
-
内核模块:内核模块就是被单独编译的一段内核代码,它可以在需要的时候动态地加载到内核,从而动态地增加内核的功能。在不需要的时候可以动态地卸载,从而减少内核的功能,并节约一部分内存(这要求内核配置了模块可卸载选项才行)
-
#include<linux/init.h> #include<linux/kernel.h> #include<linux/module.h> int init_module(void) { printk("module init\n"); return 0; } void cleanup_module(void) { printfk("cleanup module\n"); }
2.2内核模块的相关工具
- 模块加载:
- insmod:加载指定目录下的一个.ko文件到内核。
- modprobe:自动加载模块到内核,相对于insmod更加智能。
- 模块信息:
- modinfo:查看模块的信息。
- 模块卸载:
- rmmod:卸载模块。
2.3内核模块的一般形式
- MODULE_LICENSE是一个宏,里面的参数是一个字符串,代表相应的许可证协议。可以是:GPL、GPLv2、GPL and additional rights、Dual BSD/GPL、Dual MIT/GPL、Dual MPL/GPL等
一个模块的程序代码
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/module.h>
static int_init vser_init(void)
{
printk("vser_init\n");
return 0;
}
static void_exit vser_exit(void)
{
printk("vser_exit\n");
}
module_init(vser_init);
module_exit(vser_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Kevin Jiang <jiangxg@farsight.com.cn>");
MODULE_DESCRIPTION("A simple module");
MODULE_ALIAS("virtual-serial");
2.6内核模块依赖
/*vser.c*/
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/module.h>
extern int expval;
extern void expfun(void);
static int _init vser_init(void)
{
printk("vser_init\n");
printk("expval: %d\n",expval);
expfun();
return 0;
}
static void _exit vser_exit(void)
{
printk

本文详细介绍了嵌入式驱动开发,涵盖内核模块、字符设备驱动、高级I/O操作、中断和时间管理等多个方面。讲解了内核模块的加载、卸载工具,字符设备驱动的框架,中断处理函数,以及不同类型的中断下半部机制,如软中断、tasklet和工作队列。此外,还讨论了高级I/O操作如ioctl、阻塞I/O、异步I/O等,并探讨了内存管理和Linux设备模型。

516

被折叠的 条评论
为什么被折叠?



