Как создать свою операционную систему на компьютер


Пишем свою ОС: Выпуск 1 / Хабр

Данный цикл статей посвящён низкоуровневому программированию, то есть архитектуре компьютера, устройству операционных систем, программированию на языке ассемблера и смежным областям. Пока что написанием занимаются два хабраюзера — iley и pehat. Для многих старшеклассников, студентов, да и профессиональных программистов эти темы оказываются весьма сложными при обучении. Существует много литературы и курсов, посвящённых низкоуровневому программированию, но по ним сложно составить полную и всеохватывающую картину. Сложно, прочитав одну-две книги по ассемблеру и операционным системам, хотя бы в общих чертах представить, как же на самом деле работает эта сложная система из железа, кремния и множества программ — компьютер.

Каждый решает проблему обучения по-своему. Кто-то читает много литературы, кто-то старается поскорее перейти к практике и разбираться по ходу дела, кто-то пытается объяснять друзьям всё, что сам изучает. А мы решили совместить эти подходы. Итак, в этом курсе статей мы будем шаг за шагом демонстрировать, как пишется простая операционная система. Статьи будут носить обзорный характер, то есть в них не будет исчерпывающих теоретических сведений, однако мы будем всегда стараться предоставить ссылки на хорошие теоретические материалы и ответить на все возникающие вопросы. Чёткого плана у нас нет, так что многие важные решения будут приниматься по ходу дела, с учётом ваших отзывов.

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

Мы будем предполагать, что читатель уже знаком с основами языков ассемблер и Си, а также элементарными понятиями архитектуры ЭВМ. То есть, мы не будем объяснять, что такое регистр или, скажем, оперативная память. Если вам не будет хватать знаний, вы всегда можете обратиться к дополнительной литературе. Краткий список литературы и ссылки на сайты с хорошими статьями есть в конце статьи. Также желательно уметь пользоваться Linux, так как все инструкции по компиляции будут приводиться именно для этой системы.

А теперь — ближе к делу. В оставшейся части статьи мы с вами напишем классическую программу «Hello World». Наш хеллоуворлд получится немного специфическим. Он будет запускаться не из какой-либо операционной системы, а напрямую, так сказать «на голом железе». Перед тем, как приступить непосредственно к написанию кода, давайте разберёмся, как же конкретно мы пытаемся это сделать. А для этого надо рассмотреть процесс загрузки компьютера.

Итак, берем свой любимый компьютер и нажимаем самую большую кнопочку на системном блоке. Видим веселую заставку, системный блок радостно пищит спикером и через какое-то время загружается операционная система. Как вы понимаете, операционная система хранится на жёстком диске, и вот тут возникает вопрос: а каким же волшебным образом операционная система загрузилась в ОЗУ и начала выполняться?

Знайте же: за это отвечает система, которая есть на любом компьютере, и имя ей — нет, не Windows, типун вам на язык — называется она BIOS. Расшифровывается ее название как Basic Input-Output System, то есть базовая система ввода-вывода. Находится BIOS на маленькой микросхемке на материнской плате и запускается сразу после нажатия большой кнопки ВКЛ. У BIOS три главных задачи:

  1. Обнаружить все подключенные устройства (процессор, клавиатуру, монитор, оперативную память, видеокарту, голову, руки, крылья, ноги и хвосты…) и проверить их на работоспособность. Отвечает за это программа POST (Power On Self Test – самотестирование при нажатии ВКЛ). Если жизненно важное железо не обнаружено, то никакой софт помочь не сможет, и на этом месте системный динамик пропищит что-нибудь зловещее и до ОС дело вообще не дойдет. Не будем о печальном, предположим, что у нас есть полностью рабочий компьютер, возрадуемся и перейдем к рассмотрению второй функции BIOS:
  2. Предоставление операционной системе базового набора функций для работы с железом. Например, через функции BIOS можно вывести текст на экране или считать данные с клавиатуры. Потому она и называется базовой системой ввода-вывода. Обычно операционная система получает доступ к этим функциям посредством прерываний.
  3. Запуск загрузчика операционной системы. При этом, как правило, считывается загрузочный сектор — первый сектор носителя информации (дискета, жесткий диск, компакт-диск, флэшка). Порядок опроса носителей можно задать в BIOS SETUP. В загрузочном секторе содержится программа, иногда называемая первичным загрузчиком. Грубо говоря, задача загрузчика — начать запуск операционной системы. Процесс загрузки операционной системы может быть весьма специфичен и сильно зависит от её особенностей. Поэтому первичный загрузчик пишется непосредственно разработчиками ОС и при установке записывается в загрузочный сектор. В момент запуска загрузчика процессор находится в реальном режиме.

Печальная новость: размер начального загрузчика должен быть всего 512 байт. Почему так мало? Для этого нам надо ознакомиться с устройством дискеты. Вот познавательная картинка:

На картинке изображена поверхность дискового накопителя. У дискеты 2 поверхности. На каждой поверхности есть кольцеобразные дорожки (треки). Каждый трек делится на маленькие дугообразные кусочки, называемые секторами. Так вот, исторически сложилось, что сектор дискеты имеет размер 512 байт. Самый первый сектор на диске, загрузочный сектор, читается BIOS'ом в нулевой сегмент памяти по смещению 0x7С00, и дальше по этому адресу передается управление. Начальный загрузчик обычно загружает в память не саму ОС, а другую программу-загрузчик, хранящуюся на диске, но по каким-то причинам (скорее всего, эта причина — размер) не влезающую в один сектор. А поскольку пока что роль нашей ОС выполняет банальный хеллоуворлд, наша главная цель — заставить компьютер поверить в существование нашей ОС, пусть даже и на одном секторе, и запустить её.

Как устроен загрузочный сектор? На PC единственное требование к загрузочному сектору — это содержание в двух его последних байтах значений 0x55 и 0xAA — сигнатуры загрузочного сектора. Итак, уже более-менее понятно, что нам нужно делать. Давайте же писать код! Приведённый код написан для ассемблера yasm.

section .text use16 org 0x7C00 ; наша программа загружается по адресу 0x7C00 start: mov ax, cs mov ds, ax ; выбираем сегмент данных mov si, message cld ; направление для строковых команд mov ah, 0x0E ; номер функции BIOS mov bh, 0x00 ; страница видеопамяти puts_loop: lodsb ; загружаем очередной символ в al test al, al ; нулевой символ означает конец строки jz puts_loop_exit int 0x10 ; вызываем функцию BIOS jmp puts_loop puts_loop_exit: jmp $ ; вечный цикл message: db 'Hello World!', 0 finish: times 0x1FE-finish+start db 0 db 0x55, 0xAA ; сигнатура загрузочного сектора 

Эта короткая программа требует ряда важных пояснений. Строка org 0x7C00 нужна для того, чтобы ассемблер (имеется в виду программа, а не язык) правильно рассчитал адреса для меток и переменных (puts_loop, puts_loop_exit, message). Вот мы ему и сообщаем, что программа будет загружена в память по адресу 0x7C00.
В строках

 mov ax, cs mov ds, ax 

происходит установка сегмента данных (ds) равным сегменту кода (cs), поскольку в нашей программе и данные, и код хранятся в одном сегменте.

Далее в цикле посимвольно выводится сообщение «Hello World!». Для этого используется функция 0x0E прерывания 0x10. Она имеет следующие параметры:
AH = 0x0E (номер функции)
BH = номер видеостраницы (пока не заморачиваемся, указываем 0)
AL = ASCII-код символа

В строке «jmp $» программа зависает. И правильно, незачем ей выполнять лишний код. Однако чтобы компьютер опять заработал, придется перезагрузиться.

В строке «times 0x1FE-finish+start db 0» производится заполнение остатка кода программы (за исключением последних двух байт) нулями. Делается это для того, чтобы после компиляции в последних двух байтах программы оказалась сигнатура загрузочного сектора.

С кодом программы вроде разобрались, давайте теперь попробуем скомпилировать это счастье. Для компиляции нам понадобится, собственно говоря, ассемблер — выше упомянутый yasm. Он есть в большинстве репозиториев Linux. Программу можно откомпилировать следующим образом:

$ yasm -f bin -o hello.bin hello.asm

Полученный файл hello.bin нужно записать в зарузочный сектор дискеты. Делается это примерно так (разумеется, вместо fd нужно подставить имя своего дисковода).

$ dd if=hello.bin of=/dev/fd

Поскольку далеко не у всех остались дисководы и дискеты, можно воспользоваться виртуальной машиной, например, qemu или VirtualBox. Для этого придётся сделать образ дискеты с нашим загрузчиком и вставить его в «виртуальный дисковод».
Создаём образ диска и заполняем его нулями:

$ dd if=/dev/zero of=disk.img bs=1024 count=1440

Записываем в самое начало образа нашу программу:

$ dd if=hello.bin of=disk.img conv=notrunc

Запускаем полученный образ в qemu:

$ qemu -fda disk.img -boot a

После запуска вы должны увидеть окошко qemu с радостной строчкой «Hello World!». На этом первая статья заканчивается. Будем рады увидеть ваши отзывы и пожелания.

Литература

  1. По языку ассемблера:
  2. По языку Си:
    • Керниган Б., Ритчи Д. «Язык программирования C»
    • Шилдт Г. «Полный справочник по C»
  3. По устройству операционных систем:
    • Таненбаум Э. «Современные операционные системы»
    • Таненбаум Э. «Операционные системы: Разработка и реализация»
    • Олифер В., Олифер Н. «Сетевые операционные системы»
    • http://osdev.org
  4. По архитектуре ЭВМ:
    • Таненбаум Э. «Архитектура компьютера»
    • Гук М. «Аппаратные средства IBM PC. Энциклопедия»
    • Петцольд Ч. «Код. Тайный язык информатики»
  5. Справочная информация

Пишем операционную систему. Часть 1. Загрузчик / Хабр

Всем привет! Сегодня мы напишем загрузчик, который будет выводить «Hello World» и запустим его на VirtualBox. Писать будем на ассемблере FASM. Скачать его можно отсюда. Также нам понадобится собственно VirtualBox и UltraISO. Перед тем как писать код, разберемся как загружаются операционные системы.

Итак, когда мы нажимаем большую кнопку включения на нашем компьютере запускается система, которая есть на любом компьютере — BIOS (Basic Input/Output System или базовая система ввода/вывода). Задача BIOS это:


  1. Обнаружить все подключенные устройства и проверить их на работоспособность. За это отвечает программа POST (Power On Self Test, самотестирование при включении). Если жизненно необходимое железо не обнаружено, то системный динамик (если таковой имеется) пропищит что-то непонятное и дальше загрузка не пойдет.
  2. Предоставить операционной системе функции для работы с железом.
  3. Считать самый первый сектор загрузочного устройства в нулевой сегмент оперативной памяти по смещению 0x7C00h и передать туда управление. 1 сектор на диске равен 512 байтам. Поэтому, наш загрузчик не должен превышать 512 байт. BIOS определяет, что сектор загрузочный по наличию в последних двух его байтах значений 0x55 и 0xAA.

Теперь можно приступать к написанию кода. Запускаем файл FASMW.EXE, который находится в архиве с FASM-мом и вставляем туда следующий код:
org 7C00h start: cli ;Запрещаем прерывания (чтобы ничего не отвлекало) xor ax, ax ;Обнуляем регистр ax mov ds, ax ;Настраиваем dataSegment на нулевой адрес mov es, ax ;Настраиваем сегмент es на нулевой адрес mov ss, ax ;Настраиваем StackSegment на нулевой адрес mov sp, 07C00h ;Указываем на текущую вершину стека sti ;Запрещаем прерывания ;Очищаем экран mov ax, 3 int 10h mov ah, 2h mov dh, 0 mov dl, 0 xor bh, bh int 10h ;Печатаем строку mov ax, 1301h mov bp, message mov cx, 12 mov bl, 02h int 10h jmp $ message db 'Hello World!',0 times 510 - ($ - $$) db 0 ;Заполнение оставшихся байт нулями до 510-го байта db 0x55, 0xAA ;Загрузочная сигнатура 

Этот код требует немного пояснений. Командой
org 7C00h

мы говорим, что код нужно загружать в ОЗУ по адресу 0x7C00. В строках
 mov ax, 3 int 10h 

мы устанавливаем видео режим 80х25 (80 символов в строке и 25 строк) и тем самым очищаем экран.
 mov ah, 2h mov dh, 0 mov dl, 0 xor bh, bh int 10h

Здесь мы устанавливаем курсор. За это отвечает функция 2h прерывания 10h. В регистр dh мы помещаем координату курсора по Y, а в регистр dl — по X.
 mov ax, 1301h mov bp, message mov cx, 12 mov bl, 02h int 10h

Печатаем строку. За это отвечает функция 13h прерывания 10h. В регистр bp мы помещаем саму строку, в регистр cx — число символов в строке, в регистр bl — атрибут, в нашем случае цвет, он будет зеленым. На цвет фона влияют первые 4 бита, на цвет текста — вторые 4 бита. Ниже представлена таблица цветов
0 - черный, 1 - синий, 2 - зеленый, 3 - желтый, 4 - красный, 5 - фиолетовый, 6 - коричневый, 7 - светло-серый, 8 - темно-серый, 9 - светло-синий, A - светло-зеленый, B - светло-желтый, C - светло-красный, D- светло-фиолетовый, E - светло-коричневый, F – Белый.

В строке
jmp $

Программа зависает.

Откомпилируем код нажатием клавиш Ctrl + F9 и сохраним полученный файл как boot.bin.

Запуск


Запускаем UltraISO и перетаскиваем наш бинарник в специальную область (отмечено красной стрелкой).

Далее кликаем правой кнопкой мыши по бинаринку и нажимаем кнопку примерно с такой надписью: «Установить загрузочным файлом». Далее сохраняем наш файл в формате ISO.
Открываем VIrtualBox и создаем новую виртуальную машину (если вы не знаете, как это делается, кликайте сюда). Итак, после того, как вы создали виртуальную машину, нажимаем «Настроить, выбираем пункт „Носители“, нажимаем на „Пусто“, там где „Привод“ есть значок оптического диска. Нажимаем на него и выбираем „Выбрать образ оптического диска“, ищем наш ISO файл, нажимаем „Открыть“. Сохраняем все настройки и запускаем виртуальную машину. На экране появляется наш „Hello World!“.

На этом первый выпуск подходит к концу. В следующей части мы научим наш загрузчик читать сектора диска и загрузим свое первое ядро!

Создание операционной системы на базе ядра linux. С нуля / Хабр

