Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/163: Рейтинг темы: голосов - 163, средняя оценка - 4.90
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101

Своя ОС для чайника

09.01.2010, 22:16. Показов 36809. Ответов 81

Студворк — интернет-сервис помощи студентам
Хочу написать свою ОС на асме. Самую простую. Единственное, что она должна уметь: загружаться с неё, открывать файлы (проводник) пускай консольный или еще какой. Но нужно, чтобы скажем если установлены некоторые программы, то с этой ОС можно было бы найти екзешник и его запустить. Если и это сложно, то хотя бы чтобы по нажатию клавиши открывалась любая заведомо установленная программа. Нашел-написал это MyOS.rar Я не претендую написать полноценную ОС. Просто пример.

Там в архиве готовая ОС. Но я не могу разобраться как её скомпилировать.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.01.2010, 22:16
Ответы с готовыми решениями:

Использование модификатора ref для ссылок на объекты (для чайника)
Всем привет! Изучаю c# по учебнику Шилдта, также разбираю примеры из него. Из примера ниже мне непонятно. Зачем здесь использовать...

ДК для чайника
Мой друг попросил меня помочь ему подобрать ДК 5.1, но не по отдельности, а как говориться в "одной коробке". Его интересует...

QT для чайника
Хочу выучить QT, можете дать примеры программ (на уровень чайник в QT)

81
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
12.01.2010, 18:49  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Не с того конца вы все это лепите...
1) загрузочный сектор у меня уже есть
2) у меня есть код некого подобия фар-командера, коотрый читает файлы с дискеты из под доса.
3) есть код и прога, которая читает нтфс диски из под биоса.
Сейчас я хочу, чтобы после загрузки, загрузочный сектор передал управление ена пункт 2) и открыл содержимое дискеты.
Напишите тогда как Вы видите построение ОС?
Можете описать как делается ОС? Полностью по пунктам. Ну я не говорю о сложной. Ну уровня ДОС, но только если убрать оттуда все кроме возможности каталоги отображать?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21282 / 8307 / 637
Регистрация: 30.03.2009
Сообщений: 22,669
Записей в блоге: 30
12.01.2010, 19:19
> 2) у меня есть код некого подобия фар-командера, коотрый читает файлы с дискеты из под доса

Этот командер нужно запускать в досе, а не в твоей самодельной ОС

> Можете описать как делается ОС?

