Ситуация следующая. Запускаем на ядре 2.6.5 или младше на i386
такую программку:
#include <stdio.h>
#include <sys/mman.h>
int main() {
while(1) {
void *p = mmap(NULL,0x100000,PROT_READ |PROT_WRITE|PROT_EXEC,
MAP_PRIVATE|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
if(p==(void*)-1)
break;
printf("p = %X\n", p);
}
return 0;
}
Она заканчивает работу на последнем возвращенном адресе 0xBFE2F000,
что меньше 3-гигабайтного предела.
Запускаем ту же самую прогу на ядре 2.6.8. Последний адрес равен 0xFED00000,
что больше 3-гигабайтного предела.
Проблема в следующем: я никак не могу найти в ChangeLog-ах ядра
запись, указывающую на фикс, позволяющий адресоваться дальше 3 Gb.
Куда смотреть, чтобы понять, что вообще изменилось?
Подскажите, плз. Заранее спасибо...
> Последний адрес равен 0xFED00000,
> что больше 3-гигабайтного предела.
как бы этого быть не может, это больше PAGE_OFFSET == 0xC0000000.
чему равен USER_DS в include/asm/uaccess.h ?
PAGE_OFFSET в include/asm/page.h ?
в принципе, увеличение PAGE_OFFSET может дать такой эффект.
> Куда смотреть, чтобы понять, что вообще изменилось?
flexible mmap от Ingo Molnar меняет поведение get_unmapped_area
и, соответственно, адресное пространство процессов, но дело
явно не в этом.