LINUX.ORG.RU

X11-приложение на чистом ассемблере под Linux

 , ,


2

5

Наконец закончил перевод очень крутой и интересной статьи, где описывается работа с Х-сервером на чистом ассемблере.

Как сама статья так и перевод - большие и сложные, знаний на такое у меня уже нехватает. Если есть желающие помочь с вычиткой и поиском ошибок - велкам!

На скриншоте обычная Ubuntu и Xfce, самое главное - ч0рное окошко по центру, это и есть та самая тестовая программа из статьи, написанная на чистом ассемблере и вызывающая Х-сервер через unix-сокет.

>>> Просмотр (1366x768, 988 Kb)

★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

имхо, dlopen(емнип).
но смысл гонять диалап через 800G/port Arista'у?

etwrq ★★★★★
()
Последнее исправление: etwrq (всего исправлений: 1)
Ответ на: комментарий от eternal_sorrow

Там же написано: сгенерирована нейросетью. Т.е. не стрёмно взять другую нейросеть и заапскейлить, а затем увеличить резкость (:

anonymous-angler ★☆
()
Ответ на: комментарий от mittorn

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

Так тебе и не надо. Вместо записи в сокет ты зовешь библиотеку и ололо.

cumvillain
()
Ответ на: комментарий от eternal_sorrow

Конечно. А кто говорил что то про сокеты?

Реализация протокола, лол: /run/user/1000/wayland-0

Куда по-твоему libwayland-client шлет команды?

cumvillain
()
Последнее исправление: cumvillain (всего исправлений: 2)
Ответ на: комментарий от LINUX-ORG-RU

Быль.

В стародавние времена я очень интересовался ассемлерами. Настолько «очень», что это стало частью моей натуры.
И тусовался общался, естественно, с такими же, как сам.
Было это во времена венд, но через пару лет пришёл *никс и я в своём кругу высказался насчёт асма в *никсах. Дескать, вот, неплохо бы.
И каково было моё удивление, когда спустя время была продемонстрирована некая ассемблерная программа, которая выводила точку во время работы системы инициализации.
Автором программы была одна тян из тоЙ тусы.
Ну дык вот.
Позднее судьбина занесла меня на курсы этого вашего Ынтерпрайза. Там я познал другую сторону Марлезонского балета IT-индустрии.
Но это уже другая история.

sparkie ★★★★★
()
Ответ на: комментарий от sparkie

некая ассемблерная программа, которая выводила точку во время работы системы инициализации. Автором программы была одна тян из тоЙ тусы.

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

alex0x08 ★★★
() автор топика

Замечу что эти секции обычно раскидываются ОС по разным страницам памяти, с разными правами (можно увидеть с помощью команды readelf -l), поэтому секция text является только для чтения, а секция data — с запретом на запуск, но это отличается в разных ОС.

Рассогласование. Предлагаю: „… поэтому секция text доступна только для чтения, а в секции data не разрешён запуск, …».

ugoday ★★★★★
()
Ответ на: комментарий от cumvillain

На скрине речь идёт об программе без библиотек. Обрати внимание на код, делающий сисколл и на вызов ld

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

На скрине речь идёт об программе без библиотек. Обрати внимание на код, делающий сисколл и на вызов ld

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

В случае с библиотекой тебе надо позвать mmap и найти нужный символ. Это не то чтобы сложно делается.

cumvillain
()
Последнее исправление: cumvillain (всего исправлений: 1)
Ответ на: комментарий от cumvillain

Ты предлагаешь загрузить библиотеку сиссколлом и искать символ? А как же релокации? Особенно если это glibc, то её загиузка будет весьма сложной. Вот я недавно например србрал glibc 2.19 свежим компилятором (надо было таргетить 2.6.25) в итоге он так и не заработал, даже под акиуальными ядрами, пришлось собрать idiotlibc (musl)

mittorn ★★★★★
()
Последнее исправление: mittorn (всего исправлений: 1)
Ответ на: комментарий от mittorn

Не слышал о таком, откуда информация?

alex0x08 ★★★
() автор топика
Ответ на: комментарий от mittorn

На бзде же запрещено дёргать сисколы не через libc?

Только OpenBSD.

cumvillain
()
Ответ на: комментарий от kirill_rrr

Тут всё проще - если в промпте была тян - значит тян

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

Ты предлагаешь загрузить библиотеку сиссколлом и искать символ? А как же релокации? Особенно если это glibc, то её загиузка будет весьма сложной.

Слинкуй с муслом и все ок.

Вот я недавно например србрал glibc 2.19 свежим компилятором (надо было таргетить 2.6.25) в итоге он так и не заработал, даже под акиуальными ядрами, пришлось собрать idiotlibc (musl)

Хз, musl норм (кроме аллокатора).

cumvillain
()
Ответ на: комментарий от alex0x08

Не хотел, ну ладно...

Мои познавания Ынтерпрайза были омрачены переходом от человека думающего к человеку потребляющему: мне было тупо интересно, но я был один на курсе, поэтому когда я рассказал об опыте той тян, в ответ узнал о себе много нового)))

