сями из того что дала ОС в ответ на mmap?
А если оси нету на эмбеддед?
хороший вопрос! первая мысль: а разве есть компилятор под "отсутствие оси"? : ) Т.е. разве можно запустить там, где нет оси, прогу на си?
А как запускается сама операционная система интересно?
Интересно, конечно. С удовольствием бы узнал, что имеетсе ввиду
А почему может быть нельзя?
Оси многие написаны на Си + асме
Программу нужно скомпилировать. А компилятор обычно под ОС. Если нет ОС, то каким компилятором компилировать?
это меня ставит в тупик но могу пофантазировать, если угодно
Что это за "компилятор под ОС"? Компилятор машинный код генерит, ему пох на ОС
Компилятор к ОС не имеет отношения, за исключением средств взаимодействия с ней (вызовы и специфичный рантайм)
Вопрос о запуске программы или компиляции?
"Специфичный рантайм", конечно, широкое понятие...
я думаю, о запуске программы ведь на этапе запуска формируются стэк и хип
Главное чтобы рантайм был
Да, в ембеддеде примеров куча. Для компиляции у себя на компе используется кросс-компилятор, чтобы сгенерировать бинарник под определенную архитектуру, на которой борда
Никакого стека не существует. Никакого хипа не существует. Это всё — туман, мираж...
Это не совсем так. Но многие компиляторы умеют делать бинарные файлы для ручной загрузки.
Ну это только с точки зрения стандарта.
Существуют! Я сам видел!
Не верь глазам своим...
а исходникам можно? https://github.com/gcc-mirror/gcc/blob/16e2427f50c208dfe07d07f18009969502c25dc8/libgcc/config/i386/morestack.S
стека нет, но stack unwinding есть. другого стандарта C++ у меня для вас нет
Что ж за зверь тогда в std::stacktrace едет?
надо посмотреть, кстати
A stacktrace is an approximate representation of an invocation sequence and consists of stacktrace entries. A stacktrace entry represents an evaluation in a stacktrace. вот такой зверь. про стек тоже ничего, потому что незачем
Там определен stack_frame. Можно юлить как некоторые президенты и никогда не называть объект его реальным именем, но этого достаточно чтоб на нужном уровне абстракции определить стек :)
stack frame на практике это все-таки намного больше, чем то, что приведено в цитате выше, мне кажется. ничего, что определяло бы параметры или свойства стека, я в стандартне не видел. и по-прежнему не вижу, для чего это может быть нужно, кроме как добавить головной боли реализациям
это КОМПИЛЯТОР языка С, к тому же написанный на ассемблере. ТАМ может быть всё, что угодно...
Стек (структура данных, которая есть) фреймов вызовов функций.
Теперь, когда ты понял ИСТИНУ, что ни стека, ни хипа не существует, можно узнать ПРАВДУ. MMAP - непереносимая системно-зависимая функция. Стек и хип формируются так, как это реализовано в данной ОС и на данном компиляторе. Это детали реализации компилятора которые не должны влиять на код и работу программы.
А теперь можно вернуться к вопросу изначальному, если позволите. Вроде бы мы уже обсудили. Но хотелось бы подтвердить одну вещь. Верно ли я понимаю, что стэк формируется сями из того что дала ОС в ответ на вызов mmap (в случае других ОС или отсутствия ОС не на вызов mmap, а в ответ на что-то другое)?
Ага, тут я со всем согласен
я думаю вы созрели для книги: https://dmkpress.com/catalog/computer/programming/978-5-97060-517-2/
Половина книги push, половина pop?
нет, стек система сама создаёт
:) ну... там вроде человеческим языком про кадр стека. я думаю топикстартеру прям самое то. Вам читать не нужно!
на каком этапе? в ответ на какой сискол?
в ответ на создание потока
Перед запуском кода бинаря надо заполнить регистр IR и SP.
Если у вас вопрос про зарождение стека в системе. на русском есть перевод Ядро кортекс М3 Джозев юв. там прям по полочкам. как система стартует, как и что и зачем нужен стек, как с ним работать, и все такое...
cи, как уже долго объясняли, этими вопросами не занимается. Этим занимается либо ядро ОС (если она есть), либо сам скомпилированный файл знает по каким адресам что хранить. Вызов nmap здесь ни при чём, это более высокоуровневый API. Детали зависят от ОС. Для linux — это заполнение структуры task_struct: https://github.com/torvalds/linux/blob/1e2a199f6ccdc15cf111d68d212e2fd4ce65682e/include/linux/sched.h#L666
точно)
о! круто т.е. в linux каждый таск имеет указатель на стэк а дальше мы подхватываем это и пользуемся им через архитектурно зависимые инструкции поп, пуш и регистры?
перемещается в регистр rsp (ну или r13 если вы армовик) и двигается поинтер в этом регистре
так call stack это абстрактное понятие, оно всегда есть. Нет описания стэка и динамической аллокации
правда, call stack как абстрактное понятие имеет мало отношения и к стеку как реализации automatic storage duration, и к stack unwinding, о которых шла речь а вот к std::stacktrace имеет самое непосредственное
Обсуждают сегодня