mprotect()函数 Unix/Linux

Linux中mprotect()函数详解 测试源码 //mmp.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/mman.h> int *g_ps32Result; void add(int a, int b) { *g_ps32Result = a + b; } void s... 阅读详情
mprotect - 控制允许访问的内存区域

内容简介

#include <sys/mman.h> 
int mprotect(const void *addr, size_t len, int prot);

描述

The function mprotect() specifies the desired protection for the memory page(s) containing part or all of the interval [addr,addr+len-1]. If an access is disallowed by the protection given it, the program receives a SIGSEGV.

prot is a bitwise-or of the following values:

标签 描述
PROT_NONE The memory cannot be accessed at all.
PROT_READ The memory can be read.
PROT_WRITE The memory can be written to.
PROT_EXEC The memory can contain executing code.
The new protection replaces any existing protection. For example, if the memory had previously been marked PROT_READ, and mprotect() is then called with protPROT_WRITE, it will no longer be readable.

返回值

On success, mprotect() returns zero. On error, -1 is returned, and errno is set appropriately.

错误

标签 描述
EACCES The memory cannot be given the specified access. This can happen, for example, if you mmap(2) a file to which you have read-only access, then ask mprotect() to mark it PROT_WRITE.
EFAULT The memory cannot be accessed.
EINVAL addr is not a valid pointer, or not a multiple of PAGESIZE.
ENOMEM Internal kernel structures could not be allocated. Or: addresses in the range [addr, addr+len] are invalid for the address space of the process, or specify one or more pages that are not mapped.
#include <stdlib.h>
#include <errno.h>
#include <sys/mman.h>
#include 
#include 
#include 
#include 

#include     /* for PAGESIZE */
#ifndef PAGESIZE
#define PAGESIZE 4096
#endif

int
main(void)
{
    char *p;
    char c;

    /* Allocate a buffer; it will have the default
       protection of PROT_READ|PROT_WRITE. */
    p = malloc(1024+PAGESIZE-1);
    if (!p) {
        perror("Couldn’t malloc(1024)");
        exit(errno);
    }

    /* Align to a multiple of PAGESIZE, assumed to be a power of two */
    p = (char *)(((int) p + PAGESIZE-1) & ~(PAGESIZE-1));

    c = p[666];         /* Read; ok */
    p[666] = 42;        /* Write; ok */

    /* Mark the buffer read-only. */
    if (mprotect(p, 1024, PROT_READ)) {
        perror("Couldn’t mprotect");
        exit(errno);
    }
    c = p[666];         /* Read; ok */
    p[666] = 42;        /* Write; program dies on SIGSEGV */

    exit(0);
}

遵循于

SVr4, POSIX.1-2001. POSIX says that mprotect() can be used only on regions of memory obtained from mmap(2).

注意

On Linux it is always legal to call mprotect() on any address in a process’ address space (except for the kernel vsyscall area). In particular it can be used to change existing code mappings to be writable.

Whether PROT_EXEC has any effect different from PROT_READ is architecture and kernel version dependent.


C语言_mprotect 函数深度解析与应用实践 Linux mprotect 函数深度解析与应用实践 阅读详情

相关推荐

《科研伦理与学术规范》 全部 习题_答案 2020年秋

科研伦理与学术规范 答案 文章目录科研伦理与学术规范 答案1. 第一章课后习题(必做) 答案1.1 第一章Demo2. 第二章课后习题(必做) 答案3. 第三章课后习题(必做) 答案4. 第四章课后习题(必做) 答案5. 第五章课后习题(必做) 答案6. 第六章课后习题(必做) 答案 # 每行5题 #写于2020.11.17 侵删 1. 第一章课后习题(必做) 答案 ABC, A, B ,D ,ABCD ABC, D, A, BCD, C D, D, 1.1 第一章Demo

羊老羊 25万+

Linux下查看内存使用状况的命令:free -h