Да, я ещё застал...

sparkie ★★★★★
()
Ответ на: комментарий от EXL

WinAPI предоставляет очень большой функционал. На самом деле там ничего сверхъестественного нет - писать на нём. Те же иксы гораздо более бедные, там банальный text input реализовать это огромный объём работы. Поэтому чистые приложения под иксы это редкость, а вот чистые приложения под WinAPI никакого удивления не вызывают.

vbr ★★★★
()
Ответ на: комментарий от sparkie

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

Это же как с автогонками: залезть в болид много ума не надо, да и доехать до финиша на первой передаче тоже можно. Но суть автогонок же не в этом.

alex0x08 ★★★
() автор топика

А если на С такое написать с собственным стабом, хоть как у Столярова описано, насколько больше будет7

gns ★★★★★
()
Ответ на: комментарий от alex0x08

Ну тут как-то без него обошлись. Никто же не запрещал _asm { mov ax, что-то; mov di, другое; syscall }

У крокодила в первом томе написано, как написать собственный запускающий стаб на ассемблере и обойтись без libc.

gns ★★★★★
()
Последнее исправление: gns (всего исправлений: 1)
Ответ на: комментарий от gns

Нашел вот такой пример:


/* 64 bit linux. */

#define SYSCALL_EXIT 60
#define SYSCALL_WRITE 1

void sys_exit(int error_code)
{
    asm volatile
    (
        "syscall"
        : 
        : "a"(SYSCALL_EXIT), "D"(error_code)
        : "rcx", "r11", "memory"
    );
}

int sys_write(unsigned fd, const char *buf, unsigned count)
{
    unsigned ret;

    asm volatile
    (
        "syscall"
        : "=a"(ret)
        : "a"(SYSCALL_WRITE), "D"(fd), "S"(buf), "d"(count)
        : "rcx", "r11", "memory"
    );
    
    return ret;
}

void _start(void)
{
    const char hwText[] = "Hello world!\n";

    sys_write(1, hwText, sizeof(hwText));
    sys_exit(12);
}

Оно?

alex0x08 ★★★
() автор топика
Ответ на: комментарий от mittorn

Ирония в том, что для такого сравнения достаточно сравнить код на сишке, ибо оба ассемблерных варианта всё равно будут опиратся на C API

AKonia ★★
()
Ответ на: комментарий от alex0x08

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

AKonia ★★
()
Ответ на: комментарий от gns

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

alex0x08 ★★★
() автор топика
Ответ на: комментарий от gns

Будет больше при любых раскладах, хотя-бы из-за структур данных.

alex0x08 ★★★
() автор топика
Ответ на: комментарий от sparkie

Ты не поверишь, но асм в никсах очень даже нужен. Была со мной такая история. Занимался я разнаботкой некоего embedded-юникса ,приминяемого во всяких однолптниках типа мозгов для принтера или чего-то мелкого во всяких боингах. Так вот, «в первых байтах операционной системы» было написано (ассемблер ppc, пишу по памяти):

int get_<не помню что>(void) {
    _asm {
        mov 0x20, r0
        svc ; типа супервизор-колл, что-то типа обращения к биосу
    }
}

return'a нет. Предполагается, что там где надо появится нужный код возврата, и он скажет нам, где мы. И он существенно не нулевой.

