Отправляет email-рассылки с помощью сервиса Sendsay

Журнал CODELIB.NET.RU

  Все выпуски  

Журнал CODELIB.NET.RU Выпуск 2


Информационный Канал Subscribe.Ru

Codelib.net.ru :: Журнал :: Выпуск №2

CODELIB.NET.RU journal

Выпуск №1 ••••• 2.10.2004 ••••• admin@codelib.net.ru



Сегодня в выпуске ::

• Наши Новости
• Новое на сайте

• Написание ОС - урок 1
• Написание ОС - урок 2
• SSI - урок 1
• SSI - урок 2


Наши Новости ::

Здраствуйте! Наш сайт все еще заполнен не полностью, но статьи появились еще. Сегодня в этой рассылке мы расскажем аж 4 статьи, как вы уже заметили. НЕ забывайте пожалуйста на форум заходить!!! Регьтесь и спрашивайте! Понятно, что сайт новый, никого нет... Мы сами вам поможем!


Новое на сайте ::

Ну поскольку рассылка вышла почти с открытием сайта, здесь будет не все новое... Ну вощем вот список последнего:

Новые статьи/исходники
• SQL - урок 3
• SSI - урок 1
• SSI - урок 2
• Assembler - исходник BIOS
• Низкоуровневое - Написание ОС - урок 2
• WinAPI - пополнения

Новые файлы
• Дискета к книге Кулакова
• GCC+LD+AS для DOS


Написание ОС - урок 1 ::

Добрый день. Рад приветствовать всех вас здесь, в разделе разработок ОС. Всегда приятно почувствовать себя юным Торвальдсом=). Здесь мы, как вы уже поняли, будем писать ОС. Правда оговорюсь сразу: на этих уроках я помогу написать вам лишь каркас ОС, а остальные features вы будете добавлять сами. В основном мы будем писать ее на языке Си. Итак...

На этом уроке я собираюсь рассказать вам краткую теорию режимов процессора, что мы для начала будем создавать (какие features) и самое главное, какие инструменты нам пригодятся.
Режимов у процессоров семейства Intel 80x386+ два: реальный и защищенный. Реальный режим по сути не предназначен для операционок, это режим, который был основным в процессоре 80x86. В нем мы можем воспользоваться прерываниями видео, клавы и пр. После включения компьютера процессор находится в реальном режиме, здесь происходят тесты BIOS и загрузка BOOT-секторов, а когда уже BOOT-сектор какого-либо диска загружен, на него передается управление. Предположем, мы грузим в память загрузчик Windows 2000, после передачи ему управления он вычислит различные параметры через стандартные прерывания и затем переходит в защищенный режим. Чем плох реальный режим? А тем, что памяти там очень мало, независимо от того, сколько у вас ее натыкано и нет механизмов защиты памяти.

Защищенный режим прозвали защищенным за то, что в этом режиме разделение задач происхожит на уровне процессора, т.е. одна программа не залезет на территорию другой, как могло бы произойти в ДОСе ранних версий. В том же дозе могло и произойти так, что любая программа может затереть область самого ДОСа, может воспользоваться любыми портами ввода-вывода и выполнить любую команду типа "cli". В защищенном же режиме все совсем по другому. Если например в реальном режиме в программе встретится строка "jmp $", то не поможет уже ничего. В защищенном режиме на уровне процессора встроена многозадачность, разделение памяти между этими задачами, виртуальная память (использование жесткого диска в качестве оперативки), до 4 ГБ оперативной памяти и самое главное, кольца защиты, т.е. операционная система имеет привилегию как бы "root", а прикладные задачи обыкновенного пользователя и поэтому не могут залесть в память чужих задач и тем более операционной системы.

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

