linux 内核简介

一、内核简介

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值