total:指一共有多少内存; used:正在被使用的内存; free:完全空闲中的内存; shared:共享内存(无实际用处?) buffer/cache:缓存缓冲内存; available:真实可用的内存; cache(内存中的高速缓存)的作用:提高cpu读取数据的速度;(访内存比访问外存花费时间少,划分部分内存作为缓存区,提高性能---高效率的读) buffer(内存中的缓冲区):为了提高写硬盘的速度;(高效率的写) 参考书籍:运维手册 ...

JoggingPig的博客 2377

STM32 HAL库串口DMA接收不定长数据的两种实战方法:IDLE中断与超时管理详解

本文详细解析了STM32 HAL库中串口DMA接收不定长数据的两种实战方法:IDLE中断与超时管理。通过对比分析两种方案的硬件要求、响应速度和适用场景,为嵌入式开发者提供了高效可靠的串口通信解决方案,特别适用于智能家居、传感器网络等需要处理不定长数据包的应用场景。

weixin_30954265的博客 471

mprotect

mprotect是一个在Linux操作系统中使用的函数,它允许用户修改一段指定内存区域的访问权限。

qq_42805085的博客 1080

安卓逆向实战:用Batch Apktool 3.8.0快速汉化APK的完整流程

本文详细解析了如何使用Batch Apktool 3.8.0进行安卓APK汉化的完整流程,包括环境配置、反编译、资源解析、深度汉化、重构建与签名优化等关键步骤。通过这款集成化逆向工具,开发者可以高效完成APK汉化,提升工作效率。

s1t2u3的博客 1099

CarPlay无线连接背后的‘握手’秘密:深入解读iAP2协议与蓝牙/Wi-Fi协同

本文深入解析了CarPlay无线连接背后的技术细节,重点探讨了iAP2协议与蓝牙/Wi-Fi的协同工作原理。从蓝牙层的UUID识别到iAP2协议的握手过程,再到Wi-Fi热点的建立与优化,详细揭示了CarPlay无线连接的安全机制和调试方法,为开发者提供了实用的技术参考。

weixin_42520573的博客 475

Linux中mprotect()函数的用法

mprotect()函数修改在内存映像上的保护模式。 函数原型: #include    #include    int mprotect(const void *start, size_t len, int prot); mprotect把自start开始的内存区的保护模式修改为prot指定的值,如果执行成功返回0,如果执行失败,mprotect返回-1,并且设置errno变量。

Roland_Sun的专栏 5万+

Python画常见分布的概率密度图

因为做概随大作业,了解了一些python画概率分布图的方法。

qq_44807946的博客 5204

高级I/O之函数readv和writev以及存储映射I/O

本文来自个人博客:https:dunkwan.cn 文章目录函数readv和writev函数`readn`和`writen`存储映射I/O 函数readv和writev readv和writev函数用于在一次函数调用中读、写多个非连续缓冲区。有时也将这两个函数称为散布读和聚集写。 #include <sys/uio.h> ssize_t readv(int fd, const st...

Dunk.Wan 789

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的远距离停车位检测系统(深度学习代码+UI界面+训练数据集)

本文详细介绍了基于YOLOv5/YOLOv6/YOLOv7/YOLOv8深度学习模型的远距离停车位检测系统的完整实现方案。该系统能够准确识别200米范围内的停车位状态,为智能停车场管理系统、自动驾驶车辆提供关键的视觉感知能力。文章涵盖算法原理、数据集构建、模型训练、系统实现及优化策略,并提供完整的代码实现和UI界面设计。关键词:YOLO系列,深度学习,停车位检测,计算机视觉,智能交通系统pythonimport cv2import os"""创建数据存储目录""""""定时采集图像"""

YOLO 186

WPS访问权限不足怎么解决??具体怎么操作?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 4171

Unix/Linux编程:内存映射------mmap()系列函数

