Где “стопка ядра”, “Кадры для запуска во время выполнения C функционирует”, и “Кадр для основного ()” в расположении памяти программы?

Терминалы передают символы, а не ключи. Большинство символов можно распечатать, что не оставляет много места для кодирования функциональных клавиш и сочетаний клавиш. Функциональные клавиши кодируются как escape-последовательности, то есть последовательности байтов, начинающиеся с escape-символа (значение байта 27, которое во многих языках программирования может быть записано как \ e ). Для получения дополнительной информации см. Как работают ввод с клавиатуры и вывод текста?

Не существует универсального стандарта в отношении того, какую escape-последовательность отправляет каждая клавиша или сочетание клавиш. Библиотека curses предоставляет уровень абстракции, который декодирует функциональные клавиши. Он использует внутреннюю библиотеку termcap (старый стиль) или terminfo (современный); вы можете использовать termcap / terminfo напрямую, если не хотите связываться с curses.

Кроме того, вы можете жестко запрограммировать обычные управляющие последовательности для Вверх и Вниз . Хотя стандарта нет, почти каждый терминал отправляет либо \ eOA , либо \ e [A для Up и либо \ eOB , либо \ e [B для Down , и я никогда не видел терминала, который отправлял бы эти последовательности для другого ключа.

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

Терминалы не отправляют события нажатия клавиш. (Однако ваш вариант использования не требует их, согласно вашему описанию.)

Если вы не можете позволить себе требовать определенный эмулятор терминала (например, недавний xterm), не полагайтесь на то, что пользователь может ввести Shift + вверх . Поддержите альтернативный метод, например, клавишу «начать множественный выбор», за которой следует простой Вверх / Вниз .

1
02.09.2018, 18:32
1 ответ
  1. Не существует стека ядра . Для каждого потока существует область памяти, которая используется как пространство стека, когда процесс выполняет системный вызов. Существуют также отдельные «стеки прерываний», по одному на ЦП, которые используются обработчиком прерываний. Эти области памяти находятся в адресном пространстве ядра (выше 0xc0000000на вашем рисунке.

  2. Кадры стека (Кадры времени выполнения C, кадры для основного и т. д. )являются частью стека. Аргументы процесса(argv)и окружение являются отдельными областями и не являются частью стека.

  3. Область между 0x0и0x08048000(около 128 МБ )ни для чего не используется. Первоначально i386 System V ABI зарезервировал эту область для стека, но Linux делает все по-другому. Если оставить область неиспользуемой, не будет потрачено ОЗУ, только адресное пространство, потому что область не отображается. Обратите внимание, что эта информация к настоящему времени почти полностью устарела, так как она описывает, как все делается в 32 -битной архитектуре x86. Сегодня трудно найти 32 --битные машины x86, и дистрибутивы постепенно отказываются от их поддержки.

5
27.01.2020, 23:18

Теги

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