Странный вопрос о fork() и физическом адресе в LinuxLinux

Ответить
Anonymous
 Странный вопрос о fork() и физическом адресе в Linux

Сообщение Anonymous »


Профессор, преподающий Linux, задал своим студентам этот странный вопрос...

Странно то, что эта программа выдает выходные данные, в которых родительский процесс и дочерний процесс получат один и тот же физический адрес при запуске в обычном пользовательском режиме, но когда я запускаю это в режиме корневого пользователя, выходные данные показывает, что родительский и дочерний элементы имеют разные физические адреса, как показано ниже.

В обычном пользовательском режиме:

pid:5269, ppid:3152 идентификатор: 5270, идентификатор ПП: 5269 Дочерний процесс: � виртуальный адрес str=0x7ffd7023bfd0 и &count=0x7ffd7023bfcc, физический адрес str=0xfd0,&count=0xfcc Отец-процесс: � количество: 1 (0x7ffd7023bfcc), идентификатор: 5269 виртуальный адрес str=0x7ffd7023bfd0 и count=0x7ffd7023bfcc, физический адрес str=0xfd0,&count=0xfcc количество: 2 (0x7ffd7023bfcc), идентификатор: 5270 В режиме root-пользователя:

pid:5294, ppid:3414 идентификатор: 5295, идентификатор ПП: 5294 Дочерний процесс: � виртуальный адрес str=0x7ffe501a1530 и &count=0x7ffe501a152c, физический адрес str=0x1298db530,&count=0x1298db52c Отец-процесс: � количество: 1 (0x7ffe501a152c), идентификатор: 5294 виртуальный адрес str=0x7ffe501a1530 и count=0x7ffe501a152c, физический адрес str=0x12282b530,&count=0x12282b52c количество: 2 (0x7ffe501a152c), идентификатор: 5295 Я просто не могу разобраться, может кто-нибудь помочь?

// имя файла proc-1.c #include #include #include #include #include #include #include //#include //#include intptr_t mem_addr(длинный vaddr без знака, длинный *paddr без знака) { int pagesize = getpagesize(); беззнаковый длинный v_pageindex = vaddr / размер страницы; unsigned long v_offset = v_pageindex * sizeof(uint64_t); беззнаковый длинный page_offset = vaddr % размера страницы; uint64_t элемент = 0; int fd = open("/proc/self/pagemap", O_RDONLY); lseek(fd, v_offset, SEEK_SET); read(fd, &item, sizeof(uint64_t)); if((((uint64_t)1
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»