hirthwork
22.01.2013 03:49 mcabber
Что происходит когда я обращаюсь к массиву в Java? JVM проверяет, что я не вышел за пределы массива, а затем ОС проверяет, что я не вышел за пределы отведённой мне памяти, что уже излишне. выходит, что программы на Java на системах типа JNode будут работать быстрее, ибо там проверка будет происходить лишь однажды. в общем, надо срочно прочитать Таненбаума и написать свой Jnode с драйверами и гарбаж коллектором
Вот если бы еще была гарантия, что Java не выйдет за пределы памяти — цены бы не было.
ну так, если JVM является осью, то она никогда не выйдет. вся память уже принадлежит ей
алсо, ты когда-нибудь слышал, чтобы JVM прибивалась осью за то что вышла за пределы памяти? вот и я не слышал
ну уязвимости в ней находят периодически (хотя какие именно я вообще без понятия). то есть, разве что действительно если бы кроме JVM в ОС ничего не было — тогда да, проверка была бы лишней.
ос не проверяет этого, тащемта
ой, да ладно. а как это ОС догадывается моё приложение с SIGSEGV прихлопнуть? наверное потому что видит, что я не на свою страницу памяти залез
ээ, что-что?
Наверное потому что процессор выкинул #pf при обращении по виртуальному адресу, который не смаплен ни на одну физическую страницу в твоем адресном пространстве? Ну или #gp при обращении к странице, если твоего уровня привилегий недостаточно для этого. Все эти проверки занимают не больше времени, чем, собственно, вычисление физического адреса из виртуального.
что-то я не очень понимаю, разве маппингом и поиском соответствия в маппинге виртуальной памяти на физическую не ОС занимается? при чем здесь процессор?
os строит таблицы. Процессор вычисляет адреса по ним.
Или ты думаешь что есть какое-то волшебное прерывание, которое вызывается пи *любом* обращении к памяти, и позволяет ос что-то там считать?
я думал, что процессор вычисляет адреса и отдаёт вычисленные адреса обратно ОС, а ОС уже обращается к памяти по вычисленному адресу.
или обращение к памяти как раз через процессор и делается?
И как же ос должна обращаться к памяти в таком случае, минуя процессор?
ну, даже если не минуя, я был уверен, что ос вычисляет физический адрес, а затем по нему обращается, и получает ошибку лишь в случае отсутствия такого физического адреса. а вот работу по проверке принадлежности виртуального адреса его диапазону и прочего перевода по таблицам из виртуального в физический адрес делает ОС (используя процессор в качестве калькулятора и не более).
1) Представь на секунду быстродействие этого бреда и ужаснись.
2) Кто в таком случае вычислял бы адреса, к которым обращается ос из обработчика, который должен вычислять адреса?
3. :(
Вообще у микрософта есть такая экспериментальная ось, на этих самых принципах, только там дот нет. От нее в свое время было много шума.