информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медГде водятся OGRыПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
Ya zaglianul v `man mlock` pod Linux: 20.10.04 15:14  Число просмотров: 1650
Автор: Walk Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Выдает ошибку EINVAL (Invalid argument).
Ya zaglianul v `man mlock` pod Linux:
///////////////////////////////////////////////////////
........................
#include <sys/mman.h>
int mlock(const void *addr, size_t len);
........................
ERRORS
........................
EINVAL (Not on Linux) addr was not a multiple of the page size.
Linux adds
EINVAL len was negative.
........................
///////////////////////////////////////////////////////
O4en interesno, 4to vivedit sleduu4aya programma na Solarke i na Linuxe (kstati interesno `uname -a` na Solarke i na Linuxe):
///////////////////////////////////////////////////////
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/mman.h>
int main(void) {
char *p;
int s;
int ret_code;
long s_conf;
s = getpagesize();
s_conf = sysconf(_SC_PAGESIZE);
printf("s='%d' s_conf='%ld'='%d'\n",s,s_conf,s_conf);
p = (char *)malloc(s);
if(p == NULL) {fprintf(stderr,"Malloc error: %s\n",strerror(errno)); return -1;}
ret_code = mlock((void *)p,s);
fprintf(stderr,"Error code = '%d' Result:%s\n",ret_code,strerror(errno));
return 0;
}
/////////////////////////////////////////////
> Маны читал. Куда кпать больше не знаю.
Prorvemsia...
mailto: walkid@yandex.ru
S uvazeniem,
Walk


<programming>
[Unix] Solaris: mlock() 19.10.04 19:18  
Автор: lunc <Alexander Krizhanovsky> Статус: Member
<"чистая" ссылка>
В Solaris/SPARC 8 пытаюсь залочить память:

prx_login = (char *) malloc(getpagesize());
mlock((void*)prx_login, getpagesize());

Выдает ошибку EINVAL (Invalid argument). В линуксе все проходит на ура.
Вот, что выдает sysconf (значения параметров):
sysconf( _SC_PAGESIZE) == getpagesize() == 8192
sysconf(_SC_MEMLOCK) == sysconf(_SC_MEMLOCK_RANGE) == 1

Пробовал через memcntl() -- та же ошибка:

caddr_t prx_login = (caddr_t) malloc(getpagesize());
memcntl(prx_login, getpagesize(), MC_LOCK, NULL, PRIVATE | PROT_READ | PROT_WRITE, 0);

Маны читал. Куда кпать больше не знаю.
Решилось. 20.10.04 16:36  
Автор: lunc <Alexander Krizhanovsky> Статус: Member
<"чистая" ссылка>
Решилось.
Надо было выровнять алоцированную память по границе страницы (чего в линуксе не требуется, видимо лочились все страницы, на каторые попадала алоцированная память).

prx_login = (caddr_t) malloc((size_t)getpagesize()*2);
mlock(((int)prx_login+getpagesize())&~0x1fff, (size_t)getpagesize());
[Unix] ? 20.10.04 20:54  
Автор: Walk Статус: Незарегистрированный пользователь
Отредактировано 20.10.04 20:56  Количество правок: 1
<"чистая" ссылка>
> Решилось.
> Надо было выровнять алоцированную память по границе
> страницы (чего в линуксе не требуется, видимо лочились все
> страницы, на каторые попадала алоцированная память).

?
Ya bi skazal, 4to viravnivane vklu4eno v sistemnii vizov...
Smotrite Linux kernel-2.6.5 "./mm/mlock.c":

asmlinkage long sys_mlock(unsigned long start, size_t len)
{
unsigned long locked;
unsigned long lock_limit;
int error = -ENOMEM;

down_write(¤t->mm->mmap_sem);
len = PAGE_ALIGN(len + (start & ~PAGE_MASK));
start &= PAGE_MASK;

locked = len >> PAGE_SHIFT;
locked += current->mm->locked_vm;

lock_limit = current->rlim[RLIMIT_MEMLOCK].rlim_cur;
lock_limit >>= PAGE_SHIFT;

/* check against resource limits */
if (locked <= lock_limit)
error = do_mlock(start, len, 1);
up_write(¤t->mm->mmap_sem);
return error;
}
> prx_login = (caddr_t) malloc((size_t)getpagesize()*2);
> mlock(((int)prx_login+getpagesize())&~0x1fff,
> (size_t)getpagesize());
Nemnogo koriavo kazdii raz vizivat getpagesize()...
S uvazeniem,
Walk
Ya zaglianul v `man mlock` pod Linux: 20.10.04 15:14  
Автор: Walk Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Выдает ошибку EINVAL (Invalid argument).
Ya zaglianul v `man mlock` pod Linux:
///////////////////////////////////////////////////////
........................
#include <sys/mman.h>
int mlock(const void *addr, size_t len);
........................
ERRORS
........................
EINVAL (Not on Linux) addr was not a multiple of the page size.
Linux adds
EINVAL len was negative.
........................
///////////////////////////////////////////////////////
O4en interesno, 4to vivedit sleduu4aya programma na Solarke i na Linuxe (kstati interesno `uname -a` na Solarke i na Linuxe):
///////////////////////////////////////////////////////
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/mman.h>
int main(void) {
char *p;
int s;
int ret_code;
long s_conf;
s = getpagesize();
s_conf = sysconf(_SC_PAGESIZE);
printf("s='%d' s_conf='%ld'='%d'\n",s,s_conf,s_conf);
p = (char *)malloc(s);
if(p == NULL) {fprintf(stderr,"Malloc error: %s\n",strerror(errno)); return -1;}
ret_code = mlock((void *)p,s);
fprintf(stderr,"Error code = '%d' Result:%s\n",ret_code,strerror(errno));
return 0;
}
/////////////////////////////////////////////
> Маны читал. Куда кпать больше не знаю.
Prorvemsia...
mailto: walkid@yandex.ru
S uvazeniem,
Walk


1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach