LINUX.ORG.RU

Сообщения hibou

 

Linux kernel обработка прерываний

Народ, а вот кто в прерываниях понимает что-нибудь? Нужна помощь.

Номер прерывания в таблице IDT, и номер линии прерывания – это не одно и то же?

Такие дела – линукс ядро, при регистрации обработчика прерывания требует именно номер линии прерывания. А я знаю только номер из IDT. Если они совпадают и это одно и тоже – тогда без проблем. Но если не совпадают, то как мне найти номер линии?

Случай, когда они не совпадают я уже знаю – например, NMI (немаскируемое прерывание). Оно имеет номер 2 в таблице IDT, но вот линия номер 2 отдана под каскадное подключение другого контроллера прерываний. У NMI нет линии, оно отдельно.

А для остальных прерываний, которые обычные, маскируемые, как найти их линии?

 

hibou
()

Дифференциация загрузки через grub

Привет, ЛОР.

Можно ли как-то загружать разные службы исходя из выбранного пункта меню в grub?

Может быть какой-то параметр можно выставить в grub и прочитать его в процессе загрузки служб?

 ,

hibou
()

Термодатчик lm75ad и Linux

В общем, есть датчик lm75ad, установлен на шину i2c. Его видит утилита i2cdetect по адресу 0х49. Я даже могу прочитать с него температуру с помощью утилиты i2cget. Но!!! Его в упор не видит модуль ядра lm75.ko. Просто вообще ничего в ответ на загрузку драйвера нет. Никаких сообщений, ни файла устройства не появляется, вообще ничего.

Что я могу сделать со стороны Software? Боюсь, что к схемотехникам вопросов быть не должно. Они уверяют, что поставили датчик по его спецификациям, все как надо. Да и я же читаю из его регистра температуру. Почему же стандартный драйвер в составе линукса его не видит? Устройство не какое-то там экзотическое. Напротив, драйвер давно в составе ядра.

Что может быть не так? Если со схемотехникой что-то не так, то как это проверить?

 ,

hibou
()

Задачка про велотрек

Привет, ЛОР! Хочу предложить вам задачку. Есть давний вопросик, который меня беспокоит.

Велотрек. Радиус виража в нем 33 метра. Максимальный наклон полотна 42 градуса.

Эмпирически, то есть по наблюдениям, кажется, что тандемы (двойные велосипеды) держатся в вираже стабильней, нежели одиночки. То есть, на меньших скоростях.

Можно ли как-то математически доказать это наблюдение или опровергнуть его?

Для удобства возьмем вес одиночного велосипеда 7 кг, а вес тандема 15 кг. Гонщики у нас тоже будут одинаковые 65 кг (на тандеме их два). Колеса и покрышки у нас пусть будут тоже одинаковые с одинаковым износом.

Мастерство гонщиков у нас пусть будет тоже одинаковое. Потому что понятно, что если вилять рулем, по велосипеду проходит волна и хвост виляет тоже, что сказывается на стабильности, быстрее слетишь так.

Возможно есть еще какие-то факторы влияющие на стабильность в вираже. Но сейчас бы хотелось знать насколько влияет масса.

 ,

hibou
()

Задачка на самый быстрый подсчет встречаемости слов

Привет,

По мотивам темы: Различия между macOS и GNU/Linux

Есть файлик. Вот он: https://disk.yandex.ru/d/XaavsEkOvCT4HQ

Нужно пройтись по файлику и посчитать встречаемость каждого слова в тексте. Словом считается любая последовательность букв от a до z. Регистр нужно привести к одному. Любой другой символ прерывает слово.

Результат записать в другой файл в формате: <количество> <слово>. Например, текст: «cat, cat, cat». Ответ будет такой: «3 cat». Также, слова при выводе нужно отсортировать по их встречаемости.

Например первые несколько строк вывода из приведенного выше файла будут такими:

3343241 the
1852717 and
1715705 of
1560152 to
1324244 a