Начальные шаги я тебе ужи описывал. Разве что дописать нужно "забудь про любые существующие программы, которые работают под какую-то конкретную ОС". Потому как без переделок на твоей ОС они не запустятся (либо ты сделаешь поддержку дос'овских прерываний)
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
12.01.2010, 19:30  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
(либо ты сделаешь поддержку дос'овских прерываний)
А єти прерівания на самом деле реализованы через ф-и биоса или нет?
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
12.01.2010, 19:32
Эти прерывания реализованы в досе с участием биоса, программистами из майкрософта долгими американскими вечерами
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
12.01.2010, 19:45  [ТС]
Хорошо. Вот я написал загрузочный сектор. Теперь нужно писать ядро? И передавать на него управление, да? А что должон делать ядро? Ну конкретно.

Добавлено через 10 минут
Допустим я мспользую диалог с пользователем как в ДОСе, тогда достаточно кода, который выложил Goodwin98. Правильно? Теперь мне нужно написать драйвер для обработки мыши, допустим, или видеокарты. Написать хелп, написать чтение диков?
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
12.01.2010, 19:55
Может быть, как сказал, Evg
Цитата Сообщение от Evg Посмотреть сообщение
Сформируй внутри своего ядра некую точку входа или процедуру, которая бы работала аналогично printf'у в минимально необходимом объёме и с максимально простым интерфейсом. Добейся того, чтобы у тебя "экран" работал как нормальный терминал: т.е. в нём нормально работали переносы строк, прокрутка текста вверх по достижении нижнего края экрана. Без этой функции ты скорее всего не сможешь ничего отладить, т.к. никакие отладчики не будут доступны
Т.е. можно сделать, либо удобную надстройку над ф-циями биоса для этой цели (проще) или делать все самому, работая с видеопамятью.
Иначе даже просто чтобы вывести строку текста, нужно будет кучу строк кода.

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

Цитата Сообщение от galileopro Посмотреть сообщение
Теперь мне нужно написать драйвер для обработки мыши
Без мыши я думаю можно и обойтись

Цитата Сообщение от galileopro Посмотреть сообщение
допустим, или видеокарты.
Если нужно будет рисовать, например, окна из псевдографики, то для этого лучше сделать отдельную подпрограмму.
Цитата Сообщение от galileopro Посмотреть сообщение
написать чтение диков?
Да причем сделать для каждой из ФС отдельный модуль. С каким-нибудь интерфейсом, чтобы файловый менеджер не сильно задумывался что ему делать, чтобы получить список файлов в каталоге. Причем это, возможно, хотя бы для дискеты, стоит начать даже до графики.

Естественно все это имхо, т.к. я никогда не писал серьезные ОС и вы можете делать по-своему.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
12.01.2010, 20:01  [ТС]
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Сформируй внутри своего ядра некую точку входа или процедуру, которая бы работала аналогично printf'у в минимально необходимом объёме и с максимально простым интерфейсом.
Я без понятия как написать точку входа. И что нужно передавать этому printf? Его надо в длл засовывать или можно прямо в ядре писать? И что вообще такое ядро? Чем оно отличается от загрузчика?

Добавлено через 2 минуты
Загрузчик сам вообще что делает? Где это все почитать? Он после того как выполняется передает управление на ядро или куда угодно?
0
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
12.01.2010, 20:23  [ТС]
Вот я нашел исходники довольно несложной ОС на масме. Некий аналог лоса но проще. Можно взять её за основу? OS.rar
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
12.01.2010, 20:33
Цитата Сообщение от galileopro Посмотреть сообщение
Я без понятия как написать точку входа. И что нужно передавать этому printf?
Не так все сложно... Просто например
Assembler
1
2
3
mov dx,offset stroka
mov ah,9
int 21h
Так он может вызываться. А на 21h - прерывание повесить обработчик, который будет посимвольно копировать строку из stroka на экран, пока не встретит ноль.

Добавлено через 48 секунд
Цитата Сообщение от galileopro Посмотреть сообщение
Загрузчик сам вообще что делает?
Загрузчик занимается тем, что загружает ядро и передает ему управление

Добавлено через 4 минуты
Цитата Сообщение от galileopro Посмотреть сообщение
Вот я нашел исходники довольно несложной ОС на масме. Некий аналог лоса но проще. Можно взять её за основу? OS.rar
Ну вот. Так сразу, конечно, сказать нельзя, но судя по всему в ней есть и менеджер памяти, и дисковый ввод-вывод, и оболочка, и еще много всего. Обратите так же внимание, как все функции разбиты на отдельные файлы. Это и есть модули.
Однако, очень сильно простой я бы ее не назвал, но за основу взять я думаю можно, если не сдавать прямо её же.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
12.01.2010, 20:36  [ТС]
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Загрузчик занимается тем, что загружает ядро и передает ему управление
Тогда что делает ядро?
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Так он может вызываться. А на 21h - прерывание повесить обработчик, который будет посимвольно копировать строку из stroka на экран, пока не встретит ноль.
Спасибо огромное. Иеперь я понял о чем речь.
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Ну вот. Так сразу, конечно, сказать нельзя, но судя по всему в ней есть и менеджер памяти, и дисковый ввод-вывод, и оболочка, и еще много всего. Обратите так же внимание, как все функции разбиты на отдельные файлы. Это и есть модули.
Однако, сильно просто ее назвать нельзя.
Посмотрите её чуть подробнее, пожалуйста. Она маленькая вроде. Мне важно мнение пронеё. Очень.
0
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
12.01.2010, 22:18  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Dosbox, насколько я знаю, эмулятор пользовательского уровня (т.е. эмулирует "машина + ОС"). А тебе нужен чистый эмулятор машины (VMware или подобное). Хотя даже не чистый эмулятор машины, а машины с bios'ом (хотя у VMware это дело вроде бы есть)
Попробовал VMware. Не запустилась эта ОС. Как её на дискету записать? Я записал в корень KERNEL.COM и остальные файлы просто скопировал на дискету. Но оно не запускается. Хотя она рабочая. Вот я подправил кодировку файлов OS.rar

И как её перекомпилировать, если я поменяю что-то?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21282 / 8307 / 637
Регистрация: 30.03.2009
Сообщений: 22,669
Записей в блоге: 30
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 минут
Всё, что описано выше - как я уже говорил, называется программным соглашением. Это свойство операционной системы и всё это дело должно быть описано в программной документации для ОС. И все программисты, пишущие под эту ОС должны придерживаться именно этих соглашений.

Когда ты пишешь программу, ты не занимаешься формированием ручками значений в регистрах. Это всё спрятано внутри библиотеки, которая поставляется вместе с ОС. Там есть примитивы низкого уровня. Например (применительно к нашему коду):

C
1
2
extern void write (const char *ptr, int size);
extern void exit (int code);
Функция write формирует в регистре ax единицу, в регистре bx записывает параметр ptr, в регистре cx записывает параметр size и дёргает "int 21h". Аналогично работает exit. Таким образом, те, кто НЕ занимается непосредственно низкоуровневым программированием, просто вызывают функции write и exit и совершенно не заморачиваются тем, как устроены программные соглашения. Более того, эти write и exit есть и для Windows, и для других ОС, но они имеют другие внутренности. Но те, кто использует из в виде функций (у которых одинаковый интерфейс на языке Си на всех платформах), по сути дела пишут код, который содержит внутри себя вызовы этих низкоуровневых функций. Функция printf в конечном итоге тоже работает через write. При таком многоуровневом построении интерфейсов код printf ("Hello world"); у тебя будет работать одинаково на любой платформе. При этом вся платформо-зависимая часть спрятана в библиотечном вызове write

В нашем случае я условно написал, что номер передаётся в ax, а параметры в bx, cx, ... реально всё это можно передавать через стек, или через фиксированные адреса в памяти. Т.е. для самой первой реализации сделай так, как проще, но когда появятся хоть какие-то более-менее реальные очертания ОС, уже можно придумывать конкретную реализацию. Проще всего сделать по аналогии с DOS'ом. В этом случае в конечном итоге может даже получится запустить простейшую DOS'овскую программу на твоей ОС

Нажмё всё-таки "Ответить", чтобы текст не потерялся
13
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
12.01.2010, 23:22  [ТС]
Спасибо. Ох насколько єто сложнее, чем просто писать программі на масме под ДОС или винду) Ладно. Буду переваривать.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21282 / 8307 / 637
Регистрация: 30.03.2009
Сообщений: 22,669
Записей в блоге: 30
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 минуту
Цитата Сообщение от galileopro Посмотреть сообщение
Спасибо. Ох насколько єто сложнее, чем просто писать программі на масме под ДОС или винду) Ладно. Буду переваривать.
Когда пишешь программу, то у тебя по сути исполняется код в том порядке, в котором ты написал. В случае работы ОС там постоянно происходят всякие прерывание и управление скачет из одного места в другое. К этому по началу очень сложно привыкнуть и осознать
13
0 / 0 / 0
Регистрация: 24.01.2016
Сообщений: 13
24.01.2016, 13:54
Цитата Сообщение от galileopro Посмотреть сообщение
Но я не могу разобраться как её скомпилировать.
Скорей сделай программу установки типа:
"УСТАНОВКА имя ОС
лицензия...
распаковка файлов...
перезагрузка...
лицензионный ключ(можно и без него)
перезагрузка...
пожалуйста подождите...
инструкция
перезагрузка...
ВСЁ!!!"а дальше я тебе помогу!
вот что там "netbooot1.gif" это сделай сайт или хотя бы собери сервер и можно загружать твою ОС с сервера (почитай "веб-сервер.doc")
Миниатюры
Своя ОС для чайника  
Изображения
 
