Как выделение стека работает в Linux?

В зависимости от Вашего Unix они могут быть упакованы Вашей системой.

Например, на debian и его производных. Существует виртуальное wordlist пакет, обеспеченный различными пакетами как wamerican, wfrench... Если Вы смотрите на тот пакет в aptitude, Вы будете видеть опции.

Существуют также различные словари для различной программы проверки правописания как ispell или myspell но они могли бы быть в различных форматах. Если Вы смотрите на все пакеты, которые зависят от dictionaries-common (r вводят aptitude), Вы найдете много.

18
21.07.2014, 02:52
3 ответа

Unetbootin может сделать внешний диск загрузочным с определенными ISO без форматирования диска - он сохраняет все данные и добавляет к нему MBR, а также некоторые распакованные папки и файлы из ISO. Но будьте осторожны, у него есть возможность отформатировать диск , поставив этот флажок перед нажатием next .

Если вы хотите установить Ubuntu обычным способом, чтобы разделить раздел, то вам нужно будет записать ISO на CD/DVD/USB, а затем загрузиться с него (вы должны будете сообщить BIOS об этом). Если у вас ранее был какой-либо дистрибутив Linux, вы можете добавить пункт меню загрузки в GRUB и попросить его запустить определенный образ ISO с определенного диска.

Установить Ubuntu в том же разделе Windows? Потому что с помощью WUBI можно установить Ubuntu в раздел Windows вместе с текущей Windows, просто запустив все материалы из Windows. См. ссылку, которую я поставил на WUBI.

Если у вас уже был Linux, чтобы установить ISO без CD/DVD ot USB, вы можете запустить его как LIVE с вашего жесткого диска. Для этого выполните следующие действия:

  • Поместите файл ISO в /live :

sudo mkdit/live

sudo cp somelinux.iso/live

  • Добавить новый пункт меню в grub.cfg

sudo gedit/ etc/grub.d/40_custom

menuentry 'ISO Ubuntu 14.04 2014 Live' --class os --class gnu-linux --class gnu --class os --group group_main {
                set isofile="/live/ubuntu-14.04-desktop-amd64.iso"

         insmod ext2
         insmod loopback
         insmod iso9660      
                loopback loop (hd0,msdos5)$isofile      

                linux (loop)/casper/vmlinuz.efi  file=(loop)/cdrom/preseed/ubuntu.seed noprompt boot=casper persistent iso-scan/filename=/$isofile quiet splash --
                initrd (loop)/casper/initrd.lz


}

TO DO:

  1. изменение в пункте меню над именем кода для вашего раздела, в котором содержится /live/somelinux.iso , в моем случае это hd0, msdos5 , потому что на /dev/sda5 /

  2. измените имя файла с somelinux.iso на ваше, в моем случае у меня есть: ubuntu-14.04-desktop-amd64.iso

    • обновить GRUB

sudo update-grub

  • перезагрузить
-121--73505-

На основе замечания @ mark-plotnick: новое оборудование имеет другой mac-адрес. Старый MAC-адрес по-прежнему жестко кодируется в /etc/udev/rules.d/70-persistent-net.rules . Можно просто переименовать этот файл. В этом случае перезагрузка повторно создаст файл с новым MAC-адресом.

-121--79535-

Оказалось, что предел памяти стека не выделен (в любом случае, он не может иметь неограниченный стек). https://www.kernel.org/doc/Documentation/vm/overcommit-accounting говорит:

Рост стека языка Си делает неявную карту. Если вы хотите абсолютный гарантирует и запустить близко к краю, вы ДОЛЖНЫ ммапировать свой стек для наибольший размер, который, по вашему мнению, вам понадобится. Для типичного использования стека не имеет большого значения, но это угловой случай, если вы действительно действительно заботитесь

Однако сопоставление стека будет целью компилятора (если у него есть возможность для этого).

ОТРЕДАКТИРОВАТЬ: После некоторых тестов на машине x84_64 Debian я нашел, что стек растет без любого системного вызова (согласно strace). Таким образом, это означает, что ядро растет автоматически (это то, что «неявный» означает выше), т.е. без явного mmap / mapap из процесса.

Было довольно трудно найти подробную информацию, подтверждающую это. Я рекомендую Общие сведения о диспетчере виртуальной памяти Linux Мэла Гормана. Я полагаю, что ответ находится в разделе 4.6.1 Обработка ошибки страницы , за исключением «Область недействительна, но находится рядом с расширяемой областью, такой как стек» и соответствующего действия «Расширить область и выделить страницу». См. также D.5.2 Расширение стека .

Другие ссылки на управление памятью Linux (но почти ничего не о стеке):

EDIT 2: Эта реализация имеет недостаток: в угловых случаях коллизии стека и кучи могут не быть обнаружены, даже в том случае, когда стек будет Причина заключается в том, что запись в переменную в стеке может оказаться в выделенной кучной памяти, и в этом случае отсутствует сбой страницы, и ядро не может знать, что стек нуждается в расширении. Смотрите мой пример в разделе Бесшумное столкновение стека и кучи в GNU/Linux Я начал в списке gcc-help. Во избежание этого компилятору необходимо добавить некоторый код при вызове функции; Это можно сделать с помощью -fstack-check для GCC (для получения подробной информации см. ответ Яна Лэнса Тейлора и справочную страницу GCC).

14
27.01.2020, 19:46

По умолчанию максимальный размер стека настроен на 8 МБ для каждого процесса,
. но его можно изменить, используя ulimit:

Показывая значение по умолчанию в kB:

$ ulimit -s
8192

Установка на неограниченное:

ulimit -s неограниченное

влияние на текущую оболочку и подоболочки и их дочерние процессы.
(ulimit - команда сборки оболочки)

Вы можете показать реальный диапазон адресов стека, который используется с:
cat /proc/$PID/maps | grep -F '[stack]'
on Linux.

2
27.01.2020, 19:46

Ядро Linux 4.2

Минимальная программа тестирования

Затем мы можем протестировать ее с помощью минимальной 64-разрядной программы NASM:

global _start
_start:
    sub rsp, 0x7FF000
    mov [rsp], rax
    mov rax, 60
    mov rdi, 0
    syscall

Убедитесь, что вы отключили ASLR и удалили переменные среды, поскольку они попадут в стек и будут использоваться space:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
env -i ./main.out

Предел где-то немного ниже моего ulimit -s (8 МБ для меня).Похоже, это связано с тем, что дополнительные данные, указанные в System V, изначально помещаются в стек в дополнение к среде: Параметры командной строки Linux 64 в Assembly | Переполнение стека

Если вы серьезно относитесь к этому, TODO создаст минимальный образ initrd , который начинает запись сверху и спускается вниз, а затем запускает его с QEMU + GDB . Поместите dprintf в цикл, печатающий адрес стека, и точку останова на acct_stack_growth . Это будет великолепно.

По теме:

6
27.01.2020, 19:46

Теги

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