Что такое безымянные записи в / proc / pid / smaps?

Очень трудно помочь вам, потому что вы не знаете основных команд... но я попробую, хорошо?

  • С помощью fdisk -l вы выводите список текущих разделов, как в вашем образе.
  • Из вашего образа я вижу, что у вас есть /dev/sda1 как EFI System, /dev/sda10 как Linux filesystem и /dev/sda11 как Linux swap. Сохраните эту информацию.
  • Когда вы загружаетесь с live cd, вы должны сделать chroot для доступа к вашей системе, другими словами, операция, которая изменяет видимый корневой каталог для текущего запущенного процесса и его детей. Давайте:

  • смонтируем вашу систему в /mnt. Помните? Файловую систему Linux? Да. Это /dev/sda10. Итак, выполните команду:

             sudo mount /dev/sda10 /mnt.

    Вы используете sudo, потому что для этого у вас должны быть права администратора.

  • Итак, смонтируйте временные файловые системы, необходимые для работы программ, с помощью команд:

             sudo mount --bind /dev /mnt/dev
             sudo mount --bind /dev/pts /mnt/dev/pts
             sudo mount --bind /proc /mnt/proc
             sudo mount --bind /sys /mnt/sys

  • Вы изменяете загрузку, поэтому вам нужен и раздел /boot. Некоторые системы используют один и тот же раздел для каталога /boot и корня системы (/). Если вы не знаете, какой раздел используется в вашем случае, проверьте, есть ли у вас файлы в папке /mnt/boot/ (там вы найдете образы ядра, конфигурации и т.д.).

    - Если папка /mnt/boot пуста, значит, вам нужно смонтировать раздел /boot. Единственный другой раздел, который можно использовать в вашем случае, это /dev/sda1, так что это будет он. Монтируем в /mnt/boot.

    - Если вы нашли файлы, то другой раздел /dev/sda1 должен быть действительно файловой системой EFI, и его нужно смонтировать в /mnt/boot/EFI.

  • Когда все смонтировано, измените корневой каталог, используя:

             sudo chroot /mnt /bin/bash

  • Теперь, внутри chroot, вы можете установить grub:

    sudo grub-install /dev/sda

2
04.05.2017, 20:02
1 ответ

Безымянные области могут быть созданы с помощью достаточно большого malloc:

#include <sys/types.h>    
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
    int *ip;
    char *before, *after;

    asprintf(&before, "cat /proc/%d/smaps > before", getpid());
    asprintf(&after, "cat /proc/%d/smaps > after", getpid());

    system(before);

    ip = malloc(9999999);
    if (!ip) abort();

    system(after);
    return 0;
}

Как показано

$ CFLAGS=-g make ilikebigmallocs
cc -g    ilikebigmallocs.c   -o ilikebigmallocs
$ ./ilikebigmallocs 
$ diff before after
64a65,80
> 7f97425ac000-7f9742f36000 rw-p 00000000 00:00 0 
> Size:               9768 kB
> Rss:                   4 kB
...

, по крайней мере, некоторые из ваших областей были созданы malloc или аналогичный (который под капотом вызывает mmap). strace (или sysdig) может регистрировать следующее:

$ strace -e trace=memory -o blah ./ilikebigmallocs
$ awk '/^mmap/{print $NF}' blah
0x7fc6193b1000
0x7fc6193a6000
...
$ grep 7fc6193b1000 after
7fc6193b1000-7fc6193b2000 rw-p 00000000 00:00 0 
$ 

Я думаю, вы могли бы использовать gdb или трассировщик malloc или другие средства для разрешения конкретной mmap создайте резервную копию определенного кода в вашем требовательном к памяти процессе...

2
27.01.2020, 22:10

Теги

Похожие вопросы