Linux下C编程:让系统更安全之锁定内存

Linux 实现了请求页面调度,页面调度是说页面从硬盘按需交换进来,当不再需要的时候交换出去。这样做允许系统中每个进程的虚拟地址空间和实际物理内存的总量再没有直接的联系,因为在硬盘上的交换空间能给进程一个物理内存几乎无限大的错觉。

交换对进程来说是透明的,应用程序一般都不需要关心(甚至不需要知道)内核页面调度的行为。然而,在下面两种情况下,应用程序可能像影响系统的页面调度:

确定性(Determinism)

时间约束严格的应用程序需要确定的行为。如果一些内存操作引起了页错误,导致昂贵的磁盘操作,应用程序的速度便不能达到要求,不能按时做计划中的操作。如果能确保需要的页面总在内存中且从不被交换进磁盘,应用程序就能保证内存操作不会导致页错误,提供一致的,可确定的程序行为,从而提供了效能。

安全性(Security)

如果内存中含有私人秘密,这秘密可能最终被页面调度以不加密的方式储存到硬盘上。

例如,如果一个用户的私人密钥正常情况下是以加密的方式保存在磁盘上的,一个在内存中为加密的密钥备份最后保存在了交换文件中。在一个高度注重安全的环境中,这样做可能是不能被接受的。这样的应用程序可以请求将密钥一直保留在物理内存上。当然,改变内核的行为会导致系统整体性能的负面影响。当页面被锁定在内存中,一个应用程序的安全性可能提高了,但这能使得另外一个应用程序的页面被交换出去。如果内核的设计是值得信任的,它总是最优地将页面交换出去(看上去将来最不会被使用的页面)。

如果用户不希望某块内存在暂时不用时置换到磁盘上,可以对该内存进行内存锁定。

相关函数如下:

#include <sys/types.h>     

int mlock(const void *addr,size_t length)     

int munlock(void *addr,size_t length)     

int mlockall(int flag)     

int munlockall(void

函数:mlock锁定一片内存区域,addr为内存地址,length要锁定的长度。

munlock接触已锁定的内存

mlockall一次锁定多个内存页。flag取值有两个MCL_CURRENT锁定所用内存页,MCL_FUTURE锁定为进程分配的地址空间内存页。munlockall用于解除锁定的内存。

注:只有超级用户才能进行锁定和解除内存操作。

查看全套文章:http://www.bianceng.cn/Programming/C/201212/34807.htm

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索内存
, 页面
, 磁盘调度
, 应用程序
, 密钥
, 调度
一个
,以便于您获取更多的相关知识。

时间: 2024-08-03 03:02:20

Linux下C编程:让系统更安全之锁定内存的相关文章

Linux下多线程编程(C语言)

Linux下多线程编程(C语言) 2.6内核开始使用NPTL(Native POSIX Thread Library)线程库,这个线程库有以下几个目标: POSIX兼容,都处理结果和应用,底启动开销,低链接开销,与Linux Thread应用的二进制兼容,软硬件的可扩展能力,与C++集成等. 这里的线程是指用户空间的线程操作 一.线程相关操作 1.1  pthread_t      pthread_t 在头文件  /usr/include/i386-linux-gnu/bits/pthreadt

Linux下多进程编程(C语言)

Linux下多进程编程(C语言) 一.    进程简介 1.进程是程序的执行.程序是静态的,进程是动态的. 2.进程在内存中有三部分组成:数据段.堆栈段和代码段.          代码段:就是存放程序代码的数据,如果有数个进程运行同一个一个程序,那么它们就可以使用同一个代码段(代码段是可以共享的):          堆栈段:存放的是子程序的返回地址.参数以及程序的局部变量,主要是保存进程的执行的环境,这里用到了栈先进后出的特性,可以看做具有记忆上一次执行的环境.          数据段:存

Linux下Shell编程快捷键大全(日常整理)_linux shell

有时候,我们需要在 Bash 中重复执行先前的命令.你当然可以使用上方向键来查看之前曾经运行过的命令.但这里有一些更好的方式,例如,数量掌握以下的快捷键. 1) !!:重复执行上一条指令 2) !a:重复执行上一条以a为首的指令 3) !number:重复执行上一条在history表中记录号码为number的指令 4) !-number:重复执行前第number条指令 5) !$:表示获得上一条命令中的最后一项内容 6) 用Ctrl + r 组合键来进入历史搜索模式在history表中查询某条过