Дополнительное условие, нужно, чтобы ваша программа отрабатывала быстрее, чем за 7 секунд на Core i5-4690 @ 3.7 GHz.

Понятно, что железяки у всех разные, поэтому если участвуете, пишите на каком оборудовании вы запускали свою программку.

Вроде как BceM_IIpuBeT хотел поучаствовать. Может еще кто-то присоединится.

Я свою штуку написал. Отрабатывает примерно за 5 секунд на Мак-мини 2012-го года, core i7 @ 2,3 GHz.

 

hibou
()

Корректное удаление мутекса в ядре

Привет, ЛОР. Вопрос, наверное, простой, только никак не могу найти ответ на него. Все форумы облазил, никто не знает.

Короче, дело происходит в ядре линукса. Нужно корректно удалить мутекс. Мутекс создается динамически, через mutex_init(). И весь вопрос в том, как его теперь корректно удалить.

Упрощенный пример:

//somewhere in the code:
typedef struct {
  struct mutex *lock;
  int ref_count;
} super_duper_mutex_struct;

super_duper_mutex_struct * create_sdms () {
   super_duper_mutex_struct * r = kmalloc (sizeof (super_duper_mutex_struct), GFP_KERNEL);

   if (r) {
      mutex_init(r->lock);
      r->ref_count = 1;
   }

   return r;
}


//in another place
void delete_sdms(super_duper_mutex_struct *r) {
   mutex_lock(r->lock);

   r->ref_count--;

   if (r->ref_count == 0) {
      mutex_unlock (r->lock);
      mutex_destroy(r->lock);
      kfree (r);
   } else mutex_unlock(r->lock);
}

В приведенном коде сразу несколько проблем.

  • Предположим есть 2 потока. Предположим, поток_1 успешно доходит до mutex_destroy() и пытается удалить мутекс. Поток_2 в это время встал на ожидание в mutex_lock(). Далее, поток_2 видит, что мутекс разблокирован врывается в секцию. Что произойдет далее неизвестно. Либо поток_1 попытается удалить заблокированный мутекс. Либо поток_1 уже удалит мутекс и тогда не понятно, что произойдет с потоком_2, который на этом мутексе висит в ожидании?
  • Проблема вторая связана с освобождением памяти, занимаемой структурой. Поток_1 освободит память из-под структуры. Поток_2 ворвется в секцию и попытается уменьшить уже освобожденный реф-каунтер.

Со второй проблемой, я еще могу справиться, как-то по-другому перефразировав код. Но с первой я вообще не понимаю. Как правильно удалить мутекс, если там будут висеть потоки?

Заранее спасибо за ответы, если вдруг кто-нибудь что-то знает на этот счет. :-)

 ,

hibou
()

Объясните как работает связка cmake + make

Здравствуйте. Есть большой проект, который конфигурируется cmake и собирается make. В проект входит некий компонент, который не переписан на конфигурирование cmake, там обычный Makefile и переписывать его не хочется.

Из cmake я просто создаю отдельный таргет, командой add_custom_target. Внутри этого таргета копирую проект в билд-папку. И собираю его там простым вызовом make внутри этого таргета.

То есть, чтобы нагляднее было:

    add_custom_target(${CUSTOM_TARGET} ALL
      COMMAND "${CMAKE_COMMAND}" -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}" "${CUSTOM_BUILD_DIR}"
      COMMAND $(MAKE) clean
      COMMAND $(MAKE) 
      COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${PRODUCT} "${PRODUCT_DIR}"
      WORKING_DIRECTORY "${CUSTOM_BUILD_DIR}"
      VERBATIM
      )
 

Проект отлично собирается. Все хорошо. Но! Если выполнить снова make -j8 на уже собранном проекте, то получается следующее:

make[5]: Предупреждение: время изменения файла "blablabla.c" находится в будущем (0.0011)
make[5]: предупреждение: Неправильный ход часов.  Сборка может быть неполной.

Похоже это значит, make -j8 распараллеивает команды еще и внутри таргета. Видимо make исполнилось раньше, чем copy_directory.

