一、内核简介
user application、GUN library
(用户空间)(Ring3)
system call interfer (SCI)
kernel
kernel code
(内核空间)(Ring0)
用户空间——————(通过系统调用和硬件中断)——————————————内核空间
如图所示:
二、内核简介目录
1、工作模式:usr、fiq、irq、svc、abt、sys、und
2、
3、arch:不同的处理器(里面包括不同的CPU架构,举例mach-S3C2440的配置config)
block::部分设备驱动
document:内核的文档
drivers:设备驱动程序
fs:ext2、nfs等等
include:与平台无关的头文件子目录
init:内核初始化
ipc:进程通信实现代码
lib:库文件代码
mm:内存管理
net:网络协议实现代码
scripts:配置脚本
security:SElinux 模块
sound:音频设备驱动
usr:cpio实现命令
virt:内核虚拟
三、内核配置与编译
1、make clean、make mrproper、make distclean
2、确定硬件、CPU、网络协议
3、make config、make menuconfig、make oldconfig、make xconfig、
4、配置config
根据参考配置config 把arch不同CPU 下的config 拷贝到主目录下
make menuconfig
选择Y(*)N(NULL)、M(M)(PS:*表示编译+链接、M表示编译但不链接、NULL表示不编译)
5、编译内核
make bzImage (V=1):完全显示编译过程
5、编译内核模块
make module
6、安装内核模块
make module_install (自动会使copy到/lib/modules目录)
7、制作init ramdisk:
mkintrd initrd$vision vision
8、安装内核拷贝到、boot目录、并修改grub./config
四、内核模块开发
1、模块加载函数module_init()
模块卸载函数module_exit()
2、Makefile编写格式
3、安装模块 insmod XX.KO
卸载模块 rmmod XX
查看:lsmod
加载模块:modproper XX
4、模块可选信息
1--许可证申明
宏MODULE_LICENSE用来告知内核,该模块带有一个许可证(GPL,GPLv2等)。
2---MODULE_AUTHER()作者
3--MODULE_DESCRIPTION()描述
4--MODULE_VERSION()版本
5--MODULE_ALIAS()别名
示例代码:
/***********hellomodule*********/
#include<linux/init.h>
#include<linux/module.h>
static int hello_init(void)
{
printk("hello module\n");
return 0;
}
static int hello_exit(void)
{
printk("exit module\n");
}
module_init(hello_init);
module_exit(hello_exit);
/*********Makefile***********/
ifneq ($(KERNELRELEASE),)
obj-m :=hellomodule.o
else
KDIR:=/lib/modules/2.6.18-238.el5/build
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *mod.c .symvers
endif
5、模块参数选择
/**************paramodule.c**************/
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
static char *name = "DREAM890527";
static int age=24;
module_param(age, int ,S_IRUGO);
module_param(name, charp ,S_IRUGO);
static int __init hello_init(void)
{
printk(KERN_EMERG "Name:%s\n",name);
printk(KERN_EMERG "Age:%d\n",age);
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_EMERG"Module exit!\n");
}
module_init(hello_init);
module_exit(hello_exit);
/*******************Makefile**********************/
ifneq ($(KERNELRELEASE),)
obj-m :=paramodule.o
else
KDIR:= /lib/modules/2.6.18-238.el5/build
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c .symvers
endif
6、依赖模块必须按顺序加载
使用EXPORT_SYSMBOL()
EXPORT_SYSMBOL_GPL()
/**************export_sysmbol**************#include<linux/init.h>
#include<linux/module.h>
MODULE_LICENSE("GPL");
extern int add_integar(int a,int b);
extern int sub_integar(int a,int b);
static int __init hello_init(void)
{
int res=add_integar(1,2);
printk(KERN_EMERG "hello init,res=%d\n",res);
return 0;
}
static void __exit hello_exit()
{
int res=sub_integar(1,2);
printk(KERN_EMERG "hello exit,res=%d\n",res);
return 0;
}
module_init(hello_init);
module_exit(hello_exit);
/******************caculate.c*********************/
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
int add_integar(int a,int b)
{
return a+b;
}
int sub_integar(int a,int b)
{
return a-b;
}
static int __init sym_init()
{
return 0;
}
static void __exit sym_exit()
{
}
module_init(sym_init);
module_exit(sym_exit);
/*EXPORT_SYMBOL(add_integar);
EXPORT_SYMBOL(sub_integar);*/
/**************Mackefile**********************/
ifneq ($(KERNELRELEASE),)
obj-m := export_symbol.o calculate.o
else
KDIR := /lib/modules/2.6.18-238.el5/build
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif