информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 С наступающим 
 Microsoft обещает радикально усилить... 
 Ядро Linux избавляется от российских... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Unix] ? 20.10.04 20:54  Число просмотров: 1709
Автор: 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
<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