Прав ли я? И как это пофиксить? Заранее спасибо за ответы. :-)

 ,

hibou
()

udev rules usb hubs

Привет, лорчик!

А можно ли как-то отделить мух от котлет usb хабы внутренние, которые находятся внутри системника, от хабов внешних, подключаемых?

Знаю как отделить хабы от остальных устройств. Хабы имеют класс 9. Т.е. в правилах можно сверяться с этим. Например так: ATTR{bDeviceClass}==«09».

Но таким образом, через класс 9, затронуты все хабы, и внутренние, и внешние.

Можно ли как-то их различить?

 , ,

hibou
()

Кодим на ассемблере в рождество

С Рождеством ЛОРчик!

Что мы делаем в Рождество? Кодим на ассемблере конечно же!

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

Я сначала удивился простоте задачи, минут за 5 набросал решение на С++ с использованием remove_if(). Потом подумал, наверное это не совсем честно, ведь нужно самостоятельное решение, а remove_if() - это вариант для ленивых, уж очень напоминает решение с библиотечной функцией. И я переделал код на свой собственный цикл в С++ стиле, на итераторах.

Замерил быстродействие. Команда time выдавала стабильные 0,005 - 0,006 секунды.

Вроде бы и все, задача решена. Я немного отдохнул, сходил попил чаю. И тут меня осенило. А смогу ли я написать то же самое на чистом Си так, чтобы оно работало быстрее?

И я попробовал. Переписал решение на Си, с адресной арифметикой во все поля. Очень старался не делать ничего лишнего, только самое необходимое и все в одном цикле. Замерил быстродействие. Оно оказалось те же 0,005 секунды. Но 0,006 уже не появлялось никогда. Т.е. может быть мы немножко выиграли, какую-нибудь половину тысячной доли секунды.

Но! Я бы не стал писать пост ради этого. Как вы понимаете, потом меня понесло! :-)

Я попил еще чаю. Поел маминого супа. И решил написать все то же самое, только на ассемблере! Мне было интересно, смогу ли я переплюнуть результаты Си-шного кода.

Вот тут пришлось серьезно постараться. Кажется, это будет мое первое приложение на ассемблере под мак.

Сколько раз мое приложение падало, наверное не сосчитать. Я убил на него полдня! Сломал себе весь мозг. Едва не навернул всю систему, особенно пока искал нужный системный вызов. Но я, таки, справился.

Короче, идея, в общем-то, проста. У нас есть некая строка в секции данных приложения. Там же мы себе оставили буфер для будущей новой строки. Ну и переписываем в этот буфер по байтам старую строчку. Если нам встречается пробел, мы его не переписываем. Для этого в ассемблере есть специальные команды, lods и stos, которые сами увеличат и уменьшат нужные заначения в регистрах. Нам для них нужно только подготовить начальные данные. Командой cmp мы сравниваем байты. Командой je (jump if equivalent) прыгаем на нужную инструкцию по результату сравнения. Регистр r10 я использовал, чтобы сохранить длину нашей новой строки. Почему r10? Не знаю, вроде он был следующий по конвенции вызовов, остальные, предыдущие мы уже использовали.

Чтобы напечать строки, дергаем системный вызов write(). Здесь я тоже надеялся немного выиграть, за счет того, что не использую библиотечные функции, а напрямую прося операционную систему печтать в stdout. Так как операционка - macos, системные вызовы у нее оказались под другими номерами, не как в Linux. Пришлось изрядно постараться, чтобы найти наконец нужный. Хорошо хоть параметры передавались в тех же регистрах, что и в Linux. Видимо соблюдалась конвенция о системных вызовах.

Другой новостью оказалсь RIP-related адресация. Может быть я забыл, но это было несколько неожиданно. Когда последний рза писал на ассемблере для Linux, вроде не сталкивался с этим. В общем, теперь мы не можем просто передавать адрес объекта внутри бинарника куда-нибудь еще. Этот адрес нужно вычислять относительно RIP - register instruction pointer. По-идее, это хорошее нововведение, потому что объекты встроенные в бинарник более не зависят от адреса загрузки этого бинарника поскольку вычисляются из адреса текущей исполняемой инструкции.

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

