|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
|
Своя ОС для чайника09.01.2010, 22:16. Показов 36809. Ответов 81
Хочу написать свою ОС на асме. Самую простую. Единственное, что она должна уметь: загружаться с неё, открывать файлы (проводник) пускай консольный или еще какой. Но нужно, чтобы скажем если установлены некоторые программы, то с этой ОС можно было бы найти екзешник и его запустить. Если и это сложно, то хотя бы чтобы по нажатию клавиши открывалась любая заведомо установленная программа. Нашел-написал это MyOS.rar Я не претендую написать полноценную ОС. Просто пример.
Там в архиве готовая ОС. Но я не могу разобраться как её скомпилировать.
0
|
|
| 09.01.2010, 22:16 | |
|
Ответы с готовыми решениями:
81
ДК для чайника QT для чайника |
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
||
| 12.01.2010, 18:49 [ТС] | ||
|
2) у меня есть код некого подобия фар-командера, коотрый читает файлы с дискеты из под доса. 3) есть код и прога, которая читает нтфс диски из под биоса. Сейчас я хочу, чтобы после загрузки, загрузочный сектор передал управление ена пункт 2) и открыл содержимое дискеты. Напишите тогда как Вы видите построение ОС? Можете описать как делается ОС? Полностью по пунктам. Ну я не говорю о сложной. Ну уровня ДОС, но только если убрать оттуда все кроме возможности каталоги отображать?
0
|
||
|
|
|
| 12.01.2010, 19:19 | |
|
> 2) у меня есть код некого подобия фар-командера, коотрый читает файлы с дискеты из под доса
Этот командер нужно запускать в досе, а не в твоей самодельной ОС > Можете описать как делается ОС? Начальные шаги я тебе ужи описывал. Разве что дописать нужно "забудь про любые существующие программы, которые работают под какую-то конкретную ОС". Потому как без переделок на твоей ОС они не запустятся (либо ты сделаешь поддержку дос'овских прерываний)
1
|
|
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
|
| 12.01.2010, 19:30 [ТС] | |
|
0
|
|
|
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
|
|
| 12.01.2010, 19:32 | |
|
Эти прерывания реализованы в досе с участием биоса, программистами из майкрософта долгими американскими вечерами
1
|
|
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
|
| 12.01.2010, 19:45 [ТС] | |
|
Хорошо. Вот я написал загрузочный сектор. Теперь нужно писать ядро? И передавать на него управление, да? А что должон делать ядро? Ну конкретно.
Добавлено через 10 минут Допустим я мспользую диалог с пользователем как в ДОСе, тогда достаточно кода, который выложил Goodwin98. Правильно? Теперь мне нужно написать драйвер для обработки мыши, допустим, или видеокарты. Написать хелп, написать чтение диков?
0
|
|
|
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
|
|||||
| 12.01.2010, 19:55 | |||||
|
Может быть, как сказал, Evg
Иначе даже просто чтобы вывести строку текста, нужно будет кучу строк кода. Потом в биосе ничего нету для удобного ввода строк пользователем. ![]() Естественно все это имхо, т.к. я никогда не писал серьезные ОС и вы можете делать по-своему.
1
|
|||||
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
||
| 12.01.2010, 20:01 [ТС] | ||
|
Добавлено через 2 минуты Загрузчик сам вообще что делает? Где это все почитать? Он после того как выполняется передает управление на ядро или куда угодно?
0
|
||
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
|
| 12.01.2010, 20:23 [ТС] | |
|
Вот я нашел исходники довольно несложной ОС на масме. Некий аналог лоса но проще. Можно взять её за основу? OS.rar
0
|
|
|
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
|
|||||||||
| 12.01.2010, 20:33 | |||||||||
Добавлено через 48 секунд ![]() Добавлено через 4 минуты Однако, очень сильно простой я бы ее не назвал, но за основу взять я думаю можно, если не сдавать прямо её же.
1
|
|||||||||
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
||||
| 12.01.2010, 20:36 [ТС] | ||||
|
0
|
||||
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
||
| 12.01.2010, 22:18 [ТС] | ||
|
И как её перекомпилировать, если я поменяю что-то?
0
|
||
|
|
||||||
| 12.01.2010, 23:04 | ||||||
Сообщение было отмечено как решение
Решение
В общем, у тебя возникает очень много вопросов по уже готовому коду, так что лучше тебе начать с того, что самому написать какой-то примитив с нуля и только потом пробовать чужое. Но при написании с нуля придётся подглядывать за чужими фрагментами
Для начала рассмотрим, как работает пользовательское приложение. Приложение простейшее: печатает текст и завершает работу. В самый начальный момент ОС загружает приложение по нужным адресам памяти, находит так называемую точку входа (грубо говоря первую команду, с которой стартует приложение) и передаёт на неё управление. С этого момента пользовательское приложение начинает жить. Оно каким-то образом в памяти формирует строку текста, котору хотим напечатать на экран, а так же вычисляет её длину. После формирования строки в памяти её как-то нужно вывести на экран. Хотя более правильным было бы сказать "терминал", но это не суть. Но экран является внешним устройством по отношению к нашему приложению. Поэтому, чтобы напечатать туда что-то, нужно это делать через операционную систему - это "нормальный" порядок работы программы: все данные формируем и обрабатываем на регистрах и в памяти, но к любому внешнему устройству (клавиатура, терминал, графический экран, файловая система на диске) обращаемся только через операционную систему. При таком порядке работы весь необходимый код по работе устройствами (включая драйвера) собран в ОС и пользовательскому приложению не надо заботиться о конкретных видах устройств: что за тип монитора, какая именно файловая система, какая сетвая карта и т.п. Итак, нам нужно напечатать строку на экран. Для этого нам нужно обратиться к ОС. Но мы не знаем по какому адресу расположен нужный нам код в ОС. Для этих целей придуманы так называемые программные прерывания (software interrupt). О конкретике их работы пока говорить не будем, но вызов программного прерывания передаёт управление на нужный фрагмент кода в ОС. Далее возникает вопрос о том, как передавать параметры в прерывание. Интерфейс работы с прерываниями называется "программные соглашения" (API, не помню как точно расшифровывается). Допустим, в нашем случае мы сделаем следующее соглашение. Для вызова прерывания надо исполнить инструкцию "int 21h" (я в интеловской системе команд плохо разбираюсь, а потому условно пишу именно 21). При этом в регистре ax должен быть сформирован некий номер, означающий, что нужно делать (допустим 1 будет означать, что мы хотим напечатать на экран). В регистрах bx, cx, dx, ex будем передавать дополнительные параметры. Допустим, что для ax=1 в регистре bx передается адрес памяти, откуда надо брать символы, а в регистре cx записывается количество символов, которые надо напечатать из этого адреса. Таким образом для того, чтобы что-то напечатать пользовательская программа должна записать в регистр ax единицу, в регистр bx адрес строки, в регистр cx длину строки и исполнить команду "int 21h". После этого управление передастся в ОС, ОС что-то там сделает и напечатает строку на экран, после чего передаст управление на следующую после "int 21h" команду. Т.е. опять вернёмся в пользовательскую задачу. Текст мы на экран напечатали, больше нам ничего делать не надо. Но при этом нам надо как-то уведомить ОС, что мы завершили исполнение. Для этого нам надо опять выполнить программное прерывание. Делается всё аналогичным образом, но формируются другие значения в регистрах. Допустим, что для завершения работы в регистр ax нам надо записать двойку (т.к. единица означает печать), а в регистр bx записать код возврата (туда мы запишем ноль, сигнализируя о том, что наша программа исполнилась без ошибок). После чего опять влепим команду "int 21h" и опять уйдём в ОС. При этом по значению в регистре ax ОС поймёт, что на этот раз нам нужно не печатать, а завершить исполнение приложения. Добавлено через 25 секунд Опс... слишком рано нажал "отправить". Буду дальше дописывать Добавлено через 11 минут Всё, что описано выше - как я уже говорил, называется программным соглашением. Это свойство операционной системы и всё это дело должно быть описано в программной документации для ОС. И все программисты, пишущие под эту ОС должны придерживаться именно этих соглашений. Когда ты пишешь программу, ты не занимаешься формированием ручками значений в регистрах. Это всё спрятано внутри библиотеки, которая поставляется вместе с ОС. Там есть примитивы низкого уровня. Например (применительно к нашему коду):
В нашем случае я условно написал, что номер передаётся в ax, а параметры в bx, cx, ... реально всё это можно передавать через стек, или через фиксированные адреса в памяти. Т.е. для самой первой реализации сделай так, как проще, но когда появятся хоть какие-то более-менее реальные очертания ОС, уже можно придумывать конкретную реализацию. Проще всего сделать по аналогии с DOS'ом. В этом случае в конечном итоге может даже получится запустить простейшую DOS'овскую программу на твоей ОС Нажмё всё-таки "Ответить", чтобы текст не потерялся
13
|
||||||
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
|
| 12.01.2010, 23:22 [ТС] | |
|
Спасибо. Ох насколько єто сложнее, чем просто писать программі на масме под ДОС или винду) Ладно. Буду переваривать.
0
|
|
|
|
||
| 12.01.2010, 23:31 | ||
Сообщение было отмечено как решение
Решение
Теперь рассмотрим, как работает ОС. В самый начальный момент раскрутки машины запускается загрузчик, который загружает в память код ОС и передаёт на ней управление. Процесс загрузки пока опустим и начнём с точки запуска кода ОС. В начале ОС настраивает машину: настраивает таблицы прерывания, настраивает работу с устройствами и т.п. Этот момент пока тоже пропустим. Далее однозадачная ОС должна запустить некую пользовательскую программу, обычно это командный интерпретатор (где ты что-то вводишь с клавиатуры, запускаешь программы и т.п.). На начальной стадии для простоты я пока предлагаю вместо командного интерпретатора сразу запускать пользовательское приложение (которое у нас будет печатать текст и завершать работу). В этом месте задачу на начальном этапе также можно упростить. Пользовательская задача НЕ будет храниться на диске в виде отдельной программы, а будет зашита в код ОС. При таком допущении мы сможем не заморачиваться работой с диском для запуска пользовательских задач.
Ещё одна немаловажная вещь. Мы пишем НЕзащищённую однозадачную ОС. Поэтому и сама ОС и пользовательская задача будут жить в одном адресном простанстве, которое будет НЕзащищённым: т.е. из кода пользовательского приложения можно будет лезть непосредственно в код ОС. По большому счёту DOS устроена примерно так же. Итак, наша ОС настроила всё что нужно и запустила приложение. В нашем простом случае попросту произошла передача управления на некую метку, которая соответствует стартовой точке приложения. Далее наше приложение в памяти формирует текст, после чего запускает "int 21h". Что происходит в этот момент. Процессор должен передать управление на некий адрес. А этот самый адрес ОС должна записать в какое-то специально отведённое место (этого я точно не знаю, но Гудвин должен знать) в самый начальный момент запуска (там, где я писал про настройку прерываний). И таким образом при исполнении команды "int 21h" процессор лезет в это специальное место, достаёт там адрес и передаёт упарвление на этот адрес. Этот адрес принадлежит ОС и является так называемым обработчиком программных прерываний (trap handler). В этом обработчике прерываний мы первым делом должны сохранить текущий контекст: т.е. куда-то сохранить все значения регистров, т.к. они сейчас содержат те значения, которые были в пользовательском процессе в момент вызова прерывания. После завершения обработки прерывания мы должны восстановить значения регистров и вернуться вточку вызова (т.е. на следующую за "int 21h" команду). На начальном этапе опять-таки можно не заморачиваться сохранением контекста, поскольку пользовательскя программа у нас примитивная. Итак, мы попали в обработчик прерываний. Дальше мы разбираемся, что хочет программа. Смотрим в регистр ax. Если там записано 1, то значит пользователь хочет напечатать на экран, поэтому мы из регистра bx достаём адрес строки, а из регистра cx - длину. Далее каким-то образом печатаем текст на экране (на начальном этапе можно воспользоваться функциями bios'а, которые устроены примерно также, как и программные прерывания ОС. По завершении печати мы передаём управление на точку, откуда было вызвано программное прерывание. Если в ax записано 2, то это означает, что пользовательская программа завершила работу. Проверяем регистр bx, если там написано 0, то печатаем на экран "программа успешно отработала", если не 0, то пишем "программа отработала с ошибкой, код ошибки ...". После чего наша ОС завершает свою работу и останавливает машину (а перед этим сделать паузу, чтобы текст с экрана не пропал). При всём этом программные прерывания устроены таким образом, что вызывать их можно не только из пользовательских приложений, но и из самой ОС. Например, в начальный момент можно напечатать "started", после настройки таблицы прерываний "trap table configured" и т.д. Только надо следить за тем, чтобы не возникало вложенных прерываний (т.е. прерывание в процессе обработки прерывания) Что касается загрузчика, то его задача состоит в том, чтобы прочитать код ОС (а в нашем случае это будет ОС + приложение) с диска и поместить его в память. На пальцах тут объяснить что-то сложно, тут нужна конкретика. Примеры загрузчиков у тебя есть. Собственно, на пальцах выглядит примерно так. Если тебе это не показалось слишком страшным, то можешь попробовать реализовать примитивнейший вариант Добавлено через 1 минуту
13
|
||
|
0 / 0 / 0
Регистрация: 24.01.2016
Сообщений: 13
|
||
| 24.01.2016, 13:54 | ||
|
"УСТАНОВКА имя ОС лицензия... распаковка файлов... перезагрузка... лицензионный ключ(можно и без него) перезагрузка... пожалуйста подождите... инструкция перезагрузка... ВСЁ!!!"а дальше я тебе помогу! вот что там "netbooot1.gif" это сделай сайт или хотя бы собери сервер и можно загружать твою ОС с сервера (почитай "веб-сервер.doc")
0
|
||
|
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 6
|
||
| 30.05.2016, 02:56 | ||
|
Просто потому, что из под Windows до них добраться сложно. Работать эта ОС должна на современных процессорах, грузиться с дискеты. Вопрос 1: какая разрядность команд/операндов должна быть? )." An INIT provides a method for switching from protected to real-address mode". Это цитата из Intel® 64 and IA-32 Architectures Software Developer’s Manual Т.е. можно ли написать загрузчик в Debug из под DOS (у меня есть) - он 16 разрядный? Или нет? Вопрос 2: Ну загрузит BIOS нулевой сектор по адресу 0000:7с00 и передаст туда управление, как считать всё остальное? ТС в примере на первой странице приводит код, в котором используется int 10. Но после включения компа вся память пустая, таблицы векторов прерываний ещё нет (если только сам BIOS её не прописывает, а я думаю - не прописывает). И как читать следующую часть? Вопрос 3: Если нет векторов прерываний, то как получить адреса портов? Попробовал разобраться, как сам BIOS это делает - под DOSом в DEBUGе с адреса FFFF:0000. Но там на 8-й (примерно) команде mov SS,DX программа зацикливается. Сама команда выполняется: SS получает значение из DX, но кроме этого меняются значения четырёх(!) регистров и почти все флаги. IP при пошаговом выполнении не меняется. Жесть. При этом, если из другой программы (без DEBUGа) передать управление по этому адресу - всё норм, холодная перезагрузка. Не то, что бы тупик, но нужен совет.
0
|
||
|
Модератор
|
|
| 30.05.2016, 06:56 | |
|
Если у компа не планируется связи с "внешним миром" кроме как через COM и LPT порты - может взять контроллер (stm, avr,...), даже какую-нибудь готовую плату (Raspbery Pi, Arduino,...)?
0
|
|
|
|
||
| 30.05.2016, 08:56 | ||
|
0
|
||
|
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
|
|||||||||
| 01.06.2016, 21:53 | |||||||||
|
0
|
|||||||||
|
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 6
|
|||||||
| 04.06.2016, 01:12 | |||||||
|
Решил выяснить, как работает стандартный загрузчик. И тут выясняются интересные вещи: к примеру - сигнатура АА55 есть на всех дискетах, как системных, так и не. "Non system disk or disk error" выводит код с самой дискеты и, следовательно, таблица векторов прерываний в памяти уже есть. конфигурационное пространство PCI находится в оперативной памяти? Если да, то по какому адресу? Как его узнать? Если да, то ЗАЧЕМ это надо ??? Замена 16 разр. проц. на 32 понятна, но замена 32 на 64 нет. Оффтоп, конечно, но дайте ссылку на тему, если такая тема есть. Добавлено через 31 минуту Да, кстати, сюжет из жизни: Митино, лавка по железу. Захожу, вопрос: "материнка под 32 разрядный проц есть? И проц?" Ответ: - Сокет какой? - любой под 32 разр. проц. - ????????????? Вопрос не поняли. Лавка по железу. Кто здесь нормальный?
0
|
|||||||
| 04.06.2016, 01:12 | |
|
Литература для чайника для понимания VCL Atoi для чайника Assembler для чайника
Интеграл для чайника Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|