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

Интересную тему недавно обсуждали на zdnet.com с Sam Diaz - использование PC без операционной системы и почему-то как всегда говорили о Windows. Такое ощущение, что других систем нет и не может быть. Но сегодня тема не об этом, а о самой идее - запуск программ напрямую на железе и без использования прокладки в виде ОС.

Что такого дает ОС и зачем вообще ее придумали? Неужели нельзя писать код, который будет выполняться напрямую на железе? Сложно, но можно! ОС - это тоже программа, которая работат на этом железе, а раз ее написали, то вы можете написать программу, которая только используя железо будет работать и делать то, что вы захотите, при этом, будет работать быстрее и это утверждает Sam Diaz. Это логично и не могу спорить, что это не так, тогда почему нет программ, которые работали бы на железе напрямую?

Sam Diaz несет полный бред, а все потому, что он не программист. Если однозадачный компьютер еще можно как-то сделать без ОС, чтобы он выполнял только одну программу одновременно, то многозадачность умрет сразу. Если нет ОС, то кто будет распределять ресурсы между программами? Кто будет отвечать за выделение памяти, процессора и т.д. Кто будет определять приоритетность выполнения одного процесса над другим и кто будет отвечать за безопасность объектов в системе?

Допустим, что изобрели такой идеальный и крутой механизм и идеологию работы, при которой удобно работать в однозадачной системе. Бред, но допустим. Каждый программист при написании программы должен сам для себя каждый раз писать функции работы с памятью, распределением и удалением - да это же ад. Он должен работать с жестким диском на уровне драйвера, хотя стоп, какой драйвер, когда нет системы, которая отвечала бы за драйвера и загружала бы их, в каждой программе должны быть свои функции, которые обращались бы к контроллерам. Ну ладно диски, их работа схожа, но что делать с видео? Видеокарты ATI и GeForce имеют разные наборы функций и возможности, и разные модели одной и той же фирмы тоже имеют разные возможности, а мы не можем использовать драйвера, тогда в каждой программе должна быть прописана возможность работы со всеми типами видео в виде кода. Представляшь этот бред?

Zdnet в борьбе против Microsoft начинает обсуждать вообще бредовые идеи, которые даже обсуждать стыдно и не понятно, как они в голову вообще залезли. Это компания специализируется на ИТ решениях, в том числе и WEB, так почему им в голову пришла мысль о том, что компьютер может эффективно работать без посредника в виде ОС? Не ужели они думают, что ОС придумали только для того, чтобы вымогать у пользователей деньги? ОС - это не набор программ, это набор решений, которые упрощают программирование и берут на себя груз ответственности за работу программ.

Cуществуют отдельные программы, способные работать при отсутствии какой-либо операционной системы. Эти программы одновременно играют роль и загрузчика, и операционной системы, и приложения. Применение подобных программ ограничено узкоспециальными задачами, а выход из таких приложении является перезагрузкой компьютера. Примерами подобных программ, загружаемых с дискеты, являются утилиты тестирования оперативной памяти Windows Memory Diagnostic и низкоуровневого тестирования жёстких дисков MHDD.

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

Первые бытовые персональные компьютеры 70-80-х годов не имели операционных систем, но некоторые пользователи рассматривали содержащийся в ПЗУ язык программирования как самостоятельную операционную систему, хотя и упрощенную. Она позволяла принимать и понимать команды от клавиатуры и загружать посторонние программы.

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

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



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

Работа компьютера возможна благодаря взаимодействию программного и аппаратного обеспечения. На самом деле, программный часть компьютера неоднородна и представляет собой сложную структуру. Всё программное обеспечение можно представить как три "слоя", покрывающие аппаратную часть, - "Прикладные программы, Операционная система, и Микропрограмма BIOS.

Осуществляется написание кодов событийных процедур и управление объектами

Процедура и их виды

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

Процедуры бывают: СОБЫТИЙНЫЕ и ОБЩИЕ.

Событийная процедура - подпрограмма, которая начинает выполняться после достижения какого то события (например, при щелчке по кнопке появляется картина).

В событийной процедуре могут участвовать несколько объектов. Например, само событие происходит с первым объектом (Объект 1), в результате второй (Объект 2) изменяет значение своего свойства, а третий (Объект 3) реализует какой-либо метод.

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

В случаях, когда в программном модуле можно выделить многократно повторяющиеся действия (процедуры), создают общие процедуры. Выполнение общих процедур не связывается с какими-либо событиями, они вызываются на выполнение с помощью оператора Call. Каждой общей процедуре дается уникальное название - имя процедуры и устанавливается список входных и выходных параметров процедуры.

