精华内容
下载资源
问答
  • 2020-05-09 11:48:44

    1、契子

    当我配置虚拟机中系统的网络配置时,出现无法连接外网,于是上网查询一些建议。发现有人说vm虚拟机中桥接模式的“复制物理网络连接状态“是否勾选会影响虚拟机是否可以上网。但在尝试选择勾选后并没有解决问题,最后我自己发现是其它问题导致我的虚拟机无法上网,这里暂且不说。

    等我的虚拟机配置网络配置弄好后,我再回过头来尝试在”复制物理网络连接状态”勾选和没勾选情况先尝试,发现无论是否勾选,虚拟机都可连接外网。于是对此感到困惑。

    2、网络寻找答案

    我针对vm虚拟中桥接模式下“复制物理网络连接状态”的含义进行搜索,但许多答案都是说在物理机可以上网的前提,勾选虚拟机可以上网,不勾选虚拟机网络连接正常显示,但无法上网。但这显然和我发现的情况不符合,最后找到Vm官网关于这个选项的意义

    3、官网给出解释

    https://docs.vmware.com/cn/VMware-Workstation-Pro/15.0/com.vmware.ws.using.doc/GUID-826323AD-D014-475D-8909-DFA73B5A3A57.html

    官网这样介绍:
    选择桥接模式: 直接连接物理网络。

    如果在笔记本电脑或其他移动设备上使用虚拟机,请选择复制物理网络连接状态。

    当您在有线或无线网络之间进行移动时,该设置会导致 IP 地址续订。

    4、理解“当您在有线或无线网络之间进行移动时,该设置会导致 IP 地址续订”意思

    首先这个选项是只在移动设备上有效。例如当你自笔记本中使用vmware软件,
    1、初始你的电脑有线连接局域网,开启桥接状态使用虚拟机,这时虚拟机获取的局域网Ip地址例如为:192.168.1.111。
    2、当你将网线拔掉,换成wifi连接,有两种情况:

    • 没有勾选“复制物理连接状态时”,此时你的虚拟机ip地址可能变为:192.168.1.112
    • 勾选“复制物理连接状态时”,你的虚拟机ip地址将还是:192.168.1.111

    这是对于该设置会导致ip地址续订 的理解

    更多相关内容
  • 怎样修改手机的物理地址

    千次阅读 2021-01-16 19:48:02
    修改手机的物理地址方法一1、手机先root2、安装RE文件管理器3、把/data/etc/wifi/fw复制到电脑里4、电脑事先安装好16位编辑器,同时先记下你的MAC地址5、用16为编辑器打开复制出来的文件,6、按照事先记号得MAC地址....

    MAC地址是网卡地址是一个固定的物理地址不像IP地址是自己设置的MAC地址,那么呢?今天小编与大家分享下修改手机的物理地址的具体操作步骤,有需要的朋友不妨了解下。

    修改手机的物理地址方法一

    1、手机先root

    2、安装RE文件管理器

    3、把/data/etc/wifi/fw复制到电脑里

    4、电脑事先安装好16位编辑器,同时先记下你的MAC地址

    5、用16为编辑器打开复制出来的文件,

    6、按照事先记号得MAC地址数据,寻找相对应的数据,然后要怎么改就是你自己的事了!

    7、改好后把文件再拷回手机替换原来的文件!

    注意请备份好原来的哪些数据,要是改乱了就麻烦了!

    修改手机的物理地址方法二

    还没改前 小编手机的mac 位数是a5 等下小编们就修改 成a6 mac的查看在wifi高级里面

    然后小编们打开下载好安装完成的re文件管理器

    然后再管理器里面退回到根目录

    打开 如图的文件路径

    找到softmac 对就是这个文件了 管理着手机的mac

    然后小编们要修改它 选中文件长按 选择编辑打开

    然后小编们进行修改 这里wsczgoo 就示范改了个尾数 全改也是可以的 然后小编们点击保存

    到了这里可能大家觉得已经完成了,其实还有很重要的一个步奏小编们要做哦 就是修改权限 使系统不会真的的还原本来的mac 如图 长按文件选择权限

    然后修改的权限如图 确定

    然后小编们关闭一次wifi 在开启 手机的wifi mac就被成功的修改了

    修改手机的物理地址三

    下面介绍一款软件 叫物理地址修改器MacAddress

    物理地址修改器MacAddress是 Android 平台上的无线网卡物理地址修改软件。

    主要功能:

    修改无线网卡的物理地址需要 root 权限;

    支持恢复到之前的网卡物理地址设置。

    需要说明的是,这个软件好像只支持华为的手机,所以我没试。

    d0a6e8bff221a4e8c68831b51f5f9ca1.png

    展开全文
  • 逻辑地址是CPU在执行过程中生成的地址,而物理地址是指存储单元(已加载到内存中的单元)中的位置。请注意,用户仅处理逻辑地址(虚拟地址)。逻辑地址尤其由MMU或地址转换单元进行转换。该过程的输出是适当的物理...

    目录

    引言

    地址绑定

    MMU(内存管理单元)

    基本硬件

    进程如何从磁盘映射到内存

    磁盘和内存的映射过程

    MMU方案

    开始编码

    创建我们的缓冲区

    /proc/[pid]/pagemap

    写 /dev/mem

    结论和完整代码清单

    DPDK是如何操作的?

    推荐文章


     

    引言


    理解“了解Linux内核”中有关内存管理的章节中,我认为尝试编写将虚拟内存地址转换为物理地址的程序会很有趣。而且,我想在用户空间上使用它。再进一步,为什么不尝试获取缓冲区的物理地址,转到内存中的该位置,对其进行修改,然后使用虚拟地址查看更改。

    尝试在用户空间中完成此任务存在一些问题:

    • 虚拟内存背后的想法是提供连续内存的地址空间。进程的内存很可能存储在不连续的块中。
    • 没有保证page在系统的物理内存中。它可以在交换区或缓存中。可能没有实际地址!
    • 出于安全原因,即使进程的UID为0,进程也无权访问系统的原始内存。

    我们可以采用两种方法来获取物理地址:

    1. 给内核添加一个系统调用,给定一个虚拟地址,它将返回物理地址。但是,修改内核违反了从用户空间执行所有操作的规则,因此我们必须将其排除在外。
    2. 将page映射文件用于进程(内核2.6.25中已添加)以获取页面映射到的帧,然后使用该页面查找/dev/mem并修改那里的缓冲区。

    使用这种方法,完全有可能在用户空间中将虚拟地址转换为物理地址。但是,要验证我们的翻译是正确的,需要阅读/dev/mem。这确实需要对内核进行一次小的修改(更改配置选项),但稍后会进行更多修改。

    内存由大量word或array组成,每个word或array都有与之关联的地址。现在,CPU的工作是从基于内存的程序计数器中获取指令。现在,这些指令可能会导致加载或存储到特定的存储器地址。地址绑定是从一个地址空间映射到另一地址空间的过程。逻辑地址是CPU在执行过程中生成的地址,而物理地址是指存储单元(已加载到内存中的单元)中的位置。请注意,用户仅处理逻辑地址(虚拟地址)。逻辑地址尤其由MMU或地址转换单元进行转换。该过程的输出是适当的物理地址或代码/数据在RAM中的位置。

     

    地址绑定


    地址绑定可以通过三种不同的方式完成:

    1. 编译时间–如果您知道在编译期间进程将驻留在内存中,则会生成绝对地址,即在编译过程中将物理地址嵌入到程序的可执行文件中。将可执行文件作为进程加载到内存中的速度非常快。但是,如果生成的地址空间被其他进程所占用,则程序将崩溃,并且有必要重新编译程序以更改地址空间。
    2. 加载时间–如果在编译时不知道进程将驻留在哪里,则将生成可重定位的地址。加载程序将可重定位地址转换为绝对地址。加载程序将主存储器中进程的基地址添加到所有逻辑地址中,以生成绝对地址。在这种情况下,如果进程的基址发生更改,则我们需要再次重新加载进程。
    3. 执行时间-指令在内存中,正在由CPU处理。此时可以分配和/或释放其他内存。如果可以在执行期间将进程从一个内存移动到另一个内存(动态链接-在加载或运行时完成链接),则使用此方法。例如–压实。

     

    MMU(内存管理单元)


    虚拟地址和物理地址之间的运行时映射是通过称为MMU的硬件设备完成的。

    在内存管理中,操作系统将处理进程并在磁盘和内存之间移动进程以执行。它跟踪可用和已使用的内存。

    指令执行周期包括以下步骤:

    1. 从存储器中获取第一条指令,例如ADD A,B
    2. 然后将这些指令解码,即A和B的加法
    3. 然后在某个特定的存储位置进行进一步的加载或存储。

    基本硬件

    由于主存储器和寄存器内置在处理器中,CPU只能访问它们,因此每条指令都应写入直接访问存储
    设备中。

    1. 如果从寄存器访问CPU指令,则由于寄存器内置在CPU中,因此可以在一个CPU时钟周期内完成。
    2. 如果指令驻留在主存储器中,那么它将通过存储器总线进行访问,这将花费大量时间。因此,对此的补救措施是在CPU和主内存之间添加快速内存,即为事务添加缓存。
    3. 现在,我们应该确保流程位于法定地址内。
    4. 合法地址由基址寄存器(拥有最小的物理地址)和限制寄存器(范围的大小)组成。

    例如:

    基址寄存器= 300040
    限制寄存器= 120900 
    那么合法地址=(300040 + 120900)= 420940(含)。
    法定地址=基本寄存器+限制寄存器

     

    进程如何从磁盘映射到内存

    1. 通常,进程以二进制可执行文件的形式驻留在磁盘中。
    2. 因此,执行过程应驻留在主存储器中。
    3. 根据使用的内存管理,进程从磁盘移动到内存。
    4. 进程以就绪队列的形式在磁盘中等待以获取内存。

     

    磁盘和内存的映射过程

    正常过程是从输入队列中选择进程并将其加载到内存中。进程执行时,它将访问内存中的数据和指令,一旦完成,它将释放内存,现在内存可用于其他进程。

     

    MMU方案

     CPU ------- MMU ------内存 

    1. CPU将为例如346生成逻辑地址
    2. MMU将为例如:14000生成重定位寄存器(基址寄存器)
    3. 内存中的物理地址位于例如:(346 + 14000 = 14346)

    图来源https://users.dimi.uniud.it/~antonio.dangelo/OpSys/materials/Operating_System_Concepts.pdf
    本文由Vaishali Bhatia贡献。如果您喜欢GeeksforGeeks并且愿意做出贡献,那么您也可以使用contribution.geeksforgeeks.org撰写文章或将您的文章邮寄至contribution@geeksforgeeks.org。查看您的文章出现在GeeksforGeeks主页上,并帮助其他Geeks。

     

    开始编码

    创建我们的缓冲区


    除了通常的malloc()调用之外,创建缓冲区以查找地址的过程还需要另外一步。内核不保证虚拟地址空间中的地址实际映射到内存中的物理地址。它可以存储在交换空间中,某个地方或整个地方的缓存中。为了避免这种可能性,我们可以mlock()用来强制将页面保留在系统的物理内存中。幸运的是,这很简单。只需将mlock()指针传递到缓冲区和缓冲区的大小,它将处理其余的内容。看起来像这样:

    void* create_buffer(void) {
       size_t buf_size = strlen(ORIG_BUFFER) + 1;
    
       // Allocate some memory to manipulate
       void *buffer = malloc(buf_size);
       if(buffer == NULL) {
          fprintf(stderr, "Failed to allocate memory for buffer\n");
          exit(1);
       }
    
       // Lock the page in memory
       // Do this before writing data to the buffer so that any copy-on-write
       // mechanisms will give us our own page locked in memory
       if(mlock(buffer, buf_size) == -1) {
          fprintf(stderr, "Failed to lock page in memory: %s\n", strerror(errno));
          exit(1);
       }
    
       // Add some data to the memory
       strncpy(buffer, ORIG_BUFFER, strlen(ORIG_BUFFER));
    
       return buffer;
    }

    请注意,锁定后我将数据复制到缓冲区中。这是因为如果缓冲区所在的页面与父进程共享,则OS可能会采用写时复制分页机制。为了强制操作系统提供我们自己的页面,我们将数据锁定后写入缓冲区。

     

    /proc/[pid]/pagemap


    页面映射为用户提供了访问空间,以访问内核如何管理进程页面。这是一个二进制文件,因此从中提取信息有些棘手。

    从文档1中可以看到,每页有64位信息。我们对页帧号0-54位感兴趣。

    我们如何从页面地图中获取给定页面的页面框架号?首先,我们需要确定要映射到页面地图中的偏移量。可以这样进行:

    #define PAGEMAP_LENGTH 8
    offset = (unsigned long)addr / getpagesize() * PAGEMAP_LENGTH

    给定一个地址,我们将其除以页面大小,然后乘以8。为什么是8?每页有64位或8字节的信息。

    然后,我们在文件中寻找该位置并读取前7个字节。为什么是7?我们对咬伤0-54感兴趣。总共有55位。因此,我们读取了前7个字节(56位)并清除了位55。位55是我们不关心的软脏标志。

    unsigned long get_page_frame_number_of_address(void *addr) {
       // Open the pagemap file for the current process
       FILE *pagemap = fopen("/proc/self/pagemap", "rb");
    
       // Seek to the page that the buffer is on
       unsigned long offset = (unsigned long)addr / getpagesize() * PAGEMAP_LENGTH;
       if(fseek(pagemap, (unsigned long)offset, SEEK_SET) != 0) {
          fprintf(stderr, "Failed to seek pagemap to proper location\n");
          exit(1);
       }
    
       // The page frame number is in bits 0-54 so read the first 7 bytes and clear the 55th bit
       unsigned long page_frame_number = 0;
       fread(&page_frame_number, 1, PAGEMAP_LENGTH-1, pagemap);
    
       page_frame_number &= 0x7FFFFFFFFFFFFF;
    
       fclose(pagemap);
    
       return page_frame_number;
    }

    现在我们有了页面帧号,我们可以轻松计算出缓冲区的物理地址,例如2:

    physcial_addr = (page_frame_number << PAGE_SHIFT) + distance_from_page_boundary_of_buffer

    PAGE_SHIFT内核#define在哪里。对于我的x86_64系统,它定义为12,但这可能因您而异。您应该自己查看内核源代码来确认该值。

     

    写 /dev/mem


    现在我们已经确定了物理地址,我们可以继续在内存中找到该位置并对其进行修改。

    Linux通过/dev/mem块设备提供对系统内存的直接访问。但是,由于明显的安全隐患,即使是root用户,也无法读取(更不用说写入)该文件了。这是由于CONFIG_STRICT_DEVMEM内核配置选项。作为配置选项,必须在编译时设置它,以便更改它,您必须重新编译内核。

    内核的编译和安装会因发行版的不同而有所差异,因此在此不再赘述。如果您已经熟悉该过程,则只需CONFIG_STRICT_DEVMEM=n在配置中设置,重新编译,安装和重新启动即可。希望所有虚拟机都存在,因为这显然会带来巨大的安全漏洞。

    假设您的内核已CONFIG_STRICT_DEVMEM禁用,我们可以继续。首先是要知道在哪里寻找/dev/mem我们放入缓冲区的字符串。实际上,这很简单。我们需要寻找的偏移量等于我们上面计算的物理地址。

    // Find the difference from the buffer to the page boundary
    unsigned int distance_from_page_boundary = (unsigned long)buffer % getpagesize();
    
    // Determine how far to seek into memory to find the buffer
    uint64_t offset = (page_frame_number << PAGE_SHIFT) + distance_from_page_boundary;

    现在让我们打开/dev/mem并寻找我们计算出的偏移量:

    int open_memory(void) {
       // Open the memory (must be root for this)
       int fd = open("/dev/mem", O_RDWR);
    
       if(fd == -1) {
          fprintf(stderr, "Error opening /dev/mem: %s\n", strerror(errno));
          exit(1);
       }
    
       return fd;
    }
    
    void seek_memory(int fd, unsigned long offset) {
       unsigned pos = lseek(fd, offset, SEEK_SET);
    
       if(pos == -1) {
          fprintf(stderr, "Failed to seek /dev/mem: %s\n", strerror(errno));
          exit(1);
       }
    }
    
    int mem_fd = open_memory();
    seek_memory(mem_fd, offset);

    快完成了!我们在内部找到了正确的文件描述符,/dev/mem所以现在我们只需要写3。

    if(write(mem_fd, NEW_BUFFER, strlen(NEW_BUFFER)) == -1) {
       fprintf(stderr, "Write failed: %s\n", strerror(errno));
    }

    请注意,NEW_BUFFER长度必须等于或短于ORIG_BUFFER。就我而言,我将它们定义为相同的长度,因此我不必费心复制NUL终止符。

    最后,我们可以从原始缓冲区中读取内容,如果一切正常,我们将看到通过写入更改了缓冲区的内容/dev/mem

    printf("Buffer: %s\n", buffer);

     

    结论和完整代码清单


    值得注意的是,这只是一个实验。这并不是要依赖的行为。实际上,在我的测试中,我体验了内核在计算偏移量以查找该偏移量并将数据写入该偏移量之间的时间在物理地址周围乱码的情况。底线是:坚持虚拟内​​存;它真的很好。而且,如果您需要从用户空间修改物理内存,请寻找另一种方法。

    完整代码清单:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/mman.h>
    #include <errno.h>
    #include <fcntl.h>
    #include <stdint.h>
    
    // ORIG_BUFFER will be placed in memory and will then be changed to NEW_BUFFER
    // They must be the same length
    #define ORIG_BUFFER "Hello, World!"
    #define NEW_BUFFER "Hello, Linux!"
    
    // The page frame shifted left by PAGE_SHIFT will give us the physcial address of the frame
    // Note that this number is architecture dependent. For me on x86_64 with 4096 page sizes,
    // it is defined as 12. If you're running something different, check the kernel source
    // for what it is defined as.
    #define PAGE_SHIFT 12
    #define PAGEMAP_LENGTH 8
    
    void* create_buffer(void);
    unsigned long get_page_frame_number_of_address(void *addr);
    int open_memory(void);
    void seek_memory(int fd, unsigned long offset);
    
    int main(void) {
       // Create a buffer with some data in it
       void *buffer = create_buffer();
    
       // Get the page frame the buffer is on
       unsigned int page_frame_number = get_page_frame_number_of_address(buffer);
       printf("Page frame: 0x%x\n", page_frame_number);
    
       // Find the difference from the buffer to the page boundary
       unsigned int distance_from_page_boundary = (unsigned long)buffer % getpagesize();
    
       // Determine how far to seek into memory to find the buffer
       uint64_t offset = (page_frame_number << PAGE_SHIFT) + distance_from_page_boundary;
    
       // Open /dev/mem, seek the calculated offset, and
       // map it into memory so we can manipulate it
       // CONFIG_STRICT_DEVMEM must be disabled for this
       int mem_fd = open_memory();
       seek_memory(mem_fd, offset);
    
       printf("Buffer: %s\n", buffer);
       puts("Changing buffer through /dev/mem...");
    
       // Change the contents of the buffer by writing into /dev/mem
       // Note that since the strings are the same length, there's no purpose in
       // copying the NUL terminator again
       if(write(mem_fd, NEW_BUFFER, strlen(NEW_BUFFER)) == -1) {
          fprintf(stderr, "Write failed: %s\n", strerror(errno));
       }
    
       printf("Buffer: %s\n", buffer);
    
       // Clean up
       free(buffer);
       close(mem_fd);
    
       return 0;
    }
    
    void* create_buffer(void) {
       size_t buf_size = strlen(ORIG_BUFFER) + 1;
    
       // Allocate some memory to manipulate
       void *buffer = malloc(buf_size);
       if(buffer == NULL) {
          fprintf(stderr, "Failed to allocate memory for buffer\n");
          exit(1);
       }
    
       // Lock the page in memory
       // Do this before writing data to the buffer so that any copy-on-write
       // mechanisms will give us our own page locked in memory
       if(mlock(buffer, buf_size) == -1) {
          fprintf(stderr, "Failed to lock page in memory: %s\n", strerror(errno));
          exit(1);
       }
    
       // Add some data to the memory
       strncpy(buffer, ORIG_BUFFER, strlen(ORIG_BUFFER));
    
       return buffer;
    }
    
    unsigned long get_page_frame_number_of_address(void *addr) {
       // Open the pagemap file for the current process
       FILE *pagemap = fopen("/proc/self/pagemap", "rb");
    
       // Seek to the page that the buffer is on
       unsigned long offset = (unsigned long)addr / getpagesize() * PAGEMAP_LENGTH;
       if(fseek(pagemap, (unsigned long)offset, SEEK_SET) != 0) {
          fprintf(stderr, "Failed to seek pagemap to proper location\n");
          exit(1);
       }
    
       // The page frame number is in bits 0-54 so read the first 7 bytes and clear the 55th bit
       unsigned long page_frame_number = 0;
       fread(&page_frame_number, 1, PAGEMAP_LENGTH-1, pagemap);
    
       page_frame_number &= 0x7FFFFFFFFFFFFF;
    
       fclose(pagemap);
    
       return page_frame_number;
    }
    
    int open_memory(void) {
       // Open the memory (must be root for this)
       int fd = open("/dev/mem", O_RDWR);
    
       if(fd == -1) {
          fprintf(stderr, "Error opening /dev/mem: %s\n", strerror(errno));
          exit(1);
       }
    
       return fd;
    }
    
    void seek_memory(int fd, unsigned long offset) {
       unsigned pos = lseek(fd, offset, SEEK_SET);
    
       if(pos == -1) {
          fprintf(stderr, "Failed to seek /dev/mem: %s\n", strerror(errno));
          exit(1);
       }
    }

     

    DPDK是如何操作的?


    
    
    #define _FILE_OFFSET_BITS 64
    #include <errno.h>
    #include <stdarg.h>
    #include <stdbool.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <stdint.h>
    #include <inttypes.h>
    #include <string.h>
    #include <sys/mman.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/queue.h>
    #include <sys/file.h>
    #include <unistd.h>
    #include <limits.h>
    #include <sys/ioctl.h>
    #include <sys/time.h>
    #include <signal.h>
    #include <setjmp.h>
    #ifdef RTE_EAL_NUMA_AWARE_HUGEPAGES
    #include <numa.h>
    #include <numaif.h>
    #endif
    
    
    #define phys_addr_t	uint64_t
    static bool phys_addrs_available = true;
    typedef uint64_t rte_iova_t;
    #define RTE_BAD_IOVA ((rte_iova_t)-1)
    #define RTE_LOG(l, t, fmt...) printf(fmt)
    #define PFN_MASK_SIZE	8
    
    enum rte_iova_mode {
    	RTE_IOVA_DC = 0,	/* Don't care mode */
    	RTE_IOVA_PA = (1 << 0), /* DMA using physical address */
    	RTE_IOVA_VA = (1 << 1)  /* DMA using virtual address */
    };
    
    /*
     * Get physical address of any mapped virtual address in the current process.
     */
    phys_addr_t rte_mem_virt2phy(const void *virtaddr)
    {
    	int fd, retval;
    	uint64_t page, physaddr;
    	unsigned long virt_pfn;
    	int page_size;
    	off_t offset;
    
    	/* Cannot parse /proc/self/pagemap, no need to log errors everywhere */
    	if (!phys_addrs_available)
    		return RTE_BAD_IOVA;
    
    	/* standard page size */
    	page_size = getpagesize();
    
    	fd = open("/proc/self/pagemap", O_RDONLY);
    	if (fd < 0) {
    		RTE_LOG(ERR, EAL, "%s(): cannot open /proc/self/pagemap: %s\n",
    			__func__, strerror(errno));
    		return RTE_BAD_IOVA;
    	}
    
    	virt_pfn = (unsigned long)virtaddr / page_size;
    	offset = sizeof(uint64_t) * virt_pfn;
    	if (lseek(fd, offset, SEEK_SET) == (off_t) -1) {
    		RTE_LOG(ERR, EAL, "%s(): seek error in /proc/self/pagemap: %s\n",
    				__func__, strerror(errno));
    		close(fd);
    		return RTE_BAD_IOVA;
    	}
    
    	retval = read(fd, &page, PFN_MASK_SIZE);
    	close(fd);
    	if (retval < 0) {
    		RTE_LOG(ERR, EAL, "%s(): cannot read /proc/self/pagemap: %s\n",
    				__func__, strerror(errno));
    		return RTE_BAD_IOVA;
    	} else if (retval != PFN_MASK_SIZE) {
    		RTE_LOG(ERR, EAL, "%s(): read %d bytes from /proc/self/pagemap "
    				"but expected %d:\n",
    				__func__, retval, PFN_MASK_SIZE);
    		return RTE_BAD_IOVA;
    	}
    
    	/*
    	 * the pfn (page frame number) are bits 0-54 (see
    	 * pagemap.txt in linux Documentation)
    	 */
    	if ((page & 0x7fffffffffffffULL) == 0)
    		return RTE_BAD_IOVA;
    
    	physaddr = ((page & 0x7fffffffffffffULL) * page_size)
    		+ ((unsigned long)virtaddr % page_size);
    
    	RTE_LOG(ERR, EAL, "phyaddr %p\n", (void*)physaddr);
    
    	return physaddr;
    }
    
    rte_iova_t rte_mem_virt2iova(const void *virtaddr)
    {
    //	if (rte_eal_iova_mode() == RTE_IOVA_VA)
    //		return (uintptr_t)virtaddr;
    	return rte_mem_virt2phy(virtaddr);
    }
    
    int main()
    {
    	int *addr1 = malloc(10);
    
    	printf("addr1 = %p\n", addr1);
    	rte_iova_t rte_iova = rte_mem_virt2iova(addr1);
    
    	printf("addr1 = %p, 0x%x\n", addr1, (void*)rte_iova);
    
    	return 0;
    }
    

     

    推荐文章


    将虚拟地址映射到物理地址

    在用户空间中将虚拟地址转换为物理地址

    用户态进程如何得到虚拟地址对应的物理地址?

    操作系统中的逻辑和物理地址

    物理和逻辑数据独立

    物理和逻辑文件系统

    物理层中的设计问题

    私有和公共IP地址之间的区别

    操作系统中的虚拟内存

    虚拟内存| 问题

    虚拟内存和缓存内存之间的区别

    操作系统中的虚拟机

    虚拟机和容器之间的区别

    虚拟机类型

    创建连接点

    抢占优先级与循环调度算法的关系

    cd cmd命令

    https://www.kernel.org/doc/Documentation/vm/pagemap.txt

    https://www.kernel.org/doc/gorman/html/understand/understand005.html

    https ://www.blackhat.com/presentations/bh-europe-09/Lineberry/BlackHat-Europe-2009-Lineberry-code-injection-via-dev-mem.pdf

     

    展开全文
  • 总结: 如果要虚拟机上网,勾不勾该选项,没什么区别。 如果不勾的话,无线和有线切换,很有可能IP地址发生变化,需要重新查看。

    在这里插入图片描述
    官网文档地址

    续订IP是指网卡从路由器的DHCP服务器获得IP地址的过程。
    网卡通过DHCP对IP都有租定时间,等到了一定的时间,你的电脑会自动续订IP,以方便继续使用。
    不选择复制物理网络连接状态选项

    • 如果采用DHCP的方式来分配IP地址,当电脑网络从有线或无线网络之间进行移动时,DHCP会重新分配ip地址,即虚拟机IP地址会发生变化。

    选择复制物理网络连接状态选项:

    • 复制网络连接状态仅用于笔记本电脑在有线网络与无线网络之间切换时进行IP地址续订,虚拟机IP地址不变

    总结:

    • 如果要虚拟机上网,勾不勾该选项,没什么区别。
    • 如果不勾的话,无线和有线切换,很有可能IP地址发生变化,需要重新查看。
    展开全文
  • 第四步:将逻辑地址的页内偏移量直接复制物理地址的页内偏移量上 ( 即:逻辑地址的页内偏移量 = 物理地址的页内偏移量 ) 第五步:以逻辑地址的页号查页表,查出物理地址的帧号,再把帧号转为二进制,复制物理...
  • vue项目引入第三方js插件,单个js文件引入成功,使用该插件方法时报错(问题已解决)1.引入第三方js文件,npm安装不了 2....{ var cd ...VMware Ubuntu 虚拟机安装 VMwareTools (VMware虚拟机如何与主机互相复制文件...
  • 复制物理网络连接状态是在桥接模式下方有一个选项,选择这个。 解释: VM上的网卡是虚拟的,也就是可以说是假的,而选择了这个选项后,就是把你电脑的真实网卡信息传输过去,虚拟网卡,就好比自己电脑的真实网卡。 ...
  • 如果在笔记本电脑或其他移动设备上使用虚拟机,请选择复制物理网络连接状态。 当您在有线或无线网络之间进行移动时,该设置会导致 IP 地址续订。 解释: 复制网络连接状态选项仅用于笔记本电脑在有线网络与无线...
  • Linux中逻辑地址等于线性...因为Linux所有的段(用户代码段、用户数据段、内核代码段、内核数据段)的线性地址都是从 0x00000000 开始,长度4G,这样 线性地址=逻辑地址+ 0x00000000,也就是说逻辑地址等于线性地址了。
  • PROE在安装的时候都要手动生成LICENSE这个文件,需要把自己电脑的物理地址填写进去,这个小软件就是用来查看电脑的物理地址的,并能自动生成一个.txt文件,打开后直接复制即可。
  • 浅析逻辑地址与物理地址映射关系

    千次阅读 2018-01-23 17:06:03
    基本概念: ...我们都知道任何一个独立运行的程序都需要系统分配单独的内存空间,大多数情况下这个工作是由系统完成,方便程序访问变量,程序不需要关心变量的物理地址。因此现代操作系统都提供了一种内存管
  • 这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,...
  • 本文转自论文点击打开链接,主要讲述了操作系统中人们应该熟悉但是容易混淆的逻辑地址、线性地址和物理地址: 1、逻辑地址:  逻辑地址(Logical Address) :是指由程序产生的与段相关的偏移地址部分。例如,你...
  • 复制物理网卡连接状态,就是说把你指定的、本机的、真是网卡的状态信息复制给虚拟机的虚拟网卡,比如说你的本机真是网卡链接到了家用路由器的LAN口上,获得到了DHCP分配的地址,那么你的虚拟网卡就好像和真是网卡接...
  • 内存地址(逻辑地址、线性地址、物理地址)概念(转) 逻辑地址(Logical Address)  是指由程序产生的与段相关的偏移地址部分。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个...
  • 与虚拟地址空间和虚拟地址相对应的则是物理地址空间和物理地址,大多数时候我们的系统所具备的物理地址空间只是虚拟地址空间的一个子集。这里举一个最简单的例子直观地说明这两者,对于一台内存为256M的32bit x86...
  • 怎么查询mac地址命令_如何查mac地址

    千次阅读 2021-07-26 01:16:43
    在电脑上,mac地址是每台电脑独一无二的,我们一直讲的物理地址就是电脑的mac地址,要是你不知道自己电脑的mac地址,但自己又不会查看,相信也有其他的用户也不会查看,那么下面小编就给你分享用ping命令来查看电脑...
  • 基本的思路:linux下的/proc/self是对自身进程映射的文件夹,里面的pagemap允许查看到每个虚拟页映射到的物理页。#include #include #include intptr_t Mytop(uintptr_t vaddr) { FILE *pagemap; intptr_t ...
  • 物理主机:通常也叫作宿主机,是安装 VMware 软件的主机。 虚拟机:是运行在 VMware 软件上的主机。 虚拟机网卡认识: VMnet0:虚拟机桥接模式的网卡。 VMnet1:虚拟机仅主机模式的网卡。 VMnet8:虚拟机 NAT ...
  • 本贴涉及的硬件平台是X86,如果是其它平台,不保证能...物理地址(physical address) 用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。 ——这个概念应该是这几个概念中最好理解的一个,但是值得一
  • 《Linux内核完全剖析—基于0.12内核》第5章Linux内核体系结构,本章...本节为大家介绍的是虚拟地址、线性地址和物理地址之间的关系。 5.3.6 虚拟地址、线性地址和物理地址之间的关系 前面我们根
  • GetAdaptersAddresses是获取物理网卡的MAC,这里我们通过HOOK,随机的改变它,效果如下图,获取本节MAC可以采用精易模块的MAC_取本机MAC (1) GetAdaptersAddresses .版本 2 .DLL命令 GetAdaptersAddresses, ...
  • 虚拟地址 、物理地址 、线性地址 、逻辑地址
  • ●在一个系统中,进程是和其他进程共享CPU和主存资源。但是共享资源会造成一些不可避免的问题,例如由于存储器不够而 进程无法运行,亦或是存储器被... 当CPU要执行某条指令时,它会生成一个有效物理地址,通过存...
  • 内存管理中的虚拟地址到物理地址翻译  在虚存映射中,建立了文件到虚存区的映射,那么我们知道数据都是要放到物里内存中才能执行的,为了完成从虚拟内存到物理内存的映射,引入了请页机制。同虚拟存储器...
  • 所谓调试,也就是把VirtualBox与主机的通讯功能,如粘贴复制,还有拖拽功能配置好。在万能的百度(虽然很讨厌这个该死的百度,但自从google离开以后,虽然不情愿,还是经常使用,偶用google。  在安装调试...
  • 【MySQL】MySQL复制架构

    万次阅读 2022-02-19 11:20:17
    一主多从复制架构 在实际应用场景中,MySQL复制90%以上都是一个Master复制到一个或者多个Slave的架构模式。 在主库读取请求压力非常大的场景下,可以通过配置一主多从复制架构实现读写分离,把大量的对实时性要求...
  • 虚拟内存和物理内存

    千次阅读 2021-06-16 23:03:41
    处理器运算器和应用程序设计人员看到的只是虚拟内存空间和虚拟地址,而处理器片外的地址总线看到的只是物理地址空间和物理地址。 将虚拟地址转换成物理地址的任务叫 【地址翻译】。 虚拟内存的地址如何转成真实地址...
  • 在8086 的实模式下,把某一段寄存器(段基址)左移4 位,然后与地址ADDR 相加后被直接送到内存总线上,这个相加后的地址(20位)就是内存单元的物理地址,而程序中的这个地址ADDR就叫逻辑地址(或叫虚地址)。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 178,050
精华内容 71,220
关键字:

复制物理地址