Linux内核及可加载内核模块编程

news2025/1/21 18:42:17

图1 Linux系统整体结构

图2 Linux的源代码结构

下面显示一段内核模块代码案例:

#include <linux/moduLe.h>
#include <linux/kernel.h 
#include <linux/intt.h>
/*
    模块的初始化函数lkp_ init()
    _init是用于初始化的修饰符
*/
static int __init lkp_init(void)
{
    printk( "<1>Hello ,world!from the kernel space...\n" );
    return 0;
}
/*
    模块的退出和清理函数1kp_ exit()
*/
static void __exit lkp_exit(void)
{
    printk( "<1>Goodbye ,world!leaving kernel space...\n" );
}
module_init(lkp_init);
module_exit(lkp_exit);
/*
    模块的许可证声明GPL
*/
MODULE_ LICENSE("GPL");

        在此使用了printk0函数,该函数是由内核定义的,功能和C库中的printf()类似,它
把要打印的日志输出到终端或系统日志。字符串中的<1>是输出的级别,表示立即在终端输出。

任何模块都要包含的三个头文件:
        #include <linux/module.h>
        #include <linux/kernel.h>
        #incldue <linux/init.h>
        说明: module.h头文件包含了对模块的版本控制; kernel.h包含 了常用的内核函数; init.h包含 了宏__init和__exit,宏__init告诉编译程序相关的函数和变量仅用于初始化,编译程序将标有__init的所有代码存储到特殊的内存段中,初始化结束就释放这段内存。

内核模块的Makefile文件

obj-m:=module_example.o    #产生module_example模块的目标文件
CURRENT_PATH :=$(shell pwd)    #模块所在的当前路径
LINUX_KERNEL :=$(shell uname -r)    #linux内核源代码的当前版本
LINUX_KERNEL_PATH := /usr/src/linux-headers-S(LINUX_KERNEL)    #linux内核源代码的绝对路径

all:
    make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules #编译模快
clean:
    make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean    #清理模块

        第一行中的obj-m :=这个赋值语句的含义是说明要使用目标文件module_example.o建立一个模块,最后生成的模块名为module_ example.ko。.0文件是经过编译和汇编,而没有经过链接的中间文件。
        注: makefile文件中, 若某一 行是命令,则它必须以一个Tab键开头。

模块插入命令:
$insmod module_ example.ko
模块删除命令:
$rmmod module_ example
查看模块信息的命令:
$dmesg

Linux内核模块与C应用的对比

操作系统接口

OS是如何对系统调用进行处理的?
系统调用发生在用户态,当调用了系统调用后就陷入到内核态。如何陷入?比如,在比如DOS的软中断int 21H;Linux下的int 0x80;处理器不同指令不同,我们统一把他叫做陷入指令。OS比较理智,它会在陷入之前先把自己当时执行的CPU现场保存起来,然后进行压栈,给自己留下退路;接下来就是让内核执行一段程序,这段程序叫系统调用服务例程,比如执行sub1在显示器上输出;内核把这种脏活累活于完以后,它会理智的撤出(就是把堆栈中东西弹出来就行)。

系统调用与一般过程调用有何不同?

        系统调用要涉及到CPU状态的转换,首先从用户态陷入到内核态,在内核执行系统调用服务例程,处理结束后,返回用户态;一般的程序它调用的时候在用户态也可能在内核态,只是一个函数调用另外一个函数而已,不存在CPU状态的转换 。

Linux各种接口

        不管是图形接口还是命令行接口,都统称为用户接回,因为图形界面只是一种与用户更方便打交道的方式,其本质还是一堆实用程序的集合。而库函数,如printf,open,read等等,这些库函数实际上很多也只是穿了件衣服,尤其是与硬件或者系统打交道的话,并不是库函数干的,实际上是操作系统干的,这就是系统调用接口。
系统调用与API

        系统调用是与具体操作系统相关的,而AP1是遵循POSIX标准的,Linux的ibc库的函数malloc和free都叫做API,其实现都调用了brk系统调用;另一方面,一个API实现可能会调用好几个系统调用,而有些AP甚至不需要任何系统调用,比如说strepy函数,因为它们不需要内核提供的服务