Нет, те же 0,005 тысячных долей секунды. Я не смог переплюнуть в написании кода Си-шный компилятор. Иногда, в некоторых, очень редких замерах проскакивает отметка 0,004 секунды. С натяжкой можно предположить, что мы обошли на 0,001 тысяную доли компиляторный код. Но это настолько мало, что можно списать на погрешность измерений.

ЛОР, скажи, а был ли у меня шанс обогнать компилятор? Можно ли как-то улучшить код?

Вот мой код ниже. Только номер системного вызова write стоит маковский, при компиляции под линукс, нужно будет подставить линуксовый номер. В линукс он, вроде 1 (единица).

.bss
str_out:
    .space 256

.global _main

.text

# rsi: msg, rdx: len
_print:
    movq $0x2000004, %rax            # system call write
    movq $1, %rdi                    # id handler 1 is stdout
    syscall
    ret

# rsi: from, rdi: to, rcx: count
# r10: current index
_copy:
    lodsb 
    cmpb $32, %al
    je _cpe
    stosb
    inc %r10
_cpe:
    loop _copy
    ret

_main:

    movq msg@GOTPCREL(%rip), %rsi    # address of string to output
    movq $msg_len, %rdx              # number of bytes
    call _print

    movq msg@GOTPCREL(%rip), %rsi
    movq str_out@GOTPCREL(%rip), %rdi
    movq $msg_len, %rcx
    xor %r10, %r10
    call _copy
    
    movq str_out@GOTPCREL(%rip), %rsi
    movq %r10, %rdx                  # number of bytes
    call _print

    ret

.cstring
msg:
    .ascii "String spaces remover\n"
    msg_len = . - msg


Перемещено Zhbert из linux-org-ru

 

hibou
()

Понимание широкой команды, VLIW

Лорчик, у меня тут вопрос возник, чисто теоретический.

Есть VLIW, архитектура e2k. Если посмотреть ассемблерный код, то команда там будет в фигурных скобках. Это и есть одна широкая команда.

Пример:

{
  nop 2
  istofd,3    %g17, %g18
}
{
  nop 7
  sdivs,5     %g17, %g16, %g16
}

В документации сказано, что одна такая широкая команда выполняется процессором за 1 такт. Справедливости ради, нужно заметить, что здесь ни слова про ядра. Просто сказано, что за один такт.

Дальше отсебятина, точнее «отменятина». Как бы суть-то широкой команды именно в том, чтобы распределить мелкие команды внутри этой широкой между ядрами процессора. Т.е. смысл фразы «за один такт» - это просто распараллеливание по ядрам.

Поскольку e2k не содержит жуткого блока предсказаний, как на обычном х86_64 и не умеет распаралеливать команды сам. За него это делает компилятор. Вот для этого и нужна эта широкая команда - компилятор распаралелил, перетасовал команды и сказал как их надо выполнить.

А теперь вот вопрсик в связи с этим. Получается, что прогу для e2k придется пересобирать для разных e2k процессоров с разным числом ядер?

Допустим прога собрана для Эльбрус 8С, у которого 8 ядер. Значит в фигурных скобках будет много команд. Т.е. широкая команда будет ну очень широкой, широчайшей прям! А запустится ли этот получившийся бинарник, скажем на 4С, у которого только 4 ядра? А на 1С? В смысле без пересборки.

 ,

hibou
()

Перехват системных вызовов начиная с ядра 4.15

Привет всем.

Кто-нибудь знает, что сделали с ядром начиная с 4.15 в части перехвата системных вызовов?

Раньше работала стратегия, находишь таблицу вызовов в памяти ядра, патчишь ее, подставляя адреса своих функций вместо оригинальных адресов обработчиков. И потом вызываешь оригинальные обработчики из своих функций. Это отлично работало раньше.

