В /pr/ полтора анона, так что пишу сюда.Начал читать structured computer organisation Таненбаума. Не могу понять почему уровень ассемблера выше уровня ОС. Буду очень благодарен за объяснение.
>>199527722 (OP)Программа на ассемблере работать без ОС будет, а ОС без ассемблера нет.Собственно, ось и есть программа на ассемблере.
Ассемблер ниже ОС по левелу из-за того, что меньше надо ступеней пройти, что бы перевести код в бинарную форму (0 и 1).
>>199528001А разве по такой логике не должно быть как раз наоборот: ОС выше ассемблера?>>199528200Так на рисунке ОС как раз таки ниже ассемблера. В этом и вопрос треда.
>>199527722 (OP)Самого Танбербаума и спрашивай. Погугли, наверняка у него есть мыло или что-то такое.
>>199527722 (OP)ОС это программа, она технически может быть написана в виде машинных кодов 01010101.А ассемблер это команд которые потом переводятся в машинные коды. Машинные коды уже интерпретирует непосредственно процессор.
>>199528385Instruction set это ассемблер. На пикче разделяют Assembly level (Instruction set, или Machine code), и ЯП Ассемблер
>>199528681То есть если взять условный С, то сишный код транслируется осью в ассемблер, а ось уже исполняет полученый набор команд? Исправь, если я не ошибаюсь.
>>199528681Короче я походу понял.Типа Assembly language level это именно язык, сам синтаксис, для упрощения написания команд на ассемблере человеком. А Instruction set architecture level это как раз те команды, которые исполняются компьютером на уровне железа и о синтаксическом представлении там уже речи не идёт. Правильно?
>>199527722 (OP)Тут наверное связано с архитектурой x86 и её кольцами защиты.Имеется ввиду, что приложение на ассемблере под конкретную ОС имеет меньше прав, чем сама ОС.Так как ОС работает в привелегированном режиме.Ты можешь писать программы на асме\С без конкретной ОС, но тебе придется реализовывать в ней её функции.Хотя, может я не прав.
>>199529525сишный код компилируется компилятором в бинарный вид (0 и 1). стадии такие: препроцессинг, перевод кода в ассемблер, перевод в object code и линковка.>>199529988для простоты понимания: идет от высшего уровня к нижнему, где язык типо С++ на высшем уровне, и бинарный код (0 и 1) на нижнем.перевести 0 и 1 в набор инструкций можно.
>>199530417А я так понял - просто ОС реализует абстракции и функции, которые предоставляет программе, это её суть.Вот поэтому она и ниже уровнем.>>199530215 - кун
>>199529988Assembly language level -- это на полуровня ниже компилируемого языка (вроде С++)На уровне железа выполняется машинный код (набор инструкций для этого железа переходит в машинный код)
>>199527722 (OP)Нашел че читать, бля. Таненбаум твой черт который нихуя не смыслит в устройстве компа.
>>199530996нормально все, Таненбаум дает представление как раз о том, как код обрабатывается.>>199531106да.
Тред не читал.На схеме под Instruction Set architecture Level имеется ввиду набор инструкций процессора. Потенциально, в теории, программист может использовать этот набор инструкций для написания чего-то своего, например, своего загрузчика ОС. Или своего обработчика сигналов (но этим никто не занимается). Более правдоподобно - этот набор инструкций используется для создания загрузчиков Операционных систем. Вот например, набор инструкций для AMD: https://www.amd.com/system/files/TechDocs/24592.pdfОперационная система сейчас содержит средства для безопасного управления периферией (сетевые карты, видеокарты, ввод-вывод, ну такое). Она имеет свой собственный бинарный формат для программ (POSIX, PE) У Андроида вообще два уровня: POSIX, под который так просто не слинковать программу, и JAR - формат Java-машины, которая транслирует комманды в POSIXАссемблер (TASM, MASM, FASM, NASM) - это еще один язык программирования, который просто очень похож на набор инструкций процессора. Компилятор Ассемблера исходный код из текстового файла преобразует в бинарный формат операционной системы (POSIX, PE) и программа будет выполнятся в среде операционной системы, наравне с другими пользовательскими программами, написанными, например на С++. В древности многие компиляторы высокоуровневых языков могли создавать Листинг - код программы на ассемблере, который потом дальше преобразовывали в бинарный файл ОС (Паскаль точно так мог). Но сейчас в этом необходимости нет, С++ создает сразу бинарный файл Объектные файлы - это просто побочный продукт работы компилятора и линкера
А вообще, книги Таненбаума древние, там многие вещи могут оказаться устаревшими.Если ОП хочет делать что-то интересное, то пусть читает материалы по запросу Windows Internals или Linux Internals
>>199530676В смысле процессит код ассемблера? У любой ос есть свой формат исполняемого файла, и файлы эти - бинарные, это максимум, что она процессит, попутно предоставляя виртуальную адресацию, файлы, сокеты, прерывания и прочие абстракции.Не все функции процессора доступны в безопасном режиме, из этого режима переключиться в другой может только ОС, ну или твоя программа, работающая без ОС и проделавшая кое-какие манипуляции при старте процессора для получения такой привелегии.
>>199531129> даХорошо, спасибо.>>199531216В таком случае здесь >>199529988 я всё правильно понял.Спасибо все анонам, тред можно закрывать.
>>199531216Так, постой. Разве все работает не через обращение высокоуровнево языка к ОС, ОС к ассамблеру, ассамблера к машинному коду, а там уже интерпретация логических нулей и единиц в сигналы и битовые операции?
>>199531713Чувак, ты хуйню сморозил.Программы хранятся в двоичном виде, ни в каком не ассемблерном коде. Может и есть такая ОС - но это вообще плохое решение, транслировать программу во время исполнения. Хотя есть такие вещи как JIT. Но это не относится к ОС, и JIT нужна не для этих задач.
>>199532393ты обдвачевался, бро, не ОС ли линкует и транслирует? я про ОС как уровень в архитектуре, а не как отдельно стоящий термин.
>>199531753Ну няшенька. Это же материал первого-второго курса.Есть компилируемые языки (С++), есть интерпретируемые языки (Python). Есть языки, которые работают в своей коробочке (1С) .Компилируемые языки: код из текстового файла преобразовывается в бинарный формат ОС. Операционная система читает полученный бинарный файл и обращается к машинным ресурсам посредством драйверов. А драйвера - это уже ближе к машинному коду, они направляют команды к периферийным устройствам. Например, программа на С - записать что-то в файл. В программе мы использовали две инструкции - fopen открыть файл и fprintf записать в файл. Компилятор и линкер сделают нам exe файл, где будут в бинарном виде закодированы вызовы WinApi (OpenFile и WriteFileW) или линуксовых подпрограмм. Дальше пишу для windows, в линуксе нету опыта. Операционная система выполнит вызовы этих подпрограмм и будет выполнять код из Kernel32.dll . Что там происходит - я могу только предполагать. Думаю, будет вызван драйвер файловой системы. Драйвер файловой системы поймет, в какой сектор жесткого диска нужно написать данные, чтобы они оказались в нужном фале и файловая таблица была правильной. Потом будет вызван драйвер работы с жестким диском, и ему будет передана последовательность байт, которые нужно записать в сектор. Драйверу жесткого диска все равно, что это за байты и что за адрес куда писать. Он просто передаст дальше вызов на драйвер SATA шины, который начнет магию - синхронизация, начало передачи, контроль четности, передача данных, это все. На другом конце шины жесткий диск примет сигнал и запишет данные, как его попросили.
>>199532843Программист не должен самостоятельно беспокоиться о целостности файловой системы, а тем более - о корректности передачи по шине, если он просто хочет записать текстовый файл.
>>199527722 (OP)Потому что ассемблер это перевод названия команд в коды, эти коды записываются в файл с расширением .exe и потом уже OC берёт этот файл, читает его и превращает набор чисел в какие-то действия.
>>199532843Дальше - языки, которые работают в своей коробочке. 1С работает в своей собственной среде, называется Конфигурация. 1С 8.3 регистрирует в Операционной системе собственный сервис. В этом сервисе-коробочке выполняется предварительно скомпилированный код 1С. Программист, например, хочет записать какой-нибудь бухгалтерский документ, да хоть провести поступление по складскому регистру накопления. Сервис-коробочка распознает вызов и сделает запись в реляционную таблицу базы данных куда именно - хз. Работал только пять месяцев 1С трейни, а в реальном строении базы данных не разбираются даже монстр-сениоры. Сервис базы данных передаст вызов дальше, к файловой системе, и так далее...
>>199533082Ну как сказать...Если мы говорим - НАТИВНЫЙ КОД, то считается, что он выполняется в среде операционной системы. Это - песочница, которую для тебя построили, чтобы не разбил дорогие игрушки и чтобы не поранился сам :3 . Можешь вылезти из песочницы и полазать по детской площадке, но там грязно и дядюшки-архитекторы это не одобряют. Если боишься играть в песочнице, для тебя могут сделать песочницу внутри песочницы с отфильтрованным песочком, и даже немного подмешать сахара.
>>199532843А в каком месте там прерывания участвуют? Вот на ассемблере когда пишешь, чтобы напечать что-то нужно поставить управляющие флаги, типа в один регистр 1, в другой 4,(это будет означать печать, а например поставишь 3 это будет означать чтение) загрузить в третий сообщение и вызвать прерывание. Вот в каком месте твоей схемы это находится?
>>199533680Ну вот типа того, где тут драйвера используются или что, не понимаюsection .textglobal _start ;must be declared for linker (ld)_start: ;tell linker entry point mov edx,len ;message length mov ecx,msg ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernelsection .datamsg db 'Hello, world!',0xa ;our dear stringlen equ $ - msg ;length of our dear string
>>199533889>mov eax,4 ;system call number (sys_write)>int 0x80 ;call kernel>А, всё, понял, вот тут вызов к условному kernel.dll и его функции с номером 4(sys_write)
>>199533680Прерывания - это скорее работа с шиной и системными ресурсами. >>Вот на ассемблере когда пишешь, чтобы напечать что-то нужно поставить управляющие флаги, типа в один регистр 1, в другой 4,(это будет означать печать, а например поставишь 3 это будет означать чтение) загрузить в третий сообщение и вызвать прерывание.Это дичь времен MS DOS. Ее не должно быть в программах на пользовательском уровне в 2019. Современная Win 10 такое вообще обработает? Хотя, то что тут описано вполне допустимо в коде какого-то загрузчика, когда операционная система с ее драйверами еще не запущена.
>>199532615Ты связываешь вещи теряя контекст. Ты вообще хуйню неЛинкует и транслирует компилятор.Это вообще не относится к схеме, ты неправильно думаешь.Ты можешь на одном компьютере написать свою ОС. А запустить на другом.Что ОС не работает без ассемблера - бред, они на нем пишутся, но ОС - такая же программа на машинном коде в итоге.Я еще раз повторяю: ОС предоставляет свой код, функции программе. Тебе не нужно каждый раз писать логику работы с жестким диском, например, или считать адреса, это за тебя реализовано в ОС.
>>199534089>win10 такое обработаетМб в винде это обернуто и там можно писать call printf, я хз, в линуксе так по идее.
>>199533956>>int 0x80 ;call kernelЭто не вызов kernel.dll . Это как раз вызов прерываний процессора. Не делай так в 2019 году. Вот надо делать так: https://stackoverflow.com/questions/7247601/how-to-exit-win32-application-via-api Вот например вызов из kernel.dll : https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-exitprocess
>>199534338Суть-то та же, с помощью прерывания дёргается обработчик и потом берёт из регистров 4(которая значит принт) и 1(которая значит stdout) и вызывает первое на втором с аргументом мсг.
>>199533237> эти коды записываются в файл с расширением .exeДальше не читал. Учи мат часть, умник. Комплюктеры идут куда дальше школьного курса информатики.
>>199534489Просто я пробовал писать прямо в хексе ассемблерный хелловорд и всё получалось, можно прямо в хексе погромировать по сути, а ос уже исполнит твою бинарную писанину.
>>199534587Ну и что? Я не понимаю, называя файл .exe ты показываешь оси, что его можно запускать, только и всего, у тебя там последовательность байт лежит, ты его называешь ексе и ось потом запускает эту последовательность. Что не так?
>>199534397Все есть.https://en.wikipedia.org/wiki/Exit_(system_call)https://linux.die.net/man/2/exitДобрые дяди-архитекторы подвезли для нас песочка с сахаром. Мы можем строить песочные замки любых форм и размеров не вылезая из песочницы. А если полить водичкой сверху и укрепить палочками, то наш замок будет стоять очень долго. Не вылезай из песочницы, тут есть все что нужно :3
>>199534711Так она и вызывается как бы, когда ты пишешьmov eax,1 int 0x80Я имел ввиду в линуксовом ассемблере вроде бы нельзя написатьcall exit
>>199534639В Линуксе вообще интересно. Там нету стандартного расширения для исполняемых файлов. Для того, чтобы показать, что файл можно запускать нужно просто указать chmod +x <file> Но если там не окажется заголовка POSIX в начале, или по первой строчке операционная система не поймет, какой интерпретатор использовать для запуска (bash, python например), то получим ошибку
>>199534639Начнем с того, что ехе это чисто мелкософтовская фича, и на какомнить линухе ее точно не будет => она не обязательно станет ексешной.>>199534596Это такой тролинг тупостью? В контекст можешь? Как я понял, ты написал в хексе хеловорлд, как дяденьки в бородатые времена, и он стал ексешным? Ты же понимаешь что ехе он благодаря твоему хекс едитору и соответсвено оси.
>>199534964Ну на линуксе свой ексе, суть ведь та же, .elf там какой или вообще без расширения>ь что ехе он благодаря твоему хекс едитору и соответсвено оси.Чё? Ексе он благодаря тому, что я его назвал ексе и правильные заголовки и тд добавил перед самим кодом. Хуйню какую-то пишешь.>>199534929Да это просто способ сказать оси, что это исполняемый файл, типа ассемблер переводит команды в коды команд, пишет их, потом оборачивает во всякую стандартную хуйню, заголовки там и тд, чтобы ось поняла, что это исполняемый файл и всё, а дальше уже ось работает и превращает эти последовательности в результат, исполняет типа.
>>199535200> что я его назвал ексе и правильные заголовки и тд добавил перед самим кодом> благодаря осиХуй соси бочку делай
>>199536428 - дополню>>199535200>Ну на линуксе свой ексе, суть ведь та же, .elf там какой или вообще без расширенияexe!=elf. И тебе не обязательно он создаст исполняемый файл.