系统调用-内核的出口

        系统调用,顾名思义说的是操作系统提供给用户程序调用的一组特殊接口,从逻辑上来说,系统调用可被看成是一个内核与用户空间进行交互的接口,它好比一个中间人,把 用户进程请求传达给内核,待内核把请求处理完毕后,再将处理结果送回给用户空间。

        如图为Linux系统中,各个子系统相关的工具集,在这里可以通过strace命令查看个应用程序所调用的系统调用,strace被称为神器,它是Linux环境下的一款程序调试工具,它可以统计每一个系统调用所执行的时间、被调用的次数和出错的次数,例如“strace -c 可执行文件名”,它把执行的时间以微妙为单位的每个系统调用平均耗时、调用次数、错误次数以及系统调用名称显示在表格中。        

从用户态函数到系统调用

        比如在程序中调用fwrite函数,图中①,而fwrite函数在glibc库中调用系统调用write()(图中②),然后从用户态陷入内核态(图中③),查找系统调用表syscall table ( 图中④),在内中中对应的系统调用服务例程为sys_write,然后在内核执行该例程.

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

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

相关文章

第十五届全国大学生数学竞赛报名快要截止了,你报上名了吗?

关于组织参加 第十五届全国大学生数学竞赛的通知 01 为了培养人才、服务教学、提高大学生学习数学的兴趣&#xff0c;培养学生分析问题、解决问题的能力&#xff0c;发现和选拔数学创新人才&#xff0c;为学生提供一个展示基础知识和思维能力的舞台&#xff0c;我校决定组织参…

SSM整合demo及个人思考

SSM整合 项目整体架构说明1. 创建Maven项目2. 配置web.xml4. 配置springmvc.xml5. 配置spring.xml6. 配置mybatis-config.xml以及创建mapper接口和mapper配置文件7. 配置log4j.xml8. 后端CURD测试8.1 在数据库中插入数据8.2 pojo中的实体类Employee8.3 mapper层的EmployMapper接…

oppo手机便签隐藏了一条怎样打开?手机如何找到隐藏便签?

有不少用户在使用OPPO手机的过程中&#xff0c;遇到了一些问题&#xff0c;例如自己在使用手机系统便签应用时&#xff0c;把一条重要的便签设置了隐藏&#xff0c;但是现在找不到隐藏的便签了。 那么oppo手机便签隐藏了一条怎样打开&#xff1f;OPPO手机如何找到隐藏便签&…

【C++】基础知识点回顾 上:命名空间与输入输出

前言 学习C一段时间后&#xff0c;再回过头来看这些C的基础知识&#xff0c;感觉有很多细节是自己当时没有注意的&#xff0c;所以写一篇文章来回顾复习一下C的基础知识。 命名空间的使用 相信很多朋友在学习C的第一个代码的时候&#xff0c;在写上头文件之后&#xff0c;紧…

运营商大数据实时获取精准数据

随着大数据技术的快速发展和完善&#xff0c;出现了一种新的扩张方式——互联网大数据的精准扩张。如果没有一个好的渠道来获得顾客&#xff0c;这就像准备热情地做饭&#xff0c;但当饭吃完后&#xff0c;人们只能饿了。 今天的消费者已经从最早的线下消费逐渐过渡到互联网消…

浅谈6种API架构模式

在摸鱼刷X时&#xff0c;看到一张非常棒的图&#xff0c;是关于不同API架构的&#xff0c;下面学习记录一下。 &#xff08;摘自网络&#xff09; 1、gRPC gRPC是一种高性能、跨语言、易扩展的远程过程调用(RPC)框架&#xff0c;可用于分布式系统之间的通信。gRPC被广泛地应用…

金融贷款行业实时高精准获客 ——三网运营商大数据

都说生产是第一因素&#xff0c;但对于任何企业来说&#xff0c;客户来源才是第一因素。 在大多数行业&#xff0c;获得客户的困难已经成为行业的挑战。如今&#xff0c;许多行业和企业获得客户的主要来源是在线促销和客户获取。现在几乎每个人都有一部手机。运营商可以根据移…

每日一练 | 网络工程师软考真题Day33

阅读以下说明&#xff0c;答复以下【问题1】和【问题2】 【说明】 某单位内部网络拓扑结构如图5-1所示&#xff0c;在该网络中采用RIP路由协议。 【问题1】 1&#xff0e;路由器第一次设置时&#xff0c;必须通过Console口连接运行终端仿真软件的微机进行配置&#xff0c;此时…

ByteV联合“智农”打造--数字孪生大棚可视化

ByteV联合“智农”打造的数字孪生大棚可视化&#xff0c;不仅要让粮食稳产、增产&#xff0c;更要对土壤肥力进行改良和提升。不仅能够实现科技引领农业发展&#xff0c;更在智慧农业的基础上实现一站式托管&#xff0c;真正做到技术提升、5G引领、建后管护的闭环管理。让高标准…

