Сообщение Re[8]: Самый низкоуровневый язык, ага от 07.10.2023 14:02
Изменено 07.10.2023 14:04 vsb
Re[8]: Самый низкоуровневый язык, ага
Здравствуйте, vdimas, Вы писали:
V>>>Если пользуешь Си, то для оперирования объявленными статическими данными (структурами, массивами) необходим CRT.
M>>Что именно из CRT нужно для этого?
V>Двухфазная инициализация глобальных данных.
V>Причём, при внешнем загрузчике CRT обыгрывает только вторую фазу (динамической инициализации), а в гарварде CRT обыгрывает обе фазы.
V>Упреждая пинг-понг вопросов-ответов:
V>
V>Здесь в бинарном образе в сегменте данных по адресу a будет число 42, по адресу b будет 0.
V>Внешний загрузчик грузит образ в память, переменная a уже инициализирована (это первая фаза), а переменная b будет инициализирована из глобального связанного списка инициализации, где каждый узел примерно такого вида:
V>
V>CRT пробегается по этому списку, вызывая код динамической инициализации — это вторая фаза стандартной инициализации С/С++.
V>Для инициализации модуля, содержащего динамическую инициализацию (здесь глобальной переменной b), будет порождена безымянная ф-ия примерно такого вида:
V>
V>Указатель на эту ф-ию будет в одном из узлов __init_module в глобальном списке динамической инициализации.
V>Для микриков обычно нет связанного списка, динамическая инициализация представляет собой развернутый (типа заинлайненный) код, но это всё-равно лишний код, который почти всегда не нужен, т.к. любые начальные данные или не нужны, или являются константами, тогда им не место в ОЗУ.
Честно говоря я ничего не понял. Можно пример минимальной компилируемой программы? Глобальные переменные нельзя инициализировать чем-либо кроме констант. Константы идут в .data и всё, без всяких init.
V>>>Если пользуешь Си, то для оперирования объявленными статическими данными (структурами, массивами) необходим CRT.
M>>Что именно из CRT нужно для этого?
V>Двухфазная инициализация глобальных данных.
V>Причём, при внешнем загрузчике CRT обыгрывает только вторую фазу (динамической инициализации), а в гарварде CRT обыгрывает обе фазы.
V>Упреждая пинг-понг вопросов-ответов:
V>
V>int a = 42;
V>int b = calcB();
V>
V>Здесь в бинарном образе в сегменте данных по адресу a будет число 42, по адресу b будет 0.
V>Внешний загрузчик грузит образ в память, переменная a уже инициализирована (это первая фаза), а переменная b будет инициализирована из глобального связанного списка инициализации, где каждый узел примерно такого вида:
V>
V>struct __init_module {
V> void (*fn)(void);
V> __init_module * next;
V>};
V>
V>CRT пробегается по этому списку, вызывая код динамической инициализации — это вторая фаза стандартной инициализации С/С++.
V>Для инициализации модуля, содержащего динамическую инициализацию (здесь глобальной переменной b), будет порождена безымянная ф-ия примерно такого вида:
V>
V>void __some_init_xxx() {
V> b = calcB();
V>}
V>
V>Указатель на эту ф-ию будет в одном из узлов __init_module в глобальном списке динамической инициализации.
V>Для микриков обычно нет связанного списка, динамическая инициализация представляет собой развернутый (типа заинлайненный) код, но это всё-равно лишний код, который почти всегда не нужен, т.к. любые начальные данные или не нужны, или являются константами, тогда им не место в ОЗУ.
Честно говоря я ничего не понял. Можно пример минимальной компилируемой программы? Глобальные переменные нельзя инициализировать чем-либо кроме констант. Константы идут в .data и всё, без всяких init.
Re[8]: Самый низкоуровневый язык, ага
Здравствуйте, vdimas, Вы писали:
V>>>Если пользуешь Си, то для оперирования объявленными статическими данными (структурами, массивами) необходим CRT.
M>>Что именно из CRT нужно для этого?
V>Двухфазная инициализация глобальных данных.
V>Причём, при внешнем загрузчике CRT обыгрывает только вторую фазу (динамической инициализации), а в гарварде CRT обыгрывает обе фазы.
V>Упреждая пинг-понг вопросов-ответов:
V>
V>Здесь в бинарном образе в сегменте данных по адресу a будет число 42, по адресу b будет 0.
V>Внешний загрузчик грузит образ в память, переменная a уже инициализирована (это первая фаза), а переменная b будет инициализирована из глобального связанного списка инициализации, где каждый узел примерно такого вида:
V>
V>CRT пробегается по этому списку, вызывая код динамической инициализации — это вторая фаза стандартной инициализации С/С++.
V>Для инициализации модуля, содержащего динамическую инициализацию (здесь глобальной переменной b), будет порождена безымянная ф-ия примерно такого вида:
V>
V>Указатель на эту ф-ию будет в одном из узлов __init_module в глобальном списке динамической инициализации.
V>Для микриков обычно нет связанного списка, динамическая инициализация представляет собой развернутый (типа заинлайненный) код, но это всё-равно лишний код, который почти всегда не нужен, т.к. любые начальные данные или не нужны, или являются константами, тогда им не место в ОЗУ.
Честно говоря я ничего не понял. Можно пример минимальной компилируемой программы? Глобальные переменные нельзя инициализировать чем-либо кроме констант. Константы идут в .data и всё, без всяких init.
[ccode]
int calcB();
int a = 42;
int b = calcB();
[/code]
Этот код не компилируется: error: initializer element is not constant
V>>>Если пользуешь Си, то для оперирования объявленными статическими данными (структурами, массивами) необходим CRT.
M>>Что именно из CRT нужно для этого?
V>Двухфазная инициализация глобальных данных.
V>Причём, при внешнем загрузчике CRT обыгрывает только вторую фазу (динамической инициализации), а в гарварде CRT обыгрывает обе фазы.
V>Упреждая пинг-понг вопросов-ответов:
V>
V>int a = 42;
V>int b = calcB();
V>
V>Здесь в бинарном образе в сегменте данных по адресу a будет число 42, по адресу b будет 0.
V>Внешний загрузчик грузит образ в память, переменная a уже инициализирована (это первая фаза), а переменная b будет инициализирована из глобального связанного списка инициализации, где каждый узел примерно такого вида:
V>
V>struct __init_module {
V> void (*fn)(void);
V> __init_module * next;
V>};
V>
V>CRT пробегается по этому списку, вызывая код динамической инициализации — это вторая фаза стандартной инициализации С/С++.
V>Для инициализации модуля, содержащего динамическую инициализацию (здесь глобальной переменной b), будет порождена безымянная ф-ия примерно такого вида:
V>
V>void __some_init_xxx() {
V> b = calcB();
V>}
V>
V>Указатель на эту ф-ию будет в одном из узлов __init_module в глобальном списке динамической инициализации.
V>Для микриков обычно нет связанного списка, динамическая инициализация представляет собой развернутый (типа заинлайненный) код, но это всё-равно лишний код, который почти всегда не нужен, т.к. любые начальные данные или не нужны, или являются константами, тогда им не место в ОЗУ.
Честно говоря я ничего не понял. Можно пример минимальной компилируемой программы? Глобальные переменные нельзя инициализировать чем-либо кроме констант. Константы идут в .data и всё, без всяких init.
[ccode]
int calcB();
int a = 42;
int b = calcB();
[/code]
Этот код не компилируется: error: initializer element is not constant