您当前的位置:首页 > 电脑百科 > 软件技术 > 操作系统 > linux

什么是linux内核?linux内核模块是什么?内核模块详解

时间:2021-12-23 09:37:39  来源:  作者:linux上的码农

什么是linux内核

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

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

前面的几个是我比较关心的方向。我现在主要在学习linux嵌入式编程方面的知识。此外就是复杂的linux编程。我在后面会说一下我对linux编程的浅薄认识。众多的有趣的方向,常常让我们感觉无所适从。我不谈专业的知识,我就谈谈我学习linux的故事,以及站在专业角度上的评论和展望好了。

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

linux内核体系结构

1.操作系统原理

什么是linux内核?linux内核模块是什么?内核模块详解

 

2.汇编语言精讲

什么是linux内核?linux内核模块是什么?内核模块详解

 

3.内存管理专题

什么是linux内核?linux内核模块是什么?内核模块详解

 

4.网络协议栈专题

什么是linux内核?linux内核模块是什么?内核模块详解

 

5.设备驱动专题

什么是linux内核?linux内核模块是什么?内核模块详解

 

6.文件系统专题

什么是linux内核?linux内核模块是什么?内核模块详解

 

7.内核项目实战专题

什么是linux内核?linux内核模块是什么?内核模块详解

 

1. 何为内核模块

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

更多linux内核视频教程文本资料免费获取可以后台私信【内核】获取。

什么是linux内核?linux内核模块是什么?内核模块详解

 


什么是linux内核?linux内核模块是什么?内核模块详解

 

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

2. 内核模块的相关操作

a) 加载内核模块:insmod

b) 卸载内核模块:rmmod

c) 查看内核模块:lsmod

3. 模块声明

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

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

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

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

4. 模块参数

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

1 module_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。通常情况下将他们按位或

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

  1. 1 Module_param_array(name,type,num,perm)

5. 模块符号导出

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

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

简单内核模块实现

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

1. 内核模块编写

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

  1. 1 #include<linux/init.h> 2 #include<linux/module.h> 3 MODULE_LICENSE("GPL"); 4 staticint hello_init(void) 5 { 6 printk("<0> hello worldn"); 7 return0; 8 } 9 staticvoid hello_exit(void) 10 { 11 printk("<0> goodbyen"); 12 } 13 module_init(hello_init);//该宏在模块的目标代码中增加一个特殊地段,用于说明内核初始化函数所在的位置 14 module_exit(hello_exit);//跟上面的宏对立

2. Makefile编写

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

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

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

编译:

什么是linux内核?linux内核模块是什么?内核模块详解

 

加载:

什么是linux内核?linux内核模块是什么?内核模块详解

 

查看:

什么是linux内核?linux内核模块是什么?内核模块详解

 

卸载:

什么是linux内核?linux内核模块是什么?内核模块详解

 

3. Printk函数简介

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

什么是linux内核?linux内核模块是什么?内核模块详解

 

1 #define KERN_EMERG 0 //紧急事件消息,系统崩溃之前提示,表示系统不可用
2 #define KERN_ALERT  1 //报告消息,表示必须立即采取措施
3 #define KERN_CRIT    2 //临界条件,通常涉及严重的硬件或软件操作失败
4 #define KERN_ERR     3 //错误条件,驱动程序常用KERN_ERR来报告硬件的错误
5 #define KERN_WARNING  4 //警告条件,对可能出现问题的情况进行警告
6 #define KERN_NOTICE 5 //正常但又重要的条件,用于提醒
7 #define KERN_INFO 6    //提示信息,如驱动程序启动时,打印硬件信息
8 #define KERN_DEBUG 7 //调试级别的消息
什么是linux内核?linux内核模块是什么?内核模块详解

 

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



