LINUX.ORG.RU

Изменения пределов user-space памяти в ядре 2.6.8 (или 2.6.6/2.6.7)


0

0

Ситуация следующая. Запускаем на ядре 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.
Куда смотреть, чтобы понять, что вообще изменилось? 

Подскажите, плз. Заранее спасибо...

Ответ на: комментарий от Deleted

Очень странно. Я экспериментировал на Fedora2 с оригинальным ядром и ядром, пропатченным до 2.6.8 (kernel-2.6.8-1.521.i686.rpm).

jek_
() автор топика

> Последний адрес равен 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
и, соответственно, адресное пространство процессов, но дело
явно не в этом.

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

Похоже, я нашел: http://www.uwsg.iu.edu/hypermail/linux/kernel/0307.1/0246.html

В asm/page.h тоже интересно (кажется, коррелирует со ссылкой):

#ifdef CONFIG_X86_4G_VM_LAYOUT
#define __PAGE_OFFSET       (0x02000000)
#define TASK_SIZE       (0xff000000)
#else
#define __PAGE_OFFSET       (0xc0000000)
#define TASK_SIZE       (0xc0000000)
#endif

в asm/uaccess.h:

#define MAKE_MM_SEG(s)  ((mm_segment_t) { (s) })
#define KERNEL_DS   MAKE_MM_SEG(0xFFFFFFFFUL)
#define USER_DS     MAKE_MM_SEG(TASK_SIZE)

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

может, и перестанет быть левым

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