Linux下c++编程中,STL模板的使用。

问题描述 Linux下c++编程中,STL模板的使用. Linux下c++编程,使用STL模板,为什么只识别#include 而不识别#include ? 程序中只要有#include 就会报无数多个错! 解决方案 难道c++标准模板库STL中没有包含queue,你可以去根目录去看看include头文件中有没有queue.h 解决方案二: STL头文件目录是否被include进项目中,如果自己写makefile的话,查看下INCLUDE的目录,如果IDE的话就查看下项目设置中的include选项

linux下串口编程read函数返回(非超时返回)问题

问题描述 linux下串口编程read函数返回(非超时返回)问题 串口编程经典应用场景:打开串口,阻塞模式,非超时返回,有数据返回,无数据死等. 简易代码为例: void* read_thread(void* param) { char szbuf[128]; int size = 0; while (running) { size = read(fd, szbuf, sizeof(szbuf)); } return 0; } int main() { fd = open(port, O_RDW

Linux下网络编程read,write问题(C语言),求大神指点阿!!!

问题描述 Linux下网络编程read,write问题(C语言),求大神指点阿!!! zuijzuj.最近学习socket编程的时候调试代码出现了一些问题,求大神们指导阿!!!我要实现的功能是客户端输入两个操作数和一个运算符,在服务端进行运算再把结果返回到客户端.现在的bug是客户端输入第一个操作数的时候没问题,输入运算符的时候客户端可以通过write函数写入但是服务端读出的结果不是输入的运算符,客户端输入第二个操作数的时候write函数无法写入,这是缓冲区满了吗?缓冲区大小不是由内核自己决定的

嵌入式Linux下Camera编程--V4L2【转】

转自:http://blog.csdn.net/fwqlzz/article/details/51126653 版权声明:本文为博主原创文章,未经博主允许不得转载. USB video class(又称为USB video device class or UVC)就是USB device class视频产品在不需要安装任何的驱动程序下即插即用,包括摄像头.数字摄影机.模拟视频转换器.电视卡及静态视频相机. 最新的UVC版本为UVC 1.5,由USB-IF(USB Implementers For

Linux下C编程:底层终端编程实例

Linux 系统的终端处理是一个非常大的系统,需要处理许多不同类型的设备和需求.涉及的内容包括:调制解调器.终端仿真.伪终端等. Linux 系统处理终端的方法是通过串行接口连接的控制台与系统通信并运行程序.由于越来越多的厂商都参与到终端的生产,而且每个厂商都为自己的终端设计自己的命令集,所以需要有一种方法对终端的访问进行一般化处理.Linux 系统使用一个能力数据库terminfo来描述每个终端的能力以及调用这些功能的方法. 在某些情况下,程序员希望能够对某些并不是终端的设备提供终端驱动程序功

Linux下C编程:信号处理潜在危险

信号作为异步进程的通信方式,在实际应用中是方便而实用的.但是,也应该注意到在使用信号时的潜在危险.在此简单介绍几种可能引发错误的具体情况,希望在实际进行信号处理时特别注意. 当注册了一个信号处理函数时,可能会对某些系统调用进行修改.通常来讲,它们本来应是不受信号的影响,但由于注册了一个信号处理函数,系统可能会认为在一个信号到来时需要中断原系统调用.当这种情况发生时,原系统调用被终止,返回调用失败值,同时errno将被设置为EINTR.当然有一些时候,确实希望系统如此处理,但在另一些情况下,并不希