Рано или поздно каждый пользователь Линукса задумывается над созданием собственного дистрибутива. Некоторые аргументируют это тем, что можно «все настроить под себя». Другие сетуют на то, что среди уже представленных дистрибутивов в Ветке нет идеального. А у них, якобы, есть суперконцептуальные идеи для собственной системы. Зачем я всю эту психологию затеял? Для того, чтобы сразу перекрыть кислород играющимся с Линуксом новичкам, которым делать нечего. Если уж задумались над созданием ОС, думайте до конца. Итак,

Я хочу создать ОС на базе Linux.
Сразу предупреждаю: был бы XVIII век, всех тех, кто для основы своей будущей системы выбирает другой развитый дистрибутив (и, не дай Бог, популярный...) ждала бы виселица. Пост именно про создание системы с нуля, а значит, всякие Slax и Linux Mint мы трогать не будем.

Шаг 1. Выбор носителя
Вариантов немного: либо ваша ОС запускается с LiveCD, либо с жесткого диска, либо с флеш-устройства. Сразу оговорюсь: не скажу в посте ни слова про жесткий диск, потому что гораздо удобнее создавать гибкий дистрибутив из серии «все свое ношу с собой», либо залоченный дистрибутив на оптическом диске. Если вы научитесь создавать LiveCD или LiveUSB систему, с установкой на жесткий диск проблем не будет.

На всякий случай, приготовьте чистую флешку, CD-диск, и установите, наконец, Virtualbox.

Шаг 2. Компиляция ядра
По поводу выхода третьего ядра Linux, этот шаг воодушевляет на дальнейшие разработки… Итак, нам нужны исходники ядра. Каждый пользователь знает, что их можно достать на сайте kernel.org. Ни в коем случае, слышите?, никогда не прикручивайте к своей системе постороннее ядро, скомпилированное не вами!

Поскольку лень моя зашкаливала, я создал папку /linuxkernel и распаковал туда архив с исходниками. Залогинившись под рутом, я сделал следующее:

cd /linuxkernel
make menuconfig

В принципе, ядро можно конфигурировать тремя способами: make config (диалоговая конфигурация), make menuconfig (псевдографическая конфигурация через ncurses), а также make xconfig (графическая конфигурация). Суть в том, что make config испортит вам настроение надолго, т.к. он задаст все возможные вопросы по всем аспектам всех тем. Проблема с make xconfig встречается не у всех, но вот у меня встречалась и встречается. Если приспичило сделать через X, разбирайтесь сами. Оптимальный вариант — make menuconfig. Эта штука откроет вам псевдографический интерфейс, через который вы сможете настроить ядро на свой лад. Штука требует библиотеки ncurses, которая легко устанавливается.

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

Однако, направить вас все же придется. Перейдите по адресу File Systems ---> и поставьте необходимые звездочки. Буква M означает, что поддержка того или иного драйвера осуществляется с помощью подключения к ядру внешнего модуля (ненавижу их!). Нам понадобится также поддержка isofs, для чтения дисков. File Systems ---> CD-ROM/DVD Filesystems ---> ISO 9660 CDROM file system support. Можно еще поддержать древнедосовские системы.

Чмошные разработчики Mandriva забыли разрешить File systems ---> DOS/FAT/NT Filesystems ---> NTFS write support, и на одном из их дистрибутивов я мучился с доступом к древневиндовскому разделу.

Посмотрите Processor type and features ---> Processor family, мне порекомендовали выбрать Pentium-MMX.

Еще поройтесь в Device Drivers, полезно. Можете шутки ради понавыбирать там все и скомпилировать ядро весом > 50 Мб.

Далее. Ядро после загрузки себя должно загружать, собственно, систему. Либо из скомпилированных в себе файлов (используются во встраиваемых системах), либо из CPIO архива, сжатого чем-нибудь, либо из Initrd. Здесь вам не DOS, здесь не получится сразу сослаться на какой-нибудь init'овый файл в корневом каталоге диска или флешки. На самом деле получится, не слушайте дядю Анникса! Неправильно это, хоть в Интернете по этому поводу уже нехилая полемика ведется. В своей системе мы будем использовать initrd, т.к. это удобно, и не вызовет нецензурных выражений от сторонних разработчиков, в отличие от CPIO архива.

Ах, да, скомпилируйте ядро командой

make bzImage

Если у вас x86, найдете его по адресу /linuxkernel/arch/x86/boot/bzImage.

Для суровых челябинских программистов можно использовать Кросс-компайлинг…

Создание Ramdisk.

Теперь нам нужен initrd с установленной там простейшей оболочкой. Мы будем использовать busybox, потому что эта няша может все. Способ мы украдем у Роберто де Лео, создателя Movix (я бы даже уважать его начал, если бы не запредельная любовь к Perl):

dd if=/dev/zero of=/dev/ram0 bs=1k count=5000 - Создаем Ramdisk в оперативной памяти нашего компьютера.
mke2fs -m0 /dev/ram0 5000 - Форматируем Ramdisk в системе Ext2
mkdir /distro - Создаем папку
mount /dev/ram0 /distro - Монтируем в папку /distro

Все, теперь у нас есть Ramdisk, емкостью в 5 Мб. Можно и больше, только не нужно. В отличие от Томаса Матеджисека, я не собираюсь пичкать initrd модулями в Squashfs, сжатыми LZMA. Все, что необходимо, будет скомпилировано вместе с ядром. Да, это не очень логично и правильно, но мороки в сто раз меньше. А специально для тех, кто осуждает такой подход, можно разрешить опцию модульности в ядре: Enable loadable module support.

В нашем Ramdisk'е, смонтированном в /distro, есть такая папка, lost+found. Это потому, что мы отформатировали его в ext2. Ни в коем случае нельзя ее удалять, хоть она здесь вряд ли поможет, образ-то фиксированный. Нам бы busybox сначала поставить…

Установка Busybox
Вот почему у таких классных проектов такие отстойные сайты? Хотя… это уже не суть важно, если исходники скачаны и успешно распакованы в папку /busybox.

Сконфигурировать busybox можно так же:

cd /busybox
make menuconfig

Если вы еще не поняли, что это, объясню. Busybox заменяет тонны UNIX приложений, хранящихся в папках /bin, /sbin, /usr/bin, /usr/sbin. Вместо этого, создается только одно приложение: /bin/busybox, а на него создается куча ссылок в указанных выше папках. Установим busybox следующей командой:

make CONFIG_PREFIX=/distro install

Еще Busybox создаст файлы /sbin/init и зачем-то /linuxrc, чтобы ваша система корректно запустилась. Но не все необходимые папки были созданы. Так что завершаем все руками и создаем:

/distro/etc
/distro/lib
/distro/dev
/distro/mnt
distro/proc
/distro/root
/distro/tmp
/distro/root

Если что забыл — вспомните, т.к. директории эти забыть сложно.

Все бы хорошо, вот только busybox для работы требует библиотеки, которые нужно скопировать в наш дистрибутив. Очень легко узнать, какие:

ldd /distro/bin/busybox

Программа покажет нам библиотеки, требуемые для нашей оболочки. Сразу говорю: linux gate создается ядром и скопирован быть не может.

При копировании библиотек можно отсекать отладочную информацию (так Роберто советует):

objcopy --strip-debug откуда куда

Делаем из Линукса Линукс

Надо создать несколько системных текстовых файлов:

