Linux内核及可加载内核模块编程
图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,然后在内核执行该例程.
相关文章:

Linux内核及可加载内核模块编程
图1 Linux系统整体结构 图2 Linux的源代码结构 下面显示一段内核模块代码案例: #include <linux/moduLe.h> #include <linux/kernel.h #include <linux/intt.h> /*模块的初始化函数lkp_ init()_init是用于初始化的修饰符 */ static int __init lk…...

软件设计师_备考笔记
考试介绍及考点分布情况 考试要求: (1)掌握数据表示、算术和逻辑运算; (2)掌握相关的应用数学、离散数学的基础知识; (3)掌握计算机体系结构以及各主要部件的性能和基…...

Java学习笔记------抽象类和抽象方法
抽象方法 抽象方法:将共性的行为(方法)抽取到父类之后,由于每一个子类执行的内容是不一样的,所以,在父类中不能确定具体的方法体,该方法就可以定义为抽象方法抽象类:如果一个类中存…...
毕业设计选题指南-25个优质选题
毕业设计是大学生活中的一项重要任务,它不仅代表了您所学知识的应用,还为未来职业道路奠定了基础。然而,许多学生常常陷入选题的困境,不知道如何选择一个合适的毕业设计题目。本文将提供一些建议,帮助您决定一个适合您…...

React使用useImperativeHandle实现父组件触发子组件事件
相关知识: useImperativeHandle forwardRef 相关代码: 获取子组件实例,由于这是函数组件,没有this因此不能整体获取,我们可以通过useImperativeHandle获取想要的变量或者方法。 父组件import React, { useRef } fro…...

【PowerQuery】Excel的PowerQuery的复制
在Excel中构建符合要求的PowerQuery连接之后,所有的PowerQuery 连接已经顺利的保存在Excel 工作簿当中,但是如何去查看已经保存的PowerQuery连接呢?图6.3 显示了查看PowerQuery连接。 Excel界面->数据页签->查询与连接 如果你的Power…...

这个制作企业期刊的神器我怎么没早点发现
和大家分享个好消息,发现这款制作企业期刊的神器特好用 有点后悔早些没发现它,没用过的可以试试,FLBOOK在线制作电子杂志平台 下面教大家一些如何使用FLBOOK的过程 1.打开FLBOOK平台,点击登录与注册 2.点击开始制作,…...

核心实验18_ospf高级_ENSP
项目场景: 核心实验18_ospf高级_ENSP 多区域虚链路 实搭拓扑图: 具体操作: R1: [R1]ospf 1 router-id 1.1.1.1 [R1-ospf-1]area 0 [R1-ospf-1-area-0.0.0.0]net 1.1.1.0 0.0.0.255 [R1-ospf-1-area-0.0.0.0]net 10.1.12.0 0.0.0.255 [R1-os…...

【python零基础入门学习】python基础篇之系统模块调用shell命令执行(四)
本站以分享各种运维经验和运维所需要的技能为主 《python》:python零基础入门学习 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…...

用python实现基本数据结构【01/4】
说明 如果需要用到这些知识却没有掌握,则会让人感到沮丧,也可能导致面试被拒。无论是花几天时间“突击”,还是利用零碎的时间持续学习,在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢?列表、字典、集…...
Ubuntu22.04 install Kafka
kafka quickstart install kafka...

实现JSONP请求
同源策略 JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。 而所有非同源的请求(即 域名,协议,端口 其中一种或多种不相同),都会被作为跨域请求。实际上请求…...

如何将安防视频监控系统/视频云存储EasyCVR平台推流到公网直播间?
视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、…...

使用内网负载机(Linux)执行Jmeter性能测试
一、背景 在我们工作中有时候会需要使用客户提供的内网负载机进行性能测试,一般在什么情况下我们需要要求客户提供内网负载机进行性能测试呢? 遇到公网环境下性能测试达到了带宽瓶颈。那么这时,我们就需要考虑在内网环境负载机下来执行我们…...

Web自动化测试进阶 —— Selenium模拟鼠标操作
鼠标操作事件 在实际的web产品测试中,对于鼠标的操作,不单单只有click(),有时候还要用到右击、双击、拖动等操作,这些操作包含在ActionChains类中。 ActionChains类中鼠标操作常用方法: 首先导入ActionChains类&…...
Python之函数
函数是什么? 函数是对程序逻辑进行结构化或过程化的一种编程方法,将整块代码巧妙地隔离成易于管理的小块。把重复代码放到函数中而不是进行大量的拷贝,这样既能节省空间,也有助于保持一致性;通常函数都是用于实现某一种…...

泛型工具类型和操作符
前言 TypeScript 内置了一些常用的工具类型。 PartialRequiredOmitPick.... 操作符 typeof typeof 操作符可以用来获取一个变量声明或对象的类型 const p {x:2,y:cm} let g:typeof p {x:3,y:ff} 这里g需要满足: 有x属性且值是number类型 有y属性且值是string类型…...

idea中启动maven项目报错-java: 程序包lombok.extern.slf4j不存在问题如何解决
1、 现象: 在springboot的maven项目启动时,报错: Error:(3, 27) java: 程序包lombok.extern.slf4j不存在 编译不报错,maven依赖也合适,项目就是无法启动 原因: 其实不是项目本身或者maven本身的问题&am…...

MyBatis-动态SQL
<if>标签 用于判断条件是否成立,使用test属性进行条件判断,如果条件为true,则拼接SQL <where>标签 where元素只会在子元素有内容的情况下插入where子句,而且会自动去除子句的开头的AND或OR <where><if tes…...

Swift学习内容精选(二)
Swift 类是构建代码所用的一种通用且灵活的构造体。 我们可以为类定义属性(常量、变量)和方法。 与其他编程语言所不同的是,Swift 并不要求你为自定义类去创建独立的接口和实现文件。你所要做的是在一个单一文件中定义一个类,系…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...