Linux内核与驱动面试经典“小”问题集锦(5)
接前一篇文章:Linux内核与驱动面试经典“小”问题集锦(4)
问题6
问:mutex_lock和mutex_lock_interruptible的区别是什么?
备注:此问题也是笔者近期参加蔚来面试时遇到的一个问题。
答:
尽管信号量已经可以实现互斥的功能,但是在Linux内核中还是真实存在着“正宗”的互斥机制——mutex。
以下3个函数用于获取互斥体(均在kernel/locking/mutex.c中):
- mutex_lock
void __sched mutex_lock(struct mutex *lock)
{might_sleep();if (!__mutex_trylock_fast(lock))__mutex_lock_slowpath(lock);
}
EXPORT_SYMBOL(mutex_lock);
- mutex_lock_interruptible
int __sched mutex_lock_interruptible(struct mutex *lock)
{might_sleep();if (__mutex_trylock_fast(lock))return 0;return __mutex_lock_interruptible_slowpath(lock);
}EXPORT_SYMBOL(mutex_lock_interruptible);
- mutex_trylock
int __sched mutex_trylock(struct mutex *lock)
{bool locked;MUTEX_WARN_ON(lock->magic != lock);locked = __mutex_trylock(lock);if (locked)mutex_acquire(&lock->dep_map, 0, 1, _RET_IP_);return locked;
}
EXPORT_SYMBOL(mutex_trylock);
mutex_lock()与mutex_lock_interruptible()的不同之处为,前者引起的睡眠不能被信号打断,而后者则可以被打断。mutex_trylock()则用于尝试获得mutex,获取不到mutex时不会引起进程睡眠。
mutex的使用方法和信号量用于互斥的场合完全一样。
参考资料:
《Linux设备驱动开发详解 —— 基于最新的Linux 4.0内核》 宋宝华 编著,机械工业出版社
问题7
问:如何分配内存时指定其不被释放?
备注:此问题也是笔者近期参加蔚来面试时遇到的一个问题。
答:
一般用户空间关联的物理页面是按需通过缺页异常的方式分配和调页,当系统物理内存不足时页面回收算法会回收一些最近很少使用的页面,但是有时候我们需要锁住一些物理页面防止其被回收(如时间有严格要求的应用),Linux中提供了mlock相关的系统调用供用户空间使用来锁住部分或全部的地址空间关联的物理页面。
在Linux中,可以使用mlock函数来防止特定区域的内存被操作系统自动回收。
mlock是一个系统调用,用于将指定的内存区域锁定在物理内存中,防止其被交换到磁盘上。当内存区域被锁定时,操作系统将保证该区域的数据始终在物理内存中,从而提高访问速度和安全性。
mlock函数的原型如下:
#include <sys/mman.h>
int mlock(const void *addr, size_t len);
参数说明:
- addr:指向要锁定的内存区域的起始地址。
- len:要锁定的内存区域的长度,以字节为单位。
返回值:
mlock函数成功时返回0,失败时返回-1,并设置errno来指示错误类型。
注意:mlock函数需要特权权限才能使用,通常只有root用户或具有CAP_IPC_LOCK权限的用户才能调用该函数。
实例:
下面是一个示例代码,展示如何使用mlock函数将指定的内存段进行锁定:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main() {char *buffer = (char *)malloc(1024); // 分配一个大小为 1KB 的内存空间if (mlock((void*) buffer, sizeof(buffer)) == -1) {perror("Failed to lock memory");exit(-1);} else {printf("Memory locked successfully\n");// 这里可以对已经锁定的内存进行读写等操作munlock((void*) buffer, sizeof(buffer)); // 解除内存锁定free(buffer); // 释放内存空间}return 0;
}
上述代码:
1)首先通过mlock函数分配了一个大小为1KB的内存空间;
2)然后调用mlock()函数将其锁定;
3)接着可以对已经锁定的内存进行读写等操作;
4)最后,通过munlock函数解除内存锁定并释放相应的内存空间。
mlock函数在以下情况下常常被使用:
- 对于需要频繁访问的敏感数据,可以使用mlock来确保其始终在物理内存中,避免因为内存交换而导致的性能下降。
- 对于包含敏感信息的内存区域,可以使用mlock来防止其被交换到磁盘上,提高数据的安全性。
底层机制:
mlock处理路径中,会将VM_LOCKED标志加入到vma->vm_flags中(由于设置的地址区域有可能跨越多个vma,所以代码中会涉及到分裂和合并的操作,实质上都会设置相关的vma->vm_flags的VM_LOCKED标志)。然后会调用__mm_populate来填充虚拟页对应的物理页,最终在faultin_page函数中试图查找vma中的每个虚拟页对应的物理页面(对应于follow_page_mask函数)。如果没有找到,会调用handle_mm_fault主动触发缺页处理。handle_mm_fault函数是内核通用的缺页异常处理例程,如vma是匿名映射,则分配物理页面然后建立页表映射关系;若vma是文件映射,则会从磁盘读取对应的文件页(如果page cache没有对应页面时)到内存的page cache,然后建立虚拟页面建立页表映射关系。
对于一些对时间有严格要求的应用场景,访问时按需分配和调页机制的时延可能是未知的,内核中提供了mlock相关的系统调用,用于将虚拟内存区域对应的物理页面“锁在”内存中。内核对应mlock锁住的页面实际上它主要做了两步比较重要的操作:(1)调用mlock的时候就将所需要的物理页面准备好;(2)内存回收时当扫描到相关的物理页面时,将其放入不可回收的lru链表。第一步保证访问的虚拟地址对应的物理页面在内存中,第二步保证了锁住的页面不会被回收。
参考资料:
一文剖析mlock锁原理
相关文章:
Linux内核与驱动面试经典“小”问题集锦(5)
接前一篇文章:Linux内核与驱动面试经典“小”问题集锦(4) 问题6 问:mutex_lock和mutex_lock_interruptible的区别是什么? 备注:此问题也是笔者近期参加蔚来面试时遇到的一个问题。 答: 尽管…...
基于51 单片机的交通灯系统 源码+仿真+ppt
主要内容: 1)南北方向的绿灯、东西方向的红灯同时亮40秒。 2)南北方向的绿灯灭、黄灯亮5秒,同时东西方向的红灯继续亮。 3)南北方向的黄灯灭、左转绿灯亮,持续20秒,同时东西方向的红灯继续…...
【蓝桥杯冲冲冲】[NOIP2017 提高组] 宝藏
蓝桥杯备赛 | 洛谷做题打卡day29 文章目录 蓝桥杯备赛 | 洛谷做题打卡day29[NOIP2017 提高组] 宝藏题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样例输入 #2样例输出 #2提示题解代码我的一些话[NOIP2017 提高组] 宝藏 题目背景 NOIP2017 D2T2 题目描…...
C#中实现串口通讯和网口通讯(使用SerialPort和Socket类)
仅作自己学习使用 1 准备部份 串口通讯需要两个调试软件commix和Virtual Serial Port Driver,分别用于监视串口和创造虚拟串口。网口通讯需要一个网口调试助手,网络上有很多资源,我在这里采用的是微软商店中的TCP/UDP网络调试助手࿰…...
LeetCode回溯算法的解题思路
回溯法概念 回溯法:一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些变化抛弃该解,即回溯并且再次尝试。 应用场景 回溯算…...
泰克示波器(TBS2000系列)数学运算功能使用
目录 1 数学运算菜单1.1 运算符选择1.2 信源选择1.3 数学运算结果 1 数学运算菜单 Math运算按钮,用于实现对两个通道的信号进行实时的“加、减、乘”运算,计算时信源1在前面,信源2在运算符的右边,设置时设置信源与运算符就行了。…...
数据结构与算法之美学习笔记:50 | 索引:如何在海量数据中快速查找某个数据?
目录 前言为什么需要索引?索引的需求定义构建索引常用的数据结构有哪些?总结引申 前言 本节课程思维导图: 在第 48 节中,我们讲了 MySQL 数据库索引的实现原理。MySQL 底层依赖的是 B 树这种数据结构。留言里有同学问我ÿ…...
Python(SQLite)executescript用法
SQLite 数据库模块的游标对象还包含了一个 executescript() 方法,这不是一个标准的 API 方法,这意味着在其他数据库 API 模块中可能没有这个方法。但是这个方法却很实用,它可以执行一段 SQL 脚本。 例如,如下程序使用 executescr…...
BUUCTF-Real-[ThinkPHP]IN SQL INJECTION
目录 漏洞描述 漏洞分析 漏洞复现 漏洞描述 漏洞发现时间: 2018-09-04 CVE 参考:CVE-2018-16385 最高严重级别:低风险 受影响的系统:ThinkPHP < 5.1.23 漏洞描述: ThinkPHP是一款快速、兼容、简单的轻量级国产P…...
python安装步骤
安装 Python 的步骤如下: 在 Python 官方网站(https://www.python.org)上下载 Python 安装程序。运行下载的安装程序。在安装程序中选择要安装的 Python 版本(通常选择最新版本),并选择安装目录。确保勾选…...
BlueLotus 下载安装使用
说明 蓝莲花平台BlueLotus,是清华大学曾经的蓝莲花战队搭建的平台,该平台用于接收xss返回数据。 正常执行反射型xss和存储型xss: 反射型在执行poc时,会直接在页面弹出执行注入的poc代码;存储型则是在将poc代码注入用…...
.[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
导言: 在当今数字化时代,勒索病毒已成为网络安全领域的一大威胁。其中一种新近出现的勒索病毒是由[hudsonLcock.li].mkp[hendersoncock.li].mkp[myersairmail.cc].mkp制作的,它以其高效的加密算法和勒索方式而备受关注。本文91数据恢复将介绍…...
基于SpringBoot和PostGIS的震中影响范围可视化实践
目录 前言 一、基础数据 1、地震基础信息 2、全国行政村 二、Java后台服务设计 1、实体类设计 2、Mapper类设计 3、控制器设计 三、前端展示 1、初始化图例 2、震中位置及影响范围标记 3、行政村点查询及标记 总结 前言 地震等自然灾害目前还是依然不能进行准确的预…...
JUnit实践教程——Java的单元测试框架
前言 大家好,我是chowley,最近在学单元测试框架——JUnit,写个博客记录一下! 在软件开发中,单元测试是确保代码质量和稳定性的重要手段之一。JUnit作为Java领域最流行的单元测试框架,为开发人员提供了简单…...
选择大语言模型:2024 年开源 LLM 入门指南
作者:来自 Elastic Aditya Tripathi 如果说人工智能在 2023 年起飞,这绝对是轻描淡写的说法。数千种新的人工智能工具被推出,人工智能功能被添加到现有的应用程序中,好莱坞因对这项技术的担忧而戛然而止。 甚至还有一个人工智能工…...
ElastAlert 错误日志告警
文章目录 前言一、ElastAlert 概览1.1 简介1.2 ElastAlert 特性 二、ElastAlert 下载部署2.1 安装 Python3 环境2.2 下载 ElastAlert2.3 部署 ElastAlert 三、接入平台3.1 对外接口层3.2 服务层 前言 ElastAlert 是 Yelp 公司基于 python 开发的 ELK 日志告警插件,…...
假设检验的过程
假设检验的核心思想是小概率事件在一次实验中不可能发生,假设检验就是利用小概率事件的发生进行反正。学习假设检验,有几个概念不能跳过,原假设、p值 1.原假设 假设检验的基本过程如下: 1)做出一个假设H0,…...
vue项目打包部署到flask等后端服务里面,实现前后端不分离部署,解决空白页面和刷新页面not fount问题
1. 编译模式一定要设置为esnext,否则会报错: Strict MIME type checking is enforced for module scripts per HTML spec.Expected a JavaScript module script but the server responded with a MIME type of "text/plain". 具体解释可以看vi…...
labelimg 在pycharm下载使用
labelimg 使用数据标注工具 labelimg 制作数据集 在pycharm中搜索labelimg 选择版本安装 labelimg install 使用数据标注工具制作数据集 启动 带参数启动 1、cmd cd到指定目录 2、带参数启动标注工具 左侧可以选择切换为需要的数据格式 一些快捷键 和自动保存,…...
STM32/C51开发环境搭建(KeilV5安装)
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
