linux内核结构以及内核模块编程

news2024/10/7 8:21:35

1、linux内核结构

1.1、单内核与微内核结构

1.1.1、什么是单内核结构和微内核结构

  • linux操作系统是一个单内核的结构,它的各个子系统之间可以直接调用
    比如说文件系统、内存管理、进程管理以及网络系统和进程间通信它们互相之间可以直接调用
  • 只有一些核心的代码它在微内核里面
    比如说核心的进程间通信、中断以及调度程序放在微内核,而其他的像文件系统、内存管理可能以服务器的方式放在外部

1.1.2、单内核与微内核的区别

  • 单内核因为它各个子系统之间可以直接调用,所以性能比较高,但是它的可维护性比较差
  • 微内核与服务器之间是一种通信的关系,比如说当要发出一个请求的时候文件系统可能要与微内核进行通信,而这个通信是有代价的,所以微内核的效率比较低,但是因为这种架构各个服务器之间相对独立,所以它的维护性比较好

1.1.3、linux内核源码目录结构

其中各个目录的主要代码类别如下:

  • arch:架构相关
  • block:块设备管理相关
  • drivers:驱动相关
  • fs:文件系统相关
  • include:头文件相关
  • init:linux内核初始化相关
  • ipc:进程间通信
  • kernel:linux内核相关
  • lib:库函数相关
  • mm:内存管理相关
  • net:网络协议相关
    … …

linux-5.4:
在这里插入图片描述

2、linux内核模块

从上面linux源码目录也可以发现,linux内核是单内核结构,因此其维护性较差,因此为了能够让我们的驱动代码不需要每次都重新编译一次linux内核,linux提供了一种模块——可加装的linux内核模块(LKM)。因为linux使用C语言写的,由于C语言是模块化编程的,添加模块很麻烦,所以为了给Linux添加模块,于是诞生了LKM,就是可以使使用户随时添加内核模块到内核,也可以随时卸载,不和内核建立捆绑。
为了更好的理解该模块,下面写一个简单的linux内核驱动模块:

2.1、驱动模块的编译

  • hello.c文件
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
//module.h包含了对模块的版本控制
//kernel.h包含了常用的内核函数
//init.h包含了宏__init和__exit
/*
 * 模块的初始化函数 hello_init()
 * __init是用于初始化的修饰符
 * insmod模块的时候执行
 */
static int __init hello_init(void)
{
  //<1>是输出的级别,表示立即在终端输出
  printk("<1>hello,Kernal!...\n!");
  return 0;
}
/*
 * 模块的退出和清理函数 hello_exit()
 * rmmod 模块的时候执行
 */
static void __exit hello_exit(void)
{
  printk("<1>Goodbye,world!...\n");
}

module_init(hello_init);
module_exit(hello_exit);
/*
 * 模块的许可证声明GPL
 */
MODULE_LICENSE("GPL");

ps:
printk相比printf来说还多了个:日志级别的设置,用来控制printk打印的这条信息是否在终端上显示的,当日志级别的数值小于控制台级别时,printk要打印的信息才会在控制台打印出来,否则不会显示在控制台!


#define    KERN_EMERG    "<0>"    /* system is unusable            */
#define    KERN_ALERT    "<1>"    /* action must be taken immediately    */
#define    KERN_CRIT    "<2>"    /* critical conditions            */
#define    KERN_ERR    "<3>"    /* error conditions            */
#define    KERN_WARNING    "<4>"    /* warning conditions            */
#define    KERN_NOTICE    "<5>"    /* normal but significant condition    */
#define    KERN_INFO    "<6>"    /* informational            */
#define    KERN_DEBUG    "<7>"    /* debug-level messages            */
  • Makefile文件
    内核模块不是独立的可执行文件,但在运行时其目标文件被链接到内核中,并且只有root用户才能insmod和rmmod模块
obj-m :=hello.o                    #产生hello模块的目标文件,这里的hello必须和c语言的文件名对应,
CURRENT_PATH := $(shell pwd)       #模块当前所在的当前路径
LINUX_KERNEL := $(shell uname -r)  #linux内核源代码的当前版本,uame -r 查看内核的linux命令
LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL)
                                   #linux内核源代码的绝对路径
all:
        make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules #编译模块,Makefile文件中若一行是命令,必须以tab键开头
clean:
        make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean   #清理模块

