кто запускает main () в Linux?

Есть шанс, что если вы просто декодируете кодировки %XX URI, вы получите символы в кодировке UTF-8. В zsh:

autoload zmv
LC_ALL=C zmv '(**/)(*%*)' '$1${2//(#b)%(??)/${(#):-0x$match}}'

Если, как отметил Gilles, этот символ подстановки � предназначен для байта 0xc3 (который в iso8859-1 является буквой, что объясняет, почему он не был URI-кодирован, в отличие от 0x9c, который в iso8859-1 недопустим), то приведенная выше команда изменит имя вашего файла на Übersicht. html

0
19.03.2019, 02:31
3 ответа

Название main()было выбрано просто для знакомства и эстетических соображений; его не вызывала среда выполнения C, как в случае с main()из пользовательской программы. Есть даже комментарий, который говорит об этом вinit/main.c:

void main(void)         /* This really IS void, no error here. */

Функция main()вызывается изboot/head.s:

after_page_tables:
        pushl $0                # These are the parameters to main :-)
        pushl $0
        pushl $0
        pushl $L6               # return address for main, if it decides to.
        pushl $_main
        jmp setup_paging
L6:
        jmp L6                  # main should never return here, but
                                # just in case, we know what happens

Обратите внимание, что адрес mainпомещается в стек, а setup_pagingвызывается с jmp, а не с call, что означает, что retв конце будет продолжаться с начала main().

2
28.01.2020, 02:22

Ядро Linux, особенно в дни 0.11, загружалось напрямую аппаратным BIOS.

Обычно BIOS просматривает загрузочный сектор (дискеты )или главную загрузочную запись жесткого диска и загружает этот сектор. На жестком диске MBR затем загружает загрузочный сектор «основного раздела».

В этом загруженном загрузочном секторе достаточно информации, чтобы знать, как загрузить ядро ​​в память, а затем запустить его.

Со старыми старыми дисками версии 0.11 это было эффективное решение для загрузки с дискеты, с ядром на одном диске и корнем на другом диске, так что система загрузки была очень простой.

Когда Linux работал с жесткими дисками, процесс загрузки был очень простым. Это было настолько просто, что стало возможным создавать такие инструменты, как «loadlin», которая была простой программой для DOS, которая загружала ядро ​​​​Linux и загружалась в него, эмулируя загрузчик BIOS. Таким образом можно создать меню config.sys DOS для загрузки DOS или Linux; ранняя форма двойной загрузки.

Но в основе своей ядро ​​Linux загружается с «голого железа» и берет на себя управление машиной.

1
28.01.2020, 02:22

Функция main— это особенность языка C. Как именно он преобразуется в компьютерную инструкцию для ЦП, чтобы «начать здесь», в основном является деталью реализации компилятора. На «голом железе» часто можно просто положиться на то, что аппаратное обеспечение начнет выполнение с определенного адреса памяти при первой загрузке. Ранние версии Linux зависели от a. простой загрузчик x86; сегодня эту роль обычно выполняет Grub. Это поведение, в свою очередь, зависит от соглашений прошивки BIOS. Но на самом деле на каждом уровне у вас есть часть компьютерной архитектуры с соглашением о том, как запускать программу.

0
28.01.2020, 02:22

Теги

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