Задать вопрос
  • Как осуществить взаимодействие клиента и сервера на основе протокола TCP/IP?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Если у тебя посреди функции main сервера действительно стоит return x | y;, то она не может никогда вызвать send, а программа-сервер должна просто завершаться после расчёта НОД.

    А программа-клиент при этом будет получать ошибку из recv, но поскольку ты её не обрабатываешь, то дальше она будет пытаться выводить ответ из буфера в который не было ничего принято.

    не знаю, как правильно найти НОД в данном случае:

    в данном случае x и y нужно извлечь из принятой из сокета строки, математика дальше в порядке, вместо return x | y нужно просто использовать x | y в itoa. Res и всё что с ним связано можно выкинуть, поскольку оно всё равно никак не используется.

    Но вообще, конечно, из кода видно, что твоя проблема не с НОД и не с сетевым программированием, а с тем, что С/С++ ты, судя по всему, просто не знаешь. Учи основы, не жди халявы.
    Ответ написан
    Комментировать
  • Как работает выделение памяти malloc?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    char *str = malloc(0);
    Правильно ли я понимаю, что в str находится начало выделянно памяти на 0 байт


    Вот что говорит стандарт (c99, 7.20.3:1) о выделении 0 байт через malloc:

    If the size of the space requested is zero, the behavior is implementation-
    defined: either a null pointer is returned, or the behavior is as if the size were some
    nonzero value, except that the returned pointer shall not be used to access an object.


    Поскольку твоё обращение к этой памяти не вызывает SEGFAULT, то да, malloc вернул не NULL. Сколько байт реально было выделено зависит от реализации.

    а дальше идет запись символов в память, которая для нас не предназначалась?


    Да. Использовать эту память согласно стандарту нельзя.
    Ответ написан
    Комментировать
  • Самопроизвольное объявление define'ов в проекта?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Получается, магическим образом, самопроизвольно, между включениями VulkanTexture.h и VulkanglTFModel.h был объявлен define.

    А на самом деле где этот define определяется и как это место относится ко всем этим заголовочным файлам?

    Разве препроцессор не последователен и может включать файлы в том порядке, в каком ему заблагорассудится, а не как я написал?

    Нет, не может, но возможно ты не вполне понимаешь сам, в каком порядке ты написал их подключение. Так, например, Helpers/VulkanTexture.h и VulkanTexture.h -- это один и тот же файл, или разные? Если один и тот же, то из-за #pragma once в нём он не подключается в VulkanglTFModel.h, а если разные -- то подключается.

    Понять, что фактичиски куда подключается можно выполнив вместо шага компиляции только препроцессирование (например, для gcc заменив в команде компиляции ключ -c на -E). В выводе препроцессора не видно дефайнов, но видно когда подключается тот или иной файл и видно весь исходный код не относящийся к препроцессору.
    Ответ написан
    Комментировать
  • Почему появляется такая ошибка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    что тут неправильно?

    для однозначного ответа на этот вопрос не хватает определения типа Student.
    Но судя по тому как всё падает, в Student есть не-POD поля, выделяющие и освобождающие память, например std::string или что-то типа того. Загружать их из файла просто читая записанное ранее содержимое памяти нельзя, потому что загруженные указатели будут ссылаться на невыделенную память, такие типы данных нужно по-честному сериализовывать.
    Ответ написан
    Комментировать
  • Как вычисляется эффективный адрес относительно счетчика команд?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    откуда появился результат после сложения?

    Оттуда, что складываемые числа -- RIP 0x7ff778a06497 и смещение 0x67f9. Смещение записано в поле инструкции mov в формате little endian.

    что это за значение 88 13 00 00 ......... и Val = 5000 ?

    Я так понимаю, что это иллюстрация, что по адресу 0x7ff778a0cc90 оказались байты 0x88, 0x13, 0x00..., которые после загрузки в регистр rax дали значение 0x1388 == 5000
    Ответ написан
    Комментировать
  • Почему при вызове return вызывается конструктор копирования, а не перегрузка оператора =?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    coffeeMachine mix = device + machine;
    вызывает перегрузку конструктора копирования, а не перегрузку оператор =, почему?

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

    А если написать вот так:
    coffeeMachine mix; mix = device + machine;
    то ты сначала создаёшь экземпляр со значением по умолчанию, а потом вызываешь оператор =.
    Ответ написан
    Комментировать
  • Как поставить пробел после запятой в строке?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В чём же проблема?
    for (int i = strlen(sentence); i >= pos; i--) {
        sentence[i + 1] = sentence[i];
        sentence[pos] = ' ';
      }

    Должно быть
    for (int i = strlen(sentence); i > pos; i--) {
        sentence[i + 1] = sentence[i];
      }
      sentence[pos + 1] = ' ';
    Ответ написан
    Комментировать
  • Как работает long long int в C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    где найти информацию о внутреннем устройстве long long int и unsigned long long int?

    В стандарте: eelis.net/c++draft/basic.fundamental

    у меня появилось впечатление, что long long int склеен из двух long int и дает псевдо длину в 64 бита. Поправьте меня, если я не прав

    Можно и так на это смотреть, но почему "псевдо"? Вполне реальные 64 бита, на машинах с 64-битными регистрами это вообще "родной" тип данных.
    Ответ написан
    3 комментария
  • Как выучить язык ассемблера?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как выучить язык ассемблера?

    Читать ассемблерный код. Когда научишься с лёгкостью читать, писать тоже сможешь.
    Посоветуйте какие-нибудь ресурсы по изучению

    Исходники на ассемблере, которые любой компилятор тебе нагенерирует, справочник по инструкциям твоего процессора (например 2й том Intel developer manual) и гугл. Просто бери, читай и разбирайся зачем так.
    Ответ написан
    Комментировать
  • Нужно найти сумму отрицательных чисел. Что с кодом?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    int sum;

    Переменная используется без инициализации.
    Замени int sum; на int sum = 0;
    Ответ написан
    1 комментарий
  • Как узнать возраст файла в Ассемблере?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как мне найти возраст файла?

    Сравнить creationTime который возвращает GetFileTime с текущим временем которое возвращает GetSystemTimeAsFileTime. 3 дня -- это 3 * 24 * 60 * 60 * 10000000 100-наносекундных интервала (в таких единицах измеряется FILETIME).
    Чтобы упростить себе задачу можно сравнивать только старшие части (dwHighDateTime) структур FILETIME, вес младшей части -- 429 секунд, меньше 10 минут.
    Типа того:

    invoke GetFileTime, hFile, addr ftCreate, NULL, NULL
      invoke GetSystemTimeAsFileTime, addr ftNow
      mov eax, ftNow.dwHighDateTime
      sub eax, ftCreate.dwHighDateTime
      cmp eax, (3 * 24 * 60 * 60 * 10000000 / 0x100000000)
      jg <файл старше 3 дней>
      /* иначе файл младше 3 дней */

    Если упрощать не хочется и нужно отмерить в точности 3 дня, то хвост можно переписать так:
    mov eax, ftNow.dwHighDateTime
      sub eax, ftCreate.dwHighDateTime
      cmp eax, (3 * 24 * 60 * 60 * 10000000 / 0x100000000)
      jg <файл старше 3 дней>
      jl <файл младще 3 дней>
      mov eax, ftNow.dwLowDateTime
      sub eax, ftCreate.dwLowDateTime
      cmp eax, (3 * 24 * 60 * 60 * 10000000 % 0x100000000)
      jg <файл старше 3 дней>  
      /* иначе файл младше 3 дней */
    Ответ написан
    2 комментария
  • Почему не получается открыть файл?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    invoke CreateFile, addr [edi].lpstrFile, GENERIC_READ,

    addr [edi].lpstrFile выглядит неправильно. Должно быть либо [edi].lpstrFile (значение указателя, а не его адрес), либо offset buf.
    Ответ написан
  • Перенести ветку мастер в другой репозиторий?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Если master который был в новой репе не нужен, то следующих команд должно быть достаточно:
    git remote add new <url_new_repo>
    git push new +master
    Ответ написан
    3 комментария
  • Почему не собирается EFI application?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    пишет, что не может найти "efi.h", хотя он есть в папке inc из Makefile

    что такое "папка inc из Makefile"? Если ты имеешь в виду переменную inc определённую в 7й строке, то ты её нигде не использовал, а сами по себе переменные с произвольными именами в Makefile ничего не значат.

    gcc -fshort-wchar -I -I/ -I/usr/include -O2 -Wall -fpic -DEFI_FUNCTION_WRAPPER -ffreestanding -nostdlib -c main.c -o main.o
    main.c:1:10: фатальная ошибка: efi.h: Нет такого файла или каталога

    смотри: нигде в списке -I ты не указал своего каталога inc, как по-твоему компилятор должен понять, что efi.h нужно там искать?

    -I$(EFIINC)

    В твоём Makefile не определена переменная EFIINC, откуда ты ожидаешь что она возьмётся?

    Судя по содержимому Makefile стоит заменить имя inc на EFIINC, lib на EFILIB, crtobj на CRTOBJ и т. д.
    Ответ написан
  • Как указать в исполняемом файле абсолютный путь до него самого?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Есть ли возможность из файла узнать его (файла) местоположение?

    readlink -f "$0" для исполняемого скрипта или readlink -f "$BASH_SOURCE" для скрипта загружаемого через source.
    Ответ написан
    2 комментария
  • Что значит этот код?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    что значит код

    ubfx r0, r0, #1, #1 -- извлечь битовое поле шириной 1 бит (правая единица) начиная с бита №1 (левая единица) из регистра r0 (правый r0) и поместить результат в r0 (левый r0).
    bx lr -- перейти по адресу в регистре lr, обычно это возврат из подпрограммы.
    Семантика опкодов легко гуглится по названию опкода и названию архитектуры процессора.

    какая между ними разница

    ubfx r0, r0, #1, #1
    ubfx r0, r0, #2, #1
    теперь, когда ты знаешь, что это за опкод, ты можешь понять сам, что они извлекают битовое поле начиная с разных битовых позиций.

    что я делаю не так

    ты не написал, что конкретно ты делаешь: что и где меняешь и как проверяешь результат.
    Ответ написан
    3 комментария
  • Как изменить существующее прерывание биос?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Вот, что я попытался сделать:
    push word 0
      pop es
      mov bx, 0x11*2+0xF000
      mov word [es:bx], int10-$$


    Расскажи немного словами, что ты имел в виду когда писал это?

    Я пытался гуглить, всю ночь потратил, …
    проблема в отсутствии информации


    Вот это нашёл? https://ru.wikipedia.org/wiki/Таблица_векторов_пре...

    Самое важное для тебя и полностью достаточное для реализации твоей задачи предложение из этой статьи:
    В микропроцессорах Intel 8086/80186 таблица векторов прерываний расположена в первом килобайте памяти начиная с адреса 0000:0000 и содержит 256 векторов прерываний в формате сегмент:смещение.


    boot:
      push word 0
      pop es
      mov bx, 0x11*4
      mov word [es:bx + 2], cs
      mov word [es:bx], int10
    Ответ написан
  • Что происходит во время прерывания в многопоточной среде? Или прерывания посреди прерывания?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    откуда прерывания знают адрес, куда им вернуть результат.

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

    Прерывание в коде int 21h и прочие Это какое?

    Любое прерывание инициируемое инструкцией int -- программное. В отличие от прерывания, инициируемого уровнем или фронтом сигнала подключённого к контроллеру прерываний.

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

    выполнение прерывания std::cin>>line; Может и сутки длиться.

    Системного вызова. std::cin >>line в конце концов превращается в системный вызов read.

    Вот как по пунктам для этой команды. (С условием что есть еще 1 поток жаждущий ЦП).

    Можно запустить такую программу, узнать её PID, выполнить где-нибудь cat /proc/<PID>/stack и увидеть следующую картину:
    [<0>] wait_woken+0x67/0x80
    [<0>] n_tty_read+0x426/0x5a0
    [<0>] tty_read+0x135/0x240
    [<0>] new_sync_read+0x115/0x1a0
    [<0>] vfs_read+0xf4/0x180
    [<0>] ksys_read+0x5f/0xe0
    [<0>] do_syscall_64+0x33/0x80
    [<0>] entry_SYSCALL_64_after_hwframe+0x44/0xa9

    Т.е. поток выполнил системный вызов (ksys_read), зашёл в VFS, добрался до функции чтения в драйвере терминала (tty_read) и перешёл в состояние ожидания в глубине этой функции (wait_woken). Когда драйвер терминала получит данные для программы, он разбудит её поток и системный вызов завершится. До тех пор этот поток будет не готов к выполнению и скедулер ОС просто не будет выделять ему время.

    Мне кажется, что тебе было бы полезно прочитать вторую и третью книжки (Understanding the Linux Kernel и Linux Kernel Developmen) из моего списка.
    Ответ написан
    Комментировать
  • Как происходит доступ к эл. массива на уровне ядра? Malloc выделяет непрерывную физическую память?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как происходит доступ к эл. массива на уровне ядра?

    Так же как и на уровне приложения -- через трансляцию виртуального адреса в физический.

    Например массив Int* arr = new int[1024*1024*1024] он как храниться?

    Если мы для определённости возьмём linux, то у ядра есть несколько разных способов выделения памяти, в зависимости от того, для чего эта память выделяется. Есть наиболее простой и стандартный kmalloc который выделяет память непрерывную как виртуально так и физически. Обычно этим механизмом нельзя выделить большой непрерывный кусок. Есть vmalloc, который выделяет непрерывную виртуально, но возможно прерывную физически память. Есть get_free_pages который выделяет непрерывные страницы физической памяти, возможно, не отображаемые ни в какие виртуальные адреса. Есть Contiguous Memory Allocator который при старте системы резервирует кусок непрерывной физической памяти и может аллоцировать оттуда куски по запросу.
    Важный момент состоит в том, что аллокации делаемые ядром linux через упомянутые интерфейсы всегда обеспечиваются физической памятью, у памяти ядра нет пейджинга.

    А физическая, для массива то же? Ведь, так будет доступ намного быстрее?

    Почему быстрее? С точки зрения процессора всё равно будет трансляция виртуального адреса в физический, если повезёт -- попадание в TLB, если не повезёт -- ходить по каталогам и таблицам страниц в памяти.

    получается эмулятор каждый адрес вычислять что ли?

    Простой эмулятор -- да, наверно. Умный эмулятор может кешировать эту информацию, например именно это свойство даёт QEMU большую часть его Q.
    Ответ написан
    Комментировать
  • Зачем нужно выравнивание памяти? Точнее, почему процессор обращается 2 раза к невыравниным данным?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Для процессора x86 с word 32bit. Как будут выполняться fetch?
    Хочу ответ в таком формате.

    Что мешает взять спецификацию на процессор и почитать, например, раздел 5.3.6?

    почему процессор обращается 2 раза к невыравненным данным?

    Если посмотреть на схему i386 на первой же странице документа по ссылке выше, то можно увидеть, что шина адреса процессора имеет линии A2 - A31. Линий A0 и A1 тупо вообще нет, физически.
    Ответ написан
    Комментировать