Но начиная с ядра 4.15 больше не работает. Даже если ты найдешь табличку, пропатчишь ее своими адресами, фиг там! И непонятно почему. Кто-нить в курсе что там понаделали? И как теперь перехватывать вызовы?

Заранее спасибо! :-)

 ,

hibou
()

Теряется связь

Здравствуйте! Помогите, пожалуйста, понять, что происходит?

Есть вот такая железка:

[    0.000000] Linux version 4.14.171 (builder@buildhost) (gcc version 7.5.0 (OpenWrt GCC 7.5.0 r10947-65030d81f3)) #0 Thu Feb 27 21:05:12 2020
[    0.000000] bootconsole [early0] enabled
[    0.000000] CPU0 revision is: 00019374 (MIPS 24Kc)
[    0.000000] MIPS: machine is Netgear WNDR3800
[    0.000000] SoC: Atheros AR7161 rev 2

C вот такой сетевой карточкой:

[    0.735213] Realtek RTL8366S ethernet switch driver version 0.2.2
[    0.741336] rtl8366s rtl8366s: cannot find mdio node phandle
[    0.747050] rtl8366s rtl8366s: using GPIO pins 5 (SDA) and 7 (SCK)
[    0.753315] rtl8366s rtl8366s: RTL8366 ver. 1 chip found
[    0.810121] libphy: rtl8366s: probed
[    0.815202] libphy: Fixed MDIO Bus: probed
[    1.155740] ag71xx 19000000.eth: connected to PHY at fixed-0:00 [uid=00000000, driver=Generic PHY]
[    1.165262] eth0: Atheros AG71xx at 0xb9000000, irq 4, mode: rgmii
[    1.505971] ag71xx 1a000000.eth: connected to PHY at rtl8366s:04 [uid=001cc960, driver=Generic PHY]
[    1.515598] eth1: Atheros AG71xx at 0xba000000, irq 5, mode: rgmii

И она теряет связь время от времени. Работает-работает и потом бац! Связи нет! Причем, ifconfig wan показывает, что линк поднят и ему присвоен ip-шник. Только вот пакеты не ходят от слова совсем и в логах тишина. Логи включил на уровень дебага, нифига не помогло, там все тихо, никаких ошибок вообще.

Если руками опустить интерфейс через «ifdown wan» и потом попытаться поднять заново: «ifup wan», то интерфейс опустится корректно, а вот подняться уже не поднимется. В ifconfig исчезнет присвоенный ip.

Помогает поднять сеть вытаскивание ethernet кабеля и втыкание его заново.

Еще помогает переустановить характеристики карты через «ethtool -s eth1». Eth1 - это и есть wan.

Что делать? Куда копать? Как вообще понять что происходит, если в логах ничего нет по проблеме? Логи на максимальном дебажном уровне. И все, что там есть, это визги по поводу невозможности обновить аренду DNS. Так это и понятно, если линк отвалился. А вот по поводу линка я никаких сообщений не вижу.


Еще небольшая странность, может это как-то связано. По тарифу, договору с провайдером у меня скорость 100 мбит. И если кабель воткнуть в компьютер, он без проблем соединяется именно на 100 мбит. Эта же штуковина иногда фигачит на 1000!!! На гигабите, блин! Фактическая скорость при этом около 300 мбит. Как такое возможно?

Заранее спасибо за ответы!

 , , wndr3800

hibou
()

Задачка про трисекцию угла

Привет!

Прокомментируйте кто-нибудь?

https://rg.ru/2020/04/29/reg-urfo/byvshaia-uchitelnica-matematiki-predlozhila-reshenie-nereshaemoj-zadachi.html

Вроде бы задачка про трисекцию угла не решаема. Любой угол, отличный от 90 градусов нельзя разделить на три равные части циркулем и линейкой.

Где ошибка?

 ,

hibou
()

Определить MAC адрес WAN интерфейса роутера

Привет!

А можно каким-то способом определить MAC адрес, принадлежащий именно WAN порту на роутере? Если в админке ничего нет. И наклейки на роутере с такими данными тоже нет.