Теперь какие же нам пригодятся инструменты. Сначала обо мне. Я буду использовать Windows XP, GCC 3.2.3 (заточенный под DJGPP, DOS), nasmw 0.98, BOCHS 2.1 pre1, RawWriteWin. DJGPP - это такая фишка, в которой gcc, ld, as и прочие полезные штуки. Скачать можно с ftp://delorie.com, но это все довольно увесистое, поэтому на нашем сайте есть статья о том, как поставить gcc (+as,+ld) и архив с самими программами - минимальный набор туриста под Винду... Лучше конечно же использовать Linux. На nasm мы будем писать ассемблерный код, скачать под Винды можно с нашего сайта. BOCHS - это эмулятор, т.е. мы можем тестировать нашу операционку, не выключая компа. Сделан и под Винды и под Линукс, на нашем сайте есть инструкция.

В-общем вам пригодится GCC (можно не очень новый), nasw, RawWriteWin (для записи образов на дискету, можно скачать с нашего сайта), BOCHS - по желанию, но это очень удобно и сетап (гзип) весит около 2-3 МБ всего помойму.
И хотелось бы, чтобы вы хотя бы чуток разбирались в Си (пусть даже не в ассемблере, так как на нем мы в основном только загрузчик напишем).

Ваши вопросы, пожелания, идеи мы всегда ждем на мыле. Пишите!

Авторы: C0dfather, ash
Дата: 14.09.2004


Написание ОС - урок 2 ::

Добрый день. Сегодня мы поговорим о загрузчике нашей ОС и вообще загрузчиках. Что такое загрузчик? Это то, что загружает основные данные.
Рассмотрим понятие BOOT-сектора: это самый первый сектор дискеты или диска, в котором находится сам загрузчик. Для того то он и нужен, чтоб уместить его в один сектор. Так как сектор обычно имеет 512 байт емкости, то соответственно и загрузчик должен быть не более 512 байт. А больше и не надо: несколько инструкций чтения с дискеты и загрузки этих данных в оперативную память. BOOT-сектор при загрузке компьютера загружается в память посредством BIOS (в настройках BIOS мы указываем First/Second/Third Boot Device).

Сначала BIOS загружает с устройства, указанного в строке First Boot Device. Предположим, это дисковод (Floppy). Тогда BIOS считает первый сектор дискеты, загрузит его в память по адресу 0x7C00 и передаст на него управление, но в случае, если дискета не вставлена, сектор сбойный или первый сектор не является BOOT-сектором, BIOS передаст управление на Second... Аналогично Third.

На жестком диске же находится Master Boot Record (Главная Загрузочная Запись). Она содержит таблицу разделов жесткого диска (C: D: E: или /dev/hdaX). Определяется активный раздел и производится загрузка его загрузчика.
Следует отметить, что загрузочный сектор (буть он BOOT-сектор на съемных дисках или MBR на жестком) должен оканчиваться (байты 511 и 512) на специальную сигнатуру 0x55, 0xAA. Если BIOS не обнаружит этой сигнатуры в конце сектора, она подумает, что это не загрузочный диск и перейдет к следующему устройству загрузки, а если это было последним (First), она скажет что-то типа DISK BOOT FAILURE....

В оставшейся части урок я объясню, как будет работать наш загрузчик и напишу программу для ОС-независимого запуска. Основываться я буду на статье "Пишем BOOT-сектор (мини ОС)". Создаем файл boot.s ну или boot.asm, как вам удобно.
[BITS 16] ; а сколько же в реальном режиме
[ORG 0x7c00] ; BIOS грузит нас поэтому адресу

main:

cli
mov ax, cs
mov ds, ax
mov ss, ax
mov sp, main
sti

; Здесь идет основной код

mov si, hello
call _print

; Основной код заканчивается

cli
jmp short $

_print:
 ._loop:
lodsb
cmp al, '$'
jz ._stop
mov ah, 0x0e
int 0x10
jmp short ._loop
 ._stop:
ret

hello: db "Hello world!",0x0a,0x0d,"$"