**

**ps:
obj-m := .o
obj-y := .o
上面两者的区别在于,前者才会生成ko文件,后者只是代码编译进内核,并不生成ko文件。

  • 如何安装和卸载驱动模块
    insmod hello.ko:安装hello.ko模块
    rmmod hello.ko:卸载hello.ko模块
    dmesg:查看hello.ko的模块信息
    lsmod:查看hello.ko模块,可搭配grep使用,例如,lsmod | grep hello

3、linux内核模块与C应用的对比

上面已经简单实现了一个linux内核模块,但是它与C应用编程有哪些区别呢,如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/412743.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记录npm的安装过程

一、访问官网&#xff08;https://nodejs.org/en&#xff09;&#xff0c;下载nodejs并安装&#xff1a; 然后一路点击next直到安装完成&#xff0c;环境变量已经自动添加好了&#xff1a; 通过设置环境变量&#xff0c;改变本地仓库地址&#xff1a; 可以看到&#xff0c;…

一条更新语句的执行流程又是怎样的呢?

当一个表上有更新的时候&#xff0c;跟这个表有关的查询缓存会失效&#xff0c;所以这条语句就会把表T上所有缓存结果都清空。这也就是我们一般不建议使用查询缓存的原因。 接下来&#xff0c;分析器会通过词法和语法解析知道这是一条更新语句。优化器决定要使用ID这个索引。然…

LNMP网站框架搭建(yum方式安装)

1. nginx 的yum安装 1.1 搭建nginx相关的yum源 注意&#xff1a;本次安装所获得的软件包都是来源于httpd源&#xff08;都是由该软件包厂商提供&#xff09;。所以切记不能像往常一样直接使用本地源去安装一切包 vim /etc/yum.repos.d/nginx.repo [nginx-stable] namenginx…

Linux--tty

Linux 终端(TTY) TTY 是 Teletype 或 Teletypewriter 的缩写&#xff0c;原来是指电传打字机&#xff0c;后来这种设备逐渐键盘和显示器取代。不管是电传打字机还是键盘显示器&#xff0c;都是作为计算机的终端设备存在的&#xff0c;所以 TTY 也泛指计算机的终端(terminal)设…

【CSS】更改用户界面样式 ① ( 更改鼠标样式 | 更改鼠标样式应用场景 | 代码示例 )

文章目录一、更改鼠标样式二、更改鼠标样式代码示例三、更改鼠标样式应用场景一、更改鼠标样式 为对象元素设置 cursor 样式 , 可以更改鼠标移动到该元素上的显示样式 ; cursor 样式常用属性值 : default : 默认鼠标样式 , 白色箭头鼠标 ;pointer : 小手形状 ;move : 移动 - …

C++——初始化列表 | explicit关键字 | static成员

文章目录&#x1f490;专栏导读&#x1f490;文章导读&#x1f337;初始化列表&#x1f33a;初始化列表的形式&#x1f33a;初始化列表的注意事项&#x1f337;explicit关键字&#x1f33a;单参数构造函数&#x1f33a;多参数构造函数&#x1f337;static成员&#x1f33a;stat…

SprigBoot学习笔记(五)

监控 监控的意义 可视化监控平台 监控原理 自定义监控指标 监控的意义 监控服务状态是否宕机 监控服务运行指标(内存、虚拟机、线程、请求等) 监控日志 管理服务(服务下线) 监控的实施方式 显示监控信息的服务器:用于获取服务信息,并显示对应的信息 运行的服务:启动时主动…

Node【五】内置模块 【http模块】

文章目录&#x1f31f;前言&#x1f31f;http模块&#x1f31f; 1.引入http模块&#x1f31f; 2.创建服务&#x1f31f; 3.添加头信息&#x1f31f; 4.搭建一个简单的服务器&#xff1a;&#x1f31f; 5.Request对象&#x1f31f; 6.Response对象&#x1f31f; 7.练习&#xff…

【力扣周赛】第340场周赛

【力扣周赛】第340场周赛6361&#xff1a;对角线上的质数题目描述解题思路6360&#xff1a;等值距离和题目描述解题思路6361&#xff1a;对角线上的质数 题目描述 描述&#xff1a;给你一个下标从 0 开始的二维整数数组 nums &#xff0c;返回位于 nums 至少一条 对角线 上的…

