LINUX.ORG.RU

Системные вызовы

 ,


0

1

Умные люди, можете рассказать, как ОС, в данном случае linux, обрабатывает скомпилированный файл? Готовый файлик от компилятора это входные данные какой-то системной программы внутри ОС? Как, например, обрабатываются системные вызовы, в программе ведь, как я понял, только заголовки этих функций?

Терпеть не могу вот эти заходы про умных людей но фик с тобой. Скомпилированный файл это сразу командыи процессора. А системные вызовы даже не по именам, по номеру в регистре процессора.

ilovewindows ★★★★★
()
Ответ на: комментарий от ilovewindows

Без сарказма было сказано))

Скомпилированный файл это сразу командыи процессора

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

bubvalet
() автор топика
Ответ на: комментарий от bubvalet

Если про наследников 486, то описывается область памяти, начало, конец, читать-писать-выполнять, адрес загружается в специальный регистр и может в этих ограничениях делать что хошь. Если обратился по недопустимому адресу или пытаешься выполнить данные процессор уходит в обработку исключения. Но так как таких самостоятельных программ мало на это забили и поделили на два куска, ядро и пространство пользователя. В вообщем в пространстве пользователя можешь чудить, модифицировать код и лазить по чужим данным.

ilovewindows ★★★★★
()
Ответ на: комментарий от ilovewindows

лазить по чужим данным

для такого нужно использовать api для отладчиков. просто так нельзя

anonymous
()
Ответ на: комментарий от ilovewindows

наследников 486

Защита памяти в 286 появилась.

поделили на два куска, ядро и пространство пользователя

Четыре кольца защиты во всяком случае и в i686 были.

luke ★★★★★
()
Ответ на: комментарий от peregrine

Вообще всё что можно можно.

В 0 не все, все в -2

Minona ★★☆
()
Ответ на: комментарий от luke

4 кольца сразу были с 286, только ос до сих пор(?) два используют, ну винда по крайней мере. 286 убог как аппарат, смысла от защищенного режима нет, на 386 уже прилично работал, например, автокад и имело смысл играться с защищенном режимом, до винды был dos shell, который позволял загрузить несколько программ и переключатся между ними. Короче, пока не появилось железо под пользовательские программы, даже не под ОС, она крохи занимает, ну занимала, смысла переходить на кольца не было.

ilovewindows ★★★★★
()
Последнее исправление: ilovewindows (всего исправлений: 1)
Ответ на: комментарий от annulen

звучит глупо, но почему-то такая терминология используется местами:

readelf --all /bin/true |grep -i interp
  [ 1] .interp           PROGBITS        00000000000002a8 0002a8 00001c 00   A  0   0  1
...
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
...
anonymous
()

Умные люди, можете рассказать, как ОС, в данном случае linux, обрабатывает скомпилированный файл? Готовый файлик от компилятора это входные данные какой-то системной программы внутри ОС?

В общем схема загрузки выглядит как-то так:

https://wiki.osdev.org/ELF#Loading_ELF_Binaries

В linux загрузку выполняет непосредственно ядро. Для загрузки динамических библиотек и обработки релокейшенов может использоваться юзерспейсный ELF-интерпретатор, который обычно называется ld.so или ld-linux.so и входит в состав libc, но со статически слинкованным приложением ядро и само справится.

Как, например, обрабатываются системные вызовы

Системные вызовы, как это ни странно, тоже выполняются ядром. Способ вызова определяется ISA и ABI платформы, это может быть прерывание или специальная инструкция, в результате CPU перестает выполнять код программы и передает управление обработчику в ядре.

в программе ведь, как я понял, только заголовки этих функций?

Заголовки вообще к системным вызовам не относятся. В libc есть функции-обертки над настоящими системными вызовами, упрощающие их использование по сравнению с syscall(2). Сама syscall(2) тоже является оберткой, позволяющей правильно заполнить регистры и инициировать переключение контекста подходящим для конкретной плафтормы способом.

annulen ★★★★★
()
Ответ на: комментарий от anonymous

звучит глупо, но почему-то такая терминология используется местами

См. мой комментарий выше

annulen ★★★★★
()
Ответ на: комментарий от anonymous

Название между прочим вполне логичное, так как интерпретирует он ELF-заголовки, а не машкод

annulen ★★★★★
()
Ответ на: комментарий от annulen

Ахтунг, профессианалы в треде!

Я, конечно, не профессионал, но не совсем понял к чему тут сарказм.

В linux загрузку выполняет непосредственно ядро.

И там эта сущность называется по-другому? Я вижу такую же терминлогию: https://github.com/torvalds/linux/blob/7cf726a59435301046250c42131554d9ccc566b8/fs/binfmt_elf.c#L238

EXL ★★★★★
()
Ответ на: комментарий от ilovewindows

286 убог как аппарат

4.2, полуось на нём летала (если памяти два метра).

до винды был dos shell

До винды был XENIX, это если из мелкомягкого. Работал только на IBM PC AT.

смысла переходить на кольца не было

Я так понимаю это делалось для гипервизора с виртуалками, идея тянется ещё от MULTICS.

luke ★★★★★
()
Ответ на: комментарий от ilovewindows

Я не знаток полуоси. Под 286 как быстрый 8086 много чего делали вплоть до начала 90-х, та же винда была. Я на своём PS/2 30-286 Windows 3.0 запустил и ничего, работает, можно тексты писать, можно картотеку заполнять, можно даже играть в Реверси!

Плюс, возможность в параллель и с защитой памяти запустить текстовый редактор и компилятор бесценна. Особенно на двух мониторах, что комбинация двух адаптеров MDA+CGA/EGA/VGA позволяла.

luke ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.