В админке роутера есть мак адреса интерфейсов в сторону локальной сети, но не WAN. Т.е. если адрес обоих Wifi 2,4 и 5 ГГц. Есть адрес Ethernet порта, к которому компьютер подключен. Но эти адреса я и без админки могу посмотреть. Например, командой arp.

А вот как посмотреть адрес именно WAN - загадка.

Еще я пробовал поглядеть через WireShark. Но там тоже только адрес компа и порта роутера в сторону компа. Адреса порта во внешку нету.

 ,

hibou
()

Американский программист 12 лет в одиночку работал над созданием собственной операционной системы TempleOS

Американский программист Терри Дэвис 12 лет в одиночку работал над созданием собственной операционной системы TempleOS, предназначенной для разговоров с Богом. Изначально ему был поставлен диагноз биполярное расстройство, позже он был признан страдающим шизофренией. Дэвис разговаривал с Богом при помощи генератора случайных чисел и считал, что имеет прямую связь с Богом. Бог сказал ему, что созданная операционная система — это Третий Храм и что в TempleOS проявляется «божественный» разум.

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

В 2017 году TempleOS экспонировалась во Франции на выставке работ в жанре ар брют.

Терри немного не осилил сеть, а так невероятно крут!

https://mi3ch.livejournal.com/4543951.html

 templeos

hibou
()

gcc 32/64 bits

Парни, привет!

Давно уже не работал с линуксом. Много чего позабыл. Но тут внезапно понадобилось.

Можно ли как-то на 64-х битной системе собрать gcc с версиями библиотек под 32 и 64 бита одновременно. Библиотеки libgcc, libstdc++. Правильно я понимаю, они часть gcc?

 , ,

hibou
()

Перехват звонков 3g, 4g

Читаю тут новость: http://www.kommersant.ru/doc/2983088

И сдается мне, там кто-то кого-то изнасиловал. Насколько вообще такое возможно? Перехват звонков в 3g и LTE. Сигнал ведь шифруется.

Да и подмена базовой станции не прокатит. Это в 2g можно было подъехать со своей БС и переподключить все телефоны на себя, прослушивать их всех (но дешифровать сигнал все-равно придется). С 3g и 4g такой номер вообще не пройдет, насколько я знаю.

СОРМ - это немного другое. Там сами операторы данные сливают. Тут же речь именно о перехвате, кажется.

 

hibou
()

Госдума просит ФСБ заблокировать Телеграм

Уже было, нет? В общем началось. Запрещаторы активировались.

http://www.kommersant.ru/doc/2855366

Для Ъ: Первый заместитель главы конституционного комитета Госдумы Александр Агеев попросил ФСБ рассмотреть возможность ограничения доступа российских пользователей к мессенджеру Telegram. Об этом говорится в обращении господина Агеева к руководителю ФСБ Александру Бортникову.

 

hibou
()

Лицензия libraw

Привет всем.

Если коротко, хочу закрыть код проекта, имеющего в своем составе статическую линковку с libRaw. Можно ли это сделать юридически? Я сам не юрист и не смогу разобраться в хитросплетениях тройного лицензирования этой библиотеки. Да, там аж три лицензии. И чем отличаются я тоже не знаю. GPL, CDDL и какая-то собственная libraw-лицензия.

 , , ,

hibou
()

В ГД поддержали идею наказывать чиновников за использование WhatsApp

Первый зампред комитета Госдумы по информационной политике Вадим Деньгин сообщил «Русской службы новостей», что поддерживает идею наказывать чиновников за использование WhatsApp и Google.

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

Также, Секретарь Совета безопасности РФ Николай Патрушев раскритиковал чиновников за использование иностранных сервисов Google, Yahoo и WhatsApp и потребовал от губернаторов принять меры для решения этой проблемы.

http://tass.ru/politika/2211260

Приведенный текст приведен без изменений, орфография авторов сохранена.

В смысле, ошибки не мои ))

 

hibou
()

RSS подписка на новые темы