当前位置:首页 > 行业发展 > 正文

什么是linux内核?linux内核模块是什么?如何使用?内核模块详解

什么是linux内核linux就像是一个哲学的最佳实践。如果非要对它评价,我真的不知道该怎么赞叹,我只能自豪地说着:“linux的美丽简直让人沉醉。”我只能说是我处在linux学习的修炼之路上的一个小菜鸟,linux的东西真的太丰富了,让你感觉只要掌握了其中的一个部分,就可以在求职之路上大放光彩,因...

什么是linux内核linux就像是一个哲学的最佳实践。如果非要对它评价,我真的不知道该怎么赞叹,我只能自豪地说着:“linux的美丽简直让人沉醉。”我只能说是我处在linux学习的修炼之路上的一个小......

什么是linux内核

linux就像是一个哲学的最佳实践。如果非要对它评价,我真的不知道该怎么赞叹,我只能自豪地说着:“linux的美丽简直让人沉醉。”

我只能说是我处在linux学习的修炼之路上的一个小菜鸟,linux的东西真的太丰富了,让你感觉只要掌握了其中的一个部分,就可以在求职之路上大放光彩,因此我常常感叹自己的弱小和无知,我离着linux的中心是多么的遥远,我只看到众多高耸的山峰。

我们张家亮老师曾经提起说LInux的设计是行为需求驱动型。似乎是这么说的,觉得不对劲。我对linux的感觉就是自由,合作,兼容。

linux内核体系结构

1.操作系统原理

2.汇编语言精讲

3.内存管理专题

4.网络协议栈专题

5.设备驱动专题

6.文件系统专题

7.内核项目实战专题

1.何为内核模块

最笨的方法是对内核进行重新配置,然后再重新编译。这样的话岂不是说我加一个组件就得重新编译内核,这显然不是很科学的方法,其实我们的linux内核提供在运行时可进行扩展的特性,这意味着当系统启动并运行时,我们可以向内核添加或移除部分功能。

我们在运行时添加到内核中的代码就被称为动态可加载内核模块,我们简称为内核模块。

2.内核模块的相关操作

a)加载内核模块:insmod

b)卸载内核模块:rmmod

c)查看内核模块:lsmod

3.模块声明

a)MODULE_LICENSE(“GPL”):内核可以识别的许可证有GPL(任意版本GNU通用公共许可证)、GPLv2等

b)MODULE_AUTHOR(“作者”):声明作者信息可以不用

c)MODULE_VERSION(“版本”):声明版本信息也可以不用

d)MODULE_DESCRIPTION(“功能描述”):声明模块功能,可不用

4.模块参数

我们可以在加载内核模块的时候向其传递参数,以让同一代码达到不同的效果。当然我们的参数必须用module_param宏来声明具体如下:

1module_param(name,type,perm)

a)name:变量名

b)type:数据类型内核支持模块参数类型有:bool、invbool(bool的发转,true变为false,false变为true)、charp(char类型指针值)、int、long、short、uint、ulong、ushort、

c)perm:常见的访问许可值通常为S_IRUGO和S_IWUSR。通常情况下将他们按位或

同时我们也可以用下面的宏声明数组:

1Module_param_array(name,type,num,perm)

5.模块符号导出

当一个模块要使用另一个模块的函数(变量)的时候,要使用EXPORT_SYMBOL(符号名)或者EXPORT_SYMBOL_GPL(符号名)来申明。

注:EXPORT_SYMBOL_GPL()只适用于遵循GPL协议的模块

简单内核模块实现

想必大家都记得我们在学习某种语言的时候,写的第一个程序大部分都是输出helloworld,所以我接下来用我们刚才介绍的内核模块去完成helloworld。

1.内核模块编写

通过上面部分内容的介绍,要完成第一个内核模块不是很难,下面是自己的代码。

1includelinux/_LICENSE("GPL");4staticinthello_init(void)5{6printk("0helloworld\n");7return0;8}9staticvoidhello_exit(void)10{11printk("0goodbye\n");12}13module_init(hello_init);//该宏在模块的目标代码中增加一个特殊地段,用于说明内核初始化函数所在的位置14module_exit(hello_exit);//跟上面的宏对立

2.Makefile编写

Makefile的编写也比较简单,要注意的地方代码中已经说明。

1obj-m:=:=/smbshare////此处路径为内核源码路径,该内核源码必须要经过编译,不然会报错3all:4make-C$(DIRS)M=$(PWD)modules5clean:6rm-Rf*.o*.ko*.*.order*.symvers

经过了上面两个步骤,我们然后编译加载然后卸载我们的模块进行试验。

编译:

加载:

查看:

卸载:

3.Printk函数简介

printk函数为内核打印函数,其和printf函数功能类似,不过比printf多了打印权限一共有8个级别,printk的日志级别定义如下(在include/linux/中):

1defineKERN_ALERT1//报告消息,表示必须立即采取措施3defineKERN_ERR3//错误条件,驱动程序常用KERN_ERR来报告硬件的错误5defineKERN_NOTICE5//正常但又重要的条件,用于提醒7defineKERN_DEBUG7//调试级别的消息

今天的内容比较简单,只是对内核模块有了一个初步的了解,所以我今天在给大家推荐一个比较好用的工具,叫做exvim其将好多vim的工具进行了集成,个人感觉十分方便,就是换电脑什么的也不怕自己的配置丢失了。贴一张自己使用的图,大家有兴趣的可以去。

最新文章