预测多基因扰动的转录结果

了解细胞对基因扰动的反应是许多生物医学应用的核心&#xff0c;从识别癌症中涉及的基因相互作用到开发再生医学方法。然而&#xff0c;可能的多基因扰动数量的组合爆炸严重限制了实验验证。在这里&#xff0c;作者提出了图增强的基因激活和抑制模拟器&#xff08;GEARS&#x…

Linux内核4.14版本——drm框架分析(13)——DRM_IOCTL_MODE_SETPLANE(drm_mode_setplane)

目录 1. drm_mode_setplane 1.1 根据应用的plane_req->plane_id找到plane 1.2 根据应用的plane_req->fb_id找到struct drm_framebuffer 1.3 调用setplane_internal 2. setplane_internal->__setplane_internal 2.1 struct drm_framebuffer是否为空 2.2 判断此p…

Cesium对WMS地图服务进行查询并弹框展示信息

一、简介 Cesium加载WMS地图服务&#xff0c;然后调用接口GetFeatureInfo对要素信息进行查询 二、测试接口 {type: "Point | MultiPoint | LineString | MultiLineString | Polygon | MultiPolygon",coordinates: 数组 } 查询点 http://123.56.67.147:8080/geoserve…

智慧公厕构建城市公共厕所中枢网络,民生服务更高效,城市管理更精准

随着城市化进程的加快&#xff0c;城市人口的不断增长&#xff0c;城市公共厕所问题愈发凸显。大量的人口涌入&#xff0c;公厕资源的不足、管理的不到位&#xff0c;已经成为困扰城市发展的一大难题。然而&#xff0c;智慧公厕的出现&#xff0c;为解决这一问题提供了新的思路…

2023-09-12 LeetCode每日一题(课程表 IV)

2023-03-29每日一题 一、题目编号 1462. 课程表 IV二、题目链接 点击跳转到题目位置 三、题目描述 你总共需要上 numCourses 门课&#xff0c;课程编号依次为 0 到 numCourses-1 。你会得到一个数组 prerequisite &#xff0c;其中 prerequisites[i] [ai, bi] 表示如果你…

这泼天的富贵,轮到数字化转型升级的企业了

数字化转型是建立在现代信息技术上&#xff0c;利用数字化的一切相关技术创建一种新的、或者对已有的商业模式进行重塑&#xff0c;以此来满足时代变化中传统的业务和市场进行变革。 数字化转型 - 派可数据BI可视化分析平台 出现这种变革是因为经过几十年的经济发展&#xff0…

怎么合并pdf文件到一起?快点过来尝试一下吧

怎么合并pdf文件到一起&#xff1f;pdf文件的使用越来越频繁&#xff0c;相信每个小伙伴都有这样的感受&#xff0c;不管是网上下载到的文件资料&#xff0c;还是合作伙伴发送过来的合作意向书&#xff0c;基本上都会做成pdf格式的文件&#xff0c;因为pdf文件具有更强的稳定性…

记账app排行榜前十名,第2个开店必备!

工欲善其事必先利其器&#xff0c;不管是开店做生意的老板还是个人&#xff0c;想要管理好自己的财富&#xff0c;第一步就是要坚持记账。 现在市面上的记账App有很多&#xff0c;我们选取了秦丝进销存、随手记、智慧记等10款比较有代表性的记账APP&#xff0c;其中有几个是专…

webpack自定义loader解析指定后缀名文件

案例&#xff1a; webpack自定义loader解析.chenjiang后缀名的文件 整体目录&#xff1a; chenjiangLoader.js文件代码 // 正则匹配script标签中的内容 const REG /<script>([\s\S]*)<\/script>/;module.exports function (source) {const __source source.…

拼多多手势验证

国内的好像并没有出现这种&#xff0c;一般都是在海外注册&#xff0c;或者发信才会有。各位大哥想研究的话得需要挂vpn了。 拼多多手势的轨迹其实咋说&#xff0c;难倒是不难&#xff0c;反正要你准确按这个线条描绘出不间断的数据。 它这识别的话&#xff0c;跟狗东的那个还…

运维学习之部署Grafana

sudo nohup wget https://dl.grafana.com/oss/release/grafana-10.1.1.linux-amd64.tar.gz &后台下载压缩包&#xff0c;然后按一下回车键。 ps -aux | grep 15358发现有两条记录&#xff0c;就是还在下载中。 ps -aux | grep 15358发现有一条记录&#xff0c;并且tail …