При закрытии подписчики были переданы в рассылку "Для бухгалтера: программы, новости, советы" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Сегодня в номере:
Новость. После месяца упорной работы вышла в свет версия 0.01 операционной системы Tyros/Neutronix, которая уже является слегка работоспособной системой (это означает, что она может запускать несколько программ с рамдиска :)
Образ дискеты с ОС и исходники вы можете забрать по адресу: http://sf.net/projects/tyros/
Как вы помните, в прошлом выпуске мы рассмотрели возможные способы отображения виртуального адресного пространства на физическую память. Но у системы виртуальной памяти есть еще один очень важный компонент - это исключение 11 - несуществующий сегмент и исключение 14 - page fault ака ошибка страничной адресации. Первое из них предназначено для организации виртуальной памяти на уровне сегментов и генерируется при попытке использования сегмента или шлюза, в дескрипторе которого бит P равен 0.
Исключение 14 генерируется в тех случаях, когда процессор не знает как обработать доступ к определенной странице памяти. Тут необходимо отметить, что page fault, хотя он и называется ошибкой, вовсе не является чем-то из ряда вон выходящим - процессор просто сообщает, что доступ нельзя осуществить аппаратными средствами и это придется делать программному обработчику.
При возникновении page fault процессор загружает в регистр CR2 адрес той ячейки памяти, обращение к которой вызвало сбой, а в стек помещает код ошибки, который имеет следующий формат:
Обработчик исключения page fault анализирует код ошибки, вычисляет элемент таблицы/каталога соответствующий послужившему причиной сбоя адресу и в зависимости от этого предпринимает какие-либо действия. Если ему удается исправить ситуацию, то нужный элемент таблицы страниц исправляется (иначе обращение по этому адресу снова вызовет page fault). После возврата из обработчика прерывания управление передается на ту же инструкцию, которая вызвала сбой. Если все в порядке, то процесс сможет продолжать управление
Заметьте, все это происходит прозрачно для процесса!
А теперь рассмотрим алгоритм одного из методов организации виртуальной памяти на IA-32 - demand allocation (выделение по требованию):
Я не привожу примеров кода (поскольку для реализации вышеописанных методов в системе уже должна быть серьезная инфраструктура), но самых любопытных отсылаю к исходникам Tyros, а именно:
hal/ia32/paging.c
hal/ia32/vm.c
На сегодня все, уважаемые подписчики.Как всегда, мой почтовый ящик открыт для вас: lonesome@lowlevel.ru Также вы можете задавать интересующие вас вопросы в форуме lowlevel.ru Предыдущие выпуски рассылки вы можете найти по этому адресу: http://subscribe.ru/archive/comp.soft.prog.osdev А все, исходники, опубликованые в рассылке, располагаются здесь: http://www.lowlevel.ru/osdev/sources.htm Всего наилучшего! Lonesome
{#template MAIN} {#include js_tmpl_auth_reg_tab} {#if $P.login_register_tab == 1} Войти на сайт {* {#include js_tmpl_auth_reg_button} *} {#include js_tmpl_auth_reg_action} {#include js_tmpl_auth_reg_descr} Если вы еще не с нами, то начните с регистрации Вход для авторов {#/if} {#if $P.login_register_tab == 2} Регистрация {* {#include js_tmpl_soc_auth_reg_descr} *} {#include js_tmpl_auth_reg_soc} {#include js_tmpl_auth_reg_agree} {* #include js_tmpl_auth_reg_descr *} {#include js_tmpl_auth_reg_action} {* {#include js_tmpl_auth_reg_button} *} {#include js_tmpl_auth_reg_descr} {#include js_tmpl_soc_auth_reg_descr} {#/if} {* *} {#/template MAIN} {#template js_tmpl_auth_reg_tab} Вход на сайт Регистрация {#/template js_tmpl_auth_reg_tab} {#template js_tmpl_auth_reg_action} {#if $P.login_register_tab == 1} {#include js_tmpl_auth_reg_soc} {#/if} {#if $P.login_register_tab == 1} E-mail или код подписчика Пароль Русская раскладка клавиатуры! У вас включен Caps Lock! У вас включен Caps Lock и русская раскладка клавиатуры! Чужой компьютер Забыли пароль? {#/if} {#if $P.login_register_tab == 2} E-mail Я ознакомился и согласен с условиями сервиса Subscribe.ru Нажимая на кнопку "Готово!", я даю согласие на обработку персональных данных {* Я хочу получать новости о скидках на одежду *} Готово! {#/if} {#/template js_tmpl_auth_reg_action} {#template js_tmpl_auth_reg_agree} Я ознакомился и согласен с условиями сервиса Subscribe.ru {#/template js_tmpl_auth_reg_agree} {#template js_tmpl_auth_reg_button} {#if $P.login_register_tab == 1} Email OpenID Вконтакте Mail.Ru {#/if} {#if $P.login_register_tab == 2} Email OpenID Вконтакте Mail.Ru {#/if} {#/template js_tmpl_auth_reg_button} {#template js_tmpl_auth_reg_descr} {#if $P.login_register_tab == 1} Для оформления подписки на выбранную рассылку, работы с интересующей вас группой или доступа в нужный вам раздел, просим авторизоваться на Subscribe.ru {#/if} {#if $P.login_register_tab == 2} Для регистрации укажите ваш e-mail адрес. Адрес должен быть действующим, на него сразу после регистрации будет отправлено письмо с инструкциями и кодом подтверждения. {#/if} {#/template js_tmpl_auth_reg_descr} {#template js_tmpl_soc_auth_reg_descr} Или зарегистрируйтесь через социальную сеть. {#/template js_tmpl_soc_auth_reg_descr} {#template js_tmpl_auth_reg_soc} {#if $P.login_register_tab == 1} {#/if} {#if $P.login_register_tab == 2} {#/if} {#/template js_tmpl_auth_reg_soc}
{#include js_tmpl_auth_reg_descr}
{#template MAIN} {#include js_tmpl_auth_reg_tab} {#include js_tmpl_auth_reg_descr} {#include js_tmpl_auth_reg_action} {#/template MAIN} {#template js_tmpl_auth_reg_tab} Регистрация {#/template js_tmpl_auth_reg_tab} {#template js_tmpl_auth_reg_descr} Пожалуйста, подтвердите ваш адрес.Вам отправлено письмо для подтверждения вашего адреса {$P.register_confirm_mail}.Для подтверждения адреса перейдите по ссылке из этого письма. {#/template js_tmpl_auth_reg_descr} {#template js_tmpl_auth_reg_action} Или введите код из письма: Не пришло письмо? Пожалуйста, проверьте папку Спам (папку для нежелательной почты). Вышлите мне письмо еще раз! Готово {#/template js_tmpl_auth_reg_action}