1. Linux内核组成部分:
- 进程调度
- 内存管理(0~3G用户空间,3~4G内核空间)
- 虚拟文件系统
- 网络接口(分为网络协议和网络驱动)
- 进程间通信(信号量、共享内存、消息队列、管道、UNIX套接字等)
2. 内核模块:
- 模块加载/卸载函数:
#include <linux/init.h> #include <linux/module.h> /* #define __init __attribute__((__section__(".init.text"))) 内核中加载模块函数:request_module(const char *fmt, ...) */ /* 模块参数:module_param(参数名,参数类型,参数读/写权限) 模块参数数组:module_param_array(数组名,数组类型,数组长,参数读/写权限) 用户可以向模块传递参数:insmode(或modprobe) 模块名 参数名=参数值 如果模块被内置,就无法insmod,但是可以通过bootloader在bootargs里设置"模块名.参数名=值" 参数类型:byte short ushort int uint long ulong charp(字符指针) bool/invbool(布尔的反) 模块被加载后,/sys/module/目录下将出现以此模块命名的目录 */ static char *book_name = "Linux Device Driver"; module_param(book_name, charp, S_IRUGO); static int book_num = 4000; module_param(book_num, int, S_IRUGO); static int g_init_data __initdata = 1; static int __init func_init(void) { printf(KERN_INFO"func_init:%d\n", g_init_data); printf(KERN_INFO"book_name:%s\n", book_name); printf(KERN_INFO"book_num:%d\n", book_num); return 0; } module_init(func_init); static int g_exit_data __exitdata = 2; static void __exit func_exit(void) { printf(KERN_INFO"func_exit:%d\n", g_exit_data); } module_exit(func_exit); MODULE_AUTHOR(“Linuxer”); MODULE_LICENSE("GPL v2"); MODULE_DESCRIPTION("Module for testing"); MODULE_VERSION("V1.0");