3.2 Виды событийных процедур

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

Событийные процедуры бывают локальные и глобальные.

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

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

3.3 Механизм управления событийными процедурами

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

Событие (Event) – что-либо, что происходит (обычно, но не всегда вследствие действия пользователя за клавиатурой) во время работы программы.

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

VB позволяет легко находить код событийной процедуры для элементов управления в форме. Щелкните дважды на любом элементе управления, чтобы увидеть одну из его событийных процедур. Например, если пользователь щелкнет дважды на командной кнопке cmdРасчет, VB открывает окно Code и помещает текстовый курсор в набор строк.

Блок (block) – секция кода, представляющая единое целое. Большинство событийных процедур начинаются с оператора Private Sub... и заканчиваются строкой End Sub.

Блок Private – End показывает первую и последнюю строки этой событийной процедуры. Строки, находящиеся между этими строками, составляют тело событийной процедуры. Все элементы управления имеют уникальные имена. Все событийные процедуры также имеют уникальные имена. Имя событийной процедуры всегда принимает следующую форму: ControlName_eventName()

Событийная процедура всегда состоит из имени элемента управления, символа подчеркивания и имени события процедуры. Если необходимо реа-гировать как на событие щелчка, так и на событие двойного щелчка, которые могут быть применимы, например, к командной кнопке Exit, пользователю придется написать событийную процедуру с именем cmdExit_Click () и еще одну событийную процедуру с именем cmdExit_DblClick(). Событие двойного щелчка называется DblClick, а событие нажатия клавиши называется KeyDown. В верхней части каждого окна Code содержится поле с раскрывающимся списком, в котором находится каждое воз-можное событие для элемента управления, приведенного в левом поле с рас-крывающимся списком. Левое поле с раскрывающимся списком содержит имя каждого элемента управления в форме. Именование событийной процедуры не является пользовательским ре-шением, а является условным обозначением языка VB. Событийная процедура Click для командной кнопки с именем cmdTest всегда будет cmdTest_Click (). Имя из двух частей делает событийную процедуру абсолютно определенной: исходя из ее имени, и вы, и VB знаете, что код выполняется только, если пользователь щелкнет на командной кнопке cmdTest.

Не было достаточно подробно описано самого главного: как же запустить этот код на реальном железе? Как создать собственный загрузочный диск? В этой статье мы подробно ответим на все эти вопросы (частично данные вопросы разбирались в предыдущей статье, но для удобства чтения позволим себе небольшое дублирование материала).

В интернете существует огромное количество описаний и туториалов о для того как написать собственную мини-ОС, даже существуют сотни готовых маленьких хобби-ОС. Один из наиболее достойных ресурсов по этой тематике, который хотелось бы особо выделить, это портал osdev.org. Для дополнения предыдущей статьи про PCI (и возможности писать последующие статьи о различных функциях, которые присутствуют в любой современной ОС), мы опишем пошаговые инструкции по созданию загрузочного диска с привычной программой на языке С. Мы старались писать максимально подробно, чтобы во всем можно было разобраться самостоятельно.

Итак, цель: затратив как можно меньше усилий, создать собственную загрузочную флешку, которая всего-навсего печатает на экране компьютера классический “Hello World”.

Если быть более точным, то нам нужно “попасть” в защищенный режим с отключенной страничной адресацией и прерываниями – самый простой режим работы процессора с привычным поведением для простой консольной программы. Самый разумный способ достичь такой цели – собрать ядро поддерживающее формат multiboot и загрузить его с помощью популярного загрузчика Grub. Альтернативой такого решения является написание собственного volume boot record (VBR), который бы загружал написанный собственный загрузчик (loader). Приличный загрузчик, как минимум, должен уметь работать с диском, с файловой системой, и разбирать elf образы. Это означает необходимость написания множества ассемблерного кода, и немало кода на С. Одним словом, проще использовать Grub, который уже умеет делать все необходимое.

Начнем с того, что для дальнейших действий необходим определенный набор компиляторов и утилит. Проще всего воспользоваться каким-нибудь Linux (например, Ubuntu), поскольку он уже будет содержать все что нужно для создания загрузочной флэшки. Если вы привыкли работать в Windows, то можно настроить виртуальную машину с Linux (при помощи Virtual Box или VMware Workstation).

Если вы используете Linux Ubuntu, то прежде всего необходимо установить несколько утилит:
1. Grub. Для этого воспользуемся командой:
sudo apt-get install grub

2. Qemu. Он нужен, чтобы все быстро , для этого аналогично команда:
sudo apt-get install qemu