И тут случился переход с gcc-2.95 на 3.0. А 3.0 в таких случаях лепит implicit return 0 для функций без return. Ну заливаем собранную прошивку в плату, а она сука не грузится. Стали смотреть как-то, модифицировать ядро, мигать диодиками. Наткнулись на эту штуку быстро, конечно. Но крови нам это попортило тогда.

gns ★★★★★
()
Ответ на: комментарий от gns

Занимался я разнаботкой некоего embedded-юникса ,приминяемого во всяких однолптниках типа мозгов для принтера или чего-то мелкого во всяких боингах.

Никак «прохладная былина» времен лучших дней Люксофта?

alex0x08 ★★★
() автор топика
Ответ на: комментарий от alex0x08

Есть подозрение, что содержимое сегмента _text будет отличаться не сильно :) Ладно, будет время, попробую. Даже интересно.

gns ★★★★★
()
Ответ на: комментарий от gns

асм-то, может и нужен, но он в *никсах не разработан фактически.

...крови... ...попортило...

:-D (вспоминая своё).

sparkie ★★★★★
()
Ответ на: комментарий от sparkie

Ну так концепция — переносимость. На асме стараются писать чем меньше, тем лучше. Вон залезь в unix archive, посмотри, сколько там ассемблера.

gns ★★★★★
()
Ответ на: комментарий от cumvillain

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

mittorn ★★★★★
()
Ответ на: комментарий от alex0x08

Вот что сейчас в разработке

начинание хорошее,правильное.

а где «msx-basic в системах искусственного интеллекта» ?

«rogue-like games для логарифмической линейки» :-)

хотя-бы «настройка и разгон 3Dfx Voodoo в ядрах 6.6.2 и выше»

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

а где «msx-basic в системах искусственного интеллекта» ?

В ИИ не верю

«rogue-like games для логарифмической линейки» :-)

в игры не играю

хотя-бы «настройка и разгон 3Dfx Voodoo в ядрах 6.6.2 и выше»

Voodoo не разгонялся даже когда был актуален, разгон видеокарт пошел с продукции NVidia вроде.

alex0x08 ★★★
() автор топика
Ответ на: комментарий от alex0x08

разгон видеокарт пошел с продукции NVidia вроде.

Так, вроде, NVidia сама с этим неплохо справляется, чего еще там разгонять-то?

gns ★★★★★
()
Ответ на: комментарий от alex0x08

Нет, это в Ауриге было, году в 2005м. В Люксе я не работал, но очень благодарен по сей день собеседовавшему мена парню, имени которого к сожалению не помню. С++ я тогда знал ну так себе, так он много чего мне рассказал про всякие RAII и SFINAE. И вообще про то как там темплейты устроены. Долго общались, но на работу меня тогда не взяли. Ну и ладно, не обижаюсь. Мне показали предел моих тогдашних знаний, причем умудрились сделать это очень корректно. Чего никак не умеют в хуЯндексе.

gns ★★★★★
()
Ответ на: комментарий от gns

Я честно говоря даже не догадывался о таких талантах Ауриги, что они по embedded и C++. Всегда думал что там лишь прикладная разработка и кровавый энтерпрайз.

alex0x08 ★★★
() автор топика

Наконец закончил перевод очень крутой и интересной статьи, где описывается работа с Х-сервером на чистом ассемблере.

Поздно, red hat и иксперды в соседней ветке иксы уже закопали. Так что сотри свой перевод, он не нужен.

Herabora
()
Последнее исправление: Herabora (всего исправлений: 1)
Ответ на: комментарий от einhander

Я так и сделал) Правда пришлось подобрать такую нейросетку, которая ещё и артефакты jpeg исправляет а не просто апскейлит их.

eternal_sorrow ★★★★★
()
Ответ на: комментарий от alex0x08

Они LynxOS и BlackCat Linux пилили одно время. Там как раз всегда было что-то альтернативное. Кто-то тулкиты какие-то пилил для ppc, кто еще что... Кровавый Ынтерпрайз  — это как раз про Люкс. Там то какие-то биржевые агенты, то что-то для немецкого автопрома...

gns ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.