概述 mmap()系统调用在调用进程的虚拟地址空间中创建一个新内存映射。映射分为两种: 文件映射: 文件映射将一个文件的一部分直接映射到调用进程的虚拟内存中。 一旦一个文件被映射之后就可以通过在相应的内存区域中操作字节来访问文件内容了(即对文件映射内容的访问则转换为对相应内存区域的字节操作)。映射的分页会在需要的时候自动从文件中加载。这种映射也被称为基于文件的映射或者内存映射文件。 匿名映射(与文件无关): 这种映射没有对应的文件,其映射页面的内容会被初始化为0 可以把匿名映射看成是一个内容总是被

OceanStar的博客 1554

Android车载蓝牙开发全攻略:从基础到高级优化

本文系统介绍了Android车载蓝牙开发的核心技术与实践指南。文章首先阐述了蓝牙在智能汽车中的关键作用,包括免提通话、音频流媒体等应用场景。随后详细解析了蓝牙协议基础,重点介绍了HFP、A2DP等车载常用协议。开发实战部分提供了设备发现、连接、数据传输的完整代码示例,并融入多线程和内存优化技巧。通过真实车载案例,展示了启动时间、流畅度和资源使用的优化策略。最后针对面试需求,提供了专业的技术问答,涵盖蓝牙开发全流程。全文紧密结合Android车载开发职位要求,为开发者提供了一套完整的蓝牙技术解决方案。

郑伟强dev的专栏 118

Unix/Linux编程:虚拟内存操作

API 下面介绍在进程的虚拟内存空间上执行操作的各个系统调用 改变内存保护:mprotect() mprotect()修改起始位置为addr长度为length字节的虚拟内存区域中分页上的保护。 NAME mprotect - set protection on a region of memory SYNOPSIS #include <sys/mman.h> int mprotect(void *addr, size_t len, int prot)

OceanStar的博客 2316

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SubHook架构解析:x86/x64指令重写与内存保护机制

SubHook是一款轻量级的C/C++钩子库,专注于x86架构(支持32/64位)且无外部依赖。本文将深入剖析其核心架构,包括指令重写技术、内存保护机制及跨平台适配策略,帮助开发者理解钩子实现的底层原理。 ## 核心架构概览 📊 SubHook的架构设计遵循"简洁高效"原则,核心代码集中在以下文件: - **[subhook.h](https://link.gitcode.com/i/814

gitblog_00727的博客 498

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

linux 关于虚拟内存的几个系统调用

《linux/UNIX系统编程手册》中提到的一个关于虚拟内存的几个系统调用,在有些场景下需要对应用程序的虚拟内存进行进一步的调优时经常需要用到这几个系统调用。 mprotect mproect系统调用主要用于修改内存区域上的权限,函数原型如下: #include <sys/mman.h> int mprotect(void *addr, size_t len, int prot); addr: 所要修改的虚拟内存区域的起始地址,其中addr地址必须与系统页(sysconf(_SC_P

weixin_42730667的博客 2827

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

UNIX环境高级编程-第14章- 高级 I/O - 二

14.4 STREAMS   STREAMS(流)是系统 V 提供的构造内核设备驱动程序和网络协议包的一种通用方法。流在用户进程和设备驱动程序之间提供了一条全双工通路,下面是流在用户进程和设备驱动程序之间的流图:写到流首的数据将顺流而下传送,由设备驱动程序读到的数据则逆流向上传送; STREAMS 消息         STREAMS 的所有输入和输出都是基于消息,流首和用户进程

灯火阑珊处 648

Linux/UNIX高级I/O

高级I/O 非阻塞IO 非阻塞I/O使我们可以调用open、read和write这样的I/O操作,并使这些操作不会永久阻塞。如果这种操作不能完成,则调用立即出错返回,表示该操作如继续执行将阻塞。 对于一个给定的描述符有两种方法对其指定非阻塞I/O: 1)      如果调用open获得描述符,则可指定O_NONBLOCK标志 2)      对于已打开的一个描述符,则可调用fcntl,由

walkerkalr的专栏 1145