Нам нужен /etc/inittab. Удивлю вас: в начале жизни система даже не знает, что такое Root. У нас даже пользователь безымянный, но вот файл общесистемных низкоуровневых фич (ОНФ) должен присутствовать. Пилотное содержание файла следующее:

::sysinit:/etc/rc.d/rc.S

# Запустить оболочку в консоли.
::respawn:-/bin/sh

# Перезагрузка по нажатии на Ctrl+Alt+Del.
::ctrlaltdel:/sbin/reboot

# Команды, выполняемые перед выключением и перезагрузкой.
::shutdown:/sbin/swapoff -a >/dev/null 2>&1
::shutdown:/bin/umount -a -r >/dev/null 2>&1

Следующий файл — /etc/fstab. Это таблица, в которой описано, что и куда монтировать при загрузке. Вещь бесполезная! Нам нужно обязательно смонтировать proc, иначе вообще ничего работать не будет, так что в файле пишем:

none /proc proc defaults 0 0

Для mount нужен также файл /etc/mtab. Создайте его и оставьте пустым.

Но mount сделает все необходимое только тогда, когда мы явно его об этом попросим. А просить мы будем в том самом первозагрузочном файле /etc/rc.d/rc.S (rc.d — папка). Вежливо попросим:

#!/bin/ash

/bin/mount -av -t nonfs

Еще нам необходим файл профиля (b)(a)sh, тут вообще раздолье для фантазии. Создаем файл /etc/profile и заполняем следующим:

PATH="$PATH:/bin:/sbin:/usr/bin:/usr/sbin:"
LESS=-MM
TERM=linux
HOME=/root
PS1='> '
PS2='> '
ignoreeof=10
export PATH DISPLAY LESS TERM PS1 PS2 HOME ignoreeof

Понадобится также файл /etc/shell, в котором указано, что есть оболочка:

/bin/sh
/bin/ash
/bin/bash

Вот собственно и все. Можно записывать наш Ramdisk в файл.

mkdir /os - папка для "готового".
umount /dev/ram0 - размонтируем кусочек оперативной памяти.
dd if=/dev/ram0 of=/os/initrd bs=1k count=5000 - создаем файл.
gzip /os/initrd - сжимаем файл initrd

Создание загрузочной флешки

«Финишная прямая» нашей маленькой разработки. Берем флешку, вставляем, форматируем в vfat (можно и в ext, но не забывайте, что еще не все пользователи Windows застрелились).

На флешке создаем папку boot, в ней папки initrd и kernel.

Из папки /os копируем сжатый Ramdisk в папку boot/initrd на флешке, называем «main.gz». Из папки с исходниками ядра копируем bzImage в папку boot/kernel на флешке, называем «main.lk». Достаем файлы загрузчика Syslinux (в Интернете, либо из другого дистрибутива: тут не принципиально), а именно syslinux.bin, syslinux.boot, syslinux.cfg. Копируем их в корневой каталог нашей флешки. В файле syslinux.cfg пишем что-то подобное:

default mm
prompt 1
timeout 100
label mm
kernel /boot/kernel/main.lk
append initrd=/boot/initrd/main.gz load_ramdisk=1 ramdisk_size=5000 rw root=/dev/ram0
label mc
kernel /boot/kernel/main.lk
append initrd=/boot/initrd/custom.gz load_ramdisk=1 ramdisk_size=5000 rw root=/dev/ram0
label cm
kernel /boot/kernel/custom.lk
append initrd=/boot/initrd/main.gz load_ramdisk=1 ramdisk_size=5000 rw root=/dev/ram0
label cc
kernel /boot/kernel/custom.lk
append initrd=/boot/initrd/custom.gz load_ramdisk=1 ramdisk_size=5000 rw root=/dev/ram0
label hd
localboot 0x80

Тем самым мы поддержали кастомные initrd и ядро, которые, эксперимента ради, можно подключить к нашему дистрибутиву.

Узнаем, каким девайсом в системе является наша флешка (можно запустить mount без параметров и посмотреть). Это либо /dev/sdb1, либо /dev/sdc1, либо /dev/sdd1. Стоит отмонтировать флешку перед началом установки.

Устанавливаем syslinux (если пакета в системе нет, apt-get install syslinux):

syslinux -d путь_к_устройству

В корневом каталоге флешки должен появиться файл ldlinux.sys. Если он есть, значит syslinux.bin, syslinux.boot больше не нужны.

Как настроить BIOS на загрузку из флешки, я вам рассказывать не буду — это легко. Скажу только, что очень удобно создать папку /boot/initrd/init, в которую можно будет смонтировать /boot/initrd/main, для последующей работы с ним. Только не забудьте разжимать и сжимать его gzip'ом.

Ну вот и все.

Как-бы я только что рассказал вам, как создать с нуля систему на Linux. Легко, не правда ли? Далее вы можете редактировать скрипт /sbin/init, ведь у вас еще много работы! Вы должны будете написать скрипт для монтирования флешки, который делает chroot в корневой каталог. В противном случае, вы вынуждены будете работать с ReadOnly разделом, величиной в 5 Мб. Но это уже совсем другая история.

Unnx Davis T, B.

Для непросвещенных:

Томас Матеджисек — создатель Slax и Linux Live Scripts.
Роберто де Лео — создатель Movix.

Пишем операционную системы своими руками

Пишем ОС

Введение

Не давно мне стало интересно на сколько тяжело написать операционную систему, как она вообще устроенна внутри, что должна делать, ну или хотя бы какой минимальный набор функциональности иметь. Так же было интересно низкоуровневое программирование, там где нет помощников и готовых функций, только ты, железо и BIOS, без него было бы совсем туго :). И я решил написать простенькую ОС а попутно подучить уже совсем забытый мной ассемблер, и архитектуру x86.

Первое что я решил заделать это поискать статьи, типа «Пишем простую ОС». Таковых оказалось довольно много но лично я смог уловить по ним только основной принцип написания ОС, довольно поверхностно. Возможно просто мой уровень IQ маловат, хотя признаться я его не когда не измерял, боюсь результата :). Ну так вот открыв кучу вкладок в своём браузере, а также различных исходников ОС в notepad++ я принялся за дело. Ниже я опишу всё что я выяснил о создании собственной ОС.

Загрузка ОС с дискеты

Нашу ОС мы разместим на дискете, по этому давайте рассмотрим процесс загрузки операционной системы с дискеты. Он состоит из нескольких этапов, сначала загружается BIOS (англ. basic input/output system — «базовая система ввода-вывода»), затем BIOS определяет различные устройства в том числе и блочные устройства ввода-вывода, К блочным относятся такие устройства, которые хранят информацию в блоках фиксированной длины, у каждого из которых есть свой собственный адрес. Обычно размеры блоков варьируются от 512 до 32 768 байт. Вся передача данных ведется пакетами из одного или нескольких целых (последовательных) блоков. Важным свойством блочного устройства является то, что оно способно читать или записывать каждый блок независимо от всех других блоков. Среди наиболее распространенных блочных устройств жесткие диски, приводы гибких дисков а так же, приводы компакт-дисков и флэш-накопители USB. Нас же интересуют приводы гибких дисков а именно привод для дискет диаметром 3.5 дюйма и объёмом 1.4МБ(1 474 560 байт)

