Не существует стека ядра . Для каждого потока существует область памяти, которая используется как пространство стека, когда процесс выполняет системный вызов. Существуют также отдельные «стеки прерываний», по одному на ЦП, которые используются обработчиком прерываний. Эти области памяти находятся в адресном пространстве ядра (выше 0xc0000000
на вашем рисунке.
Кадры стека (Кадры времени выполнения C, кадры для основного и т. д. )являются частью стека. Аргументы процесса(argv
)и окружение являются отдельными областями и не являются частью стека.
Область между 0x0
и0x08048000
(около 128 МБ )ни для чего не используется. Первоначально i386 System V ABI зарезервировал эту область для стека, но Linux делает все по-другому. Если оставить область неиспользуемой, не будет потрачено ОЗУ, только адресное пространство, потому что область не отображается. Обратите внимание, что эта информация к настоящему времени почти полностью устарела, так как она описывает, как все делается в 32 -битной архитектуре x86. Сегодня трудно найти 32 --битные машины x86, и дистрибутивы постепенно отказываются от их поддержки.
Во фрагменте, который вы разместили в своем вопросе, говорится:
~$ which go
/usr/local/go/bin/go
which
указывает, что бинарный файл go находится в каталоге /usr/local/go/bin. (также см. Почему бы не использовать «который»? Что использовать тогда?)но Bash пытается запустить из него каталог /usr/local/bin:
~$ go version
-bash: /usr/local/bin/go: No such file or directory
Вероятно, это место, где go
двоичный файл находился до того, как вы переместили или удалил его. В подобных ситуациях запуск hash -r
может исправить ошибку. проблема, изhelp hash
:
-r forget all remembered locations