Теперь наш план выглядит так:
1. создать программу на C, печатающую строку на экране.
2. собрать из нее образ (kernel.bin) в формате miniboot, чтобы он был доступен для загрузки с помощью GRUB.
3. создать файл образа загрузочного диска и отформатировать его.
4. установить на этот образ Grub.
5. скопировать на диск созданную программу (kernel.bin).
6. записать образ на физический носитель или запустить его в qemu.

А процесс загрузки системы:

Чтобы все получилось, необходимо будет создать несколько файлов и каталогов:

Шаг 1. Создание кода целевой программы (ядра):

Создаем файл kernel.c, который будет содержать следующий код, печатающий сообщение на экране:

#include "printf.h" #include "screen.h" #include "types.h" void main(void) { clear_screen(); printf("\n>>> Hello World!\n"); }

Тут все привычно и просто. Добавление функций printf и clear_screen будет рассмотрено дальше. А пока надо дополнить этот код всем необходимым, чтобы он мог загружаться Grub’ом.
Для того что бы ядро было в формате multiboot, нужно что бы в первых 8-ми килобайтах образа ядра находилась следующая структура:

Если все указанные условия выполнены, то Grub через регистры %eax и %ebx передает указатель на структуру multiboot Information и значение 0x1BADB002 соответственно. Структура multiboot Information содержит различную информацию, в том числе список загруженных модулей и их расположение, что может понадобиться для дальнейшей загрузки системы.
Для того, чтобы файл с программой содержал необходимые сигнатуры создадим файл loader.s, со следующим содержимым:

Text .global loader # making entry point visible to linker # setting up the Multiboot header - see GRUB docs for details .set FLAGS, 0x0 # this is the Multiboot "flag" field .set MAGIC, 0x1BADB002 # "magic number" lets bootloader find the header .set CHECKSUM, -(MAGIC + FLAGS) # checksum required .align 4 .long MAGIC .long FLAGS .long CHECKSUM # reserve initial kernel stack space .set STACKSIZE, 0x4000 # that is, 16k. .lcomm stack, STACKSIZE # reserve 16k stack .comm mbd, 4 # we will use this in kmain .comm magic, 4 # we will use this in kmain loader: movl $(stack + STACKSIZE), %esp # set up the stack movl %eax, magic # Multiboot magic number movl %ebx, mbd # Multiboot data structure call main # call C code cli hang: hlt # halt machine should kernel return jmp hang

Рассмотрим код подробнее. Этот код в почти не измененном виде взят с wiki.osdev.org/Bare_Bones . Так как для компиляции используется gcc, то используется синтаксис GAS. Рассмотрим подробнее, что делает этот код.
.text
Весь последующий код попадет в исполняемую секцию.text.
.global loader
Объявляем символ loader видимым для линковщика. Это требуется, так как линковщик будет использовать loader как точку входа.
.set FLAGS, 0x0 # присвоить FLAGS = 0x0 .set MAGIC, 0x1BADB002 # присвоить MAGIC = 0x1BADB002 .set CHECKSUM, -(MAGIC + FLAGS) # присвоить CHECKSUM = -(MAGIC + FLAGS) .align 4 # выровнять последующие данные по 4 байта.long MAGIC # разместить по текущему адресу значение MAGIC .long FLAGS # разместить по текущему адресу значение FLAGS .long CHECKSUM # разместить по текущему адресу значение CHECKSUM
Этот код формирует сигнатуру формата Multiboot. Директива.set устанавливает значение символа в выражение справа от запятой. Директива.align 4 выравнивает последующее содержимое по 4 байта. Директива.long сохраняет значение в четырех последующих байтах.
.set STACKSIZE, 0x4000 # присвоить STACKSIZE = 0x4000 .lcomm stack, STACKSIZE # зарезервировать STACKSIZE байт. stack ссылается на диапазон.comm mbd, 4 # зарезервировать 4 байта под переменную mdb в области COMMON .comm magic, 4 # зарезервировать 4 байта под переменную magic в области COMMON
В процессе загрузки grub не настраивает стек, и первое что должно сделать ядро это настроить стек, для этого мы резервируем 0x4000(16Кб) байт. Директива.lcomm резервирует в секции.bss количество байт, указанное после запятой. Имя stack будет видимо только в компилируемом файле. Директива.comm делает то же что и.lcomm, но имя символа будет объявлено глобально. Это значит что, написав в коде на Си следующую строчку, мы сможем его использовать.
extern int magic

