LINUX.ORG.RU

_chkstk


0

0

есть ли в linux замена _chkstk? Если есть то раскажите как использовать... А то у меня при компиляции появляется сообщение undefined reference to `_chkstk'

мож тебе это надо

#define chkstk() \
	if (STACK_MAGIC != *(unsigned long *)current->kernel_stack_page){\
		printk(KERN_ALERT "UMSDOS: %s magic %x != %lx ligne %d\n" \
		, current->comm,STACK_MAGIC \
		,*(unsigned long *)current->kernel_stack_page \
		,__LINE__); \
	}

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

заимствовано из сырцов ядра. систематическое расстыкивание по коду в нужных местах приводит к проверке на тему развала стека и buffer overflow. решение в определённом смысле стандартное

остальное подскажет гугль

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

мне в общем то нужна не проверка а выделение дополнительной стековой памяти если мне потребуется больше 4к!(что собственно эта функция и выполняет в виндовс)

есть такой файл в chkstk.asm(в поставке компиляторов как билдера так и студии), сейчас попробую использовать его

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

>мне в общем то нужна не проверка а выделение дополнительной стековой памяти если мне потребуется больше 4к!

ну так с этого и начинать стоило, только скажите откудова вы приплели 4К????

>(что собственно эта функция и выполняет в виндовс)

ну да, ато только вы доки на виндовс читаете.

нету в маздае такой ф-и. Это фишка VC и делает она тоже самое.

>есть такой файл в chkstk.asm(в поставке компиляторов как билдера так и студии), сейчас попробую использовать его

а вы знаете чем его транслировать что так быстро разогнались?

вобщем man setrlimit

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

Откуда 4к:

MSDN:chkstk Routine is a helper routine for the C compiler. For x86 compilers, _chkstk Routine is called when the local variables exceed 4096 bytes; for AMD64 and IA64 compilers it is 4K and 8K respectively.

chkstk.asm: ... mov ecx, 1000h ; page size is 4K ...

А вчем собственно проблема? беру нужныей мне код из chkstk.asm оформляю его как процедуру, отдаю его nasm а затем прилинковываю его к проекту...

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

Хм... Все скомпилировалось и скомпоновалось , но работать почему то все равно не хочет 'segmentation fault', и мне кажется что беда все таки с этим _chkstk, может в линуксе надо проверять не на 4К а на другое число?

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

>Откуда 4к:

>MSDN:chkstk Routine is a helper routine for the C compiler. For x86 compilers, _chkstk Routine is called when the local variables exceed 4096 bytes; for AMD64 and IA64 compilers it is 4K and 8K respectively.

а какое это имеет отношение к линуксу???

>А вчем собственно проблема? беру нужныей мне код из chkstk.asm оформляю его как процедуру, отдаю его nasm а затем прилинковываю его к проекту...

при ваших вопросах я думал что вас на такое не хватит

PS:а может всётаки ман прочитаете???

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

> а есть ли информация как это устроено в линукс?

Это чисто виндовые заморочки, под Линуксом это нафиг не нужно. Сделай что-то вроде этого:

#define chkstk() do { } while (0);

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

>а есть ли информация как это устроено в линукс?

инвормация есть но для начала скажите вы ман прочитали? а по ссылкам??

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

>Это чисто виндовые заморочки, под Линуксом это нафиг не нужно. Сделай что-то вроде этого:

>#define chkstk() do { } while (0);

и не спрашивай откудова лезут грабли

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

с man я ознакомился, и по ссылкам сходил. вот что накопал в мане есть функция sstk, также наткнулся еще на expand_stack() в mmap.c

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

ну это вы не туда полезли.

в линукс стек увеличивается ядром автоматически на любую допустимую величину. тоесть выделить 1Мегабайт в стеке обычно не требует никаких дополнительных притопов а только разрешение от рута/сисадмина.

максимальный размер стека для каждого юзера в отдельности задаётся сисадмином/рутом(жёсткий лимит), при этом в пределах этого максимума каждый юзер для каждого приложения может динамически изменять максимальный размер стека при превышении которого процес кажись получит SIGSEGV(мягкий лимит).

все эти манипуляции выполняются сисколом setrlimit(RLIMIT_STACK)

ещё можешь посмотреть man ulimit && help ulimit в bash.

PS:ещё внимательно изучите опции компилера/линкера на тему стека

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

хотя если вы связались с тредами то там другая идеология в зависимости от реализации

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

В общем у меня такая проблема: Я пишу на ассемблере и мне в функции требуется создать массив на 16кб, вот я и ищу средство... В виндовсе я просто вызываю _chkstk а тут не знаю... Подскажите если знаете...

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

>Я пишу на ассемблере
почему на ассемблере?
я думал что на сях, в асме я хромаю

>Я пишу на ассемблере и мне в функции требуется создать массив на 16кб, вот я и ищу средство...

локальный для ф-и?? сделайте по аналогии с досом. кажись надо напрямую модифицировать ESP.

или ещё проще: создайте ф-ю на С оттранслируйте в ассемблер и посмотрите:
$cat tmp.c
void f(void){
   char arr[16*1024];
   memset(arr,0,sizeof(arr));
}
$gcc -S tmp.c
$cat tmp.s
        .file   "tmp.c"
        .version        "01.01"
gcc2_compiled.:
.text
        .align 4
.globl f
        .type    f,@function
f:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $16392, %esp
        subl    $4, %esp
        pushl   $16384
        pushl   $0
        leal    -16392(%ebp), %eax
        pushl   %eax
        call    memset
        addl    $16, %esp
        leave
        ret
.Lfe1:
        .size    f,.Lfe1-f
        .ident  "GCC: (GNU) 2.96 20000731 (ASPLinux 7.3 2.96-112)"


насколько я понял то это делается инструкцией:

 subl    $16392, %esp

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

Я в общем так с самого начала и попробовал. но вылетает segmentation faulth. Я не уверен что в этом месте ,поэтому и ищу возможные причины...

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

ps: почему думаю что в этом месте? потому что это единственное место которое пришлось заменить при компиляции под линукс. В виндовс все работает хорошо...

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

корка (core) это такой служебный файл который может создать операционка если приложение умирает по sigsegv. этот файл позволяет восстановить картину на момент падения, например кто и где обратился по адресу NULL ну и всё прочее с этим связанное

bt в gdb может показать цепочку вызовов до ф-и в которой произошол sigsegv

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

>bt в gdb может показать цепочку вызовов до ф-и в которой произошол sigsegv

иногда вместе с аргументами

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