扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
一直以来的一些老问题
大型应用程序包含很多代码模块,总是存在游离指针和内存意外破坏的问题,但更糟糕的是,在很久之后才发现此类问题,而此时已无从确定破坏发生的地点、时间、程度等。
处理内存访问错误的一个真实示例
我曾经处理过一个真的应该在其中使用存储密钥的项目,至今我仍然记得其中的情况。当我开发的终端处理程序在测试中心的每个屏幕上输出的全是垃圾信息时,整个编程团队开始转而向我寻求答案。我的变量全部被破坏,我不得不向代码中添加了大量的健全性检查和变量来尝试捕获出错的软件模块——这花了我一天的时间。然后,在下一次系统测试中,我发现是数据库代码造成的问题,但他们开始不相信,直到我输出了我的变量的十六进制转储,向他们指出一个数据库记录写入了错误的位置。这花了一个星期的时间,而编程团队的每个人都认定是我这边编码失误造成的!如果使用存储密钥,这个问题应该在一个小时之内就解决了。
但我们现在有了内存密钥这个新技术
内核程序员将其称为“存储密钥”——对于在 CPU 内部和虚拟内存中工作的内核程序员而言,存储就等于内存,因为他们使用加载和存储指令。对于其他人而言,这称为内存或 RAM!我们在这里不是讨论“内核级别的内存密钥”,而仅是应用程序的普通程序员可以使用的用户级别的密钥。
对于内核程序员而言,存储密钥在用于查找第三方设备驱动程序小错误和添加到内核的新函数的错误特别有用,在 AIX 中,这是为了保持较高级别的 RAS,并删除了一些似乎从来没有完全解决的奇怪问题。据说已经发现了大量问题,而且已经得到了解决,将提高 AIX 在所有计算机(不仅是 POWER6)上的性能。
另外请注意,存储密钥不是安全功能(存储密钥安全功能指应用到内存的一项普通安全机制,可保证进程拥有自己的地址空间,并能访问具有自己的保护机制的共享内存)。
存储密钥是用于协作程序的调试功能,可确定有问题的代码,以便消除问题,从而提高可靠性。还可以将其用于其他情况,例如运行用户编写的服务器存储过程的数据库,以保护数据库不受用户编程错误的影响。锁定,以保护数据
锁定,以保护数据
考虑一下包含数十亿内存页的大型系统,程序访问内存的速度非常快,因此要检查这些锁定,也需要非常快,即在毫微秒级单位进行。因此,我们不能使用数百万个密钥来交叉检查对内存的每次读写,因此只需要少量的锁定和密钥。每个内存页都有一个锁定,缺省为锁定状态(编号为 0),称为 UKEY_PUBLIC,即内存按照正常或解锁方式工作,可以进行读写操作(对于程序代码之类的只读部分只能进行只读操作)。
程序可以将内存锁定更改为 UKEY_PRIVATE1……UKEY_PRIVATE32。此操作通过函数调用完成 ukey_protect( address, size, UKEY_PRIVATE1)
注意:
Address 必须为页面对齐
Size 必须为页面大小的倍数
AIX 有 4 种页面大小!
获得访问的密钥
现在要访问此受保护的内存,进程必须具有恰当的密钥。密钥具有不同的选项
无权访问
读访问
写访问
读写访问
可以设置只写访问,但这没有什么意义!
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者