И теперь последняя часть:
loader: movl $(stack + STACKSIZE), %esp # инициализировать стек movl %eax, magic # записать %eax по адресу magic movl %ebx, mbd # записать %ebx по адресу mbd call main # вызвать функцию main cli # отключить прерывания от оборудования hang: hlt # остановить процессор пока не возникнет прерывание jmp hang # прыгнуть на метку hang

Первой инструкцией происходит сохранение значения верхушки стека в регистре %esp. Так как стек растет вниз, то в %esp записывается адрес конца диапазона отведенного под стек. Две последующие инструкции сохраняют в ранее зарезервированных диапазонах по 4 байта значения, которые Grub передает в регистрах %eax, %ebx. Затем происходит вызов функции main, которая уже написана на Си. В случае возврата из этой процедуры процессор зациклится.

Шаг 2. Подготовка дополнительного кода для программы (системная библиотека):

Поскольку вся программа пишется с нуля, то функцию printf нужно написать с нуля. Для этого нужно подготовить несколько файлов.
Создадим папку common и include:

Mkdir common mkdir include

Создадим файл common\printf.c, который будет содержать реализацию привычной функции printf. Этот файл целиком можно взять из проекта www.bitvisor.org . Путь до файла в исходниках bitvisor: core/printf.c. В скопированном из bitvisor файле printf.c, для использования в целевой программе нужно заменить строки:

#include "initfunc.h" #include "printf.h" #include "putchar.h" #include "spinlock.h"
на строки:
#include "types.h" #include "stdarg.h" #include "screen.h"

Потом, удалить функцию printf_init_global и все ее упоминания в этом файле:

Static void printf_init_global (void) { spinlock_init (&printf_lock); } INITFUNC ("global0", printf_init_global);

Затем удалить переменную printf_lock и все ее упоминания в этом файле:
static spinlock_t printf_lock; … spinlock_lock (&printf_lock); … spinlock_unlock (&printf_lock);

Функция printf использует функцию putchar, которую так же нужно написать. Для этого создадим файл common\screen.с, со следующим содержимым:
#include "types.h" #define GREEN 0x2 #define MAX_COL 80 // Maximum number of columns #define MAX_ROW 25 // Maximum number of rows #define VRAM_SIZE (MAX_COL*MAX_ROW) // Size of screen, in short"s #define DEF_VRAM_BASE 0xb8000 // Default base for video memory static unsigned char curr_col = 0; static unsigned char curr_row = 0; // Write character at current screen location #define PUT(c) (((unsigned short *) (DEF_VRAM_BASE)) \ [(curr_row * MAX_COL) + curr_col] = (GREEN << 8) | (c)) // Place a character on next screen position static void cons_putc(int c) { switch (c) { case "\t": do { cons_putc(" "); } while ((curr_col % 8) != 0); break; case "\r": curr_col = 0; break; case "\n": curr_row += 1; if (curr_row >= MAX_ROW) { curr_row = 0; } break; case "\b": if (curr_col > 0) { curr_col -= 1; PUT(" "); } break; default: PUT(c); curr_col += 1; if (curr_col >= MAX_COL) { curr_col = 0; curr_row += 1; if (curr_row >= MAX_ROW) { curr_row = 0; } } }; } void putchar(int c) { if (c == "\n") cons_putc("\r"); cons_putc(c); } void clear_screen(void) { curr_col = 0; curr_row = 0; int i; for (i = 0; i < VRAM_SIZE; i++) cons_putc(" "); curr_col = 0; curr_row = 0; }

Указанный код, содержит простую логику печати символов на экран в текстовом режиме. В этом режиме для записи символа используется два байта (один с кодом символа, другой с его атрибутами), записываемые прямо в видео память отображаемую сразу на экране и начинающуюся с адреса 0xB8000. Разрешение экрана при этом 80x25 символов. Непосредственно печать символа осуществляется при помощи макроса PUT.
Теперь не хватает всего несколько заголовочных файлов:
1. Файл include\screen.h. Объявляет функцию putchar, которая используется в функции printf. Содержимое файла:
#ifndef _SCREEN_H #define _SCREEN_H void clear_screen(void); void putchar(int c); #endif

2. Файл include\printf.h. Объявляет функцию printf, которая используется в main. Содержимое файла:
#ifndef _PRINTF_H #define _PRINTF_H int printf (const char *format, ...); #endif