Немного об устройстве привода. Привод состоит из электронной части и механической, в механической части присутствуют два двигателя, один из них шаговый, шаговым его называют по тому что он вращается не непрерывно, как обычные двигатели, а маленькими точными шагами, шаг двигателя 3.5 дюймового дисковода равен 1,8°,что позволяет с его помощью довольно точно позиционировать головку записи-чтения над определённой областью магнитного диска дискеты. Также к механической части относятся головки чтения-записи они то и считывают-записывают данные на магнитный диск. Их в дисководе две, одна над магнитным диском другая под ним. Ниже показано размещение головок над диском.

Д
иск имеет магнитное покрытие и разбит на дорожки и сектора, на одной стороне диска содержится 80 дорожек, всего сторон две, нумерация дорожек начинается с 0 по 79, в одной дорожке содержится 18 секторов, емкость одного сектора составляет 512байт. Нумерация секторов начинается с первого. Первый сектор является загрузочным

После определения всех устройств BIOS начинает загрузку с накопителя который выбран как загрузочный. На этом накопителе должен присутствовать загрузочный сектор в котором находится программа загрузки ядра ОС. После чего BIOS прочтёт первый сектор диска, который как правило является загрузочным и если найдёт на нём сигнатуру загрузочного сектора, это два последних байта сектора, имеющие вид в шестнадцатеричной системе AAh,55h, то загрузит этот сектор в оперативную память по адресу 07C00h, и передаст управление загруженному коду. Далее этот код должен загрузить ядро ОС в память и передать ему управление.

Инструментарий

У меня нет ни дискеты ни дисковода, да и писать любую программу куда приятнее если есть возможность запускать её по сто раз за час, дабы убедится в работе каждой написанной строчки кода :). По этому воспользуемся виртуальной машиной, я выбрал Virtual Box. Скачать Virtual Box можно тут http://www.virtualbox.org/ . Моя версия 5.0.0 на Windows 7 64 бит, сразу работать не захотела, порыскав на форумах, оказалось проблема заключается в том, что у многих для установки расширенных тем оформления пропатчен фал Windows\system32\uxtheme.dll. Обычно оригинальный файл находится в том же каталоге и имеет имя uxtheme.dll.backup. Просто поменяйте между собой их названия.

Далее нам понадобится компилятор FASM( flat assembler ) - это свободно распространяемый многопроходной ассемблер, написанный Томашем Грыштаром (польск. Tomasz Grysztar). Скачать его можно с официального сайта http://flatassembler.net/. Писать код мы будем в Notepad++ его скачать можно тут http://notepad-plus-plus.org/. Установите FASM в корневой каталог диска C, затем установите Notepad++.

Также нам понадобится программа способная создать виртуальный образ дискеты, для этих целей я написал на C# простенькую программку, которую назвал imgMaster. Принцып её действия довольно прост, после запуска программы, нажимаем кнопку Add File, и выбираем первый файл, его размер должен составлять 512байт не больше, не меньше, не больше так как он может не поместится в загрузочный сектор размер которого, как мы уже знаем 512байт. А не меньше по тому что 511 и 512 байты, это сигнатура загрузочного сектора, без них BIOS решит что программа загрузчик отсутствует, и не станет не чего загружать из сектора. Далее при необходимости добавляем остальные файлы, и нажимаем Create IMG, сохраняем образ. Программа запишет файлы один за другим, в той же очерёдности в которой они расположены в списке, затем оставшееся место заполнит нулями, чтобы размер образа был равен ёмкости дискеты 1.4МБ(1 474 560 байт).

Пишем Hello World

Можно приступать к написанию первой тестовой программы, которая без операционной системы, будет способна вывести на экран традиционную надпись «Hello World!».

И так первое что нам необходимо сделать это узнать где мы будем находится в ОЗУ. Ниже представлена модель адресного пространства ОЗУ, как я её понял.

Адресное пространство:

Размер

Назначение

Физ.Адрес

1KB

Векторы прерываний

00000h

256B

Область данных BIOS

00400h

638KB

Первая свободная область

(Суда BIOS помещает данные из загрузочного сектора)

00500h

07С00h

64KB

Графический видео буфер

A0000h

32KB

Вторая свободная область

B0000h

32KB

Текстовый видео буфер

B8000h

64KB

ПЗУ — Расширения BIOS

C0000h

128KB

Третья свободная область

D0000h

64KB

ПЗУ - BIOS

F0000h

64KB

HMA

100000h

До 4GB

XMS

Четвёртая свободная область

10FFF0h

Первые 640 Кбайт (до графического видео буфера) называются стандартной (conventional) памятью. Начинается стандартная память с килобайта, который содержит векторы прерываний, их 256 на каждый отводится по 4 байта.

Затем идет область данных BIOS. Где находятся данные необходимые для корректной работы функций BIOS. Но также можно модифицировать эту область, тем самым мы влияем на ход выполнения системных функций, по сути дела меняя что либо в этой области мы передаем параметры BIOS и его функциям, которые становятся более гибкими. С адреса 500h начинается свободная область до 640КБ. За 640 килобайтами начинается старшая память или верхняя (upper) память, она располагается до 1 мегабайта (до HMA), т.е. она составляет 384 Кбайт. Тут располагаются ПЗУ (постоянно запоминающее устройство ) : текстовый видео буфер (его микросхема рассчитана на диапазон B8000h…BFFFFh) и графический видео буфер (A0000h…AFFFFh). Если требуется вывести текст то его ASCII коды требуется прописать в текстовый видео буфер и вы немедленно увидите нужные символы. F0000h…FFFFFh, а вот и сам BIOS. Так же есть еще одна ПЗУ – ПЗУ расширений BIOS (C0000h…CFFFFh), её задача обслуживание графических адаптеров и дисков. За первым мегабайтом, с адреса 100000h, располагается память именуемая как расширенная память, конец которой до 4 гигабайт. Расширенная память состоит из 2х подуровней: HMA и XMS. Высокая память (High MemoryArea, HMA) доступна в реальном режиме, а это еще плюс 64 Кбайт (точнее 64 Кбайт – 16 байт), но для этого надо разрешить линию A20 (открыв вентиль GateA20). Функционирование расширенной памяти подчиняется спецификации расширенной памяти (Expanded Memory Specification, XMS), поэтому саму память назвали XMS- памятью, но она доступна только в защищенном режиме.

Красным отмечен адрес начала нашей программы, теперь мы можем смело указать компилятору с какого адреса начинать размещать данные в оперативной памяти. Для этого служит директива org. Давайте приступим к написанию программы. Запустите Notepad++, затем создайте новый файл и сохраните его где вам удобно, назвав boot.asm. После чего Notepad++ начнёт подсвечивать ассемблерный синтаксис. Теперь набираем данный код, сообщая компилятору адрес начала нашей программы.

org 07C00h ;BIOS помещает нашу программу по адресу 07C00h, поэтому указываем что все ;данные программы мы будем размещать начиная с этого адреса

Далее необходимо провести инициализацию регистров данных и стека.

;Инициализация

;-------------

cli ;Запретить прерывания, чтобы не чего не отвлекало :)

xor ax,ax ;Обнуляем регистр ax

mov ds,ax ;Сегмент данных. Наши данные размещены от начала программы

mov ss,ax ;Сегмент стека.

mov sp,07C00h ;Стек начинается в начале программы и растёт в ;противоположную сторону, в начало памяти

sti ;Разрешить прерывания

