• Как в написании операционной системы используют C?

    15432
    @15432
    Системный программист ^_^
    Не важно, на чём пишутся драйвера/ось/программы, в результате исполняется процессором машинный код - бинарные данные определённого формата, по которым процессор понимает, что ему делать в данный момент. На ассемблере приходится программировать, когда нужно реализовать очень "близкие к железу" вещи - трансляция памяти, регистры ввода-вывода. Каждая ассемблерная инструкция соответствует одному машинному слову, короче самый близкий к машине человекочитаемый код.
    Куда проще писать на высокоуровневых языках - части ОС и драйвера часто пишут на Си. Этот язык более прост для человека. Естественно этот код тоже сначала переводится компилятором в ассемблер, а затем и в машинный код. Другого процессор "не понимает". Этот набор данных подсовывается компьютеру в каком-либо виде. Например, самая первая инструкция в х86 ПК исполняется по адресу 0xFFFFFFF0 в адресном пространтсве. Этому адресу в современных ПК соответствуют самые последние 16 байт флеш-памяти BIOS. С этого кусочка запускается компьютер (это если кратко, на самом деле нифига не так).
    Раньше BIOS загружал операционку со специального загрузочного сектора на диске. Там в сыром виде лежал машинный код, который дальше обеспечивал загрузку ОСи. Сейчас всё более просто - место BIOS занял UEFI, по соглашению, система теперь стартует с файла в папке /efi/boot/bootx64.efi на загрузочном диске. То есть уже не просто сырые сектора, а сразу файлы. Обработка файловой системы и дисковых устройств запрограммирована в самом UEFI.
    Ответ написан
  • Как рисуется графика в операционной системе?

    Слишком поверхностно задан вопрос. Если говорить об ОС WIndows - то там вся графика в системных библиотеках (dll, и т.д.) и графических файлах, которые загружаются по мере надобности.
    Но сам процесс загрузки и то, что там делается в POST - это разные вещи, и они не пересекаются.
    То есть, сначала идёт при включении считывание содержимого микросхемы биос (да, пропустим этап инициализации чипсета и самого процессора, это зависит от аппаратуры), и биос при выполнении уже проверяет и инициализирует основные части - MIS/SIO, чипсет, контроллер памяти, порты всякие, видеокарты и т.д. И если что не так, то либо остановится, либо проинформирует о неисправности и пойдёт выполнять следующие шаги. (например, если не найдена видеокарта, на большинстве биосов по умолчанию будет остановка с выдачей пост-кода ошибки, и далее не загрузится ничего; а если не найдена клавиатура, или SMART диска BAD - то поведение может быть и с остановкой, а может и продолжить выполнение, зависит от настроек). А уже когда этап выполнения POST завершится, то биос передаёт управление на первый сектор жёсткого диска, или на другое устройство, смотря как настроено. ОС уже никак не знает, что там до него делалось в процессе POST.
    Другое дело - системы с EFI (UEFI). Там всё довольно тесно связано, и есть несколько фаз загрузки, но всё так же загрузка самой операционной системы будет после выполнения всех процедур в EFI. Разница только в том, что EFI более плотно связано с ОС, и сама ОС может хранить в чипе свои данные, и EFI может передавать данные и параметры в операционную систему.

    Если нужно именно на этапе инициализации системы на базе EFI - то вполне можно собрать образ firmware, в котором сделать нужные анимации, и прочее. Но это выйдет слишком трудозатратно, и заметно замедлит загрузку. В линуксах и всяких бсд вон изначально при загрузке не экран с картинкой, а сообщения загрузчика, ядра ОС, и стартовых скриптов (системы инициализации). И не нужно никаких анимаций, всё по тексту понятно, что именно сейчас загружается и выполняется. В более современных системах сложнее - там уже systemd, параллельная загрузка и выполнение, и прочие плюшки. Плюсом обычно ставят как раз какую-нибудь анимацию вместо текстов, якобы она предотвращает появление сообщений консоли, которые замедляют процесс старта (на самом деле, это было давно и неправда). Например, plymouth. Эта заставка стартует практически с самого загрузчика, и вполне логично было бы её и сделать под это всё дело, если надо.
    Остался у меня один вопрос - а ЗАЧЕМ? Ведь любые компы за последние лет 20 инициализировали железо (проходили POST) за доли секунды, и ещё от 1 до 3 секунд тратилось на загрузку всяких option ROM (сетевушки, рейд/ide контроллера, или ещё чего), и на раскрутку диска, чтобы с него загрузиться. О какой анимации речь? А сегодняшние компы, да с UEFI, да с SSD загружаются вместе с ОС за пару секунд! Сейчас никто и не заботится о том, чтобы что-то там в процессе загрузки Вам показать. Ладно, можно в автозагрузку запихнуть mplayer с видео любым, по вкусу. ОС уже конечно давно загрузилась, и ещё воспроизведение видео займёт 20-30 секунд. Да, красиво, да, можно понтануться перед друзьями (смори, как офигенно сделано, видно как комп загружается!). Но повторюсь, а кому это надо?
    Ответ написан
  • Где хранить сессии? SQLite? MySQL? Memcached? Redis? FS?

    @deliro
    Агрессивное программирование
    SQLite и ФС — абсолютно не подходят, если приложение будет масштабироваться

    Серверы БД (MySQL/PostgreSQL/etc.) — надёжный но самый медленный вариант

    In-memory БД (Redis/memcached) — отличный вариант, из всех выше, самый производительный, но можно упереться в оперативку

    Signed Cookie Session (и его частный случай — JWT) — неописанный тобой вариант, самый экономный по памяти и диску и самый производительный. Сессия хранится прямо в куке. Сами данные сериализуются, например, JSON'ом и сжимаются, например, gzip'ом (но можно и msgpack + lzma взять, как угодно). После, чтобы пользователь (или хакер) не поменял куку по своему желанию, она подписывается, например, HMAC'ом + любой криптостойкой хэш-функцией
    Из плюсов: 0 байт занятой оперативы (кроме момента выполнения запроса), 0 байт занимаемого места на диске, нет зависимостей от баз данных
    Из минусов: нет возможности "разлогинить все остальные сессии" по запросу пользователя, небольшой сетевой оверхэд, так как сессия от браузера отправляется на каждый запрос, ограничение на размер данных в сессии, потому что данных должны влезть в куку, включая подпись и разделители. Но ради эксперимента, мне удалось засунуть в такую сессию первую главу Войны и мира сжатой, прежде чем упереться в лимит.
    Ответ написан
  • Почему большинство компаний требуют Linux при устройстве?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Подавляющее большинство web-серверов в мире работают на Linux'ах. Вполне разумно ожидать от разработчика понимания окружения, в котором будут работать его программы. Так что не важно, что вы любите, важно с чем вас нанимают работать.
    Ответ написан
  • Как должен осуществляться поиск по пользовательсому запросу?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Изучить минимум SQL DML.

    А если для ленивых и наглых, то выборка по условию Where позволяет указывать маску. "... where 'name' like 'andy%'..."
    В данном случае, будут выбраны те строки, поле name в которых начинается с 'andy'
    Ответ написан
  • Сертификаты VPN?

    CityCat4
    @CityCat4 Куратор тега VPN
    Если я чешу в затылке - не беда!
    Для VPN иногда приходится выполнять некие особые требования к содержимому сертификатов. Не знаю, как с этим в L2TP, но в простом IPSec например для винды нужно в CN имя компьютера и еще в SAN - то же самое имя компьютера, а для андроида в серверном сертификате (то есть, который на сервере, а не на самом андроиде) в SAN должно быть то же самое имя, к которому ты подключаешься (например у тебя VPN зовется zhopa.gdeto.tam и в SAN должна быть запись DNS:zhopa.gdeto.tam)
    Потому обычно и советуют создавать свой CA, потому что в нем проще добавлять в сертификат то, что нужно именно тебе - я вот не знаю, как обьяснить LE, что тебе нужно в сертификате иметь определенную запись :)
    Ответ написан
  • Почему одна функция возвращает true, а вторая false?

    EvgenyMamonov
    @EvgenyMamonov
    Senior software developer, system architect
    Потому, что функция InitEfaceType фактически возвращает структуру, а не указатель.
    Структура не может быть nil. Если вы возвращаете указатель на структуру - тогда уже на nil можно проверить.

    Сделайте fmt.Printf("Type: %T\n", InitEfaceType()) и вы увидите тип "main.S"

    Чтобы иметь возможность проверить интерфейс на nil можете сделать вот так:
    func InitEfaceType() interface{} {
      var s *S
      return s
    }
    ...
    fmt.Println(InitEfaceType() == (*S)(nil))

    полный код

    package main

    import (
    "fmt"
    )
    type S struct{}

    func (s S) F() {}

    func InitPointer() *S {
    var s *S
    return s
    }

    func InitEfaceType() interface{} {
    var s *S
    return s
    }

    func InitType() S {
    var s S
    return s
    }

    func main() {
    fmt.Println(InitPointer() == nil)
    fmt.Println(InitEfaceType() == (*S)(nil))
    //fmt.Println(InitType() == nil)
    }

    Ответ написан
  • Как и где хранить общие файлы?

    bullitufa
    @bullitufa
    электронщик программист (микроконтроллеры и PC)
    По моему git submodule самое то оно.
    Создаёте 3 реп. туда общие файлы. И в каждый реп добавляете субмодуль. По мере обновления синхронизируете субмодули!

    Чем хорошо субмодуль? Тем что, вы можете "взять" слепок основного репа и субмодуля. При этом вести активную работу на всех трех. Ну и естественно использовать ветвление: всё что уходит в деплой берёте строго с веток релиз (например). + правильно здесь использовать теги. Особенно у субмодуля. Т.е. забирать с субмодуля не по камиту, а по тегу.
    Удачи!
    Ответ написан
  • Как выполнить MySQL запрос?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В MySQL нет функций GETDATE и DATEADD.
    Вы перепутали с MS SQL.
    Ответ написан
  • Какая существует программа для выявления (16+) картинок среди остальных изображений?

    dimonchik2013
    @dimonchik2013
    настоящие экстремалы предпочитают жен своих друзей
    Значит и программа такая должна быть для обычного пользователя?

    с чего бы оно значит и должна?

    боты юзают Nudity Detector

    https://deepai.org/machine-learning-model/nsfw-detector
    https://www.picpurify.com/nudity-detection.html

    или самостоятельно написать можно, есть даже на JS примитив
    Ответ написан
  • Хватит ли Macbook Pro 2012 для фронтенда?

    @Asokr
    Странно, но у меня, там где фигма, мой i7 7500 и 8 гигов оперативки не справляются, если параллельно открыть фотошоп, или если ноут не перезагружал дня 4-5...
    Проц тут не проблема, но только фигма съедает 2-3 гб оперы, фотошоп хочет около 2, + пару вкладок хрома около 1500мб, где остальное не известно, но факт, что нужно 16 гигов ))
    Ответ написан
  • Методы и функции в C#?

    @majstar_Zubr
    C++ & gamedev
    Есть термины функция, процедура, метод в рамках парадигм программирования, но терминология в C# иная.

    В C# нет функций и процедур, есть только методы и делегаты.
    Лямбда-выражения, в зависимости от контекста, "под капотом" приводятся к анонимным делегатам с телом или к Func, Predicate, Action.
    Все утыкается в объектную модель, которую поддерживает абстрактная машина языка C#.
    Единицей трансляции является класс, и свободных функций в namespace быть не может, так же как и указателей на функцию в принципе - вместо указателей на функцию в C# используются делегаты. Делегат реализован как абстрактный класс, это позволило реализовать типобезопасные ссылки на методы, которые можно складывать и вычитать, позволило удобно реализовать асинхронность.

    Делегат указывает только лишь на сигнатуру метода. Но предполагается, что объект, у которого вызывается метод через делегат, является экземпляром класса, который имеет такую же сигнатуру, как и делегат.

    В C# нет понятия функции как объекта, функцию нельзя просто так создать. Вообще можно, но прежде чем её использовать, её нужно будет скомпилировать, но она будет в любом случае в каком-то классе, и она будет методом этого класса; и чтобы методы вызвать, сначала надо получить ссылку на экземпляр класса.
    Ответ написан
  • В чем разница multithreading, multiprocessing и асинхронности?

    @majstar_Zubr
    C++ & gamedev
    Multiprocessing и multithreading относятся к стратегии управления разделяемыми ресурсами и оптимизации простоев между задачами, а Asynchronous invocation к паттернам проектирования.

    Многопроцессный подход к решению позволяет скинуть обработку доступа к разделяемым ресурсам на ОС, а многопоточный позволяет самому разработчику более гибко управлять этим разделением.

    Всегда хочется писать однопоточный код, который компонуется в разные исполняемые файлы, которые можно запустить как отдельные процессы. Но проблема кроется на системном уровне - с точки зрения скорости исполнения работы процессором, задержки и ожидания передачи пакетов по сети или нахождения и чтения файла просто громадные. За то время, как решение одной задачи ждёт ответа базы данных, нерационально тратить время процессора на холостую работу активного ожидания, когда все что делает процесс, это по десять раз в мс спрашивает у ОС, пришел ли ответ, пришел ли ответ, пришел ли ответ... Пройдет много времени пока ОС поймет, что процесс ничего полезного не делает, и пока переключит контекст, выгрузит один процесс, загрузит другой, может прийти ответ для процесса, который его ждал. Но теперь придется ждать, пока ОС не загрузит его.
    Другая проблема процессного подхода - захват ресурса. Применяя многопоточность можно экономить на том, что обращаться к системным ресурсам будет процесс, и потоки могут просто владеть ресурсом сообща, и как будет разделяться это владение решает сам разработчик. Более того, задача чтения из общей памяти более проста, если это происходит в рамках одного процесса, а межпроцессные взаимодействия всегда более тяжеловесные.

    Асинхронный вызов имеет отношение к высокоуровневым языкам. При синхронном вызове метода с точки зрения вызывающего кода происходит ожидание результата метода. При асинхронном вызове вместо ожидания происходит почти сразу переход на исполнение следующих инструкций, после вызова асинхронного метода.
    В рамках асинхронного вызова также могут быть объявлены фьючерсы и промисы, которые по факту разделяют по времени выделение памяти, инициализацию и присвоение возвращаемого асинхронным методом значения.

    То, как по факту будет реализован асинхронный вызов - представляет ли он ожидание исполнения транзакции, или получения сообщения от брокера, ожидание получения результата от другого процесса или задачи, которая решается в том же процессе, но в другом потоке- это уже зависит от разработчика р выбранных проектных решений.
    Ответ написан
  • Как генерируется hashcode по умолчанию, то есть в классе object, в C#?

    firedragon
    @firedragon Куратор тега C#
    Senior .NET developer
    /// <summary>Служит хэш-функцией по умолчанию.</summary>
        /// <returns>Хэш-код для текущего объекта.</returns>
        [__DynamicallyInvokable]
        public virtual int GetHashCode()
        {
          return RuntimeHelpers.GetHashCode(this);
        }

    https://stackoverflow.com/questions/720177/default...

    Она же вызывает вот этот нативный код.

    FCIMPL1(INT32, ObjectNative::GetHashCode, Object* obj) {  
        CONTRACTL  
        {  
            THROWS;  
            DISABLED(GC_NOTRIGGER);  
            INJECT_FAULT(FCThrow(kOutOfMemoryException););  
            MODE_COOPERATIVE;  
            SO_TOLERANT;  
        }  
        CONTRACTL_END;  
    
        VALIDATEOBJECTREF(obj);  
    
        DWORD idx = 0;  
    
        if (obj == 0)  
            return 0;  
    
        OBJECTREF objRef(obj);  
    
        HELPER_METHOD_FRAME_BEGIN_RET_1(objRef);        // Set up a frame  
    
        idx = GetHashCodeEx(OBJECTREFToObject(objRef));  
    
        HELPER_METHOD_FRAME_END();  
    
        return idx;  
    }  
    FCIMPLEND


    Еще посмотрите эту статью.
    see Knuth Vol 2 p16 (3.2.1.2 Theorem A)

    https://habr.com/ru/post/188038/

    https://codingsight.com/the-origin-of-gethashcode-...
    Ответ написан
  • Как удалить с концами phpstorm в убунту, чтоб после новой установки активировать пробный период?

    dimonchik2013
    @dimonchik2013
    настоящие экстремалы предпочитают жен своих друзей
    можно
    это и есть награда за усидчивость и сообразительность

    а для хитрых с вопросами на тостере - только платить
    Ответ написан
  • На что стоит смотреть свою внимание ри выборе пк для игр?

    Stalker_RED
    @Stalker_RED
    ryzen 5 2600 чуток дешевле, чем 9400F но при этом почти вдвое производительнее.
    а ryzen 5 3600 чуток дороже, но еще шустрее.
    Разве что с виртуализацией у интела получше, но если вы не разрабатываете под андроид, или типа того, то я бы рекомендовал ryzen, и видяху 1660 super, если укладывается в бюджет. Взять память ballistix, материнку на B450, разогнать немножко, и радоваться.

    ssd 120Gb для программирования наверное хватит, а вот игрушкам на нем будет тесно. Лайфхак: подключить обычный HDD, и симлинками перебрасывать на ssd только то, во что играешься прямо сейчас.

    16 гигов оперативки - норм.
    Ответ написан