3. Файл include\stdarg.h. Объявляет функции для перебора аргументов, количество которых заранее не известно. Файл целиком берется из проекта www.bitvisor.org . Путь до файла в коде проекта bitvisor: include\core\stdarg.h.
4. Файл include\types.h. Объявляет NULL и size_t. Содержимое файла:
#ifndef _TYPES_H #define _TYPES_H #define NULL 0 typedef unsigned int size_t; #endif
Таким образом папки include и common содержат минимальный код системной библиотеки, которая необходима любой программе.

Шаг 3. Создание скрипта для компоновщика:

Создаем файл linker.ld, который будет использоваться компоновщиком для формирования файла целевой программы (kernel.bin). Файл должен содержать следующее:

ENTRY (loader) LMA = 0x00100000; SECTIONS { . = LMA; .multiboot ALIGN (0x1000) : { loader.o(.text) } .text ALIGN (0x1000) : { *(.text) } .rodata ALIGN (0x1000) : { *(.rodata*) } .data ALIGN (0x1000) : { *(.data) } .bss: { *(COMMON) *(.bss) } /DISCARD/ : { *(.comment) } }

Встроенная функция ENTRY() позволяет задать входную точку для нашего ядра. Именно по этому адресу передаст управление grub после загрузки ядра. Компоновщик при помощи этого скрипта создаст бинарный файл в формате ELF. ELF-файл состоит из набора сегментов и секций. Список сегментов содержится в Program header table, список секций в Section header table. Линковщик оперирует с секциями, загрузчик образа (в нашем случае это GRUB) с сегментами.

Как видно на рисунке, сегменты состоят из секций. Одним из полей, описывающих секцию, является виртуальный адрес, по которому секция должна находиться на момент выполнения. На самом деле, у сегмента есть 2 поля, описывающих его расположение: виртуальный адрес сегмента и физический адрес сегмента. Виртуальный адрес сегмента это виртуальный адрес первого байта сегмента в момент выполнения кода, физический адрес сегмента это физический адрес по которому должен быть загружен сегмент. Для прикладных программ эти адреса всегда совпадают. Grub загружает сегменты образа, по их физическому адресу. Так как Grub не настраивает страничную адресацию, то виртуальный адрес сегмента должен совпадать с его физическим адресом, поскольку в нашей программе виртуальная память так же не настраивается.

SECTIONS
Говорит о том, что далее описываются секции.
. = LMA;
Это выражение указывает линковщику, что все последующие секции находятся после адреса LMA.
ALIGN (0x1000)
Директива выше, означает, что секция выровнена по 0x1000 байт.
.multiboot ALIGN (0x1000) : { loader.o(.text) }
Отдельная секция multiboot, которая включает в себя секцию.text из файла loader.o, сделана для того, что бы гарантировать попадание сигнатуры формата multiboot в первые 8кб образа ядра.
.bss: { *(COMMON) *(.bss) }
*(COMMON) это область, в которой резервируется память инструкциями.comm и.lcomm. Мы располагаем ее в секции.bss.
/DISCARD/ : { *(.comment) }
Все секции, помеченные как DISCARD, удаляются из образа. В данном случае мы удаляем секцию.comment, которая содержит информацию о версии линковщика.

Теперь скомпилируем код в бинарный файл следующими командами:
as -o loader.o loader.s gcc -Iinclude -Wall -fno-builtin -nostdinc -nostdlib -o kernel.o -c kernel.c gcc -Iinclude -Wall -fno-builtin -nostdinc -nostdlib -o printf.o -c common/printf.c gcc -Iinclude -Wall -fno-builtin -nostdinc -nostdlib -o screen.o -c common/screen.c ld -T linker.ld -o kernel.bin kernel.o screen.o printf.o loader.o
С помощью objdump’а рассмотрим, как выглядит образ ядра после линковки:
objdump -ph ./kernel.bin

Как можно видеть, секции в образе совпадают с теми, что мы описали в скрипте линковщика. Линковщик сформировал 3 сегмента из описанных секций. Первый сегмент включает в себя секции.multiboot, .text, .rodata и имеет виртуальный и физический адрес 0x00100000. Второй сегмент содержит секции.data и.bss и располагается по адресу 0x00104000. Значит все готово для загрузки этого файла при помощи Grub.

Шаг 4. Подготовка загрузчика Grub:
Создать папку grub:
mkdir grub

Скопировать в эту папку несколько файлов Grub, которые необходимы для его установки на образ (указанные далее файлы существуют, если в системе установлен Grub). Для этого нужно выполнить следующие команды:
cp /usr/lib/grub/i386-pc/stage1 ./grub/ cp /usr/lib/grub/i386-pc/stage2 ./grub/ cp /usr/lib/grub/i386-pc/fat_stage1_5 ./grub/