Давайте узнаем какой размер стека у нас получится при такой инициализации. Для этого выполним следующие действия: 7C00h – 0500h = 7700h. Где 7C00h – адрес начала нашей программы, 0500h – адрес начала свободного пространства. Полученное шестнадцатеричное значение 7700h, это размер стека в байта, переведём его в десятичное получим 30464байт, разделим на 1024 и получим 29КБ. Для наших целей этого более чем достаточно.

Теперь для удобства работы давайте создадим несколько макросов, в дальнейшем мы можем вынести их в отдельный файл.

macro displayClean ;Очистка дисплея

{

mov ax, 02h ;очищаем экран - функция 02h прерывания 10h

int 10h

}

Макрос displayClean служит для очистки экрана от всего лишнего.

Далее идёт макрос setCursor служащий для установки курсора в нужную нам позицию, имеющий два аргумента, координату по оси X, и координату по оси Y. От местоположения курсора зависит, место куда будет выведен следующий символ выводимой нами строки.

macro setCursor x, y ;Установить курсор

{

mov dx,x

mov dh,y

;установка курсора : функция 02h прерывания 10h

mov ah,02h

xor bh,bh

int 10h

}

И последний необходимый нам макрос Print будет выводить нашу строку, у него есть три аргумента, string – адрес первого символа строки, length — количество символов строки, и color — цвет строки.

macro print string, lenght, color ;Вывод строки

{

mov bp,string ;Адрес строки

mov cx,lenght ;Длина строки

mov bl,color ;в регистре bl- атрибут цвета

mov ah,13h ;функция 13h прерывания 10h

mov al,01h ;строка только с символами + смещение курсора

;xor dx,dx ;dh-номер строки на экране, dl - номер столбца на экране

int 10h

}

После определения макросов можно разместить нашу строку в памяти

msg0 db "Hello World!" ;Текст сообщения

msg0_len = $ - msg0 ;Длина строки, $ текущий адрес минус адрес начала строки msg0

Далее следует этот код:

displayClean ;Очистим экран с помощью подготовленного нами макроса

setCursor 0, 0 ;Утановим курсор в верхний левый угол

println msg0, msg0_len, 03h ;Выведим приветствие

На этом наша программа закончена осталось забить оставшееся место ( минус два байта сигнатуры ) нулями, чтобы файл занимал равно 512байт.

times (512-2)-($-$$) db 0 ;Цикл выполняется (512-2)-($-$$) раз. Где

;512 - размер загрузочного сектора

;2 - два последних байта

;$ - текущий адрес в памяти

;$$ - Начальный адрес в памяти

И записать два байта сигнатуры, указывающие BIOS-у что это кот загрузчика

;Конец загрузочного сектора

;---------------

db 0AAh,55h ;сигнатура, символизирующая о завершении загрузочного сектора

;последние два байта - признак конца таблицы MBR - код 0xAA55.

;──────────────────────────────END──────────────────────────

Давайте теперь скомпилируем наш код. Для этого нажмите F5, в появившемся окне введите, C:\fasm\FASM.EXE(FULL_CURRENT_PATH), нажмите сохранить, и выберите комбинацию клавиш для быстрого вызова. Теперь после нажатия выбранной комбинации, компилятор FASM скомпилирует нашу программу, и рядом с исходным кодом появится бинарный файл, этот файл и будет нашим загрузчиком, который мы должны будем записать на первый сектор дискеты.

Теперь давайте проверим работу нашей программы. Запустите imgMaster и добавте в список скомпилированный файл, он должен называется boot.bin, затем нажмите Create IMG и сохраните образ дискеты. Далее запустите Virtual Box и нажмите Создать, затем заполните поля как на рисунке ниже:

Д
алее жмём создать и выставляем:

И
снова жмём создать

После чего в списке появится наша новенькая виртуальная машина. Выбираем её и жмём Настроить, выбираем вкладку Носители, мы видим что к контроллеру IDE у нас подключен один жёсткий диск My_OS.vdi и один CD-ROM, поскольку CD-ROM мы использовать не будем мы можем его удалить, что бы не мешал. После того как мы удалили CD-ROM, жмём зелёную кнопку Добавить новый контроллер и выбираем Добавить Floppy контроллер. Затем на появившемся в списке контроллере жмём добавить привод гибких дисков, откроется окно с предложением выбрать образ, вбираем сохранённый ранее образ и жмём ОК. Теперь запускаем нашу виртуальную машину. После запуска на экране у нас должно отобразится приветствие Hello World!.

Ну вот наша первая программа которая работает без ОС готова, в дальнейшем она научится сама читать файлы с диска в ОЗУ и превратится в полноценный загрузчик ядра ОС.

Маленькая ОС с нуля на C++ и ассемблере / Хабр

Сразу говорю, не закрывайте статью с мыслями «Блин, еще один Попов». У него всего-то слизанная Ubuntu, а у меня все с нуля, включая ядро и приложения. Итак, продолжение под катом.

Группа ОС: вот.
Сначала я кину вам один скриншот.

Больше их нет, а теперь поподробнее о том, зачем я ее пишу.

Был теплый апрельский вечер, четверг. Я еще с детства мечтал написать ОС, как вдруг подумал: «Я же теперь знаю плюсы и асм, чего бы не воплотить мою мечту?». Загуглил сайты по этой тематике и нашел статью с Хабра: "Как начать и не бросить писать ОС". Спасибо ее автору за ссылку на OSDev Wiki внизу. Я зашел туда и начал работу. Там были в одной статье все данные о минимальной ОС. Я начал собирать кросс-gcc и binutils, а потом все переписал оттуда. Видели вы бы мою радость, когда я увидел надпись «Hello, kernel World!» Я прямо со стула подпрыгнул и понял — я не сдамся. Я написал «консоль» (в кавычках, у меня не было доступа к клавиатуре), но потом решил написать оконную систему. В итоге она заработала, но доступа к клавиатуре у меня не было. А потом я решил придумать название, опираясь на X Window System. Загуглил Y Window System — она есть. В итоге назвал Z Window System 0.1, входящая в OS365 pre-alpha 0.1. И да, ее не видел никто, кроме меня самого. Потом я понял, как реализовать поддержку клавиатуры. Скрин самой первой версии, когда еще не было ничего, даже оконной системы:

В ней даже не двигался курсор текста, как вы видите. Затем я написал парочку простых приложений на основе Z. И вот релиз 1.0.0 alpha. Там были много вещей, даже меню системы. А файловый менеджер и калькулятор просто не работали.

Далее 1.0.1 с текстовым редактором, 1.0.2 с граф. режимом 640x480, 1.0.3 с рабочим столом, 1.0.4 с русским языком, 1.0.5 с фиксами и чем-то еще, 1.0.6 с часами, а вот на 1.1 остановимся поподробнее.

Меня прямо терроризировал друг, которому важны одни красивости (Митрофан, сорри). Говорил «Запили VBE-режим 1024*768*32, запили, запили! Ну запили!». Ну я уже устал его выслушивать и все-таки запилил его. О реализации ниже.

Я сделал все моим загрузчиком, а именно GRUB'ом. С его помощью можно задать графический режим без осложнений путем добавления нескольких магических строчек в заголовок Multiboot.

