On , 2 Jan 2002 19:01 -0800, Florin ANDREI wrote:
>
> Se da o masina cu arhitectura x86 (32 bit) cu 4 GB RAM, rulind un kernel
> recent, compilat cu suport pentru 4 GB RAM.
>
> Din cauza modului in care kernel-ul rezerva memoria, un proces nu poate
> aloca mai mult de 3 GB, indiferent ce face (restul e rezervat pentru
> kernel). De fapt, valoarea reala e chiar mai mica de 3 GB. Din cauza
> asta, un program care vrea sa aloce niste matrici gigantice (peste 2 GB
> de date) nu poate sa ruleze.
>
> Se cere sa se mareasca memoria disponibila pentru procese, pastrind
> configuratia hardware.
[...]
> Sapind prin kernel, am vazut in include/asm-i386/page.h variabila
> __PAGE_OFFSET, care pare sa faca exact ce vreau eu: controleaza limita
> unde memoria e divizata intre kernel- si user-space. Banui ca daca o
> maresc pe la vreo 0xE0000000 atunci memoria rezervata pentru kernel o sa
> scada pe la vreo 512 MB, ceea ce ar fi beton.
>
> Intrebarea nr 1: asta e singura modificare necesara pentru a schimba
> raportul intre memoria rezervata pentru kernel si cea pentru procese?
Mai trebuie facuta o schimbare in arch/i386/vmlinux.lds. Am gasit un
patch la
http://www.kernel.org/pub/linux/kernel/people/andrea/patches/v2.4/2.4.0-test11-pre5/per-process-3.5G-IA32-no-PAE-1
care face exact ce vrei, o impartire a memoriei in 3.5GB/0.5GB. M-am
jucat un pic cu el, versiunea actualizata pentru kernelul din RH 7.2 e
mai jos. Am impresia ca unele distributii chiar au generalizat asta:
pe linga valorile obisnuite de 1, 2 si 3 GB pentru "maximum virtual
memory" au introdus si 3.5 GB.
> Intrebarea nr 2: cam cit de departe, in mod rezonabil, pot sa merg cu
> micsorarea memoriei rezervate pentru kernel? Probabil ca cache-ul de
> disc o sa devina mai mic, dar masina aia nu prea face disk I/O, si nu-mi
> dau seama daca mai sint si alte probleme.
Se pare ca mai merg si altii pe 3.5/0.5, deci pare
rezonabil. Pe statia de lucru cu 640 MB RAM pe care am incercat
kernelul modificat n-am avut probleme.
Cred ca ar fi interesant de observat ca pe linga setarea lui
PAGE_OFFSET_RAW la 0xE0000000 se micsoreaza TASK_UNMAPPED_BASE la
(0xE0000000 / 16), adica 224 MB.
TASK_UNMAPPED_BASE imparte spatiul virtual al unui proces in doua
parti: in zona de sub TASK_UNMAPPED_BASE nu se poate face mmap() si
alocarile de memorie se fac cu brk(). In zona de deasupra lui
TASK_UNMAPPED_BASE se poate folosi mmap(). Alocarile mici de memorie,
de pina la 127 KB se fac cu brk(), in zona de sub TASK_UNMAPPED_BASE,
iar alocarile de zone de memorie mai mari de 127 KB se fac cu mmap().
In cazul implicit in care PAGE_OFFSET == 0xC0000000 si
TASK_UNMAPPED_BASE == 0x40000000 marimea maxima a unei zone continue
de memorie e de aproape 2 GB pentru ca mmap() poate aloca memorie doar
de la 0x40000000 (1 GB) in sus. Zona nu poate ajunge la exact 2 GB
pentru ca o parte din plaja e ocupata cu maparile bibliotecilor
partajate sau alte fisiere iar zona de dinainte de 0xC0000000 e
folosita de stiva programului.
In cazul aplicarii patch-ului plaja disponibila pentru mmap() se
mareste la 3360 MB, adica de la 224 MB la 3.5 GB. Deci se poate aloca
o zona continua de memorie de maxim 3360 MB minus spatiul ocupat de
stiva si de bibliotecile/fisierele mapate.
Alte referinte/patch-uri de vazut am gasit la:
http://www.geocrawler.com/archives/3/35/2001/7/0/6301690/
http://www.mail-archive.com/linux-kernel%40vger.rutgers.edu/2000-month-06/msg05912.html
http://vlsi.colorado.edu/~vis/vis-users/0081.html
Radu Greab
--- linux-2.4.9-13-test/arch/i386/vmlinux.lds.orig Thu Jan 3 17:06:51 2002
+++ linux-2.4.9-13-test/arch/i386/vmlinux.lds Thu Jan 3 17:16:28 2002
@@ -6,7 +6,7 @@
ENTRY(_start)
SECTIONS
{
- . = 0xC0000000 + 0x100000;
+ . = 0xE0000000 + 0x100000;
_text = .; /* Text and read-only data */
.text : {
*(.text)
--- linux-2.4.9-13-test/include/asm-i386/processor.h.orig Thu Jan 3 17:06:56
2002
+++ linux-2.4.9-13-test/include/asm-i386/processor.h Thu Jan 3 17:16:28 2002
@@ -270,7 +270,7 @@
/* This decides where the kernel will search for a free chunk of vm
* space during mmap's.
*/
-#define TASK_UNMAPPED_BASE (TASK_SIZE / 3)
+#define TASK_UNMAPPED_BASE (TASK_SIZE / 16)
/*
* Size of io_bitmap in longwords: 32 is ports 0-0x3ff.
--- linux-2.4.9-13-test/include/asm-i386/page_offset.h.orig Thu Jan 3 17:06:55
2002
+++ linux-2.4.9-13-test/include/asm-i386/page_offset.h Thu Jan 3 17:12:03 2002
@@ -1,6 +1,6 @@
#include <linux/config.h>
#ifdef CONFIG_1GB
-#define PAGE_OFFSET_RAW 0xC0000000
+#define PAGE_OFFSET_RAW 0xE0000000
#elif defined(CONFIG_2GB)
#define PAGE_OFFSET_RAW 0x80000000
#elif defined(CONFIG_3GB)
---
Send e-mail to '[EMAIL PROTECTED]' with 'unsubscribe rlug' to
unsubscribe from this list.