Вложения
Тип файла: docx веб-сервер.docx (14.8 Кб, 7 просмотров)
0
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 6
30.05.2016, 02:56
Цитата Сообщение от Evg Посмотреть сообщение
Пользовательская задача НЕ будет храниться на диске в виде отдельной программы, а будет зашита в код ОС.
Продолжу тему. Задача : Нужна ОС для выполнения единственной программы, которая работает с портами COM и LPT.
Просто потому, что из под 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
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8675 / 4512 / 1670
Регистрация: 01.02.2015
Сообщений: 13,946
Записей в блоге: 13
30.05.2016, 06:56
Если у компа не планируется связи с "внешним миром" кроме как через COM и LPT порты - может взять контроллер (stm, avr,...), даже какую-нибудь готовую плату (Raspbery Pi, Arduino,...)?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21282 / 8307 / 637
Регистрация: 30.03.2009
Сообщений: 22,669
Записей в блоге: 30
30.05.2016, 08:56
Цитата Сообщение от A32 Посмотреть сообщение
Просто потому, что из под Windows до них добраться сложно
Думаю, будет на порядки быстрее разобраться, как добираться до портов из-под операционной системы (как это делают все нормальные люди) чем тратить ООЧЕНЬ много времени на написание софтины, работающей без операционки
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
01.06.2016, 21:53
Цитата Сообщение от A32 Посмотреть сообщение
эта ОС должна на современных процессорах, грузиться с дискеты.
На материнских платах к современным процессорам уже нет поддержки FDD.
Цитата Сообщение от A32 Посмотреть сообщение
какая разрядность команд/операндов должна быть? )
Какой хочешь, такой и оперируй. Какой вопрос - такой ответ.
Цитата Сообщение от A32 Посмотреть сообщение
Т.е. можно ли написать загрузчик в Debug из под DOS
Можно, но проще использовать современные ОС и адекватные средства отладки загрузчиков (тот же Bochs).
Цитата Сообщение от A32 Посмотреть сообщение
как считать всё остальное?
С помощью дисковых сервисов BIOS.
Цитата Сообщение от A32 Посмотреть сообщение
если только сам BIOS её не прописываеn
прописывает.
Цитата Сообщение от A32 Посмотреть сообщение
Если нет векторов прерываний, то как получить адреса портов?
Не вижу вообще никакой связи между адресами портов и таблицей векторов прерываний. На современных компьютерах порты COM и LTP обычно реализуются через платы расширения PCI. Соответственно адреса ресурсов надо брать из конфигурационного пространства PCI. Про USB расширители забудь: с твоим уровнем знаний не осилишь.
Цитата Сообщение от A32 Посмотреть сообщение
Не то, что бы тупик, но нужен совет.
Читать матчасть.
Цитата Сообщение от Evg Посмотреть сообщение
Думаю, будет на порядки быстрее разобраться, как добираться до портов из-под операционной системы
Все зависит от конечной цели.
0
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 6
04.06.2016, 01:12
Цитата Сообщение от Evg Посмотреть сообщение
(как это делают все нормальные люди)
Я и не притворяюсь.
Цитата Сообщение от shmkv Посмотреть сообщение
Про USB расширители забудь: с твоим уровнем знаний не осилишь.
И специалиста из себя не строю. Просто заинтересовался этой темой и начал с начала, с DOS и FDD.
Решил выяснить, как работает стандартный загрузчик.
И тут выясняются интересные вещи: к примеру - сигнатура АА55 есть на всех дискетах, как системных, так и не.
"Non system disk or disk error" выводит код с самой дискеты и, следовательно, таблица векторов прерываний в памяти уже есть.
Цитата Сообщение от shmkv Посмотреть сообщение
Не вижу вообще никакой связи между адресами портов и таблицей векторов прерываний.
Я, когда это писал, был уверен в наличии прерывания, возвращающего адрес порта. Но перепутал с сервисом DOS, который просто возвращает адрес вектора.
Цитата Сообщение от shmkv Посмотреть сообщение
Соответственно адреса ресурсов надо брать из конфигурационного пространства PCI
И как это сделать? Т.е.
конфигурационное пространство PCI находится в оперативной памяти? Если да, то по какому адресу? Как его узнать?
Цитата Сообщение от shmkv Посмотреть сообщение
Читать матчасть.
Читаю, но до 64 разр. ещё не добрался.
Цитата Сообщение от shmkv Посмотреть сообщение
На материнских платах к современным процессорам уже нет поддержки FDD.
Т.е. 64 разр. процессоры 16 разрядный код не воспринимают? И загрузчик должен быть с 32 (64) разрядным кодом?
Если да, то ЗАЧЕМ это надо ??? Замена 16 разр. проц. на 32 понятна, но замена 32 на 64 нет. Оффтоп, конечно, но дайте ссылку на тему, если такая тема есть.

Добавлено через 31 минуту
Да, кстати, сюжет из жизни: Митино, лавка по железу. Захожу, вопрос:
"материнка под 32 разрядный проц есть? И проц?" Ответ:
- Сокет какой?
- любой под 32 разр. проц.
- ?????????????
Вопрос не поняли. Лавка по железу. Кто здесь нормальный?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.06.2016, 01:12

Литература для чайника для понимания VCL
Добрый день. Заинтересовался, как Delphi "рисует" компоненты VCL. То есть есть желание чуток модифицировать ComboBox Чтоб...

Atoi для чайника
Условие задания под спойлером. Данные берутся из input.txt, записываются в output.txt Дана необходимая сумма M, стартовая сумма M0...

Assembler для чайника
Добрый день ребята. Начал изучение Ассемблера и столкнулся с проблемой непониманий ни синтаксиса ни самой структуры языка... Прошу вашей...

ООП для чайника
Только начинаю изучать ООП в среде Lazarus, и есть у меня задача Создать 6 разных часов, движущихся по форме, реализовать в ООП ...

Интеграл для чайника
Найти неопределённый интеграл. Не пойму, как тут сократить, и что к чему прибавить.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Установка 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). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru