Странный вопрос о fork() и физическом адресе в Linux ⇐ Linux
-
Anonymous
Странный вопрос о fork() и физическом адресе в Linux
Профессор, преподающий 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
Профессор, преподающий 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
Мобильная версия