LINUX.ORG.RU

Сообщения cyber_eagle

 

Принцип работы звука в linux

Добрый день! До определенного момента считал, что звук в linux воспроизводится благодаря xserver...но после трассировки mplayer немного потерялся. Буду благодарен за пояснение данного процесса (в какой сокет/файл записывается аудиопоток?).

Вот, что нашел:

Вырезки из «strace mplayer»:

pipe2([5, 6], O_CLOEXEC) 

и в цикле записывает (4 - это аудиофайл)

read(4, "~\2760\v\305'\251\357\377\376\273\377\277\351#~\0\0\0\20\6g?\367\342\327U\303ej\351J"..., 4096) = 4096
write(6, "W", 1)                        = 1

Кроме того перед этим открывает

socket(AF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC, 0) = 9
connect(9, {sa_family=AF_LOCAL, sun_path="/run/user/1000/pulse/native"}, 110) = 0
но ничего не пишет в него

А также нашел открытие сокета X11, но он закрывается еще до начала воспроизведения:

( читать дальше... )

PS: лез в исходники mplayer, но там уперся в библиотечные функции pulseaudio, которые в свою очередь пестрят изобильным интерфейсом и многочисленными ответвлениями, так что копать дальше ради того, чтобы узнать как оно работает не стал. (мне, для личного FAQ, достаточно внешний интерфейс, и алгоритм его взаимодействия с ядром на пальцах)

 , ,

cyber_eagle
()

«Как восстановить bluetooth адаптер с обнуленным адресом» или «Боремся с EADDRNOTAVAIL»

Когда то создавал тему :https://www.linux.org.ru/forum/general/13867818?lastmod=1512381418394#comment-13868385 (комментарий)

Но вместо помощи получил несколько шуточных комментов... Вообщем оказалось, что таких «стрелков-по-собственным-ногам» в гугле можно найти достаточно. И ни одного решения.

Так вот: решением является временный запуск пропатченного ядра и изменение адреса из-под него.

Патч необходимо накладывать на net/bluetooth/hci_core.c (моя версия ядра 4.10.17)

--- hci_core.c	2017-12-18 20:07:05.814845399 +0200
+++ /usr/src/linux-source-4.10.0/linux-source-4.10.0/net/bluetooth/hci_core.c	2017-02-20 00:34:00.000000000 +0200
@@ -1304,11 +1304,10 @@
 		 * This check is only valid for BR/EDR controllers
 		 * since AMP controllers do not have an address.
 		 */
-		if ((!hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
+		if (!hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
 		    hdev->dev_type == HCI_PRIMARY &&
 		    !bacmp(&hdev->bdaddr, BDADDR_ANY) &&
-		    !bacmp(&hdev->static_addr, BDADDR_ANY)) && 0 ) {
-			printk("BACMP 1");
+		    !bacmp(&hdev->static_addr, BDADDR_ANY)) {
 			ret = -EADDRNOTAVAIL;
 			goto done;
 		}
@@ -1364,11 +1363,10 @@
 		 * support changing the public address, fail the power
 		 * on procedure.
 		 */
-		if ((bacmp(&hdev->public_addr, BDADDR_ANY) &&
-		    hdev->set_bdaddr) || 1 )
+		if (bacmp(&hdev->public_addr, BDADDR_ANY) &&
+		    hdev->set_bdaddr)
 			ret = hdev->set_bdaddr(hdev, &hdev->public_addr);
 		else
-			printk("BACMP 2");
 			ret = -EADDRNOTAVAIL;
 	}
 

(Просто убрал «подозрительные» проверки корректности адреса перед включением)

Собираем - устанавливаем - запускаем новое ядро - поднимаем интерфейс «hciconfig hci0 up» - меняем адрес - загружаемся в старое ядро - радуемся =)

В теории можно также запихнуть set_bdaddr в модуль, и вообще копнуть глубже и сделать красивее... но времени не хватает, так что звиняйте...

Если возникнут вопросы - с радостью отвечу!

 , , ,

cyber_eagle
()

ld.so и bash

Немного покрашился мирок...

Распаковал initrd и увидел, что init, который находится в корне на самом деле является скриптом bash. Отсюда вопрос:

Получается, что ядро парсит указатель на интерпретатор файла в начале? А если строчка типа «#!/bin/bash» отсутствует, то ядро всеровно запускает bash?

Тоесть получается, после вызова exec для скрипта, ядро ищет в файле указатель на интерпретатор, а затем, если интерпретатор является бинарным исполняемым файлом - запускает указанный в нем прелоадер (ld)?

Очень хотелось бы услышать просто на пальцах. Заранее спасибо.

 , ,

cyber_eagle
()

Как убить bluetooth адаптер? -Очень просто...

Доброго ВС!

Произошло вот что:

root@PLOTVA2:~# hciconfig
hci0:	Type: Primary  Bus: USB
	BD Address: 00:00:00:00:00:00  ACL MTU: 310:10  SCO MTU: 64:8
	DOWN 
	RX bytes:501 acl:0 sco:0 events:22 errors:0
	TX bytes:92 acl:0 sco:0 commands:21 errors:0