times 510-($-$$) db 0 ; заполняем все нулями до сигнатуры
db 0x55, 0xaa ; сигнатура
Оговаривать работу самой программы я не буду, об этом описано в статье. Объясню принцип ее загрузки и передаче ей управления. Для начала давайтескомпилируем ее:
nasmw -f bin -o bootsector boot.s - если мы в Windows
nasm -f bin -o bootsector boot.s - если мы в Linux
Что такое -f bin -o bootsector? -f bin означает формат (f-format) бинарный, чисто двоичный, без заголовков, коий нужен для наших целей. Теперь заходим в RawWriteWin, выбираем вкладку "Write", открываем там файл bootsector и делаем Write. А если мы в Linux, то:
cat bootsector > /dev/fd0
Записали? Хорошо. Заметьте, RawWriteWin или cat запишут нашу программу именно на 0 сектор, потому что она весит 512 байт и RawWriteWin с cat'ом пишут на начало. Всунем дискету в дисковод и удостоверимся, что First Boot Device именно Floppy. Вот BIOS проводит тест, заветный пик (звук из писи-спикера), моргание лампочек на клаве. Вот зажурчал дисковод: это BIOS читает BOOT-сектор. После прочтения она эти данные отправляет по адресу 0x7c00. Потом прыжок на наш код и управление у нас в руках! Ну а тут уже и "Hello world!" вылезает... ВСЕ!

Ваши вопросы, пожелания, идеи мы как всегда ждем на мыле. Пишите!

Авторы: C0dfather, ash
Дата: 2.10.2004



SSI - урок 1 ::

Я приветствую всех вас на уроках по SSI. В первом уроке я объясню вам, что такое SSI. SSI расшифровывается как Server Side Includes (вставки на сервере). Все из вас знают, что есть два типа скриптов: выполняющиеся на стороне клиента (JavaScript, VBScript) и скрипты, выполняющиеся на стороне сервера (PHP, ASP, Perl...). Так вот, SSI относится именно ко второй группе. То есть он полностью выполняется на стороне сервера, как PHP, но имеет свой специфический синтаксис и не очень удобен в использовании. Команда SSI распологается в тэге комментария HTML, например, вот команда, которая включает внешний файл:
<!--#include file="file.inc"-->
То есть общий вид команды SSI таков:
<!--#cmd par="value"-->
Важным примечанием является то, что нельзя разместить несколько команд в одном комментарии. Для каждый команды нужно открывать новый комментарий. Плюсом является то, что если SSI на сервере не обрабатыватся, то строка не выведется на экран, так как находится в комментарии, в отличие, например, от PHP. А если же произошла ошибка во время обработки какой-либо из команд SSI, то выведется строка "[an error occured while processing this directive]".
Забыл сказать, что файлы SSI должны иметь расширение *.shtml, или другое, если его поддерживает ваш хостер.

Так как SSI выполняется на сервере, в странице нам доступны все серверные переменные. Эти переменные - совершенно не генерируемые SSI, для тех, кто не знает. Это общие серверные переменные, доступные и в PHP, Perl и др. Приведу список всех известных мне:

DOCUMENT_NAMEИмя текущего документа, к примеру "ssi.shtml".
DOCUMENT_URIПуть к текущему документу из корневой директории.
DATE_LOCALТекущие дата и время сервера (с учетом часового пояса).
DATE_MODIFIEDДата и время последнего изменения документа.
QUERY_STRINGСтрока запроса, посланная браузером клиента. Это та строка, которая находится после знака вопроса в строке адреса.
SERVER_SOFTWAREПрограммное обеспечение сервера.
SERVER_PROTOCOLВерсия HTTP-протокола.
SERVER_PORTПорт HTTP-сервера.
REQUEST_METHODМетод, которым запрошен текущий документ.
REMOTE_ADDRIP-адрес удаленного клиента.
REMOTE_HOSTДомен удаленного клиента.
AUTH_TYPEМетод авторизации пользователей.
CONTENT_TYPEТип переданной на страницу информации.
CONTENT_LENGHTДлина переданной на страницу информации.
HTTP_ACCEPTСписок MIME-типов, поддерживаемых удаленным браузером.
HTTP_USER_AGENTИмя и версия браузера удаленного клиента.
HTTP_COOKIECookie, присланное удаленным клиентом.

