LINUX.ORG.RU

Сообщения Murr

 

SCSI hotplug/hotunplug daemon для 2.4.20

Может кто-то встречал нечто подобное с открытым кодом?

Без разницы модулем или приложением.

Спасибо.

P.S. Просто лень писать то, что должно быть уже написано (в поиске не нашел. Может плохо искал?).

Murr
()

Linux memory consistency model (по следам Intel MP cache coherence)

Я попытался создать нитку в рассылке linux-smp, может мне ответят на ряд вопросов. Если кому интересно, то вот ссылка - http://marc.theaimsgroup.com/?l=linux-smp&m=110114715909534&w=2

Murr
()

Intel MP & cache coherence (продолжение)

Не было доступа к сети - не мог ответить
и тема спустилась

>очень может быть. но. вы не знаете наверное, когда этот mov начнет
>выполняться, даже на pentium'ах есть write buffers. причем здесь
>я не имею в виду переупорядочивание кода, считаем, что mov уже
>выполнена. то есть у нас уже выполняются следующие инструкции, а
>mov пока еще только _считывает_ cache line, в случае cache miss.

Хорошо
на уровне snoop сие не пройдет (из-за буферов)
пусть запись ведется через выход на шину lock xchg..., а чтение - через mov. Тогда имеет место атомарность(при условии выровненных данных - единственных, которые можно получить компиляцией gcc при условии кодирования по стандарту ISO C, т.е. без пакования структур и некорректных приведений вида void *a; ...(int *)a...)

>нет, совершенно точно не только по этой причине. порядок передачи
>данных может изменить и шина (только не ловите меня на слове, я не
>владею терминологией :). кроме того, даже с барьерами другая сторона
>должна делать rmb(), иначе, опять таки, никаких гарантий.

Для выровненных данных порядок не может измениться, тк все данные передаются в одной шинной транзакции(абсолютно одновременно)

Murr
()

Сколько платят программистам в Эльбрусе?

Мне на e-mail свалилось предложение придти пособеседовать,
но никак не могу от них добиться данных о порядке зарплат. :)

P.S. Просто интересно.
Murr
()

Интегрирование page cache и прозрачного шифрования файлов

Хотелось бы услышать предложения как бы это получше сделать.

Навскидку варианты:

1) использовать оригинальную страницу для ввода-вывода
   и в b_end_io расшифровывать поблочно(для readpage).

   Если во время b_end_io разрешены прерывания, то,
   как мне кажется, можно легко переполнить стек ядра
   (файловая система может жить на 16-64 дисках),

   если прерывания запрещены, то могут теряться прерывания,
   кроме того, поскольку шифрование тяжелое, то
   могут возникать неприятные задержки, даже если ядро
   поддерживает вытеснение

   кроме того, kmap_atomic(bh_kmap_irq) может в первом
   случае в какой-то момент не спроецировать страницу.

2) (для readpage) в b_end_io помещать буфера в очереди 
   и вне контекста прерывания их обрабатывать (расшифровывать)
   
   По-моему, это будет слишком медленно (лишнее переключение
   контекста).

3) совершать операции над страницами синхронно (readpage, 
   prepare-/commit- write), используя для ввода-вывода
   теневую страницу.

   Так я реализовал сейчас, но проблема в том, что readahead
   становится синхронным.

Как бы получить разумный компромисс между безопасностью и
производительностью?
Murr
()

binfmt и 2.6 (test8)

Никто с таким не сталкивался?

[root@murr binfmt]# echo ':DOSWin:M::MZ::/usr/local/bin/wine:' > register
Debug: sleeping function called from invalid context at include/asm/semaphore.h:119
in_atomic():1, irqs_disabled():0
Call Trace:
[<c0125d90>] __might_sleep+0xa0/0xd0
[<c035276b>] inode_doinit_with_dentry+0x16b/0x6c0
[<c0180da8>] do_kern_mount+0xb8/0x100
[<c01b3210>] bm_fill_super+0x0/0x40
[<c0199525>] d_instantiate+0x115/0x1b0
[<c01b2998>] bm_get_inode+0x48/0x70
[<c01b2fb3>] bm_register_write+0x193/0x1e0
[<c0175533>] vfs_write+0xd3/0x140
[<c017563f>] sys_write+0x3f/0x60
[<c010c379>] sysenter_past_esp+0x52/0x79

Murr
()

RH9.0 и do_brk :)

Имеется одна программа для RH9.0.

Делает /tmp/devmem с правами доступа 0777 (block 0101 == /dev/mem).

Проблема в том, что при этом она уходит в reboot (/tmp/devmem после перезагрузки остается, но суть не в этом). Вопрос собственно почему уходим в reboot?

P.S. Если вдруг кто запускать будет: учтите, что нужен 1 Гиг свободной виртуальной памяти или же overcommit_memory=1, иначе кина не будет (скорее всего это требование обязательно для того, чтобы не покрэшить ядро, а суметь получить что-то более полезное -- из-за того, что ядро проецирует ОЗУ на kvm через PSE страницы и само же не понимает их).

Вот собственно программа и Makefile:

#define __KERNEL__
#include <asm/pgtable.h>
#include <asm/errno.h>

extern int errno;

char mystack[4096];

char tmpmemstr[] = "/tmp/devmem";

