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