Всем доброго вечера! Хотелось бы мне чисто для удовлетворения своих желаний написать что-то типа примитивной операционной системы, которая будет бесполезной. Однако я получу неоценимый опыт. При включении компьютера, выполняется код (не помню по какому адресу), собственно выполняется код BIOS'а на тестирование системы. Следом программа пытается прочесть с любого для неё доступного устройства первые 512 байт информации (флоппи-дискета, CD-дисковод, DVD-дисковод, USB-флешка). После прочтения он загружает эти 512 байт в память и передаёт туда управление. Пускай есть код, который переводит процессор в 32-битный режим и выводит на экран какое-то сообщение. Этот код записан в первых 512 байтах на флоппи-дискетке или на USB-флешке. При включении компьютера, процессора начинает работать в реальном режиме, где доступно 16 бит адресации, то есть 65536 байт (8192 килобайт, либо 8 мегабайт). Так в какую же область памяти процессор скопирует код с устройства (флоппи-дискетка, USB-флешка)? Прямо в самое начало 0x0000 или в какое-то конкретное место? Можно ли как-нибудь указать процессору с какого именно диапазона ему вставлять в памяти код? Вот код скопирован в память, как обычно бывает, загрузчик считывает с устройства ещё сколько нужно секторов и они идут следом за первыми 512 байтами обязательно или их как-то можно в любом месте из 65536 байт разместить и потом передать туда управление? Вот пускай всё что нужно скопировано и лежит в памяти. Коду передано управление. Код выполняет перевод процессора в защищённый 32-битный режим. При этом откроется 32-битная адресация и размер памяти может быть уже 4294967296 байт (4194304 килобайт, 4096 мегабайта, либо 4 гигабайта). Так уже в защищённом режиме, если по какому адресу будет находится начало выполняемого кода? То есть оно будет лежать по тому же адресу что и было в реальном режиме, оно стирается или процессор копирует в какой-то адрес все инструкции? Теперь мы в защищённом режиме, глобальные таблицы дескрипторов, прерываний и прочего...всё это мы можем размещать в любом месте памяти и не обязательно подряд же? А как указать чтобы этот код лежал по такому адресу, а другой код по такому? Я имею ввиду чтобы я сам выбирал какие участки памяти чем забивать, а не подряд идти. Буду ждать Ваших ответов...
wsd Что за выражения? За словами следите. Смотрел я по поиску, но так нигде и не нашёл ответы на свои вопросы.
s3dworld Найдите книгу Таненбаум. Современные операционные системы. Начните с нее. А потом уже сюда за вопросами. Потому как задавая вопрос: Сразу говорит о вашем незнании теории и матчасти. Ну а если по существу - этим всем заведует биос. В нем вся информация о том с чего грузить, откуда и с каких адресов. Он для вас будет стартом. А дальше уже зависит от вас. Если вы перепишете биос, то возможно ваш биос сможет указать на другую область памяти где выполнять код загрузки. Но зачем? Есть стандарты, их надо придерживаться. И вообще про загрузчики тут много чего есть на форуме, а так же про ОС и не только. Это говорит о вашем незнании защищенного режима в принцыпе. В таблице дескрипторов описаны положения сегментов памяти различного назначения. Меняйте их как хотите. Если у вас страничная модель памяти, вы можете таблицы располагать где и как хотите, хоть в верхних хоть в нижних адресах ОП. Просто в CR3 грузите адрес вашей PDE и все. Адрес PDE задаете сами как хотите. Можете хоть 0 адрес , при этом настроив таблицу трансляции адресов например на 0х10000 адрес. И при обращении 0 будет транслироваться в 0х10000. Тока такие извращения ни к чему - это все равно что себе спицы в 1 место засовывать, потом замучаетесь.
TermoSINteZ Я имел ввиду не извращаться с памятью, а вот хотел просто узнать, все таблицы служебные где должны храниться? То есть в самом начале памяти или где угодно сам располагаю? Вот скажем у меня будет код: Code (Text): mov EAX,0x22446688 Предположим это и есть вся моя программа. Так как же я смогу эту команду разместить, скажем по адресу FFAA0012 и передать туда управление?
товарищ s3dworld в Ваш адрес не было вылито ничего обидного или не цензурного, а дан дельный совет. если у Вас повышенная нежность - это Ваши проблемы. а Ваш запощенный вопрос смахивает на просьбу "почитать книжку в слух", так что это Вам за словами следить надо.
s3dworld Прежде чем писать даже примитивную ось, стоит всё же научиться просто программировать на ассемблере. Иначе ничего Вы сделать не сможете: потонете в море информации. А заодно и подучить теорию. Например, сия Ваша фраза: говорит либо о том, что Вы не понимаете связь между разрядностью адресации, доступным адресным пространством, байтами и килобайтами, а также не знаете, как определяется адрес в реальном и защищённом режимах, либо о том, что Вы не можете внятно изложить собственные мысли. А вот эта фраза: говорит не только о том, что Вы не знаете, как происходит начальная загрузка ПК, но, что куда хуже, плохо понимаете, как работает процессор. Так что начинать надо с самых азов, а не замахиваться на что-то грандиозное. Пы.Сы. Написал без всякого наезда, а лишь для того, чтобы обратить Ваше внимание на совершеннейшее несоответствие Ваших нынешних знаний с задачей, которую Вы себе сейчас поставили.
wsd Что за сочкуешь?! Здорово когда просишь помощи у опытных людей (так как я в этом деле полный НОЛЬ), и тут тебе говорят: А вот материться не стоит. Вам первое предупреждение. Второе закончится в банановой стране....
SII Не хочу сказать что я полный ноль в ассемблере, писал программы. Самое крупное моё достижение - это написал операционно-независимую игру Змейка. Там был мой алгоритм рисования линий, управление от клавиатуры. Разрешение 1024x768. Работа была в реальном режиме В общем всё просто. А вот на счёт познаний в работе самого компьютера (да и в процессоре тоже), то тут спорить не буду - знаю мало. Грандиозное ничего писать не хочу. Просто для себя хотел бы сделать что-то типа без страничной адресации, один сектор памяти и на код, и на данные. И примитивный GUI. Чтобы при запуске у меня окно какое-то появилось. Да вот и всё.
s3dworld это не обидное слово, я тоже бывает сочкую, но не за счёт других. ты можеш открыть главную страницу сайта и найти там цикл статей "процессор в защищённом режиме"? и также другии статьи и исходники. нужно брать на себя посильные задачи и планомерно двигаться вперёд.
Извиняюсь что сошёл с катушек. wsd Читал я те статьи, и если честно, то там всё плохо описано (по крайней мере что-то понимаю, а что-то вообще нет). К тому же ошибки бывают. Написал автору на почту...так и не ответил.
s3dworld А откуда тогда: Конечно, 8192 Кбайт = 8 Мбайтам, но 65536 байт = 64 Кбайтам, а никак не 8192. Кроме того, в реальном режиме адресуется 1 Мбайт, а не 64 Кбайта. Так что с пониманием принципов формирования физического адреса у Вас имеются проблемы... Вообще-то не операционно-независимая, а системно-независимая (system-independent, если по-буржуйски). Ну а кто рисовал точки и отслеживал нажания на клавиши? Ваша программа или BIOS? Это две оччень большие разницы (хотя б потому, что функции BIOS можно использовать, абсолютно не понимая, как та же клава общается с компутером, а вот сделать полностью свою обработку без понимания этих вещей уже проблематично -- разве что украсть у кого-то готовый код и использовать его, не понимая принципов его работы). В памяти секторов нет, секторы есть на дисках. Разницы между кодом и данными никакой нет ни для диска, ни для памяти, ни даже для процессора: он это выясняет по ходу дела (должен исполнить команду по какому-то адресу -- значит, рассматривает информацию, размещённую по этому адресу, как код команды; встретил команду, считывающую данные из какого-то места памяти -- рассматривает информацию по этому адресу как данные). А "примитивный ГУИ" -- это не просто чтобы окно появилось. Нужна ещё куча всего, чтобы это можно было назвать гуем, пускай и примитивным; вывод статической картинки на экран -- это ещё не гуй.
s3dworld На ассемблере? Покажите плиз. Почитайте теорию пожалуйста. Вы наверно хотели сказать сегмент? АДД: Это уже ближе к делу. Пишите сюда, что вы не поняли из статей и про какие ошибки вы говорите. Мы поможем.
SII Извиняюсь, ошибся в расчётах. 2 в 16 степени = 65536 байт (64 килобайт). Да, всё через BIOS делал. TermoSINteZ Да, сегмент. Кода у меня того давно нет. Я всё что делаю никогда не сохраняю. Не знаю, привык так. делаю для опыта, а не для того чтобы что-то показывать. Не правильно это, нужно изменить политику.
s3dworld Мной по молодости лучше всего воспринимались азы защищенного режима в исполнении Фроловых. (Александр Фролов, Григорий Фролов "Защищенный режим процессоров Intel 80286/80386/80486") Ссылко не размещаю, ибо варез Там изложено очень примитивно, и может где-то даже устарело, но доходчиво. Хотя такой литературу - моря.
Ну, прежде чем браться за защищённый, надо хорошо разобраться с реальным, тем более что при написании чего-то более-менее продвинутого придётся прыгать из реального в защищённый и обратно...
Вообще, как мне кажется, мне можно обойтись и просто реальным режимом. Так как вряд ли я смогу написать что-то, что будет использовать так много физической памяти. Просто пиксели лучше рисовать будет не через функции BIOS'а, а в прямую в видео-память. Но всё же хочется уметь работать во всю мощь процессора.
s3dworld Это вам не надо. Правильно. Научитесь работать напрямую с видеопамятью. Это будет ваше первое задание. Ну а потом уже сделайте менеджер окон и обработку мыши (хотя можно без мыши, стрелочками на клаве хотя бы для начала).
Помню была у меня книжка Кулакова для таких случаев. Была ещё одна книжка, где учат через функции DOS'а, BIOS'а и через порты. Какие есть ещё хорошие?