#include <stdio.h>
#include <unistd.h>
#include <stdint.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
unsigned long virt_to_phys(void *virt_addr) {
int fd = open("/proc/self/pagemap", O_RDONLY);
if (fd < 0) {
return 0;
}
unsigned long virt_pfn;
unsigned long offset = ((unsigned long)virt_addr / getpagesize()) * sizeof(unsigned long);
if (lseek(fd, offset, SEEK_SET) == (off_t)-1) {
close(fd);
return 0;
}
if (read(fd, &virt_pfn, sizeof(virt_pfn)) != sizeof(virt_pfn)) {
close(fd);
return 0;
}
close(fd);
if (!(virt_pfn & (1ULL << 63))) {
return 0; // page not present
}
unsigned long phys_pfn = virt_pfn & ((1ULL << 55) - 1);
return (phys_pfn * getpagesize()) + ((unsigned long)virt_addr % getpagesize());
}
int main() {
int a = 5;
if (fork() == 0) {
a = a + 5;
printf("Child: value=%d, virt=%p, phys=%lx\n", a
, &a
, virt_to_phys
(&a
)); } else {
a = a - 5;
printf("Parent: value=%d, virt=%p, phys=%lx\n", a
, &a
, virt_to_phys
(&a
)); }
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KCnVuc2lnbmVkIGxvbmcgdmlydF90b19waHlzKHZvaWQgKnZpcnRfYWRkcikgewogICAgaW50IGZkID0gb3BlbigiL3Byb2Mvc2VsZi9wYWdlbWFwIiwgT19SRE9OTFkpOwogICAgaWYgKGZkIDwgMCkgewogICAgICAgIHBlcnJvcigib3BlbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIHVuc2lnbmVkIGxvbmcgdmlydF9wZm47CiAgICB1bnNpZ25lZCBsb25nIG9mZnNldCA9ICgodW5zaWduZWQgbG9uZyl2aXJ0X2FkZHIgLyBnZXRwYWdlc2l6ZSgpKSAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKICAgIGlmIChsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgPT0gKG9mZl90KS0xKSB7CiAgICAgICAgcGVycm9yKCJsc2VlayIpOwogICAgICAgIGNsb3NlKGZkKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAocmVhZChmZCwgJnZpcnRfcGZuLCBzaXplb2YodmlydF9wZm4pKSAhPSBzaXplb2YodmlydF9wZm4pKSB7CiAgICAgICAgcGVycm9yKCJyZWFkIik7CiAgICAgICAgY2xvc2UoZmQpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGNsb3NlKGZkKTsKCiAgICBpZiAoISh2aXJ0X3BmbiAmICgxVUxMIDw8IDYzKSkpIHsKICAgICAgICByZXR1cm4gMDsgLy8gcGFnZSBub3QgcHJlc2VudAogICAgfQoKICAgIHVuc2lnbmVkIGxvbmcgcGh5c19wZm4gPSB2aXJ0X3BmbiAmICgoMVVMTCA8PCA1NSkgLSAxKTsKICAgIHJldHVybiAocGh5c19wZm4gKiBnZXRwYWdlc2l6ZSgpKSArICgodW5zaWduZWQgbG9uZyl2aXJ0X2FkZHIgJSBnZXRwYWdlc2l6ZSgpKTsKfQoKaW50IG1haW4oKSB7CiAgICBpbnQgYSA9IDU7CiAgICBpZiAoZm9yaygpID09IDApIHsKICAgICAgICBhID0gYSArIDU7CiAgICAgICAgcHJpbnRmKCJDaGlsZDogdmFsdWU9JWQsIHZpcnQ9JXAsIHBoeXM9JWx4XG4iLCBhLCAmYSwgdmlydF90b19waHlzKCZhKSk7CiAgICB9IGVsc2UgewogICAgICAgIGEgPSBhIC0gNTsKICAgICAgICBwcmludGYoIlBhcmVudDogdmFsdWU9JWQsIHZpcnQ9JXAsIHBoeXM9JWx4XG4iLCBhLCAmYSwgdmlydF90b19waHlzKCZhKSk7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==