.set ALIGN, 1<<0 .set MEMINFO, 1<<1 .set GRAPH, 1<<2 .set FLAGS, ALIGN | MEMINFO | GRAPH .set MAGIC, 0x1BADB002 .set CHECKSUM, -(MAGIC + FLAGS) .align 4 .long MAGIC .long FLAGS .long CHECKSUM .long 0, 0, 0, 0, 0 .long 0 # 0 = set graphics mode .long 1024, 768, 32 # Width, height, depth 

А потом из структуры информации Multiboot я беру адрес фреймбуфера и разрешение экрана и пишу туда пиксели. VESA все сделали очень замороченно — цвета RGB надо вводить в обратном порядке (не R G B, а B G R). Я несколько дней не понимал — почему пиксели не выводятся!? В итоге я понял, что забыл поменять значения 16 цветовых констант с 0...15 на их RGB-эквиваленты. В итоге релизнул, заодно запилил градиентный фон. Потом я сделал консоль, 2 приложения и релизнул 1.2. Ах да, чуть не забыл — скачать ОС можно на сайте (хабраэффект, он лежит).
И да, вы не поверите, но мне 11 лет.
Продолжение следует…

8 шагов по самостоятельному созданию

С появлением Windows 10 операционная система начала набирать популярность. Но на слабых ПК, планшетах она работает медленно, а на старых гаджетах появляются проблемы с драйверами. Поэтому пользователи стараются убирать или отключать неиспользуемые программы, приложения, а также интегрировать драйверы напрямую в дистрибутив. Подробная инструкция о том, как сделать свою сборку дистрибутива Windows 10, поможет в этом процессе.

СОДЕРЖАНИЕ СТАТЬИ:

Преимущества и недостатки своих сборок

Собственноручно созданная сборка экономит время и силы при установке ОС. В зависимости от умений пользователя, профессионализма зависит количество положительных и отрицательных моментов.

К достоинствам своих сборок относятся:

  • уменьшенный размер образа и установленной системы;
  • более высокая скорость работы за счет уменьшения или отключения дополнительных служб;
  • простота использования, которая заключается в уже установленных базовых настройках, не требующих дополнительного вмешательства.

У собственных сборок также имеются недостатки:

  • созданный дистрибутив занимает больше места, чем оригинальная ОС;
  • процесс установки занимает больше времени;
  • нестабильная работа системы из-за присутствия драйвера или служба, которая сведет на нет усилия по установке;
  • ошибки реестра – важного элемента в системе; неверные записи приведут к нестабильной работе Windows и критическим ошибкам.

Если создавать модифицированную сборку Windows 10 самому, нужно знать, что лучше параллельно выполнить резервную копию системного раздела перед запуском софта.

Создание своей собственной сборки Windows 10

Процесс препарирования утилиты проходит поэтапно. Способ должен применяться только опытными пользователями.

Подготовительный этап

Для начала потребуется оригинальная версия Windows, которую скачивают на официальном сайте «Майкрософт». Дистрибутив сохраняют на съемный носитель либо в виде ISO-файла, выбрав соответствующую версию утилиты.

Далее потребуется выполнить следующее:

  • Запустить утилиту Sysprep.

  • Ввести значение: C:\Windows\System32\Sysprep\Sysprep.exe.
  • В появившемся меню поставить параметры: «Переход в окно приветствия системы», поставить отметку напротив надписи «Подготовка к использованию».
  • Выбрать внизу «Завершение работы».
  • Подтвердить действие, нажав «Ok».

Продвинутые пользователи, вместо завершения работы, выбирают перезагрузку. Это помогает при удалении папок уже удаленных учетных записей, при этом ОС особо «не сопротивляется».

Программа будет работать некоторое время. Длительность процесса зависит от размера информации, переносимой на другой ПК. После переноса данных устройство отключится.

Создание образа в формате ESD

В прошлом дистрибутивы Виндовс упаковывались в образы Windows Image Format. Позднее создатели стали использовать формат ESD, отличающийся увеличенной степенью сжатия. Это позволяет экономить больше пространства в памяти.

Для выполнения операции потребуется:

  • Подключить внешний носитель, загрузиться с него.
  • Нажать одновременно «Shift+10».

  • Ввести последовательно: «Diskpart», «lisvol», «exit».

  • Сохранить диск C, введя: Dism /Capture-Image /ImageFile:I:\install.esd /CaptureDir:C:\ /Name:Windows.

  • После выключить ПК, в котором был создан образ.

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

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

Нюансы с активацией

Самостоятельная сборка ОС Виндовс отличается от пиратских копий. Такой образ создается согласно инструкции, в которой используются процессы, отвечающие политике «Майкрософт». Но их применение не дает гарантии успешной работы запущенных сборок системы.

Активация любой копии ОС происходит на каждом устройстве, независимо от используемого дистрибутива. В качестве эталонного образа выступает уже привычная Виндовс 10. Активация сбрасывается в момент удаления привязки комплектующих.

Дополнительное сжатие файла-образа

Этап выполняется по желанию, его пользователь может пропустить. Файл Install.esd уменьшается в размерах. Юзеру предварительно необходимо удостовериться в присутствии файла на носителе, выполнить поэтапно:

  • Набрать: DISM /Export-Image /SourceImageFile:I:\install.esd /SourceIndex:1 /DestinationImageFile:I:\install2.esd /Compress:recovery. Так появится его копия, только с уменьшенными размерами.

  • Использовать вариант сжатия compress:recovery.

  • Переместить в корзину первый исходник.

Обновленный файл потребуется переименовать.

Редактирование ISO - образа Windows 10

Здесь потребуется выполнить копирование скачанного дистрибутива на съемный носитель. Здесь подойдет наилучшим образом флеш - накопитель. В нем потребуется создать папку, задав ей имя «10».

Далее следовать инструкции:

  • После завершения копирования в sources появится файл с тем же наименованием. Его нужно заменить созданным файлом.

  • Скопировать и вставить его в папку.

  • Оригинальный файл заменится созданным пользователем.

Создание ISO-образа

Снова нужно создать образ, но уже обновленной папки. Понадобится Windows ADK, обычно устанавливаемый одновременно с ОС. Но, если он отсутствует, его отдельно скачивают, выполняют установку.

Далее следовать алгоритму действий:

  • Запустить Windows ADK.
  • В открывшемся меню ввести: Oscdimg /u2 /m /bootdata:2#p0,e,bI:\10\boot\Etfsboot.com#pef,e,bI:\10\efi\microsoft\boot\Efisys.bin I:\10 I:\Windows.iso.

Создаем загрузочный носитель

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

Установка ОС Windows 10

Инсталляция созданного дистрибутива Виндовс 10 от оригинальной версии ничем не отличается. Единственным нюансом может стать более длительное время. После выполнения всех пунктов инструкции пользователь получит гаджет с ПО, готовый к работе. Юзеру останется установить соответствующие драйверы.

Сборка системы самостоятельно удобна для установки на другой ПК. Если требуется установка ее на несколько устройств, то дистрибутив применяют, как базовую конфигурацию.

Для облегчения задачи по сборке дистрибутива Windows 10 опытные разработчики используют различные инструменты. Программы позволяют вносить изменения: удалять ненужные данные, добавлять отдельные драйверы и выполнять другие задачи.

Создание собственной операционной системы

Создание собственной операционной системы

Необходимые инструменты:

Обычно, когда компьютер запускается, он пытается загрузить 512 байтов
из сектора 1 , головки 0 , цилиндра 0 из дисковода гибких дисков A
в 0000h: 7C00h и передать ему управление.
Если это не удается, используется жесткий диск.

