linux是如何组成的?
答:linux是由用户空间和内核空间组成的
为什么要划分用户空间和内核空间?
答:有关CPU体系结构,各处理器可以有多种模式,而LInux这样的划分是考虑到系统的
安全性,比如X86可以有4种模式RING0~RING3
linux内核是如何组成的?
答:linux内核由SCI(System Call Interface)系统调用接口、PM(Process Management)进程管理、MM(Memory Management)内存管理、Arch、
VFS(Virtual File Systerm)虚拟文件系统、NS(Network Stack)网络协议栈、DD(Device Drivers) 设备驱动
linux 内核源代码
linux内核源代码是如何组成或目录结构?
答:
block目录
crypto目录
documentation
drivers
fs
include
init
ipc
kernel
lib
mm
samples
scripts
security
sound
usr
virt
内核配置与编译
一、清除
make clean
make mrproper
make distclean
二、内核配置方式
make config
make menuconfig
make oldconfig
make xconfig
三、make menuconfig一些说明或技巧
在括号中按“y”表示编译进内核,按“m”编译为模块,按“n”不选择,也可以按空格键进行选择
注意:内核编译时,编译进内核的“y”,和编译成模块的“m”是分步编译的
四、快速配置相应体系结构的内核配置
我们可以
五、编译内核
1.
————————————————————————————
make zImage
make bzImage
同样我们也可以编译时获取编译信息,可使用
make zImage V=1
make bzImage V=1
编译好的内核位于
————————————————————————————
以上是编译内核make menuconfig时先“m”选项的编译
2.
make modules
make modules_install
六、制作init ramdisk
mkinitrd initrd-$version $version
七、内核安装
复制内核到相关目录下再作grub引导也就可以了
1.cp arch/$cpu/boot/bzImage /boot/vmlinux-$version
2.cp $initrd /boot/
3.修改引导器/etc/grub.conf(lio.conf)正确引导即可
#incldue <linux/init.h>
#include <linux/module.h>
static int hello_init(void)
{
printk(KERN_WARNING"Hello,world!\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_INFO"Good,world!\n");
}
module_init(hello_init);
module_exit(hello_exit);
___________hello,world!范例___________________
一、必需模块函数
1.加载函数
2.卸载函数
编译模块多使用makefile
二、可选模块函数
1.MODULE_LICENSE("*******");
2.MODULE_AUTHOR("********");
3.MODELE_DESCRIPTION("***");
4.MODULE_VERSION("V1.0");
5.MODULE_ALIAS("*********");
三、模块参数
通过宏module_param指定模块参数,模块参数用于在加载模块时传递参数模块
module_param(neme,type,perm);
name是模块参数名称
type是参数类型
perm是参数访问权限 perm常见值:S_IRUGO、S_IWUSR
S_IRUGO:任何用户都对sys/module中出现的参数具有读权限
S_IWUSR:允许root用户修改/sys/module中出现的参数
int a = 3;
char *st;
module_param(a,int,S_IRUGO);
module_param(st,charp,S_IRUGO);
ifneq
obj-m
else
KDIR
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symyers
endif
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
static char *name = "Junroc Jinx";
static int age = 30;
module_param(arg,int,S_IRUGO);
module_param(name,charp,S_IRUGO);
static int hello init(void)
{
printk(KERN_EMERG"Name:%s\n",name);
printk(KERN_EMERG"Age:%d\n",age);
return 0;
}
static void hello_exit(void)
{
printk(KERN_INFA"Module Exit\n");
}
moduleJ_init(hello_init);
module_exit(hello_exit);
----------------------------------------------------------------------------
/proc/kallsyms 文档记录了内核中所有导出的符号的名字与地址
什么是导出?
答:导出就是把模块依赖的符号导进内核,以便供给其它模块调用
为什么导出?
答:不导出依赖关系就解决不了,导入就失败
符号导出使用说明:
EXPORT_SYMBOL(符号名)
EXPORT_SYMBOL_GPL(符号名)
其中EXPORT_SYMBOL_GPL只能用于包含GPL许可证的模块
模块版本不匹配问题的解决:
1、使用 modprobe --force-modversion
2、确保编译内核模块时,所依赖的内核代码版本等同于当前正在运行的内核
----------------------------------------------------------------------
printk内核打印:
printk允许根据严重程度,通过附加不同的“优先级”来对消息分类
在<linux/kernel.h>定义了8种记录级别。按照优先级递减分别是:
KERN_EMERG
KERN_ALERT
KERN_CRIT
KERN_ERR
KERN_WARNING
KERN_NOTICE
KERN_INFO
KERN_DEBUG
没有指定优先级的printk默认使用
DEFAULT_MESSAGE_LOGLEVEL优先级
控制优先级的配置:
/proc/sys/kernel/printk(可以查看或修改)
------------
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Junroc Jinx");
MODULE_DESCRIPTION("hello,world module! ");
MODULE_ALIAS("A simple modle test");
extern int add_integar(int a,int b);
extern int sub_integar(int a,int b);
static int __init hello_init()
{
int res = add_integar(1,2);
return 0;
}
static void __exit hello_exit()
{
int res = sub_integar(2,1);
}
module_init(hello_init);
module_exit(hello_exit);
#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);
linux、内核源码、内核编译与配置…
最新推荐文章于 2024-06-19 22:29:46 发布
<script type="text/javascript" id="wumiiRelatedItems"> </script>