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.

Raspunde prin e-mail lui