Re: Колибри 0.7.7.0
Posted: Tue Jun 15, 2010 8:48 pm
Понятно. Какая-то финская традиция
хороший вопрос пытливого человека! Поздравляю!Nasarus wrote:А зачем, собственно, нужно было переключение регистров?
Ну наверное не совсем так. Вернее будет совсем не так если покумекать. Ну давай типа я тебе свое кумеканье изложу, думаю, будет полезно.Nasarus wrote:Понятно. Какая-то финская традиция
Code: Select all
cross_order:
; load all registers in crossed order
mov eax, ebx
mov ebx, ecx
mov ecx, edx
mov edx, esi
mov esi, edi
movzx edi, byte[esp+28 + 4]
call dword [servetable+edi*4]
ret
When Net branch will be merged in kernel, system function 53 will be deleted.<Lrz> wrote:Данное решение не сильно тормозит систему(регистровый сдвиг), однако занимает некоторое место. Было принято решение о прямом вызове сис. функций без регистрового сдвига. Сейчас осталось всего 4 сис. функции, которые используют это соглашение при вызове. Это 53, 58, 62, 63 сис.функции. Скоро система полностью избавиться от регистрового сдвига.
Собственно, степень соответствия размышлений реальности видна уже по тому, что в реальности ротация идёт в другом направлении - новое значение eax берётся из старого значения ebx.VaStaNi wrote:Тогда мониторинг покажет ротацию, сдвиг. Как это выглядит?
ПУсть был EAX = 0x66. Тогда логично, что в [servetable+edi*4] мы имеем EBX = 0x66 и это верно.
А если затем, сразу, "видим" еще вызов и еще и еще.... и уже ESI = 0x66......???
Угу. А заодно допустим, что при этом так грамотно рушится стек, что значение ESP оказывается таким же, каким было до "залетания", чтобы объяснить, почему следить за ESP недостаточно. Случайно всё так совпало, угу. И исключительно под этот случай подстраиваемся, бывает же. А ещё, разумеется, при этом мы совершенно игнорируем тот факт, что в первых версиях ядра всё было не так. Не было никакой метки cross_order, а случайное повторное попадание на метку i40 приводило не к повторной ротации регистров, а к повторной их загрузке в том же самом порядке.VaStaNi wrote:Ву вот залетаем мы сюда часто несанкционированно типа, циклимся непонятно откуда пусть и допустим именно на метку cross_order:
В такой интерпретации - да.VaStaNi wrote:вот тебе простенькая типа фенечка. Глупо?
Пишется, угу. Целая прожка, угу. Команда sed -i 's/;.*//' file.asm - и всё (короче даже, чем описание задания). Сэкономленное на "написании прожки" время можно использовать для флуда на форумах, домысливания целей других и, в особо исключительных случаях, для программирования ещё чего-нибудь. (Ну, если для красоты ещё потребовать, чтобы в случае, если кроме комментария на строчке только пробельные символы, то удалять всю строку, то команда несколько удлиннится до sed -i -e '/^\w*;/d' -e 's/;.*//' file.asm - опять же короче, чем формулировка. Для обхода всех файлов в подпапках можно засунуть команду в цикл for, если речь о виндовой командной строке, либо find, если об юниксовой.)VaStaNi wrote:Пишется прожка (парсер это слишком громко ), которая ищет символ ";" и удаляет весь остаток строки до 0Dh, 0Ah в листинге
любых сорцов типа asm в данном случае.
Моя версия такая. Сидит, значит, Ville, и... нет, не думу думает, а кодит. Надо как-то организовать связь между приложениями и ядром. Ясно, что удобнее всего передавать параметры в регистрах - не нужно думать думу о всяких структурах в памяти и перекодировкой указателей. Так, кодит Ville, какие бывают регистры? eax,ebx,ecx,edx,esi,edi, традиционно перечисляемые в таком порядке (esp выделенный, ebp не нужен). Значит, объявляет Ville, приложение пусть передаёт нужные параметры в этих регистрах, используя первые сколько надо в указанном порядке. А системные функции, продолжает Ville, пусть принимают нужные параметры в этих же регистрах. Естественно, номер системной функции ей самой передавать ни к чему. Следовательно, кодит Ville, в передатчике между приложениями и системными функциями регистры загружаются в порядке, смещённом относительно того, как они сохранены при системном вызове (да, там не было ротации регистров - желающие могут посмотреть на svn cat svn://kolibrios.org/trunk/core/syscall.inc@1). О том, что регистр ebx вообще-то традиционно non-volatile во всех конвенциях вызова, так что не мешало бы его трогать, только если не хватило eax+ecx+edx, мысли не возникает. О том, что вообще-то имеет смысл eax использовать под расходные материалы, а не под номер сисфункции, который можно и повторно использовать, - тоже. О том, что от такого решения может появиться совершенно ненужный код в будущем, при нормальном системном вызове, а не как он в данный момент закоден - тем более нет мысли, как и о нормальном системном вызове вообще.Nasarus wrote:А зачем, собственно, нужно было переключение регистров?
В svn.1504 пофиксил баг, приводящий в определённых ситуациях к ошибке файловой системы 5 при чтении существующих папок (не совсем правильная обработка буквы ё в названиях соседних файлов/папок).Leency wrote:Да, все ФМ выдают. КФАР пишет: Ошибка. Файл не найден. Не могу прочитать папку /bd0/2/Она моя/Моя галерея/