Tags:linux内核   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
什么是linux内核linux就像是一个哲学的最佳实践。如果非要对它评价,我真的不知道该怎么赞叹,我只能自豪地说着:“linux的美丽简直让人沉醉。”我只能说是我处在linux学习的修炼...【详细内容】
2021-12-23  Tags: linux内核  点击:(15)  评论:(0)  加入收藏
内核空间 和用户空间申请的内存最终和buddy怎么交互?以及在页表映射上的区别?虚拟地址到物理地址,什么时候开始映射?Buddy的问题分配的力度太大 buddy算法把空闲页面分成1,2,4页,bu...【详细内容】
2021-12-07  Tags: linux内核  点击:(25)  评论:(0)  加入收藏
1、设备树的概念在内核源码中,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录,对内核而言这些platform设备、resource、i2c_b...【详细内容】
2021-11-26  Tags: linux内核  点击:(31)  评论:(0)  加入收藏
自旋锁:如果内核配置为SMP系统,自旋锁就按SMP系统上的要求来实现真正的自旋等待,但是对于UP系统,自旋锁仅做抢占和中断操作,没有实现真正的“自旋”。如果配置了CONFIG_DEBUG_SPI...【详细内容】
2021-10-21  Tags: linux内核  点击:(37)  评论:(0)  加入收藏
1. Linux内核时钟系统和定时器实现Linux 2.6.16之前,内核只支持低精度时钟,内核定时器的工作方式: 系统启动后,会读取时钟源设备(RTC, HPET,PIT&hellip;),初始化当前系统时间; 内...【详细内容】
2021-09-29  Tags: linux内核  点击:(50)  评论:(0)  加入收藏
1. 红黑树1.1 红黑树概述红黑树和我们以前学过的AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。不过自从红黑树出来后,AVL...【详细内容】
2021-06-24  Tags: linux内核  点击:(119)  评论:(0)  加入收藏
UDP报文接收概述UDP数据报的接收要分两部分来看: 网络层接收完数据包后递交给UDP后,UDP的处理过程。该过程UDP需要做的工作就是接收数据包并对其进行校验,校验成功后将其放入接...【详细内容】
2021-06-04  Tags: linux内核  点击:(93)  评论:(0)  加入收藏
题目是一个典型 《Effective C++》 的风格。事情是这样的,我大致说一下。我在开发一个Netfilter模块,在PREROUTING匹配一些数据包,显而易见,都能想到使用哈希表hlist作为数据结...【详细内容】
2021-05-18  Tags: linux内核  点击:(200)  评论:(0)  加入收藏
需求在Linux SMP(对称多处理器)环境下,每个CPU对应一个run_queue(可执行队列)。如果一个进程处于TASK_RUNNING状态(可执行状态),则它会被加入到其中一个run_queue(且同一时刻仅会被加...【详细内容】
2021-04-01  Tags: linux内核  点击:(225)  评论:(0)  加入收藏
Linux内核是GNU/Linux操作系统的核心组件。它是一个免费、开源、庞大、模块化、多任务的类Unix的操作系统内核。它最初是由Linus Torvalds在1991年为他的i386 PC创造的。实...【详细内容】
2021-03-18  Tags: linux内核  点击:(274)  评论:(0)  加入收藏
▌简易百科推荐
作用显示文件或目录所占用的磁盘空间使用命令格式du [option] 文件/目录命令功能显示文件或目录所占用的磁盘空间一些写法的区别du -sh xxx 显示总目录的大小,但是不会列出...【详细内容】
2021-12-23  mitsuhide1992    Tags:du命令   点击:(12)  评论:(0)  加入收藏
什么是linux内核linux就像是一个哲学的最佳实践。如果非要对它评价,我真的不知道该怎么赞叹,我只能自豪地说着:“linux的美丽简直让人沉醉。”我只能说是我处在linux学习的修炼...【详细内容】
2021-12-23  linux上的码农    Tags:linux内核   点击:(15)  评论:(0)  加入收藏
本文将比较 Linux 中 service 和 systemctl 命令,先分别简单介绍这两个命令的基础用法,然后进行比较。从 CentOS 7.x 开始,CentOS 开始使用 systemd 服务来代替 service服务(dae...【详细内容】
2021-12-23  软件架构    Tags:systemctl   点击:(13)  评论:(0)  加入收藏
mv是move的缩写,可以用来移动文件或者重命名文件名,经常用来备份文件或者目录。命令格式mv [选项] 源文件或者目录 目标文件或者目录命令功能mv命令中第二个参数类型的不同(...【详细内容】
2021-12-17  入门小站    Tags:mv命令   点击:(23)  评论:(0)  加入收藏
大数据技术AI Flink/Spark/Hadoop/数仓,数据分析、面试,源码解读等干货学习资料 98篇原创内容 -->公众号 Linux sed 命令是利用脚本来处理文本文件。sed 可依照脚本的指令来处...【详细内容】
2021-12-17  仙风道骨的宝石骑士    Tags:sed命令   点击:(21)  评论:(0)  加入收藏
Node是个啥?  写个东西还是尽量面面俱到吧,所以有关基本概念的东西我也从网上选择性地拿了下来,有些地方针对自己的理解有所改动,对这些概念性的东西有过了解的可选择跳过这段...【详细内容】
2021-12-15  linux上的码农    Tags:node   点击:(21)  评论:(0)  加入收藏
难道只有我一个人觉得Ubuntu的unity桌面非常好用吗?最近把台式机上面的Ubuntu 16.04格式化了,装了黑苹果用了一周,不得不说,MacOS确实很精美,软件生态比Linux丰富很多,比Windows简...【详细内容】
2021-12-14  地球末日村    Tags:ubuntu   点击:(34)  评论:(0)  加入收藏
简介Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。输出信息含义执行net...【详细内容】
2021-12-13  窥镜天    Tags:Linux netstat   点击:(26)  评论:(0)  加入收藏
对于较多数量的文件描述符的监听无论是select还是poll系统调用都显得捉襟见肘,poll每次都需要将所有的文件描述符复制到内核,内核本身不会对这些文件描述符加以保存,这样的设计...【详细内容】
2021-12-13  深度Linux    Tags:Linux   点击:(16)  评论:(0)  加入收藏
今天,我们来了解下 Linux 系统的革命性通用执行引擎-eBPF,之所以聊着玩意,因为它确实牛逼,作为一项底层技术,在现在的云原生生态领域中起着举足轻重的作用。截至目前,业界使用范...【详细内容】
2021-12-10  架构驿站    Tags:eBPF   点击:(24)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条