Создать файл grub/menu.lst, со следующим содержимым:
timeout 3 default 0 title mini_os root (hd0,0) kernel /kernel.bin

Шаг 5. Автоматизация и создание загрузочного образа:

Для автоматизации процесса сборки будем использовать утилиту make. Для этого создадим файл makefile, который будет собирать компилировать исходный код, собирать ядро и создавать загрузочный образ. Makefile должен иметь следующее содержимое:

CC = gcc CFLAGS = -Wall -fno-builtin -nostdinc -nostdlib LD = ld OBJFILES = \ loader.o \ common/printf.o \ common/screen.o \ kernel.o image: @echo "Creating hdd.img..." @dd if=/dev/zero of=./hdd.img bs=512 count=16065 1>/dev/null 2>&1 @echo "Creating bootable first FAT32 partition..." @losetup /dev/loop1 ./hdd.img @(echo c; echo u; echo n; echo p; echo 1; echo ; echo ; echo a; echo 1; echo t; echo c; echo w;) | fdisk /dev/loop1 1>/dev/null 2>&1 || true @echo "Mounting partition to /dev/loop2..." @losetup /dev/loop2 ./hdd.img \ --offset `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk "{print $$3}"\`*512 | bc` \ --sizelimit `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk "{print $$4}"\`*512 | bc` @losetup -d /dev/loop1 @echo "Format partition..." @mkdosfs /dev/loop2 @echo "Copy kernel and grub files on partition..." @mkdir -p tempdir @mount /dev/loop2 tempdir @mkdir tempdir/boot @cp -r grub tempdir/boot/ @cp kernel.bin tempdir/ @sleep 1 @umount /dev/loop2 @rm -r tempdir @losetup -d /dev/loop2 @echo "Installing GRUB..." @echo "device (hd0) hdd.img \n \ root (hd0,0) \n \ setup (hd0) \n \ quit\n" | grub --batch 1>/dev/null @echo "Done!" all: kernel.bin rebuild: clean all .s.o: as -o $@ $< .c.o: $(CC) -Iinclude $(CFLAGS) -o $@ -c $< kernel.bin: $(OBJFILES) $(LD) -T linker.ld -o $@ $^ clean: rm -f $(OBJFILES) hdd.img kernel.bin

В файле объявлены две основные цели: all – компилирует ядро, и image – которая создает загрузочный диск. Цель all подобно привычным makefile содержит подцели.s.o и.c.o, которые компилируют *.s и *.c файлы в объектные файлы (*.o), а так же цель для формирования kernel.bin, которая вызывает компоновщик с созданным ранее скриптом. Эти цели выполняют ровно те же команды, которые указаны в шаге 3.
Наибольший интерес здесь представляет создание загрузочного образа hdd.img (цель image). Рассмотрим поэтапно, как это происходит.
dd if=/dev/zero of=./hdd.img bs=512 count=16065 1>/dev/null 2>&1
Эта команда создает образ, с которым будет происходить дальнейшая работа. Количество секторов выбрано не случайно: 16065 = 255 * 63. По умолчанию fdsik работает с диском так, как будто он имеет CHS геометрию, в которой Headers (H) = 255, Sectors (S) = 63, а Cylinders(С) зависит от размера диска. Таким образом, минимальный размер диска, с которым может работать утилита fdsik, без изменения геометрии по умолчанию, равен 512 * 255 * 63 * 1 = 8225280 байт, где 512 – размер сектора, а 1 – количество цилиндров.
Далее создается таблица разделов:
losetup /dev/loop1 ./hdd.img (echo c; echo u; echo n; echo p; echo 1; echo ; echo ; echo a; echo 1; echo t; echo c; echo w;) | fdisk /dev/loop1 1>/dev/null 2>&1 || true
Первая команда монтирует файл hdd.img к блочному устройству /dev/loop1, позволяя работать с файлом как с устройством. Вторая команда создает на устройстве /dev/loop1 таблицу разделов, в которой находится 1 первичный загрузочный раздел диска, занимающий весь диск, с меткой файловой системы FAT32.
Затем форматируем созданный раздел. Для этого нужно примонтировать его как блочное устройство и выполнить форматирование.
losetup /dev/loop2 ./hdd.img \ --offset `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk "{print $$3}"\`*512 | bc` \ --sizelimit `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk "{print $$4}"\`*512 | bc` losetup -d /dev/loop1
Первая команда монтирует ранее созданный раздел к устройству /dev/loop2. Опция –offset указывает адрес начала раздела, а –sizelimit адрес конца раздела. Оба параметра получаются с помощью команды fdisk.
mkdosfs /dev/loop2
Утилита mkdosfs форматирует раздел в файловую систему FAT32.
Для непосредственной сборки ядра используются рассмотренные ранее команды в классическом синтаксисе makefile.
Теперь рассмотрим как установить GRUB на раздел:
mkdir -p tempdir # создает временную директорию mount /dev/loop2 tempdir # монтирует раздел в директорию mkdir tempdir/boot # создает директорию /boot на разделе cp -r grub tempdir/boot/ # копируем папку grub в /boot cp kernel.bin tempdir/ # копирует ядро в корень раздела sleep 1 # ждем Ubuntu umount /dev/loop2 # отмонтируем временную папку rm -r tempdir # удаляем временную папку losetup -d /dev/loop2 # отмонтируем раздел
После выполнения вышеприведенных команд, образ будет готов к установке GRUB’а. Следующая команда устанавливает GRUB в MBR образа диска hdd.img.
echo "device (hd0) hdd.img \n \ root (hd0,0) \n \ setup (hd0) \n \ quit\n" | grub --batch 1>/dev/null

