Endereço físico de uma variável em processos

0

Quando criamos um processo filho usando a chamada de sistema fork() , o espaço de endereçamento do processo pai é copiado para o processo filho. O código abaixo demonstra isso claramente.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>


int main(void){

    int *mem = (int*)malloc( sizeof(int) * 1 );
    pid_t pid = fork();

    if( pid == 0 ){ // child process
        printf("Child address = %ld\n", mem);
    }
    else{ // parent process
        printf("Parent address = %ld\n", mem);
    }

    return 0;
}

No entanto, esse é o espaço de endereço virtual. Em outras palavras, os endereços impressos por este código são endereços virtuais.

O que eu estou querendo saber é se há uma chance de podermos obter endereços físicos em virtude de endereços virtuais?

Suponho que exista um registro base que armazene o endereço físico inicial do processo em execução. Se eu somar esse endereço virtual com o valor do registro base, posso encontrar o endereço físico dessa variável. Isso é verdade?

    
por Goktug 21.05.2018 / 21:55

2 respostas

1

Sim, tudo o que o processo em si vê diretamente são apenas endereços virtuais.

Em seu sistema de paginação usual, não há "registro base", já que o mapeamento de endereço virtual para físico acontece por páginas, que não precisam estar em ordem. (por exemplo, você pode ter a página virtual 1 na página física 4563, mas a página virtual 2 na página física 2413.) a imagem na página da Wikipedia nas tabelas de páginas .

Eu não acho que um processo possa acessar diretamente suas tabelas de páginas, mas parece que o Linux as exporta através de /proc/<pid>/pagemap . A documentação do kernel para isso está em Documentation/vm/pagemap.txt . Há também outra pergunta sobre a leitura do mapa de página: Visualização de pagetable para um processo .

    
por 21.05.2018 / 22:37
1

Não há garantia de que um determinado endereço virtual seja mapeado para um endereço físico exclusivo. Não há garantia de que um determinado endereço virtual mapeie para qualquer endereço físico. Não há garantia de que qualquer mapeamento entre um endereço virtual e algum endereço físico permaneça consistente por qualquer período de tempo interessante.

Então, sua pergunta realmente não reflete o modo como a memória virtual funciona. Você trabalha em termos de endereços virtuais. O kernel pode mexer com coisas como o MMU, no entanto, e sempre que ele gosta de mudar os pontos onde, então mesmo se você soubesse algum endereço físico, você nunca poderia usá-lo para nada. Mesmo que você tenha informações suficientes do kernel visível controlando seu processo para inferir onde algo pode estar, você não pode ter certeza de que não está em alguma VM, e há toda uma outra camada de indireção além do que você veja - de modo que o que você acha que é um endereço físico é na verdade apenas o endereço virtual dentro de algum software host da VM.

Seus endereços virtuais são agrupados em páginas. O MMU é programado com algumas tabelas de páginas, portanto, ele possui algum mapeamento. Se houver um registro simples com o deslocamento dentro da MMU, você não terá como obtê-lo da MMU, porque não é um registrador de CPU que faz parte do ISA. (E em máquinas mais antigas, a MMU era um chip físico completamente separado da CPU.) A única coisa que você pode fazer é ler um monte de documentação da MMU para sua arquitetura e ter acesso à configuração pagetable do kernel e passar por essas coisas. "Emular" o comportamento da MMU em determinados inputs. A própria CPU não está nem (visivelmente / diretamente) ciente da indireção.

Então, o que você realmente quer fazer?

    
por 22.05.2018 / 02:28