• Как встроить в OS компилятор C++?

    @safinaskar
    Странный у вас вопрос. Если вы всерьёз пишите ОС и уже настолько продвинулись, то столь абстрактно сформулированных вопросов у вас возникать не должно. Столь абстрактный вопрос просто заставляет усомниться в вашей компетенции писать ОС.

    Начну с азов (в изложении я буду немного упрощать некоторые моменты). Есть машинный код. Нули и единицы. У каждой архитектуры (x86, arm и так далее) он свой. Существует семейство языков программирования, находящихся максимально близко к машинному коду: языки ассемблера (часто вместо "язык ассемблера" говорят просто "ассемблер"). По одному языку ассемблера для каждой архитектуры. Они находятся к машинному коду настолько близко, что часто понятия "язык ассемблера" и "машинный код" смешивают, и это нормально. В частности, так сделал Top_Pudge в соседнем ответе, это нормально, это обычный IT-сленг.

    Языки программирования (C++, python и т. д.) делятся на компилируемые и интерпретируемые. C++ - компилируемый язык. Это значит, что для того, чтобы выполнить программу на C++, её нужно сперва скомпилировать, т. е. сконвертировать в машинный код специальной программой, называемой компилятором. Затем полученный машинный код просто выполняют на целевом процессоре. (На самом деле ничто не мешает интерпретировать компилируемый язык, но, как я обещал, я буду упрощать.)

    "Портировать" означает сделать так, чтобы некая программа, работающая в одной ОС, стала работать в другой ОС.

    Теперь по поводу того, как же "встроить" C++ в ОС. Сказанное будет относится как к ядру вашей ОС (если, допустим, вы решите переписать его на C++), так и к остальным программам в вашей ОС. Т. е. под словом "программа" далее можно понимать в том числе ядро. Итак, существует понятие кросскомпиляции и нативной компиляции. Кросскомпиляция - это когда компилятор, работающий на одной архитектуре/ОС, создаёт программу, предназначенную для другой архитектуры/ОС. Нативная компиляция - когда для той же. Компилятор, который осуществляет кросскомпиляцию, называется кросскомпилятором. Нативную - нативным компилятором.

    В вашем случае кросскомпиляция - это когда вы берёте некий компилятор (желательно уже существующий, т. е. gcc, clang, MSVC++ и т. д.), запускаете его в обычной ОС, той, которую вы используете для разработки (Windows, Linux и т. д.) и он создаёт бинарник, пригодный для запуска в вашей ОС.

    Ну а нативная компиляция в вашем случае - это когда у вас уже существует компилятор (ваш собственный либо портированный на вашу ОС существующий, такой как gcc, clang и т. д.), работающий в вашей ОС, и с его помощью вы внутри вашей ОС создаёте бинарники для вашей ОС.

    Так вот, даю 99% того, что вам в любом случае нужно будет начать с кросскомпиляции, чуть позже объясню почему.

    Итак, кросскомпиляция. С чего начать? Начнём с того, что создавать свой компилятор C++ я вам категорически не советую. C++ - это очень сложный язык, создание компилятора для него - нереально сложная задача. Вам нужно взять существующий компилятор и заставить его генерировать код для вашей ОС. Чтобы заголовки бинарников совпадали с принятыми в вашей ОС и чтоб системные вызовы правильно компилировались. Пишите - могу подробнее попытаться рассказать.

    Когда будет готов кросскомпилятор, можно с его помощью собирать программы на C++ для вашей ОС. Всё, готово.

    Что дальше? Дальше можно сделать нативную компиляцию. Делать ли её, зависит от того, для чего предназначена ваша ОС. Если это ОС для автоматов с газировкой и т. д., понятное дело, делать её не нужно. Зачем автомату с газировкой уметь самому компилировать C++? Не нужно. Просто кросскомпилятором компилируете все нужные программы для вашего автомата и заливаете в прошивку. Всё. Но если вы пишите ОС общего назначения, то нативный компилятор рано или поздно должен там появиться. Окей, как его сделать? Что ж, допустим, что ваш кросскомпилятор сделан на основе gcc. Ну окей, тогда берёте gcc и компилируете его при помощи вашего кросскомпилятора gcc. И вы получите нативный для вашей ОС gcc. Готово. На практике, конечно, всё может быть немного сложнее.

    Я обещал рассказать, почему надо в любом случае начать с кросскомпиляции. Потому что, чтобы сразу начать с нативной, вам придётся самому писать на ассемблере свой нативный компилятор языка C++. Что нереально. Если же вы начнёте с кросскомпиляции, вы сможете потом кросскомпилировать, скажем, gcc и получить таким образом нативный компилятор для вашей ОС.

    Теперь вопрос. Вы работаете на некоего заказчика/владельца за деньги или вы просто некоей командой пишите свой проект (неважно, коммерческий или нет)?

    Если первое, и если при этом этот ваш вопрос на toster.ru выражает мнение всей вашей команды (т. е. у вас в команде реально никто не знает, даже с чего начать поддержку C++ в ОС), то передайте заказчику/владельцу, чтоб уволнял всю команду и искал другую. Реально. Этот вопрос на toster.ru показывает вашу полную некомпетентность. Люди, которые пишут ОС, должны как минимум знать, что есть C++, что он компилируемый, что есть машинный код, есть языки ассемблера, есть кросскомпиляция, в общем всё, что я выше написал. Даже я справлюсь с написанием ОС лучше. И это при том, что я вобщем-то, не умею этого делать, и никогда не доходил до написания своей ОС с поддержкой своих кастомных бинарников. Максимум, до чего я доходил: пара попыток написания ОС, см. мой гитхаб github.com/safinaskar , проекты duo и gavin. Если вам совсем некого взять в проект, возьмите уж лучше меня. Я хотя бы примерно знаю, что нужно сделать, и в конце концов напишу вам ОС, пускай даже это займёт нереально много времени. Я серьёзно, я щас нигде не работаю, моё резюме здесь: safinaskar.com/resume.pdf .

    Если же верно второе, т. е. вы просто пишите проект (ещё раз говорю, не важно, коммерческий или нет) своей командой, никуда не торопитесь, хотите научиться это делать, что ж, дерзайте, написание своей ОС - это очень интересное и поучительное дело, wiki.osdev.org вам в помощь.

    Top_Pudge в соседнем ответе предлагает совершенно нереальную вещь: писать свой компилятор C++ (что само по себе сложно), да ещё и на ассемблере (кошмар! такого, видимо, вообще никто никогда не делал, даже Страуструп). Бред.

    Советую в любом случае обязательно прочитать вот эту замечательную статью: www.interstron.ru/upload/images/pubs/Redkaya_profe... . Интересный текст про написание своего компилятора C++. Про то, насколько это сложно. Чтоб у вас не возникало мыслей написать свой компилятор C++. Хотя, с другой стороны (если, разумеется, вы работаете не на заказчика, который ждёт за разумное время результат), если хотите, можете попытаться написать свой компилятор C++. Это отличный самообразовательный проект. Но очень долгий.

    Если остались вопросы, пишите тут ответ, либо в личку на Хабре ( habrahabr.ru/users/safinaskar ) либо на почту ( safinaskar@mail.ru ). Я с радостью отвечу. Я написал тут не всё, что думаю по вопросу, могу написать ещё. Вообще, в любом случае напишите, что прочитали, я старался, мне важно узнать, что меня прочитали.
    Ответ написан
    Комментировать
  • Лисп или хаскел?

    Начнём с того, что Лисп не функциональный. Тем, кто приходит в Лисп из мира императивных языков может так казаться, но я пришел в Лисп после Хаскела и я тебе точно говорю, Лисп - не функциональный.
    Теперь по теме - оба языка крайне интересны и способны взорвать мозг, но Хаскел вставляет сильнее, он действительно заумный и изобилует супер-дупер новыми изощренными технологиями программирования (Аппликативные функторы, комбинаторы, монады, ленивые вычисления), но что тебе действительно взорвёт мозг - это чистота языка (нельзя совершать побочные эффекты т.е. не напишешь в консоль где хочешь, не присвоишь значение переменной), отсутствие циклов и декларативность (ты не пишешь "как", а пишешь "что" представляет из себя задача). Но это только в начале. Когда освоишься, оказывается, что Хаскел очень выразителен и краток. Но есть у него и минусы - он очень сложен, ОЧЕНЬ. Серьезно, даже через пол года, у тебя по-прежнему будут проблемы. Уверен, 95% хаскелистов не объяснят в подробности, как работает Hello world на хаскеле, который выглядит так:
    main::IO ()
    main = do
    putStrLn "Hello world!"

    выглядит не сложно, но вот что скрывается под водой: все вычисления происходят в монаде IO т.к. только в ней разрешены побочные эффекты. Побочный эффект (действие ввода-вывода) выполняется только тогда, когда вернётся в main т.к. побочные эффекты разрешены только в main (поэтому и только в монаде IO т.к. main возвращает IO () ). Что такое IO ()? Это как бы список действий, которые туда запихиваются и объединяются в цепочку, чтобы быть последовательными (вне монады порядок выполнения твоих инструкций не определён, счастливого дебага). Эти действия на самом деле не выполняются сразу, а представляют из себя "обещание" сделать это действие, которое реализуется как только что-то уже действующее не затребует результат, в нашем случае это консоль... в общем и это только верхушка айсберга, я еще про типы не говорил, про извлечение и упаковку в монаду, про отображения множеств, карринг и тд.
    В общем хаскел это интересно, но очень сложно. Даже если не пообломаешь зубы, у тебя очень долго будут проблемы с дебагом, с пониманием всяких астральных техник, которые плодятся день и ночь, вроде стрелок или линз. Да и понять чужой код на хаскеле часто очень сложно, потому что каждый считает, что просто обязан применить все заумные штуки, которые он знает, ведь разве не для этого он учил хаскел? А ведь потом люди будут читать это...
    Теперь пара слов о Лиспе - тут у меня меньше опыта, но идея такая - это программируемый язык программирования. Кроме того, что в нём есть макросы - специальные инструменты, чтобы писать программу которая напишет программу, так и сам язык представляет из себя синтаксическое дерево в своём первозданном виде, что открывает безграничные возможности в метапрограммировании. В общем идея такая - этот язык в умелых руках становится абсолютно чем захочешь. Нравится хаскел и ФП? Отлично, сейчас реализуем. Хочешь ленивые вычисления? На! Хочешь классы? Вот! Хочешь логическое программирование? Держи! При всём этом язык крайне прост, может даже проще Си.
    Так, что я тебе посоветую? Наверное, начинай с Хаскела - он тащит за собой огромную теоретическую базу и целый арсенал таких приёмов программирования, которые тебе и не снились. Выучишь, освоишься - подумай о лиспе. Но! Тебе в любом случае нужно будет ставить Emacs - это самая лучшая среда для этих обоих языков, а Emacs конфигурируется на Emacs Lisp, так что у тебя будет возможность на него посмотреть. Посмотри видео по емаксу https://www.youtube.com/playlist?list=PLECBtie1W1t... (там и про Emacs Lisp есть глава), потом качаешь "Хаскел во имя добра" и "О хаскел по-человечески" и читаешь их параллельно - в первой хорошее мягкое введение, а во второй практика - она нужна сразу, чтобы хотябы знать, как создать проект с помощью cabal и собрать его, а то Липовача пол книги в интерпретаторе сидит.
    Ответ написан
    1 комментарий
  • Как связаться с автором статьи в песочнице?

    Mithgol
    @Mithgol
    Двухшаговый метод:

    1. Дать инвайт.
       
    2. Посмотреть контактные данные в списке розданных инвайтов.
       
    Ответ написан
    1 комментарий
  • AHCI: Проблема распознавания SATA-накопителей?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Проверьте состояние GHC.AE.
    В qemu можно включить DEBUG_AHCI в файле hw/ide/ahci.c, он при этом будет дампить в stderr всё что происходит с устройством.
    Ответ написан
    6 комментариев
  • Эмулируют ли QEMU/KVM и VmWare AHCI(SATA) контроллеры?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    За VmWare не скажу, QEMU умеет. Синтаксис командной строки, правда, вырвиглазный.
    См. например lists.gnu.org/archive/html/qemu-devel/2011-11/msg03537.html
    Ответ написан
    Комментировать
  • Эмулируют ли QEMU/KVM и VmWare AHCI(SATA) контроллеры?

    fear86
    @fear86
    Developer
    Похоже гугл знает только это lists.gnu.org/archive/html/qemu-devel/2010-11/msg02553.html
    Ответ написан
    Комментировать
  • Самоучители по Assembler?

    Antares19
    @Antares19
    Если вы в Москве, и в ближайшие 3 дня доедете до филевского парка, подарю вам книжку «Assembler» — В.Н. Пильщиков.
    Книжка не толстая, в мягком переплете, не сказать что бы сильно хороша но какая-то информация в ней есть :)

    Подробности тут: antares19.livejournal.com/12420.html

    Я там сейчас еще 20 книг по программированию раздаю даром или почти даром. Не рекламы ради, а что бы хорошие книги попали правильным людям :) Обращайтесь :)
    Ответ написан
    1 комментарий
  • Перевод терминов Git на русский?

    pomeo
    @pomeo
    не надо так делать, это ужасно, обычно когда читаешь «перевод» не понимаешь вообще о чём речь
    Ответ написан
    2 комментария
  • Не получается релоцировать local APIC?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Я вижу два странных момента.
    Один у вас: доступ к 32-битным регистрам APIC не может выполняться как к 64-битной памяти. Об этом говорит intel developer's manual vol3, p 10.4.1:
    All 32-bit registers should be accessed using 128-bit aligned 32-bit loads or stores.


    Второй — в qemu. Там (смотрел текущую голову git) нет кода, который бы перемещал регистры при изменении базового адреса APIC.
    На чём вы тестируете своё ядро?
    Ответ написан
    3 комментария
  • Не получается релоцировать local APIC?

    ntkt
    @ntkt
    Потомственный рыцарь клавиатуры и паяльника
    В интеловских мануалах пишут:
    Table 9-1 shows how the APIC registers are mapped into the 4-KByte APIC register
    space. Registers are 32 bits, 64 bits, or 256 bits in width; all are aligned on 128-bit
    boundaries. All 32-bit registers should be accessed using 128-bit aligned 32-bit loads
    or stores.


    У Вас в коде я этого не увидел.
    Ответ написан
    6 комментариев
  • Есть ли чаты для програмистов?

    Anonym
    @Anonym
    Программирую немного )
    Жениться вам надо, барин.
    Ответ написан
    1 комментарий
  • Есть ли возможность обрабатывать прерывания без TSS?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    А у меня вроде получилось без TSS. Код здесь: github.com/jcmvbkbc/multiboot-tests
    Ответ написан
    2 комментария
  • Как сгенерировать чистый бинарник, используя GCC?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Или ещё вариант без objcopy, но со скриптом линковщика:
    $ cat kernel.lds 
    SECTIONS {
            .text 0x7e00:
            {
                    *(.text)
            }
            /DISCARD/ :
            {
                    *(*)
            }
    }
    $ ld -e kmain -T kernel.lds test.o --oformat=binary -o kernel-lds.bin
    $ hexdump -Cv kernel-lds.bin
    00000000  55 48 89 e5 b8 01 00 00  00 5d c3                 |UH.......].|
    0000000b
    


    Опять же, если в исходных объектниках есть другие нужные секции помимо .text, их имена надо вписать внутрь .text: {} после *(.text).
    Ответ написан
    5 комментариев
  • Как сгенерировать чистый бинарник, используя GCC?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Может

    ld -e kmain -Ttext 0x7e00 -o kernel.elf
    objcopy --strip-all -R .comment -R .note.gnu.build-id -O binary kernel.elf kernel.bin

    и в -R добавить имена ненужных секций?
    Ответ написан
    6 комментариев
  • Возможность обработки зашифрованных данных без ключа?

    OCTAGRAM
    @OCTAGRAM
    RT @EFF:
    A new type of crypto allows computations on data you can't read. So how does this homomorphic encryption work? https://eff.org/r.a7m5

    twitter.com
    Ответ написан
    2 комментария
  • Внезапно перестал открываться сайт

    @edogs
    Как вариант — хостер Ваш ИП мог заблочить за что-нибудь (или подсетку). Может под замес попал, может если у Вас не выделенный — какая-то мерсссская активность с него была, может еще что-то. При чем не обязательно именно конечный хостер, может ДЦ например.
    По Вашему вопросу складывается впечатление, что Вы соединяетесь через роутер только? Попробуйте напрямую воткнуть шнур в комп. Если у Вас вирт.хостинг и другие сайты есть на одном ИП с Вами — попробуйте на них попасть.
    Ответ написан
    4 комментария
  • Использование морфологического словаря от OpenCorpora в коммерческом проекте?

    @kmike
    Производное произведение от словаря — да, под CC. При этом коммерческий продукт может так и оставаться закрытым и коммерческим. Если вы коммерческий продукт распространяете, то нужно просто где-то указать, что словари взяли из OpenCorpora.

    Там в FAQ ( opencorpora.org/?page=faq ) написано: «На условиях лицензии Creative Commons Attribution-ShareAlike 3.0. Т.е. бесплатно, но при создании чего-либо на основе этих данных вы обязаны указать, что эти данные взяли у нас, а распространять их дальше можно только на этих же условиях.»

    Cначала было вот так написано:

    «На условиях лицензии Creative Commons Attribution-ShareAlike 3.0. То есть бесплатно, но при создании чего-либо на основе этих данных вы обязаны, во-первых, указать, что эти данные взяли у нас, во-вторых, лицензировать свой продукт или данные на тех же условиях.»

    Т.е. к лицензии CC добавлялось еще ограничение «лицензировать свой продукт на тех же условиях» (смотря как читать); я с ребятами связался и они сказали, что это просто неточность была, такого ограничения нет, и текст переписали.

    Если совсем точно знать хотите — спросите в groups.google.com/forum/?fromgroups#!forum/opencorpora-dev, да и на хабре разработчики OpenCorpora бывают.
    Ответ написан