Я знаю, что, когда исходный код, скажем, на C++, компилируется, выход из компилятора в машинный код (исполняемый файл), который я думал, были инструкции к процессору напрямую. Я недавно читал о ядрах и я узнал, что программы не имеют прямого доступа к устройствам, но, чтобы пройти через ядро.
Поэтому, когда мы собираем несколько простых исходный код, скажем, с функции printf()
функция, и компиляции создается исполняемый машинный код, будут каждой инструкции в машинный код непосредственно выполнены из памяти (после загрузки кода в память, ОС) или каждой команды в машинный код все равно нужно пройти через ОС (ядра), чтобы быть выполненным?
Я читал подобный вопрос. Это не объяснить, если машинный код, который создается после компиляции-это инструкция к процессору напрямую или если это будет нужно снова пройти через ядро, чтобы создать правильную инструкцию для процессора. Т. е., что происходит после того, как машинный код загружается в память? Он будет идти через ядро или непосредственно с процессора?
Как кто-то написал программы, которые выполняются без ОС, я предлагаю окончательный ответ.
будет исполняемого нужен ядра ОС для запуска?
Это зависит от того, как программа была написана и построена. Вы могли бы написать программу (если у вас есть знания), что не требует ОС вообще. Такая программа описывается как автономный. Загрузчики и диагностические программы обычно используются отдельные программы.
Однако типовая программа написана и построена в некоторые хост-ОС будет по умолчанию выполняется в той же среде операционной системы. Очень явные решения и действия, необходимые для записи и построения отдельная программа.
... выход из компилятора в машинный код (исполняемый файл), который я думал, были инструкции к процессору напрямую.
Правильно.
недавно я читал о ядрах и я узнал, что программы не имеют прямого доступа к устройствам, но, чтобы пройти через ядро.
Что'с ограничениями на режим процессора, что ОС использует для запуска программ, а также способствуют определенные средства разработки, такие как компиляторы и библиотеки. Это не внутреннее ограничение на все программы, когда-либо написанных.
поэтому, когда мы собираем несколько простых исходный код, скажем только функции printf() функция, и компиляции создается исполняемый машинный код, будут каждой инструкции в машинный код непосредственно выполнены из памяти (после загрузки кода в память, ОС) или каждой команды в машинный код все равно нужно пройти через ОС (ядра), чтобы быть выполненным?
Каждая инструкция выполняется на ЦП. Инструкция, которая не поддерживается или нелегальных (например, процесс не имеет достаточных привилегий) повлечет немедленное исключение, и процессор будет выполнять рутинную для обработки этого необычного состояния.
А Е() функция не должна использоваться в качестве пример "и простой исходный код и". Перевод объектно-ориентированный язык программирования высокого уровня в машинный код может быть не так тривиально, как вам бы хотелось. А затем вы выберете один из самых сложных функции из библиотеки времени выполнения, которая выполняет преобразование данных и я/О.
Обратите внимание, что ваш вопрос предусматривает среде с ОС (и библиотека времени выполнения). После загрузки системы, и операционной системы управление передается компьютеру, ограничения накладываются на то, что программа может делать (например, ввода/вывода должны выполняться в ОС). Если вы планируете выполнять отдельную программу (т. е. без ОС), то вы не должны загрузить компьютер для запуска операционной системы.
... что произойдет после того, как машинный код загружается в память?
Это зависит от окружающей среды.
Для автономной программой, которая может быть выполнена, т. е. управление передается посредством перехода на программу'с начального адреса.
Для программы, загруженной операционной системой, программа должна быть динамически связаны с общими библиотеками от которого он зависит. ОС должна создать пространство для выполнения процесса, который будет выполняться программа.
он будет идти через ядро или непосредственно с процессора?
Машинный код выполнено по ЦП. Они не то"пройти через ядро", У, а не "и поговорить с процессора и". Машинный код (состоящий из ОП кода и операндов) - это инструкция процессора, которая декодируется и выполняется операция.
Возможно, в соседней теме вы должны расследовать это режимы ЦП.
То есть " ядра;просто" больше кода. Это's просто, что этот код является слоем, который живет между низкой части вашей системы и оборудования.
Все это выполняется непосредственно на процессор, вы просто переход сквозь слои его что-либо делать.
Вашей программе "должен" и ядра так же, как он должен стандартной библиотеки C для того, чтобы использовать команду е
на первом месте.
Фактический код программы выполняется на центральном процессоре, но ветви, что код делает, чтобы что-то напечатать на экране идут через код на С Е
функция, с помощью различных других систем и переводчиков, каждый из которых сделал свою обработку, чтобы получилось просто как Привет мир!
на самом деле будет напечатано на экране.
Скажем, у вас есть терминальной программы, работающей на диспетчер окон рабочего стола, работающих на ядре, которое в свою очередь работает на вашем оборудовании.
Там'ы намного больше, что происходит, но давайте держать его простым...
Привет мир!
Привет мир!
в консолиПривет мир!
написано на меня, вы можете поставить его в положение х
, й
, пожалуйста?&и"<суб>это массовое упрощение только для описание. Здесь драконы.</суб>
Эффективно все, что вы делаете, что требует доступа к оборудованию, будь то дисплей, блоки памяти, фрагменты файлов или что-то подобное и, чтобы пройти через некоторые драйвера устройства в ядре, чтобы понять как разговаривать с соответствующим устройством. Будь это драйвера файловой системы поверх драйвер контроллера жесткого диска SATA, который сам сидит на верхней части устройства с интерфейсом PCIe мост.
Ядро умеет связать воедино все эти устройства и представляет собой относительно простой интерфейс для программы, чтобы делать вещи, не зная о том, как делать все эти вещи сами.
Менеджеры окон рабочего стола обеспечивает слой, что означает, что программы не'т должны знать, как рисовать окна и хорошо играть с другими программами пытаются отобразить вещи одновременно.
Наконец терминальной программы означает, что программа не'т должны знать, как нарисовать окно, ни как разговаривать с ядра видеокарты драйвера, ни всю сложность общего с дело с экрана буферов и время дисплея и на самом деле покачивание линии передачи данных на дисплей.
Это's все обрабатывается слой за слоем код.
Это зависит от окружающей среды. Во многих старых (и проще!) компьютеров, таких как IBM 1401, ответ будет "нет". Ваш компилятор и компоновщик, излучаемый отдельное "в двоичном", что бежал без какой-либо операционной системы. Когда ваша программа остановилась, ты загружен в другой, которые также работали без ОС.
Операционная система необходима в современных условиях, потому что вы'т работает только одной программе одновременно. Совместное использование двухъядерного процессора(ов), оперативной памяти, устройства хранения данных, клавиатуру, мышь и дисплей, среди сразу нескольких программ требует согласования. ОС предусматривает, что. Таким образом, в современных условиях программа может'Т просто читать и писать на диск или SSD, его нужно задать операционной системы для этого от своего имени. ОС получает подобные просьбы от всех программ, которые хотят получить доступ к хранилищу устройства, реализующего о таких вещах, как контроль доступа (может'т дать возможность рядовым пользователям писать в ОС's файлов), очередей на устройство и сортирует полученную информацию к правильному программ (процессов).
Кроме того, современные компьютеры (в отличие от, скажем, 1401) поддерживает подключение самых разнообразных устройств ввода-вывода, а не только те, что компания IBM будет продавать в старые времена. Ваш компилятор и линкер может'т, возможно знать о всех возможностях. Например, ваша клавиатура может быть сопряжена через порт PS/2 или USB. ОС позволяет устанавливать устройства и"драйверов", что умеют говорить на этих устройствах, но присутствует общий интерфейс для класса устройств с ОС. Так что ваша программа, и даже операционной системы, не'т иметь, чтобы сделать что-то другое для получения нажатий клавиш с USB против клавиатуру PS/2, или для доступа, скажем, локальный диск SATA против USB-устройство запоминающее устройство для хранения ВС, что'ы где-то на NAS или San. Эти детали обрабатываются драйверов для различных контроллеров устройства.
Для запоминающих устройств, операционной системы обеспечивает на все эти драйвер файловой системы, который представляет единый интерфейс для каталогов и файлов, независимо от того, где и как осуществляется хранение. И опять же, ОС заботы о контроле доступа и сериализация. В общем, например, один и тот же файл должен'т быть открыт для записи более чем одной программы одновременно без прыжки через обручи (но одновременно читает вообще ОК).
Таким образом, в современных универсальных среды, да - вы действительно нуждаетесь в ОС. Но даже сегодня есть компьютеры, такие как в режиме реального времени контроллеров, которые арен'т сложная достаточно нужен.
В среде Arduino, например, нет'т действительно ОС. Конечно, там'куча библиотек кода, среда разработки включает в каждый "в двоичном" это строит. Но так как нет постоянства, что код от одной программы к другой, он's не ОС.
Я думаю, что многие ответы не понимает вопроса, который сводится к следующему:
компилятор выдает машинный код. Этот машинный код выполняется непосредственно процессором, или ее "трактовать" с ядром?
В основном, процессор непосредственно выполняет машинный код. Это будет значительно медленнее, у ядра выполнить все заявки. Однако, есть несколько предостережений.
Когда ОС присутствует, прикладных программ, как правило, ограничены от выполнения определенных инструкций и доступ к определенным ресурсам. Например, если приложение выполняет инструкцию, которая модифицирует таблицу системных прерываний, процессор будет прыгать, а в обработчик исключений операционной системы, так что нарушителя применение прекращается. Кроме того, приложения, как правило, не позволяют читать/писать в память устройства. (Т. е. "и говорили к оборудованию и".) Доступ к этим специальным областям памяти, как операционная система взаимодействует с устройствами, такими как видеокарты, сетевой интерфейс, системные часы и т. д.
Ограничения операционной системы на местах применения достигается за счет специальных функций процессора, таких как режимы привилегий, защиты памяти и прерываний. Хотя любой процессор в смартфоне или компьютере есть эти возможности, некоторые процессоры не. Эти процессоры действительно нужны особые ядра, которые на "интерпретация" и код приложения для того, чтобы достичь особенности, которые желательны. Очень интересный пример - Gigatron, который представляет собой 8-инструкция компьютер можно построить из фишек, которая эмулирует 34-обучение компьютеру.
Некоторые языки, такие как Java и"сборка" на нечто, называемое байт-код, который на самом деле не машинный код. Хотя в прошлом они были истолкованы, чтобы запускать программы, в эти дни то, что называется только компиляция это обычно используется, чтобы они не в конечном итоге работает напрямую на процессор, как машинный код.
Запуск программного обеспечения в виртуальной машине позволяет требовать его машинный код, чтобы быть "трактовать" и программа называется гипервизора. Из-за огромного спроса на ВМ, производители процессоров добавили функции, такие как VTx для своих процессоров, чтобы позволить большинство инструкций гостевой системы должен быть выполнен непосредственно процессором. Однако, при запуске программного обеспечения, предназначенного для процессора incompatible в виртуальной машине (например, эмуляции денди), машинный код необходимо будет интерпретировать.
При компиляции вашего кода, Вы создаете так называемый "объект" и код, который (в большинстве случаев) зависит от системных библиотек (е
, например), то ваш код обернут линкер, который добавит вид программы загрузчика ваша операционная система сможет распознать (вот почему вы можете'т запустить программу, скомпилированную для Windows на Linux, например) и знать, как развернуть свой код и выполнить. Так что ваша программа-это как мясо внутри сэндвича и могут быть съедены только в связке в целом.
недавно я читал о ядрах и я узнал, что программы не имеют прямого доступа к устройствам, но, чтобы пройти через ядро.
Ну это наполовину верно; если ваша программа является драйвер режима ядра, то фактически вы можете получить доступ непосредственно оборудования, если вы знаете, как, чтобы "говорят" с оборудованием, но как правило (особенно для не имеющих документов или сложного оборудования) люди используют драйверы ядра библиотеки. Таким образом можно найти функции API, которые знают, как разговаривать с аппаратным практически в удобочитаемый путь, не зная адреса, регистры, сроки и куча других вещей.
каждый инструкция в этот машинный код непосредственно быть выполнены из памяти (после загрузки кода в память, ОС) или каждой команды в машинный код все равно нужно пройти через ОС(ядра), чтобы быть выполненным
Ну, ядро-в качестве официантки, в обязанности которых входит проводить тебя к столу и служить вам. Единственное, что он может'т сделать - это поесть, вы должны сделать это сами. То же самое с ваш код, ядро будут распакуйте программу в память и запустить свой код, машинный код выполняется напрямую процессором. Ядра просто нужно, чтобы контролировать вас - что вы разрешаете, а что вы'вновь не позволили этого сделать.
Это не объяснить, если машинный код, который создается после компиляции-это инструкция к процессору напрямую или нужно будет снова пройти через ядро, чтобы создать правильную инструкцию для процессора?
Машинный код, который создается после компиляции-это инструкция к процессору напрямую. Никаких сомнений на этот счет. Единственное, что вы должны иметь в виду, а не весь код в скомпилированный файл актуальны машина'ы/ЦП код. Линкер завернутый программы с Некоторые мета-данные, которые можно интерпретировать только ядра, как подсказку - что делать с вашей программой.
что происходит после того, как машинный код загружается в память? Он будет идти через ядро или непосредственно с процессора.
Если ваш код-это просто коды операций, как сложение двух регистров, тогда он будет исполняться непосредственно процессором без помощи ядра, но если ваш код, используя функции из библиотеки, то такие звонки будут помогать ядра, как в Примере с официанткой, если вы хотите, чтобы поесть в ресторане, они дадут вам инструменты - Вилка, Ложка (и это еще их активов), но что вы будете делать с ним, - это на вашу "код" по.
Ну, просто, чтобы предотвратить флейм в комментариях - это очень упрощенные модели, которые, надеюсь, помогут ОП понять базовые вещи, но хорошие предложения по улучшению этого ответа приветствуются.
В то время как я Дон'т хотим, чтобы предполагать, что другие ответы не правильные сами по себе, они дают слишком много деталей, которые, я'м боюсь, еще очень непонятных для вас.
Основной ответ состоит в том, что код будет выполняться напрямую на процессор. И нет, машина код не на "говорят" с кем, это'ов и наоборот. Процессор является активным компонентом и все, что вы делаете на вашем компьютере будет сделано, что процессор (я'м все упрощаю немного, но это's хорошо для теперь). Процессор считывает код и выполнить его и выложит результаты, машинный код-это просто питание для процессора.
Ваше недоумение связано с использованием аппаратной слово. Хотя деление это'т так однозначны, как это было раньше, это's лучше, если вы думаете с точки зрения периферии, а не просто называя все оборудование. Так что, если есть операционная система или похожие на ваши машины, ваша программа должна использовать свои услуги для доступа к периферии, но процессор сам по себе является не периферийным, это'ы основной процессор, что ваша программа работает на напрямую.
Ядра, операционной системы и аналогичных промежуточных слоев обычно используются только в крупных системах, где существует надежда, что некоторые программы будут работать и там необходима система управления, как эти программы могут использовать периферийные устройства компьютера (нередко одновременно). В этих случаях запущенных программ могут получить доступ только к этим периферийным устройствам с помощью системы, которая будет решать, как разделить их и убедиться, что нет никаких конфликтов. Небольших системах, где нет необходимости для любого менеджмента среди конкурирующих программ, потому что их нет, часто не имеют базовых системы и одна программа не работает нормально на эти системы более или менее вольны делать все, что он хочет с периферии.
поэтому, когда мы скомпилировать простой код, сказал только функции printf() функция, и компиляции создается исполняемый машинный код, будут каждой инструкции в машинный код непосредственно быть выполнены из памяти (после загрузки кода в память, ОС) или каждой команды в машинный код все равно нужно пройти через ОС(ядра), чтобы быть выполненным?
По сути, только системные вызовы идут к ядру. Ничего общего с I/O или выделение/освобождение памяти обычно в конечном итоге приводит к системному вызову. Некоторые instructiosn может быть выполнена только в режиме ядра и заставит процессор, чтобы вызвать исключение. Исключения вызывают переход в режим ядра и прыжок в код ядра.
Ядра не процесс каждая инструкция в программе. Он просто делает системных вызовов и переключение между запущенными программами обмениваться процессор.
Делаешь выделение памяти в режиме пользователя (без ядра) не представляется возможным, если вы получаете доступ к памяти, вы не'т иметь разрешение на доступ, ММУ, ранее запрограммированные ядром, примечания и вызывает процессор уровня "и сегментации" не исключение, который запускает ядро, и ядро убивает программу.
Выполнять операции ввода/вывода в пользовательском режиме (без ядра) не представляется возможным, если вы получаете доступ к портам ввода-вывода и регистры для устройств или адресов подключенных устройств (одного или обоих, необходимых для выполнения ввода-вывода), это вызовет исключение, точно так же.
будет исполняемый нужен ядра ОС для запуска?
Зависит от типа исполняемого файла.
Ядер, в дополнение к посреднической общий доступ к оперативной памяти и аппаратного обеспечения, а также выполнять функции погрузчика.
Многие "в форматах исполняемых файлов" и, как эльф или PE, наличии метаданных в исполняемых файла и код, и загрузчик'С работа процесса. Читать подробности о Microsoft'формата s ПЭ для получения дополнительной информации.
Эти исполняемые файлы и ссылки на библиотеки (в Windows.dll файлыили Linux общий объект
.так, файлы) - их код должен быть включен.
Если ваш компилятор создает файл, который's означает До быть обработаны загрузчик операционной системы и загрузчика там нет, он выиграл'т работу.
Конечно. Вам нужно убедить ОС, чтобы хоть как-то запустить свой сырой код без обработки каких-либо метаданных. Если ваш код вызывает API ядра, он по-прежнему выиграла'т работу.
Если вы загрузите этот файл как-то от операционной системы каким-то образом (т. е. если это позволяет сырой код, который будет загружен и выполнен), он все равно будет в пользовательском режиме. Если код обращается к вещи, запрещенные в пользовательском режиме, а не режиме ядра, такие как нераспределенную память или устройство ввода/вывода адреса/регистров, он рухнет с правами или сегмента нарушений (опять же, исключения, перейдите в режим ядра и обрабатываются там) и по-прежнему выиграла'т работу.
Тогда это будет работать.
ТЛ;ДР нет.
Arduino развития приходит на ум в качестве текущих условиях, когда там's нет ОС. Поверь мне, на один из этих детей вы Don'т иметь пространство для операционной системы.
Кроме того, игры для Сега Генезис не'т иметь ОС от Сега для вызова на. Ты просто выстроил свою игру в 68k с ассемблера, писать непосредственно на голый металл.
Или где я вырезал мои зубы, делали встроенный работы на Intel 8051. Опять же, когда все у вас есть 2716 EPROM с 2К * 8 след, вы не'т иметь место для операционной системы.
Конечно, это предполагает очень широкое использование приложения Word. Как риторический вопрос, он's стоит спросить себя, если скетч на самом деле это приложение.
В BIOS, которая выполняется на компьютере при включении исполняемый код хранится в ПЗУ. Он состоит из машинных данных, а также. Есть компилятор (или ассемблер), которая собирает этот BIOS из исходного кода. Это особый случай.
Другие особые случаи включают программу начальной загрузки, которая загружает ядра и само ядро. Эти специальные случаи, как правило, закодированную на языке, отличном от c++.
В общем случае, это гораздо более практичным, чтобы компилятор производит некоторые инструкции, которые вызывают системные сервисы, предоставляемые ядра или библиотеки подпрограмм. Это делает компилятор гораздо более легкий. Это также делает скомпилированный код более легкий.
На другом конце спектра является Java. В Java, компилятор не преобразует исходный код в машинные инструкции, как этот термин обычно понимается. Вместо этого исходный код переводится в "машина инструкции" в воображаемые машины, называемой виртуальная машина Java. Прежде чем Java-программа может работать, он должен быть в сочетании с выполнения Java, которая включает в себя интерпретатор для виртуальной машины Java.
В старые добрые времена вашей программы был ответственен за все то, что должно быть сделано во время выполнения вашей программы, либо вы делать это самостоятельно или путем добавления кода библиотеки другие писали программу. Единственное, что бежит рядом, что в компьютере был код для чтения в скомпилированную программу - если вам повезло. Некоторые компьютеры надо было Код вводить через коммутаторы, прежде чем он сможет сделать больше (в оригинале "на ушко" в процесс), или даже всей программы, введенные таким образом.
Его быстро нашли, что это было приятно иметь код, выполняемый возможность загрузки и выполнения программы. Позже было установлено, что компьютеры были достаточно мощными, чтобы поддерживать запуск нескольких программ одновременно, имея процессор переключаться между ними, особенно если оборудование может помочь, но с дополнительной сложностью программ не степпингами друг другу (например, как работать с несколькими программами пытаюсь отправить данные на принтер сразу?).
Все это вылилось в большое количество вспомогательного кода, перебрасывают из отдельных программ, а в графе "операционные системы", самый стандартный способ вызова вспомогательного кода пользователя программ.
И это, где мы находимся сегодня. Ваши программы работают на полной скорости, но всякий раз, когда им нужно что-то под управлением операционной системы, которую они называют вспомогательных средств, предоставляемых операционной системой, и этот код не нужен и нет в пользовательских программах. Это включало запись на дисплей, сохранение файлов, доступ к сети и т. д.
Микроядер было написано, что предоставить именно то, что требуется по заданной программе работать без полноценной операционной системы. Это имеет некоторые преимущества для опытных пользователей, давая от большинства других. Возможно, вы захотите прочитать страницу в Википедии о нем - https://en.wikipedia.org/wiki/Microkernel - если вы хотите знать больше.
Я экспериментировал с микроядро поддерживает работу виртуальной машины Java, но обнаружил позже, что сладкое пятно, что такое Докер.
В типичных настольных ОС, ядра сама - это исполняемый файл. (ОС Windows ntoskrnl.exe
; в Linux `файл vmlinux и т. д.) Если вам нужны ядра для того, чтобы был запущен исполняемый файл, то эти операционки не может существовать.
То, что вам нужно ядро, для того, чтобы делать то, что в ядре нет. Разрешить множественный запуск программ сразу, арбитр между ними, реферат оборудование и т. д. Большинство программ не'т способен делать что-то себя грамотно, и вы бы'т хотите, чтобы они, даже если они могли. Во времена Дос-которые едва ли можно назвать операционной системы, игры часто используют ОС как немного больше, чем грузчиком, и непосредственно оборудования как ядро будет. Но часто нужно было знать, какие марки и модели оборудования были в машине, прежде чем вы купили игру. Многие игры поддерживают только некоторые семьи, видео-и звуковые карты, и побежал очень плохо на конкурирующие бренды, если бы они работали на всех. Что's не то, что вы получаете, когда программа управляет оборудованием напрямую, а не через абстракции, как правило, осуществляется через ядра.)