SCSI hotplug/hotunplug daemon для 2.4.20
Может кто-то встречал нечто подобное с открытым кодом?
Без разницы модулем или приложением.
Спасибо.
P.S. Просто лень писать то, что должно быть уже написано (в поиске не нашел. Может плохо искал?).
Может кто-то встречал нечто подобное с открытым кодом?
Без разницы модулем или приложением.
Спасибо.
P.S. Просто лень писать то, что должно быть уже написано (в поиске не нашел. Может плохо искал?).
Я попытался создать нитку в рассылке linux-smp, может мне ответят на ряд вопросов. Если кому интересно, то вот ссылка - http://marc.theaimsgroup.com/?l=linux-smp&m=110114715909534&w=2
Не было доступа к сети - не мог ответить
и тема спустилась
>очень может быть. но. вы не знаете наверное, когда этот mov начнет
>выполняться, даже на pentium'ах есть write buffers. причем здесь
>я не имею в виду переупорядочивание кода, считаем, что mov уже
>выполнена. то есть у нас уже выполняются следующие инструкции, а
>mov пока еще только _считывает_ cache line, в случае cache miss.
Хорошо
на уровне snoop сие не пройдет (из-за буферов)
пусть запись ведется через выход на шину lock xchg..., а чтение - через mov. Тогда имеет место атомарность(при условии выровненных данных - единственных, которые можно получить компиляцией gcc при условии кодирования по стандарту ISO C, т.е. без пакования структур и некорректных приведений вида void *a; ...(int *)a...)
>нет, совершенно точно не только по этой причине. порядок передачи
>данных может изменить и шина (только не ловите меня на слове, я не
>владею терминологией :). кроме того, даже с барьерами другая сторона
>должна делать rmb(), иначе, опять таки, никаких гарантий.
Для выровненных данных порядок не может измениться, тк все данные передаются в одной шинной транзакции(абсолютно одновременно)
Мне на e-mail свалилось предложение придти пособеседовать, но никак не могу от них добиться данных о порядке зарплат. :) P.S. Просто интересно.
Хотелось бы услышать предложения как бы это получше сделать. Навскидку варианты: 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 становится синхронным. Как бы получить разумный компромисс между безопасностью и производительностью?
Никто с таким не сталкивался?
[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
Имеется одна программа для 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
Где можно найти?
GNU binutils не предлагать... нечитаемо. :)
В NetBSD родной (не GNU) ld вроде только a.out делает.
Куда еще можно глянуть?
Нужна возможность статического связывания с so, пусть даже с потерей дискового пр-ва.
Есть программа, которая для статических 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
-------------------------------------
Ни у кого нет идей - что там такое страшное может происходить?
В общем, имеется некая бинарная программа. И очень она любит лазить в /tmp, а нужно чтобы это было /home/murr/tmp (прав root на соответствующей машине нет). Переопределять через LD_PRELOAD функции не хочется, да и к тому же ряд функций вроде tmpnam вызывают внутренние функции glibc при обращении к файловой системе, а сами не weak (впрочем, тут есть еще где поковыряться).
Имеется некий код, написанный на скорую руку, который через PTRACE_SYSCALL пытается отлавливать все обращения и заменять путь, но он, к сожалению, не работает :( По всей видимости не удается переопределить указатель на новый путь.
Если у кого есть комментарии по коду или реализации самой задачи - пишите.
Заранее спасибо.
С GNU coding style и Linux coding style знаком, поделитесь что еще интересного есть на эту тему :)