首页 > 其他分享 >pm_read pm_write实现

pm_read pm_write实现

时间:2024-05-19 21:30:17浏览次数:29  
标签:0x3u addr wmask read write int host 字节 pm

实现read函数时不要忘记对齐,其中讲义提示:

总是读取地址为 raddr & ~0x3u的4字节返回

所以需要把读进来的地址进行 & ~0x3u,得到对齐后的地址,
而后在把对齐后的物理地址转为虚拟地址guest_to_host(addr),
最后进行组合就ok了,例如:

地址:    0x80000000  0x80000001  0x80000002  0x80000003
数据:     0x12       0x34        0x56        0x78

如果 raddr = 0x80000003,对齐后的地址是 0x80000000,读取的 4 字节数据组合后为 0x78563412,该数据将作为函数的返回值。
最终实现代码如下:

static word_t pmem_read(paddr_t addr) {
  paddr_t adapt_addr = addr & ~0x3u;
  uint8_t *ret = guest_to_host(adapt_addr);
  word_t data;
  for (int i = 0; i < 4; i++){
    data |= ret[i] << ( i * 8);  
  }
  return ret;
}

利用或操作进行拼接。

写操作同理,讲义中提示:

extern "C" void pmem_write(int waddr, int wdata, char wmask) {
  // 总是往地址为`waddr & ~0x3u`的4字节按写掩码`wmask`写入`wdata`
  // `wmask`中每比特表示`wdata`中1个字节的掩码,
  // 如`wmask = 0x3`代表只写入最低2个字节, 内存中的其它字节保持不变
}

根据刚才的对齐规则,掩码也是相同机理


extern "C" void pmem_write(int waddr, int wdata, char wmask) {
    //host_write(guest_to_host(addr), len, data);
  paddr_t adapt_addr = waddr & ~0x3u;
  uint8_t *vaddr = guest_to_host(adapt_addr);

  for(int i = 0; i < 4; i++){
    if (wmask & (1 << i)) {
      vaddr[i] = (wdata >> (i * 8)) & 0xFF;
    }    
  }
}

标签:0x3u,addr,wmask,read,write,int,host,字节,pm
From: https://www.cnblogs.com/ink-bai/p/18200788

相关文章

  • DDPM原理
    生成模型核心原理解释:将观测变量(数据集图片)进行编码为具有某个确定分布(一般为正太分布)的隐变量,然后再将该隐变量解码为观测变量。在推理过程中就可以通过在隐变量的分布中进行随机采样,然后将其解码为生成的图片,进而实现生成内容的多样性。DDPMDDPM相比VAE,在将观测变量编码为......
  • “复兴杯”2023第四届大学生网络安全精英赛排位赛 Writeup
    时间跟全国信安初赛重了(),不过也是第一次在CTFAK了(个人信息个人排名:15解题过程1观察代码,使用科学技术法进行绕过,2.023e3也就是2.023*10^3=2023,弱比较时会化为2023,但是运算时后并不绝对等于2024。输入得到flag。2打开网站可以看到电脑账号是ly,使用过滤器得到包含ly的包,如......
  • Doug Lea大师的佳作CopyOnWriteArrayList,用不好能坑死你!
    一、写在开头我们在学习集合或者说容器的时候了解到,很多集合并非线程安全的,在并发场景下,为了保障数据的安全性,诞生了并发容器,广为人知的有ConcurrentHashMap、ConcurrentLinkedQueue、BlockingQueue等,那你们知道ArrayList也有自己对应的并发容器嘛?作为使用频率最高的集合类之一,A......
  • rthread学习记录汇总-不断更新
    1、rthread同Linux类似,包含了所有主流的芯片、cpu架构,可从官方获取最新的rt-thread源码后进行裁剪 2、可从rthread官网下载env工具,env工具可用来对rtthread源码生成mdk/iar工程命令式scons--target=mdk5  scons--targe=iarscons自带的编译固件功能,命令为scnons,默认用......
  • php 异步并行后续--兼容FPM使用的组件
    上次给人推荐了这篇文章,关于PHP异步并行的文章,之后有人评论问这个组件能不能给fpm用,我测试了一下发现不行,于是又找到一个可以给fpm用的http请求组件.安装很简单,就这样  composerrequireguzzlehttp/guzzle 进行安装一下.然后代码示例如下:我们先建一个文件作为一个长......
  • PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
    参考:https://blog.csdn.net/jackbon8/article/details/1079406381.导出表格<?phpnamespaceapp#给类文件的命名空间起个别名usePhpOffice\PhpSpreadsheet\Spreadsheet;#Xlsx类将电子表格保存到文件usePhpOffice\PhpSpreadsheet\Writer\Xlsx;......
  • ctflearn-writeup(Exclusive Santa)
    https://ctflearn.com/challenge/851在完成这题前最好先下载foremost,unrar,stegsolve等工具首先拿到题目后,先解压得到两个图片文件1.png和3.png两张图片用exiftool,strings,binwalk试过后发现无解于是用关键命令foremost3.png-T(修复破损文件)发现有一个output的文件夹......
  • npm install bug集
    报错信息gypERR!configureerrorgypERR!stackError:`gyp`failedwithexitcode:1gypERR!stackatChildProcess.onCpExit(/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:351:16)gypERR!stackatChildProcess.emit(event......
  • std::thread和std::jthread的区别
    `jthread`和`std::thread`是C++标准库中用于创建和管理线程的两个类。它们的主要区别在于线程的管理方式和对异常的处理:1.**RAII(ResourceAcquisitionIsInitialization)语义:**-`std::thread`在销毁时,如果线程仍在运行,需要显式调用`join()`或`detach()`方法来等待......
  • 执行npm run serve有时提示npm update check failed
    背景:这个错误虽说无关紧要,但有时候会出现就感觉不爽。错误提示: 解决方法:在网络上查阅资料后才知道是因为文件夹权限的问题(1.)删除目录configstore由于权限问题,该目录经常出现故障。如果删除该目录,则下次运行命令时将重新生成该目录。(2.)在Windows上删除......