В этом руководстве рассматривается загрузка с дисковода гибких дисков, тот же принцип
используется для загрузки с жесткого диска.Использование дисковода гибких дисков дает ряд преимуществ:

Пример простой программы загрузки:


; директива для создания файла BOOT:
# MAKE_BOOT #

; Загрузочная запись загружается по адресу 0000: 7C00,
; так сообщите компилятору, чтобы он сделал требуемый
; исправления:
ORG 7C00h

; загрузить адрес сообщения в регистр SI:
LEA SI, msg

; идентификатор телетайпа:
MOV AH, 0Eh

распечатать: MOV AL, [SI]
CMP AL, 0
JZ done
INT 10h; распечатать с помощью телетайпа.
INC SI
JMP печать

; ждать 'любой ключ':
сделано: MOV AH, 0
INT 16h

; сохранить магическое значение в 0040h: 0072h:
; 0000h - холодная перезагрузка.
; 1234h - теплый ботинок.
MOV AX, 0040h
MOV DS, AX
MOV w. [0072h], 0000h; Холодный ботинок.

JMP 0FFFFh: 0000h; перезагружать!

new_line EQU 13, 10

msg DB 'Здравствуйте, это моя первая загрузочная программа!'
DB new_line, 'Нажмите любую клавишу для перезагрузки', 0

Скопируйте приведенный выше пример в редактор исходного кода emu8086 и нажмите
кнопку [ Compile and Emulate ].Эмулятор
автоматически загружает файл ".boot" в 0000h: 7C00h.

Вы можете запустить его, как обычную программу, или вы можете использовать меню
Virtual Drive для Записать 512 байтов на 7C00h в загрузочный сектор
виртуального дисковода гибких дисков (файл FLOPPY_0 в папке эмулятора).

После записи вашей программы на виртуальный дисковод, вы можете выбрать
Boot from Floppy из меню Virtual Drive .

Если вам интересно, вы можете написать
виртуальную дискету ( FLOPPY_0 ) или «.загрузите файл "на настоящую дискету и
загрузите ваш компьютер с него, я рекомендую
использовать" RawWrite для Windows "из:

http://uranus.it.swin.edu.au/~jn/linux

(обратите внимание, что это несовместимый с MS-DOS загрузочный сектор,
, поэтому лучше использовать пустую дискету, хотя она должна быть отформатирована
IBM (MS-DOS)).

Файлы " .boot " ограничены 512 байтами (размером сектора), поэтому, если ваша операционная система
будет расти сверх этого размера, вам следует использовать программу загрузки
для загрузки данных из других секторов.Хороший пример крошечной операционной системы
можно скачать здесь:

micro-os_loader.asm

micro-os_kernel.asm

emu8086.inc

Чтобы создать расширения для вашей операционной системы (более 512 байт), вы можете использовать файлы
« .bin » (выберите « BIN Template » из « File » -> меню « New »).

Для записи файла " .bin " на виртуальную дискету выберите "Запись".bin на дискету ... »
из « Виртуальный диск » меню эмулятора:

Вы также можете использовать это для записи файлов « .boot ».


цилиндр: 0

сектор: 1

руководитель: 0

- это загрузочный сектор!

.

c - Как создать небольшую операционную систему на старом настольном компьютере?

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Whe
.

Основы работы с компьютером: понимание операционных систем

Урок 8: Общие сведения об операционных системах

/ en / computerbasics / mobile-devices / content /

Что такое операционная система?

Операционная система - это наиболее важное программное обеспечение , работающее на компьютере. Он управляет памятью и компьютера, процессами , а также всем его программным обеспечением и оборудованием . Это также позволяет общаться с компьютером, не зная, как говорить на языке компьютера. Без операционной системы компьютер бесполезен .

Посмотрите видео ниже, чтобы узнать больше об операционных системах.

Ищете старую версию этого видео? Вы все еще можете просмотреть это здесь.

Работа операционной системы

Операционная система вашего компьютера ( OS ) управляет всем программным обеспечением и оборудованием на компьютере. В большинстве случаев одновременно работает несколько разных компьютерных программ, и всем им нужен доступ к центральному процессору (ЦП) вашего компьютера, памяти и памяти .Операционная система координирует все это, чтобы каждая программа получала то, что ей нужно.

Типы операционных систем

Операционные системы обычно поставляются с предустановленной на любом компьютере, который вы покупаете. Большинство людей используют операционную систему, поставляемую с их компьютером, но можно обновить или даже изменить операционные системы. Три наиболее распространенные операционные системы для персональных компьютеров: Microsoft Windows , macOS и Linux .

Современные операционные системы используют графический пользовательский интерфейс или GUI (произносится как gooey ). Графический интерфейс пользователя позволяет использовать мышь для нажатия значков , кнопок и меню , и все четко отображается на экране с использованием комбинации графических изображений и текстовых .

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

Microsoft Windows

Microsoft создала операционную систему Windows в середине 1980-х годов. Было много разных версий Windows, но самые свежие из них - Windows 10 (выпущена в 2015 году), Windows 8 (2012), Windows 7 (2009) и Windows Vista (2007). Windows поставляется с предустановленной версией на большинстве новых ПК, что делает ее самой популярной операционной системой в мире.

Ознакомьтесь с нашими руководствами по основам Windows и конкретным версиям Windows для получения дополнительной информации.

macOS

macOS (ранее называвшаяся OS X ) - это линейка операционных систем, созданная Apple. Он предустановлен на всех компьютерах Macintosh или Mac. Некоторые из конкретных версий включают Mojave (выпущено в 2018 г.), High Sierra (2017 г.) и Sierra (2016 г.).

По данным StatCounter Global Stats, на долю пользователей macOS приходится менее 10% мировых операционных систем - намного меньше, чем процент пользователей Windows (более 80% ).Одна из причин этого в том, что компьютеры Apple обычно дороже. Однако многие люди предпочитают внешний вид macOS, а не Windows.

Ознакомьтесь с нашим руководством по основам macOS для получения дополнительной информации.

Linux

Linux (произносится как LINN-ux ) - это семейство операционных систем с открытым исходным кодом, что означает, что они могут быть изменены и распространены кем угодно по всему миру. Это отличается от проприетарного программного обеспечения

.

Может ли ваш компьютер работать без операционной системы?

Если операционная система делает все, что мы знаем, то компьютер без нее может существовать совершенно невозможно.

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

Объявление

Да. Но у тебя много работы. Без операционной системы, использующей и обеспечивающей стандартный систематический подход к работе с компьютером, вы вынуждены писать код (или программы), который должен точно указывать компьютеру, что делать. Поэтому, если вы хотите напечатать документ в текстовом редакторе, вам придется создать с нуля код, который сообщает вашему компьютеру реагировать на каждый символ, нажимаемый на клавиатуре.Затем вам нужно будет написать код, который сообщает компьютеру, как эти ответы должны транслироваться на экран. Вам придется указать компьютеру, как нарисовать нужного вам персонажа! Подумайте обо всех вариантах или возможностях, которые есть в вашей программе обработки текста. Вам придется писать код для каждого из них прямо на жесткий диск.

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

Операционная система предоставляет унифицированный набор шурупов, пиломатериалов и любого другого материала, который вам нужен. Он может перемещаться между комнатами так быстро, что вы даже не подозреваете, что покинул ту, в которой вы были.

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

.

Смотрите также