root@PLOTVA2:~# hciconfig hci0 up
Can't init device hci0: Cannot assign requested address (99)

После гугления остался в замешательстве, тккак получилось:

root@PLOTVA2:~/Загрузки/blht/Blue-Smash-v1.0e/tools# ./bdaddr -i hci0 00:11:22:FF:EE:55
Invalid device: Network is down

Итого: поднять интерфейс я не могу, тккак адрес не корректен, а изменить его нельзя потому, что интерфейс лежит?

lsusb:

Bus 002 Device 009: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)

 , ,

cyber_eagle
()

Структура elf header, Shared Object hook и symbol lookup

Доброго ВС!

Файл first.c

#include <stdio.h>

void firsh(void)
{
printf("First function...\n");
}

собран _> gcc ./first.c -fPIC -shared -o libfirst.so

main.c

int
main(int argc, char **argv)
{
  firsh();  
}
собран _> gcc maic.c ./libfirst.so

./a.out Выводит First function...

Теперь я изменяю first.c (название функции firsh стало first)

#include <stdio.h>

void first(void)
{
printf("First function...\n");
}

Предварительно переименовав libfirst.so в libfirsh.so, собираю libfirst.so еще раз

Тоесть в директории у меня находятся файлы

libfirst.so 
libfirsh.so 
a.out 
main.c 
first.c

Затем открываю hexEditor и меняю в файле libfirst.so названия first на firsh (их будет 2: symtab и dynsym). Пытаюсь выполнить

#./a.out
./a.out: symbol lookup error: ./a.out: undefined symbol: firsh

Ок смотрим, чем отличаются libfirst.so и libfirsh.so: 1) ID сборки по адресу 0x472 2) 512,514,548 байты

От ID сборки результат выполнения никак не зависит. Методом тыка определяю, что за работоспособность программы отвечают 512 и 548 байты: У меня в libfirsh.so было 0x512=0x8A 0x548=0x81

libfirst.so: 0x512=0x88 0x548=0x8D

После изменения даных байтов в libfirst.so на те, что находятся в libfirsh.so

# ./a.out 
First function...

Вопрос в том, что это такое, как их вычислить, и поправить при подобных манипуляциях.

 , , ,

cyber_eagle
()

Ubuntu touch, что с тобой не так?

Решил потестить, ubuntu touch 15 от ubports и попал в такую ситуацию: Сохранил в «~/» папку music с набором треков, но дефолтный проигрыватель соглашается читать и искать треки только в своей директории «~/Music/Imported». Ок...у меня есть консоль, желание послушать музыку и нежилание менять расположение своей директории music. Я сделал следующее:

# cd ~
# cd ./Music
# ls ./Imported
# mount -o bind ~/music ./Imported
# ls ./Imported
...Много файлов...
Далее запускаю проигрыватель...а он не отображает ни одного файла. Тогда я размонтировал папку и сделал так:
# mv ~/music/* ~/Music/Imported/
После этой операции проигрыватель увидел все, что требовалось. Почему это происходит?

Я даже грешил на selinux. Но после отключения ничего не произошло.

 , , , ,

cyber_eagle
()

Файл есть все? Функция sys_socket(3).

Доброе/ый утро/день/вечер!

В исходниках /net/socket.c есть вызов

err = sys_socket(a0, a1, a[2]);
Но реализацию, никак не могу найти (пробовал даже http://elixir.free-electrons.com/linux/latest/ident/sys_socket). Где ее искать?

Ознакомившись с sockets API впал в когнитивный диссонанс...

Смущает реализация AF_INET при которой конечные точки подключения не отображаются на ФС. Получается, что «все есть файл» здесь не работает? Почему интерфес для работы с tcp так отличается от всего остального? write/read/ioctl разве не достаточно?

 , ,

cyber_eagle
()

Как восстановить SUID на sudo

Добрый вечер! После экспериментов с chroot обнаружил невозможность запуска sudo по причине отсутствия на /usr/bin/sudo флага SUID. Загрузился с liveUSB, установил флаг на sudo... но после загрузки ОС ничего не изменилось.

 , ,

cyber_eagle
()

Какой компонент занимается авторизацией в многопользовательских режимах linux?

Доброго ВС. Немного поплыло представление об устройстве системы. Буду очень рад объяснению 'на пальцах', как в linux реализован механизм контроля доступа пользователей к файлам.

...ядро ведь не должно этим заниматся? Этот модуль получает системные вызовы open?

 , ,

cyber_eagle
()

Узнать название модуля по старшему номеру.

Доброго ВС! Собственно вопрос в названии темы. Нахожусь в директории /dev и хочу узнать название драйвера , который используется для

crw-rw---- 1 root disk 21, 0 Июл 21 16:07 sg0

К сожалению, того, что нужно, не нагуглил. Заранее спасибо!

 

cyber_eagle
()

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