Все готово к тестированию!

Шаг 6. Запуск:

Для компиляции, воспользуемся командой:
make all
После которой должен появиться файл kernel.bin.
Для создания загрузочного образа диска, воспользуемся командой:
sudo make image
В результате чего должен появиться файл hdd.img.
Теперь с образа диска hdd.img можно загрузиться. Проверить это можно с помощью следующей команды:
qemu -hda hdd.img -m 32
или:
qemu-system-i386 -hda hdd.img


Для проверки на реальной машине нужно сделать dd этого образа на флэшку и загрузиться с нее. Например такой командой:
sudo dd if=./hdd.img of=/dev/sdb

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

Инструкция

Для начала попробуйте запустить функцию восстановления системы. Для этого вам потребуется либо установочный диск (при использовании Windows Vista или 7), либо один из множества Live CD (для Windows XP). Вставьте выбранный диск в привод. Включите компьютер.

Если вы используете установочный диск Windows Vista (Seven), то начните процесс установки новой ОС. Перейдите в меню «Дополнительные параметры восстановления» и выберите один из подходящих вам пунктов. Вы можете использовать автоматическое восстановление загрузочных файлов или же полный возврат системы к тому состоянию, в котором она находилась на момент создания архивного образа.

Если же у вас на компьютере установлена ОС Windows XP, то воспользуйтесь видом Live CD, позволяющим запускать Windows без наличия на компьютере рабочей ОС. Выберите пункт «Загрузка Windows с диска».

Подождите, пока программа подготовит и загрузит файлы. Это может занять достаточно много времени, потому что скорость чтения с CD-диска гораздо меньше скорости работы винчестера. Теперь выполните требуемые операции, работая в среде запущенной операционной системы. Будьте аккуратны, потому что запуск системы с диска позволяет вам проводить любые операции с файлами установленной ОС Windows XP.

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

Если вам требуется подготовить жесткий диск к установке новой операционной системы, то вам потребуется портативная версия программы Partition Manager. Запустите ее с USB-накопителя и произведите настройку разделов жесткого диска. Помните, что работая в среде ОС, запущенной с диска, вы не сможете устанавливать дополнительные программы на данный диск.

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

Вам понадобится

  • - программы Windows miniPE edition или ERD Commander

Инструкция

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

Сброс пароля компьютер а, не включенного в общую сеть, производите по другой схеме. При компьютер а нажмите F8. Выберите «Безопасный режим» в «Меню дополнительных вариантов загрузки Windows». Загрузите встроенную учетную запись «Администратор». После загрузки Рабочего стола войдите через «Пуск» и «Панель Управления» во вкладку «Учетные записи пользователей». В пункте «Изменение пароля» введите и подтвердите новый пароль, либо оставьте поле незаполненным. Перезагрузите компьютер .

В случае неудачи воспользуйтесь -восстановительными загрузочными дисками - Windows miniPE edition или ERD Commander. Первый содержит урезанную версию Windows XP, второй является загрузочным аварийно-восстановительным диском.Диск Windows miniPE edition загружайте после того, как в BIOS отметите загрузку с CD-ROM-а. После запуска нажмите кнопку miniPE, войдите в Programs, далее в System Tools, затем в Password Renew. Выберите Select Windows Folder, а в окне Browse for Folder обозначьте папки Windows. Зафиксируйте Renew existing user password. В списке Account укажите учетную запись, а в поле New Password напишите новый пароль. Подтвердите его в пункте Confirm Password. Выполните Install. В информационном окне выйдет сообщение «Password Renew for NTs is successfuly done!». Нажмите в miniPE кнопку Reboot. Перезагрузите компьютер уже с . ERD Commander загружайте аналогично через BIOS. Нажмите Skip Network Configuration. В окне Welcome to ERD Commander укажите операционную систему для . Выберите Start, зайдите в System Tools, обозначьте вкладкуLocksmith Wizard, установите Next. Далее в списке Account укажите учетную запись, а в поле New Password напишите новый пароль и подтвердите в Confirm Password. Перезапустите компьютер .

