конечно лучше: 1) код становится намного читабельнее, не отвлекаешься на лишние названия 2) не надо придумывать кажыдй раз разные имена, думать, что они значат, искать их по коду и т.д. Когда видишь ссылку на анонимную метку, сразу подсознательно ищешь ближайшие две собачки, а не пытаешься перерыть половину кода в поисках, куда же идет прыжок 3) лично у меня весь код идет с табуляцией в единичку; анонимная метка как раз встает перед инструкцией и не смещает ее - очень удобно и код смотрится красиво
Miyamoto Лично для меня ничем. Я обычные метки и буду использовать. А вообще на деле, это лучше тем, что не нужно задумываться как обзывать метки (а то вдруг ты одинаковые имена меткам дал). Я вообще лишь про это всё хотел узнать, только лишь из-за того, что не понимал что происходит в чужом коде.
Всем доброго дня! Я запутался с менеджером памяти. Вот если у меня всё будет идти по страничкам, то я не понимаю следующего... В Windows ведь тоже используется механизм страничной адресации. А вот в языке C++ есть команды new/delete для выделения/освобождения памяти. Вот мне и интересно, ведь я могу указать так: Code (Text): char* p=new char[8]; И мне выделится именно 8 байт (с учётом того, что char занимает 1 байт). И если я зайду за границу этого массива: Code (Text): char a=p[12]; То произойдёт ошибка и приложение будет закрыто. Так как же это всё делается? И разве я могу конкретно выделить указанное количество байт для пользования программы? А то мне кажется что минимум что я смогу - так это 4 КБ выделить. То есть динамически открывать для программы новые странички. Если в текущей открытой странички есть место, то давать указатель на свободное место в страничке. А если места уже нет, то добавлять новую страничку. Да и как тогда происходит вылов обращения за несуществующий диапазон для массива? Собственно вот это меня пока смущает. А так можно было бы уделить одно прерывание для менеджера памяти и в зависимости от выбранной функции (например в EAX), производить: выделение страницы, выделение байт данных, освобождение страницы, освобождение байт данных. Но как тогда освобождать массив (видимо нужно будет в памяти хранить ещё и его размер).
Для выделения памяти используется менеджер памяти, который берет память у системы по 4kb, а твоему коду уже выдает меньшие куски. Менеджер ведет базу выданых кусков. P.S. на самом деле это практически базовые знания. Непонятно, как можно писать какую-то ОС, не понимая этого. Да и литературу приводимую ты наверное так и не читал...
Под менеджеров памяти подразумевается обслуживающий код в самом приложении. А вообще по-научному это называется куча
barmaley57 Так вот я понимаю что он выделяет кусок (точнее я про это думал). И фиксирует что он выдал. Но как же идёт определение того, что программа зашла за указанный диапазон выделенной памяти? Или в пределах 4 КБ программа сможет везде ссылаться?
barmaley57 Это в винде, а не по научному, называется куча. Только вот вопрос чего. s3dworld Контролем выхода за границы массива может занимать как автоматизированный, так и узкоспециализированный код. Под автоматизированным контролем я понимаю контроль со стороны системы за целостностью блоков выделенной памяти. В самом простом случае его можно организовать примерно так. Каждый выделенный блок для приложения помещается между промежуточными блоками безопасности фиксированного размера (скажем по 16-64 байта). При каждом выделении или освобождении (а может в каких-либо других механизмах, допустим в механизме динамического формирования строк) памяти проверяются данные в блоках безопасности как перед, так и после выделяемого/освобождаемого блока с целью определения выхода за его размер. Блоки безопасности заполняются какими-либо данными, которые система сможет безболезненно проверить и, которые с большой вероятностью не будут использоваться программой. Под узкоспециализированным методом контроля понимается код, который компилятор встраивает в приложение для контроля выхода индексов за границы массива и т.д. и т.п. По хорошему да. Но механизмы системы должны оперативно это предотвращать. Но как это сделать уже вы сами придумаете.
max7C4 Собственно не понимаю как ОС может контролировать выход. Предположим если я напишу: Code (Text): char* p=0; p=new char[1024]; Предположим что у меня выделится страничка (размер 4 КБ) и программе (точнее указателю p) будет передан адрес начала это странички. И вот я решил записать сюда: Code (Text): p[2048]=0xFF; Если посмотреть, то это абсолютно не ошибочная команда (ошибка не должно произойти), так как 2048 принадлежит к 4 КБ памяти странички. По сути в 2048 может быть использовано для другого указателя или вообще не определены в программе, но страничка то для программы эта доступна. И как же тогда я смогу определять выход за границы? Или можно настроить прерывание, которое будут срабатывать каждый раз, при обращении к памяти?! Хотя по сути такое прерывание было бы тупостью (сколько же времени тогда выполнялись бы программы).
Зачем это контролировать? Если приложение выходи за границы массива, то это проблемы самого приложения, главное чтобы ОС от этого была защищена. В обычных приложениях винды можно без проблем "прогуляться" за границами выделенного массива до конца страницы куда был выделен блок памяти функцией локального выделения.
Всем доброго дня! Как считаете, стоит ли после загрузчика писать код на C/C++? Не уверен что на C++ можно, но на C ведь точно можно с помощью GCC. Только на сколько я знаю - это хорошо прокатывает если делаешь из под Linux. Слышал что Windows не позволяет получать сырые бинарники. Вот я и думаю, может стоит писать на языке высокого уровня?
Только хорошо прожаренные получаются!!! Там этого кода - кот наплакал, пиши на чём хочешь.... Учитесь формулировать мысли. А то я понял только после того, как накатал 100500 строк гневного текста.
s3dworld, вы когда-нибудь разбирали дизассемблированный файл, написанный на языке высокого уровня? А на асме? Проверьте и заметьте разницу. Тем более смысл писать на языке высокого уровня - ведь вам всё равно придётся писать вствки на асме. Ядро пишется на асме! Лучший вариант, а я бы вам посоветовал бы Рихтера почитать (знаю, форточки, но про оргранизацию памяти ему было бы полезно почитать ). Для просто-напросто базовых знаний. Вы собрались писать ось совершенно не разбирая в данном вопросе.
Вообще, я поставил перед собой задачу написать операционную систему настолько примитивную, что она будет хуже MS-DOS. Но в отличии от MS-DOS она будет работать в защищённом режиме работы процессора (P-Mode). Система будет однозадачной и текущая задача (программа) будет иметь полный контроль над компьютером. Следовательно никто не мешает программе перейти в режим реальных адресов (R-Mode), в режим виртуальной совместимости с предыдущими процессорами (V-Mode) и даже в длинный режим (L-Mode). Собственно такое позволение позволит программам работать с любым оборудованием. А вот сама система будет уметь работать только лишь с устройством клавиатуры, подключённое к PS/2, и с floppy-дисководом. Я придумал файловую систему, которая будет размещена на дискете. Эта файловая система будет очень простой. Она не будет содержать папок (каталогов). Максимальное количество файлов будет ограничено, так же как и будет ограничен максимальный размер файла. Операционная система будет грузиться с дискеты и сохранять результат своей работы туда же. В качестве программы, будет написана только программа notepad.app, представляющая из себя простой блокнот. Ну и сама операционная система будет представлять из себя консоль, которая будет иметь возможность запускать программы, открывать документы через блокнот, просматривать список файлов, получать их размер, копировать, удалять и переименовывать их. А так же перезагружать, выключать компьютер и выходить из операционной системы передав управление BIOS, чтобы он смог дальше искать загрузчик. Для программ будут доступны ряд прерываний, которые будут обслуживать файловую систему, клавиатуру, видеоадаптер. При входе в систему видеоадаптер будет работать в текстовом режиме. Но никто не мешает программам переводить видеоадаптер в графический режим. Собственно вроде бы такая примитивная система, а делать не так уж и легко. Думаю задачка достойная для хорошего напряга мозгов. Раз не будет многозадачности, то и нет смысла использовать страничный механизм - будут лишь сегменты. Теперь бы мне научиться работать с клавиатурой и floppy-дисководом из защищённого режима, не переходя в реальный или виртуальный режим. Подскажи те хорошие статьи.
Igor1024 Разбирал. И честно говоря, всегда не понимал какого хрена так много лишнего кода в первом случае.
Запутался со стеком. Помогите полностью разобраться в его работе. Собственно что такое стек, я знаю (хотя точного определения дать не смогу, да и много их). Для меня, стек - это область памяти для временного хранения данных. Мне всё равно в какую сторону эта область данных растёт, но как уже принято - стек растёт от старших адресов к младшим. Кстати, а почему именно так? Ведь если выделять для стека определённую область, какая разница тогда куда ему расти? Немного я поспешил, сказав что всего у меня будет три дескриптора. Из будет четыре: 1. Нулевой дескриптор; 2. Дескриптор сегмента кода; 3. Дескриптор сегмента данных и стека; 4. Дескриптор сегмента данных видеобуфера. Таким образом у меня регистры DS, ES, FS и SS будут указывать на дескриптор сегмента данных и стека, а регистр GS будет указывать на дескриптор сегмента данных видеобуфера. Разумеется ESP будет указывать именно туда, где я хочу чтобы начинался стек. Так а зачем нужен регистр ЕВР? Статья Регистры (http://www.codenet.ru/progr/asm/regs.php) ничего мне не пояснила: Далее, я собираюсь делать без многозадачности, следовательно без переключения задач. Таким образом, когда будет происходить прерывание (любого типа), процессор перейдёт к коду обработчика прерывания, у меня ведь не будет никакого своего стека, будет использоваться всё тот же. Так ведь? Вроде бы стек другой используется только при переключении задач. В общем я никак эту тонкость не уловил. Поясните, пожалуйста.
s3dworld Потому что именно такой порядок предполагают команды PUSH, POP, CALL, RET и т.д. На других процессорах порядок может быть другим (в родной системе команд ARM он вообще произвольный, хотя в Thumb уже фиксированный). А что мешает не использовать сегментацию, а просто отобразить все 4 гигабайта каждого сегмента на одни и те же 4 гигабайта линейного адресного пространства, как это делается во всех коммерческих ОС? Без него вполне можно прожить. В системе команд 8086 (16-разр) нельзя было адресоваться относительно SP, поэтому для адресации данных в стеке был предусмотрен специальный регистр -- BP (предполагается, что SP постоянно меняется, ну а BP остаётся при выполнении одной подпрограммы постоянным). В 32- и 64-разрядных процессорах такого ограничения нет, поэтому EBP/RBP можно использовать как обычный РОН, а всю адресацию вести относительно ESP/RSP -- только, естественно, надо учитывать его возможные изменения. Нет, не так. Стеки переключаются не только при переключении задач, но и при изменении уровня привилегий процессора. Если вся работа делается в нулевом кольце, тогда нет и переключения стека, иначе оно всё равно происходит. Для этого, собственно, и нужен единственный ТСС, даже если аппаратная многозадачность не используется.
SII У меня всё будет только в одном нулевом уровне привилегий. Разве для этого мне обязательно создавать TSS?