Не зависит ли наличие компоновщика и загрузчика от операционных систем, таких как Linux?

Опираясь на решение одного из многих подобных вопросов:

#!/bin/sh

IFS=+
printf '%s = %s\n' "$*" "$(($*))"
  • "$*"расширит до позиционных параметров (аргументы командной строки ), разделенные $IFS. Мы устанавливаем IFSна +отдельно.

  • "$(($*))"использует $((... )), которая является арифметической подстановкой, для вычисления арифметического значения $*, аргументов командной строки с +в -между ними.

  • printfиспользуется для вывода двух строк с =между ними.

Тестирование:

$./script.sh 1 2 3
1+2+3 = 6
$./script.sh -1 2 3
-1+2+3 = 4
$./script.sh 1 2 3 4 2 2 3 1
1+2+3+4+2+2+3+1 = 18

В приведенном выше сценарии отсутствует проверка предоставленных аргументов командной строки, чтобы убедиться, что они являются целыми числами. Это делается для одного значения в вопросе «Проверка того, является ли введенное число целым числом ».

-6
25.09.2020, 17:11
1 ответ

Does the existence of linker (for performing linking following compilation) and loader (for executing an executable file) not depend on operating systems such as Linux? (I had though of linker and loader in Linux as either provided by the OS or software just like other application programs. Now I think they are very special and different.)

Компоновщик и загрузчик имеют определенные цели, как и любое другое приложение. Они важны для сборки статических программ и сборки и загрузки динамических программ, но они являются «обычными» приложениями (или библиотеками, в случае запуска -загрузчик времени )— т.е. в то время как они сложны, они, возможно, не полагаются на специальную поддержку со стороны операционной системы.

Таким образом, можно связать программы для одной операционной системы с другой (, например. создавать программы Windows в Linux или наоборот )и загружать динамически -связанные программы, созданные для одной системы, в другую (см. Wine ). Основные требования, предъявляемые к операционной системе, заключаются в том, чтобы она обеспечивала некоторый способ загрузки нового исполняемого содержимого (, т.е. позволяла работающей программе добавлять к себе исполняемую память )и позволяла в достаточной мере контролировать виртуальный адрес. пространство для удовлетворения требований программы (, в частности, базовые адреса для загрузки исполняемых файлов и библиотек ).

Do linker and loader exist at machine language i.e. ISA level? (At that level, there is no OS.) Or assembly language level?

Не знаю, что привело к этим вопросам, но компоновщики работают с символами и адресами. Они работают с объектными файлами, которые содержат таблицы импортированных и экспортированных символов, а также записи перемещений, в которые вносятся значения, рассчитанные компоновщиком.

Is it correct to think of an OS as a programming library (libraries)?

Это очень ограничивает. Операционная система предоставляет некоторые услуги приложениям, работающим на ней, но она делает гораздо больше, даже в случае очень простых операционных систем (8 -битных микропроцессоров, MS -DOS и т. д. ); например, он обрабатывает аппаратные прерывания, планирует процессы (для многозадачных -систем ), контролирует права доступа (для многопользовательских -систем с контролем доступа )...

У меня сложилось впечатление, что диаграмма, на которую вы ссылаетесь, более полезна как карта книги, чем как способ понимания компьютерной архитектуры.

5
18.03.2021, 23:02

Теги

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