Миллион целых — потому что у меня в цикле действительно миллион, и это размер листа, никакого отношения к байтам. А по поводу мебибайта/мегабайта вы правы, смешиваю. Привычку писать в сокращении выработал, а в тексте пока нет.
Да, все через GRUB. Начальная загрузка пока для меня выглядит сложной, так как я ещё не разобрался на приличном уровне с носителями и файловыми системами, чтобы корректно прочитать и загрузить образ. Думаю, что когда доберусь до реализации работы с HDD, можно будет и в сторону своего загрузчика посмотреть
Думаю, что не сможет — я же не встраиваю ассемблер в rs-файлы и не пишу интринсики. Более того, у меня опасные ассемблерные методы обернуты в безопасные методы Rust, поэтому там на два вызова больше. А линкер скорее всего такой оптимизацией не занимается. Хотя как знать.
Или в локальной LDT.
Если мы собираемся использовать не плоские глобальные сегменты, а выдавать каждой задаче свои, то места в GDT всем не хватит. Разместив дескрипторы в LDT (скажем, код-данные-стек-служебное что-то), мы займем в GDT только одну ячейку и 4 — в LDT данной задачи.
Где-то я встречал утверждение, что современные компиляторы не могут в сегментную модель, только в плоскую. Я не берусь утверждать, что оно верное, но около 100% программ собираются под плоскую модель. Так что да, можно. Но я не увидел смысла. И даже можно было бы запускать плоские программы в сегментированной памяти — как вы описываете, выделяя по одному сегменту каждой задаче, но опять же — зачем, если никто так не делает, и пишут, что это устаревшая система.
Вот этот кусок понять не смог.
Линкер собирает программу с опорой на BaseAddress, который в общем случае, может быть любым. Нам ведь никто не запрещает разместить ядро по адресу, скажем, 1000h (нулевая страница — guard), а все прикладные программы компоновать с адресом загрузки 80000000h.
Проблема будет лишь в том случае, если вы хотите запустить программу, написанную и собранную под другую ОС без перекомпоновки (что возможно только если ваш API полностью бинарно совместим, а это вряд ли).
Совершенно верно. Однако, это специфические случаи, требующие скармливания дополнительных инструкций линкеру. В самом общем случае под большинство ОС программы предпочитают начинаться с начала адресного пространства. В том же Windows дела обстоят так: 0x00000000 — 0x0000FFFF: нулевые указатели, 0x00010000 — 0x7FFEFFFF: память программы, 0x80000000 — 0xFFFFFFFF: память ядра.
А как же потери при небольших размещениях? Не велика гранулярность для 32 бит?
Велика, конечно. Надо брать 4 КиБ. Когда-нибудь у меня дойдут руки и до 4 КиБ. На этом этапе я захотел сделать жизнь чуть проще, оставив один уровень таблиц, благо PSE это позволяет.
Вообще "правильный" ассемблер в данном случае не очень хорош, так как под другие платформы в основном используется синтаксис at&t, и портировать будет сложнее — придется изменять не только код под платформу, но и систему сборки. Но мне приятнее писать в Интел синтаксисе, так что пусть будет.
Это прекрасно!
Но все же, ни одна подобная статья не освещает вопрос энергоэффективности. Как часто приходится заряжать девайс? Где находятся элементы питания и сколько они весят?
Потому как даже самый совершенный протез в мире будет практически бесполезен в повседневной жизни, если тебе нужно будет сидеть возле розетки с кабелем хотя бы 50% времени.
В 2012 болгарский шахматист Борислав Иванов явно пользовался тем, что игры транслируются он-лайн. Легко гуглится инфа на эту тему. Судя по всему, не обошлось без ПК да микрогарнитуры.
Да и вообще таких случаев немало.
Да, все через GRUB. Начальная загрузка пока для меня выглядит сложной, так как я ещё не разобрался на приличном уровне с носителями и файловыми системами, чтобы корректно прочитать и загрузить образ. Думаю, что когда доберусь до реализации работы с HDD, можно будет и в сторону своего загрузчика посмотреть
Думаю, что не сможет — я же не встраиваю ассемблер в rs-файлы и не пишу интринсики. Более того, у меня опасные ассемблерные методы обернуты в безопасные методы Rust, поэтому там на два вызова больше. А линкер скорее всего такой оптимизацией не занимается. Хотя как знать.
Где-то я встречал утверждение, что современные компиляторы не могут в сегментную модель, только в плоскую. Я не берусь утверждать, что оно верное, но около 100% программ собираются под плоскую модель. Так что да, можно. Но я не увидел смысла. И даже можно было бы запускать плоские программы в сегментированной памяти — как вы описываете, выделяя по одному сегменту каждой задаче, но опять же — зачем, если никто так не делает, и пишут, что это устаревшая система.
Совершенно верно. Однако, это специфические случаи, требующие скармливания дополнительных инструкций линкеру. В самом общем случае под большинство ОС программы предпочитают начинаться с начала адресного пространства. В том же Windows дела обстоят так: 0x00000000 — 0x0000FFFF: нулевые указатели, 0x00010000 — 0x7FFEFFFF: память программы, 0x80000000 — 0xFFFFFFFF: память ядра.
Велика, конечно. Надо брать 4 КиБ. Когда-нибудь у меня дойдут руки и до 4 КиБ. На этом этапе я захотел сделать жизнь чуть проще, оставив один уровень таблиц, благо PSE это позволяет.
Вообще "правильный" ассемблер в данном случае не очень хорош, так как под другие платформы в основном используется синтаксис at&t, и портировать будет сложнее — придется изменять не только код под платформу, но и систему сборки. Но мне приятнее писать в Интел синтаксисе, так что пусть будет.
Но все же, ни одна подобная статья не освещает вопрос энергоэффективности. Как часто приходится заряжать девайс? Где находятся элементы питания и сколько они весят?
Потому как даже самый совершенный протез в мире будет практически бесполезен в повседневной жизни, если тебе нужно будет сидеть возле розетки с кабелем хотя бы 50% времени.
Да и вообще таких случаев немало.