webgl-原生纹理贴图

踩坑&#xff1a; 1、图片不显示&#xff1a;图片分辨率为非2的幂次方&#xff0c;图片不能被渲染。图形变成黑方块 2的N次幂&#xff1a;1 2 4 8 16 32 64 128 256 512 1024 2048 4096…… 2、几何图形配置映射方式&#xff0c;顶点坐标和纹理坐标对应需要注意&#xff0c;构…

并行分布式计算 并行计算机体系结构

文章目录并行分布式计算 并行计算机体系结构并行计算机结构模型SIMD 单指令多数据流PVP 并行向量处理机SMP 对称多处理机MPP 大规模并行处理机DSM 分布式共享存储多处理机COW 工作站集群总结并行计算机访存模型UMA 均匀存储访问模型NUMA 非均匀存储访问模型COMA 全高速缓存存储…

OpenCV实战之广角相机拍照算法

拍照是手机中的一项重要功能&#xff0c;目前常见的千元机中都包含数个相机模组&#xff0c;能够实现虚化拍照、美颜、广角拍照、夜景等功能。手机是一个拥有巨大销量的电子产品&#xff0c;因此成为图像处理算法的一个重要落地场景。很多AI公司聚焦于此&#xff0c;如虹软、旷…

Docker已经创建运行启动的容器,如何修改容器中的环境变量env使长期有效

1.查看Docker Root目录 docker info | grep Docker Root[rootjenkins ~]# docker info | grep ‘Docker Root’ Docker Root Dir: /data/docker 2.查到容器的长id&#xff08;container id&#xff09; 方式一&#xff1a; docker inspect pdmaas | grep "Id"方式…

scikit-learn决策树算法笔记总结

1. scikit-learn决策树算法类库介绍 scikit-learn决策树算法类库内部实现是使用了调优过的CART树算法&#xff0c;既可以做分类&#xff0c;又可以做回归。分类决策树的类对应的是DecisionTreeClassifier&#xff0c;而回归决策树的类对应的是DecisionTreeRegressor。两者的参…

20230409英语学习

Dog Philosophy 101&#xff1a;What Dogs Teach Us About Life 狗狗教给我们的人生哲学 I recently was pleased to receive an honorary Doctor of Science Degree from the University of Guelph.As part of the ceremony I was asked to give a convocation address to the…

Openlayers(五)点位聚合Cluster

Openlayers&#xff08;五&#xff09;点位聚合Cluster 1.业务问题 由于点位在地图上显示过多&#xff0c;会造成页面卡顿、点位标注信息相互叠加导致看不清 优化后效果 不断放大层级 2.聚合类Cluster OpenLayers 中聚合是通过 ol.source.Cluster 实现&#xff0c;聚合的原…

如何写出10万+ Facebook 贴文?

想要创作一篇优秀的Facebook贴文&#xff0c;首先要考虑以下几个问题&#xff1a; 1.文案特点 一篇清晰简洁的文案有助于受众在有限的浏览时间内快速了解你想要展示的信息。根据以往经验&#xff0c;文案内容最好保持在20个汉字以内&#xff0c;加上链接描述最好也不要超过50…

学习Pycharm使用方法(一):Pycharm中Make available to all projects的含义是什么

Make available to all projects一、为什么要进行包管理二、怎么做1、命令行&#xff08;情况一&#xff09;第一步&#xff1a;先安装虚拟环境模块第二步 :激活虚拟 环境2、Pycharm(情况二)三、项目部署时批量导包一、为什么要进行包管理 Python中的第三方包提供了各种功能&a…

十五分钟带你学会 Docker

文章目录虚拟化与容器化什么是 DockerDocker 工作原理安装 DockerDocker 核心概念Docker fileImageContainerDocker 流程示例Docker 常用命令Dockerfile 常用指令Docker 网络通信Docker ComposeDocker Hub虚拟化与容器化 虚拟化技术是一种将计算机物理资源进行抽象、转换为虚拟…

【C++】类与对象(下)

系列文章 若想了解什么是类、封装的意义可以移步 【C】类与对象&#xff08;引入&#xff09; 若对六大成员函数或const成员函数有疑问的这篇文章可能可以帮到你 【C】类与对象&#xff08;上&#xff09; 目录 系列文章 前言 1.初始化列表 1.1概念 1.2特性 1.2.1必须使…