Получение начального адреса страницы

Autossh перезапускает соединения SSH по мере необходимости, если пользователь не прерывает соединение:

If the ssh process exited normally (for example, someone typed "exit" in an interactive session), autossh exits rather than restarting;

(из АвтосшREADME.txt).

Autossh улучшает поведение SSH в случае сбоя SSH или разрыва соединения по какой-либо причине, но он не будет поддерживать соединение для вас, если вы закроете соединение самостоятельно.

0
05.05.2020, 16:48
2 ответа

Добро пожаловать в StackExchange для Unix и Linux!

Этот вопрос лучше ответить на Stack Overflow , сайте StackExchange, посвященном вопросам программирования. Но все же...

В архитектуре x86 стандартная страница памяти имеет размер 4 КиБ или 0x1000 байт. Страницы памяти начинаются с адреса 0 и размещаются непрерывно без перекрытия.

Чтобы найти начальный адрес страницы памяти:

beginning of page = memory address AND (NOT page size - 1)

Таким образом, если у вас есть адрес 0x400a80, начало этой страницы = 0x400a80 И (НЕ 0x000fff )= 0x400a80 И 0xfff000 = 0x400000.

0
28.04.2021, 23:16

Если вы ищете начало страницы, содержащей ячейку памяти, вы можете использоватьsysconf(_SC_PAGE_SIZE)для получения размера системной страницы и округлить до этого:

  void *alloc;
  long pagesz;

  pagesz = sysconf(_SC_PAGESIZE);
  printf("Default page size: %ld\n", pagesz);

  alloc = malloc(512 * 1024 * 1024);
  printf("512MiB allocated at %zx\n", alloc);
  printf("The corresponding page starts at %zx\n", (((off_t) alloc) / pagesz) * pagesz);

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

Если вы ищете начало выделения адресного пространства, содержащее ячейку памяти, я не знаю переносимого способа сделать это. В Linux интерфейс для получения информации о сопоставлении — это /proc/self/maps, поэтому вам нужно будет открыть и проанализировать его.

0
28.04.2021, 23:16

Теги

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