sdjkkdkad

news/2025/3/19 17:39:11/


#include <stdio.h>


#include <stdlib.h>


#include <sys/types.h>


#include <unistd.h>


#include <sys/stat.h>


#include <fcntl.h>


#include <stdint.h>


//计算虚拟地址对应的地址,传入虚拟地址vaddr,通过paddr传出物理地址
void mem_addr(unsigned long vaddr, unsigned long *paddr)
{
    int pageSize = getpagesize();//调用此函数获取系统设定的页面大小

    unsigned long v_pageIndex = vaddr / pageSize;//计算此虚拟地址相对于0x0的经过的页面数
    unsigned long v_offset = v_pageIndex * sizeof(uint64_t);//计算在/proc/pid/page_map文件中的偏移量
    unsigned long page_offset = vaddr % pageSize;//计算虚拟地址在页面中的偏移量
    uint64_t item = 0;//存储对应项的值

    int fd = open("/proc/self/pagemap", O_RDONLY);。。以只读方式打开/proc/pid/page_map
    if(fd == -1)//判断是否打开失败
    {
        printf("open /proc/self/pagemap error\n");
        return;
    }

    if(lseek(fd, v_offset, SEEK_SET) == -1)//将游标移动到相应位置,即对应项的起始地址且判断是否移动失败
    {
        printf("sleek error\n");
        return; 
    }

    if(read(fd, &item, sizeof(uint64_t)) != sizeof(uint64_t))//读取对应项的值,并存入item中,且判断读取数据位数是否正确
    {
        printf("read item error\n");
        return;
    }

    if((((uint64_t)1 << 63) & item) == 0)//判断present是否为0
    {
        printf("page present is 0\n");
        return ;
    }

    uint64_t phy_pageIndex = (((uint64_t)1 << 55) - 1) & item;//计算物理页号,即取item的bit0-54

    *paddr = (phy_pageIndex * pageSize) + page_offset;//再加上页内偏移量就得到了物理地址
}

const int a = 100;//全局常量

int main()
{
    int b = 100;//局部变量
    static c = 100;//局部静态变量
    const int d = 100;//局部常量
    char *str = "Hello World!";

    unsigned long phy = 0;//物理地址

    char *p = (char*)malloc(100);//动态内存

    int pid = fork();//创建子进程
    if(pid == 0)
    {
        //p[0] = '1';//子进程中修改动态内存
        mem_addr((unsigned long)&a, &phy);
        printf("pid = %d, virtual addr = %x , physical addr = %x\n", getpid(), &a, phy);
    }
    else
    { 
        mem_addr((unsigned long)&a, &phy);
        printf("pid = %d, virtual addr = %x , physical addr = %x\n", getpid(), &a, phy);
    }

    sleep(100);
    free(p);
    waitpid();
    return 0;
}
 


http://www.ppmy.cn/news/805086.html

相关文章

dl~dt~dd

■ 定义 <dl>标签用于定义描述列表(或定义列表) 自定义列表常用于对术语或名词进行解释和描述&#xff0c;定义列表的列表项前没有任何项目符号 dl代表单词Definition List&#xff0c;意为定义列表 dt代表单词Definition Term&#xff0c;意为定义术语 dd代表单词Defini…

GDM, KDM, LightDM, SDDM的区别和安装配置

gdm3&#xff0c;kdm 和 lightdm 都是显示管理器。 它们提供图形化登录并处理用户身份验证。 从维基文章中&#xff1a; 显示管理器向用户显示登录屏幕。 当用户成功输入用户名和密码的有效组合时&#xff0c;会话开始。 GDM&#xff0c;gnome系列的图形管理器 sudo apt-ge…

DKVMN学习

文章目录 前言Memory-Augmented Neural Network(MANN) for Knowledge TracingDKVMN模型实验结果DKVMN总结DKVMN-BORUTA模型SKVMN模型Deep-IRT模型 前言 BKT是特定概念的。DKT使用一个总结的隐向量对知识状态进行建模。DKVMN同时维护每个概念的概念状态&#xff0c;所有的概念状…

DDPM-DDIM-DDIB

Dual Diffusion Implicit Bridges for Image-to-Image Translation(DDIB) 本文提出了一种新的域之间的Image-to-Image Translation的方法DDIB, 这种方法只需要在source域和target域上分别训练好两个DDIM模型, 然后将source域对应的latent直接传给target域. 这种方法不需要成对的…

《Vue-框架开发》期末考试试题

《Vue-框架开发》期末考试试题 .Vue与 Angular和 React框架不同的是,Vue设计为自下而上逐层应用。 [判断题] * 对(正确答案) 错 Vue完全能够为复杂的单页应用提供驱动。 [判断题] * 对(正确答案) 错 Vue是一套构建用户界面的渐进式框架,Vue的核心只关注视图层。 [判断题] * 对…

Django_re_path_使用正则匹配url

与path定义的路由相比&#xff0c;re_path 定义的路由可以使用正则表达式匹配url。 需要注意的是&#xff1a; 如果未定义匹配结果的变量名&#xff0c;匹配的结果默认传入视图的第2个形参。如果定义了匹配结果的变量名&#xff0c;匹配的结果会传给视图的同名字段&#xff0…

哈利波特系列读后感

想必很多人都已经看过哈利波特的一系列电影了&#xff0c;读原著呢&#xff1f;我倒是很乐意去品味书中那跳跃的文字&#xff0c;风趣的英式幽默&#xff0c;还有跌宕起伏的情节。和电影那仅仅的表观视觉冲击相比&#xff0c;书籍更能交待哈利在霍格沃茨的一切&#xff0c;让我…