unix环境高级编程=高级I/O

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style type="text/css"> *{

qq_37805832的博客 740

Unix环境高级编程学习笔记(九) 高级IO

fcntl 记录锁 很多时候,当我们有多个进程要访问同一个文件的时候,为了防止多进程访问导致的不一致,我们就要考虑进程间的同步问题了。fcntl是一个非常强大的函数,在这里我们可以使用它来给文件的某一个部分上锁。先来看一下它的声明: int fcntl(int filedes, int cmd, ... /* struct flock *flockptr */ ); 很显然,这是一个拥有

justaipanda的专栏 7797

unix编程(八)高级I/O

非阻塞I/O 对于一个给定的描述符,有两种方法为其指定非阻塞I/O方法: 1.如果调用open方法获取描述符,可以指定O_NONBLOCK 2.已经打开可以调用fcntl F_SETFL来改变文件状态标志,变成非阻塞。 文件记录锁 记录锁的功能,当一个进程在读取或者修改文件的某个部分,可以阻止其他进程修改同一文件区 使用fcntl函数 cmd是F_GETLK获取锁状态 F_SE

kc58236582的博客 469

50.Linux/Unix 系统编程手册(下) -- 虚拟内存操作

1.mprotect() 修改一块虚拟内存区域上的保护信息 如果一个进程在访问一块内存区域时违背了内存保护,内核会发送 SIGSEGV 信号。 2.内存锁: mlock() 和 mlockall() 将一块虚拟内存区域锁进物理内存,从而防止它被交换出去。 将一个进程的虚拟内存的部分或全部锁进内存以确保它们总是位于物理内存中是非常有用的。之所以这样做的一个原因是它可以提高性能。 对被...

enlyhua的专栏 196

如何在浏览器里拿到八大网盘的直链地址?LinkSwift 网盘直链下载助手实操记录

打开百度网盘网页版,选中一个文件,你会看到页面顶栏多出一个「下载助手」按钮。点它一下,就能拿到一份可以直接交给 IDM、Aria2 或终端命令行使用的真实下载地址——这就是 LinkSwift,一个运行在浏览器里的网盘直链下载助手。它基于 JavaScript 编写,支持百度网盘、阿里云盘、中国移动云盘、天翼云盘、迅雷云盘、夸克网盘、UC网盘、123云盘 8 大平台,直链获取过程全部发生在浏览器本

gitblog_00945的博客 259

Linux游戏TAS工具libTAS:如何实现帧级精确控制与存档状态管理

**libTAS**作为一款专为GNU/Linux系统设计的开源**工具辅助模拟**软件,通过创新的**系统层拦截**技术实现了对游戏运行的**确定性控制**和**帧级操作**。不同于传统模拟器,它让游戏在原生系统上运行,同时提供精确的输入录制、存档状态管理和时间控制功能,为Linux游戏社区带来了前所未有的TAS制作能力。 ## 🎯 核心要点速览 - **架构创新**:采用分离式进程设计,

gitblog_00309的博客 354

Memory Map(Linux 存储映射IO)

本文主要总结自UNIX环境高级编程以及RedHat6.5系统man函数 存储映射IO函数说明 mmap#include <sys/mman.h> void *mmap(void *addr,//指定映射区的起始地址。通常设置为0,由系统选择该映射区起始地址 size_t len, //映射的字节数 int prot, //对映射存储区的保护要求 int flag, //

从今天开始,做一个不偷懒好好学习的猿类 6173

UNIX环境高级编程——Linux系统调用列表

以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很罕见的。按照惯例,这个列表以man pages第2节,即系统调用节为蓝本。按照笔者的理解,对其作了大致的分类,同时也作了一些小小的修改,删去了几个仅供内核使用,不允许用户调用的系统调用,对...

weixin_34129696的博客 83
上一篇: 内存一致性中的release consistency
下一篇: scala闭包
hellochenlu
博客等级 码龄14年 97粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值