asm ("  .align 4096
        .globl expcode
    expcode:

        pushal

        movl    $0, %ebx
        movl    $60, %eax
        int     $0x80

        movl    $0xfffff000, %ebx

    copy:
        subl    $4, %ebx
        pushl   (%ebx)
        cmpl    $0xffffef00, %ebx
        jne     copy

        movl    %esp, %ebx
        movl    $020777, %ecx
        movl    $0x0101, %edx
        movl    $14, %eax
        int     $0x80

        addl    $0x100, %esp
        popal

exit:
        int     $0x80
        ret
        .globl expcode_end
        expcode_end:
");

extern unsigned char expcode, expcode_end;

void do_main (long esp) {
    unsigned char *trampoline;
    unsigned char volatile dummy;
    unsigned int i;

    trampoline = __fix_to_virt (FIX_VSYSCALL);
    if (trampoline != 0xffffe000) {
        printf ("weird... but you still can try patching the asm code accordingly ;)\n");
        exit (0);
    }

    munmap (esp & ~(4096 - 1), 0xc0000000 - (esp & ~(4096 - 1)));
    brk (0xfffff000);

    printf ("probing write @ %p\n", trampoline); sleep (1);
    *trampoline = 0xcd;
    *(trampoline+1) = 0x80;
    *(trampoline+2) = 0xc3;
    *(long*)(trampoline+3) = 0;

    printf ("probing read @ %p\n", trampoline); sleep (1);
    dummy = *trampoline;

    printf ("copying string %p->%p\n", tmpmemstr, trampoline+0xf00); sleep (1);

    for (i=0; tmpmemstr[i]; i++) {
        trampoline[0xf00+i] = tmpmemstr[i];
        printf ("%x\n", i);
    }
    trampoline[0xf00+i] = 0;

    printf ("copying hook ->%p\n", trampoline); sleep (1);
    for (i=(unsigned int)&expcode; i<(&expcode_end+1); i++) {
        trampoline[i-(unsigned int)&expcode] = *(unsigned char *)i;
    }

    printf ("done\n"); sleep (1);
    do {
        access (tmpmemstr, 3);
    } while (errno == ENOENT);

    *(unsigned int *)trampoline = 0x00c380cd;
    *((unsigned int *)trampoline+1) = 0x00000000;

    if (errno != 0)
        perror ("bad luck");
    else
        printf ("everything seems fine...\n");

    for (;;) pause (); // Don't burn the CPU :)
}

int main () {
    register long esp asm ("esp");
    register long oldesp = esp;

    esp = mystack+4096;
    do_main(oldesp);

    return 0;
}


all:
        gcc -static -g -I/lib/modules/`uname -r`/build/include -Wl,-Tdata,0xbfff0000 exp.c -o exp

Murr
()

Нужен linker (ld) для ELF в исходниках :)

Где можно найти?
GNU binutils не предлагать... нечитаемо. :)
В NetBSD родной (не GNU) ld вроде только a.out делает.

Куда еще можно глянуть?

Murr
()

Как shared object преобразовать в relocatable?

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

Murr
()

FreeBSD+ls+системные вызовы+сигналы :)

Есть программа, которая для статических ELF делает remap на системные вызовы FreeBSD->Linux (для запуска бинарников FreeBSD в Linux), но пока она не работает :) :(

Дает примерно такой trace:

--------------------------------
entering system call 5 (8095b40)
SYS_open: path=0xbfffefe0(/usr/share/locale/en_US/LC_COLLATE) flags=0 mode=1b6
SYS_open: returned -2 (No such file or directory)

entering system call 54 (1)
SYS_ioctl: fd=1 com=402c7413 data=bffff414
SYS_ioctl: returned -22 (Invalid argument)

entering system call 24 (1)
SYS_getuid: ...0

entering system call 58 (16)
SYS_readlink: path=0x80896d4(/etc/malloc.conf) buf=0xbffff370 count=63
SYS_readlink: returned -2 (No such file or directory) link=

entering system call 198 (0)
SYSCALL64: syscall_no=197
SYS_mmap: addr=(nil) len=4096 prot=3 flags=1002 fd=-1 pad=0 pos=0
SYS_mmap: returned 0x40000000

Child received a signal (11) @ 0x17b0
-------------------------------------

Ни у кого нет идей - что там такое страшное может происходить?

Murr
()

Перенаправление операций ввода-вывода через ptrace.

В общем, имеется некая бинарная программа. И очень она любит лазить в /tmp, а нужно чтобы это было /home/murr/tmp (прав root на соответствующей машине нет). Переопределять через LD_PRELOAD функции не хочется, да и к тому же ряд функций вроде tmpnam вызывают внутренние функции glibc при обращении к файловой системе, а сами не weak (впрочем, тут есть еще где поковыряться).

Имеется некий код, написанный на скорую руку, который через PTRACE_SYSCALL пытается отлавливать все обращения и заменять путь, но он, к сожалению, не работает :( По всей видимости не удается переопределить указатель на новый путь.

Если у кого есть комментарии по коду или реализации самой задачи - пишите.

Заранее спасибо.

Murr
()

Посоветуйте хорошую литературу по C/C++ coding style

С GNU coding style и Linux coding style знаком, поделитесь что еще интересного есть на эту тему :)

Murr
()

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