Обратите внимание

Не следует для сброса пароля удалять файлы SAM из system32\config. Это чревато серьезными проблемами, которые устраняются лишь переустановкой WINDOWS. И уж тем более не следует удалять файл файл logon.scr из system32\config, а файл cmd.exe называть logon.scr. Командное окно не откроется, и вы не войдете в систему как Администратор.

Полезный совет

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

Источники:

  • Тема на форуме

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

Инструкция

Перейдите в раздел
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWinlogon
Откройте параметр DefaultUserName введите и сохраните своё имя . Откройте параметр DefaultPassword введите и сохраните свой пользователя.
Откройте ключ AutoAdminLogon и введите значение 1. Если параметры DefaultPassword и AutoAdminLogon отсутствуют, создайте их, они должны иметь тип «Строковый параметр».
Перезапустите , вход будет осуществлён автоматически.

Если компьютер не принадлежит какому либо домену, и на нём установлена ОС Windows XP Home Edition или Windows XP Professional, то автоматический вход можно без реестра.
1. Запустите редактор реестра, для этого в меню «Пуск» выберите «Выполнить…» и введите строку «control userpasswords2».
2. В открывшемся окне снимите галочку «Требовать ввод пользователя и » и нажмите кнопку «Применить».
3. Откроется окно «Автоматический вход в ». Введите и подтвердите пароль в соответствующих полях и нажмите OK.

Видео по теме

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

Вам понадобится

  • Компьютер;
  • операционная система Windows

Инструкция

Зайдите в систему под именем администратора и удалите . Для этого перезагрузите , после чего дважды наберите комбинацию клавиш CTRL+ALT+DELETE. Введите имя пользователя, обладающего полномочиями администратора. Возможно вместо в поле «Имя пользователя» нужно ввести слово «Администратор», поле «Пароль» оставьте пустым и нажмите «ОК».

Левой кнопкой мыши кликните по кнопке «Пуск» в строке . Выберите пункт «Выполнить». В появившемся окне наберите команду control userpasswords2 и нажмите «ОК». Перейдите на вкладку «Пользователи», кликните на имени записи, чей пароль вы хотите удалить, затем кликните в поле «Смена ». В появившемся диалоговом окне «Смена пароля » пропишите новый пароль в поле «Новый пароль», далее повторите пароль в поле «Подтверждение», после чего нажмите кнопку «ОК». Перезагрузите компьютер и войдите в систему под новым паролем. Запишите пароль на бумажном носителе информации и храните в месте, недоступном для посторонних.

Воспользовавшись дискетой (диском) для удаления пароля , также можно зайти в систему без пароля . Для этого перезагрузите компьютер, в поле «Имя пользователя» введите имя того пользователя, чей пароль забыт и нажмите «ОК». В появившемся сообщении «Забыли пароль?» введите пароль и нажмите «Использовать диск сброса пароля ». Таким образом, запустится мастер удаления .

В окне «Мастер удаления паролей» нажмите «Далее», вставьте диск () для удаления пароля и снова нажмите «Далее». В появившемся поле «Введите новый пароль» впишите новый пароль и в нижестоящей строке еще раз напишите новый пароль для подтверждения. Далее в поле «Введите подсказку для нового пароля » введите подсказку и нажмите «Далее». В новом окне кликните «Готово», и войдите в систему Windows.

Источники:

  • Вход в систему Windows XP в случае, если пароль забыт или срок пароля истек

Полезный совет

Все это можно осуществить при помощи флешки, главное, чтобы помимо данной программы на ней ничего не было.

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

Инструкция

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

Снимите отметку флажком с пункта «Требовать ввод логина и пароля для входа в систему» в верхней части окна. Нажмите кнопку «Применить». У вас появится новое окно, в котором вам нужно будет ввести данные для автоматического входа в Windows. Примените изменения и закройте окна, перезагрузите компьютер.

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

Воспользуйтесь специальной сторонней утилитой для настроек параметров входа в операционную систему, например, XPTweaker, который имеется в свободном доступе в интернете.