Если какая-то переменная не содержит значения, на экран выведется (none).
Вывести на экран переменную можно с помощью команды #echo, где параметром var задается необходимая переменная, т.е. запрос будет выглядеть так:
<!--#echo var="SERVER_SOFTWARE"-->
На этом пока все. На следующем уроке мы разберем другие команды SSI, такие, как включение файла, запуск внешнего CGI-скрипта и пр.

Ваши вопросы и пожелания жду на мыло сайта codelib.net.ru.

Автор: ash
Дата: 12.09.2004


SSI - урок 2 ::

Вот мы и продолжаем изучать SSI. Сегодня мы поведем разговор о включении файла в документ. Это очень полезно: например, у вас есть сайт, а в нем на каждой странице находится какой-то один элемент. Пусть это рисунок. Поступают легко: создают новый файл, записывают в него код с тегом рисунка. А на страницах, где этот рисунок должен нахоиться, в этом месте пишут SSI-директиву включения файла с кодом рисунка. Нет смысла - скажете вы, но допустим вы переименуете файл рисунка? Вам бы надо было в КАЖДОЙ странице редактировать код, а если бы вы использовали конструкцию, которую привел я в пример, то нужно было бы только в одном файле поменять код и все! Удобно.

Так вот, чтобы включить файл мы пишем директиву в том месте, где необходимо вставить код из файла. Причем следует заметить, что включаемый файл обработается сервером, прежде чем будет включен. Т.е. если вы включаете файл PHP, он сначала обработается сервером, и только потом уже обработанный код включится в страницу. Вот схема включения:
<!--#include file="file.inc"-->
<!--#include file="script.php"-->
К тому же файлам можно передавать строку запроса HTTP (QUERY_STRING). То есть мы хотим, допустим, отобразить в текущем документе сообщение из форума под известным нам идентификатором (это пример):
<!--#include file="message.php?action=getmessage&id=125"-->
Кроме этого, мы можем вставить в строку запроса значение какой-нибудь переменной. Пусть это будет REMOTE_ADDR (IP-адрес удаленного клиента, понятно, что PHP-скрипт и сам определить в состоянии, но это пример). То, что это переменная, SSI поймет, если мы поставим знак доллара $ в начале. Смотрим:
<!--#include file="hacker.php?$REMOTE_ADDR"-->
Ну я думаю с этим понятно. Теперь я расскажу о других важных командах. На SSI есть возможность запустить внешний CGI-скрипт, это практически аналогично его включению инструкцией include. Сделать это можно следующим образом:
<!--#exec cgi="file.pl" -->
В PHP есть такая функция die("descr"); - завершить выполнение текущего скрипта. Все содержимое файла, которое находилось после вызова этой функции будет проигнорировано (даже HTML). В SSI существует подобная:
<!--#break-->
Подобно различным языкам программирования, в SSI имеются директивы перехода (goto). Одна директива определяет точку для перехода. Другая позволяет перейти на нее. Реализуется это все подобным образом:
 ...
<!--#label="label1"-->
 ...
 ...
<!--#goto="label1"-->
 ...
На сегодня все. На следующем уроке я расскажу об условных директивах.

Ваши вопросы и пожелания жду на мыло сайта codelib.net.ru.

Автор: ash
Дата: 2.10.2004


Эти и другие статьи с иллюстрациями Вы можете отыскать на нашем сайте http://codelib.net.ru и обсудить на форуме.
Мы ждем ваших вопросов на мэйл, указанный сверху. До встречи.

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.codelib
Отписаться

В избранное