как-то типа такого:
Код:
adr := Libc.mmap(08000_0000H - pageSize, pageSize, Libc.PROT_NONE, Libc.MAP_PRIVATE + Libc.MAP_ANON, -1, 0);
IF (adr # Libc.MAP_FAILED) & (adr # 08000_0000H - pageSize) THEN
_ := Libc.munmap(adr, pageSize)
END;
adr := Libc.mmap(08000_0000H, pageSize, Libc.PROT_NONE, Libc.MAP_PRIVATE + Libc.MAP_ANON, -1, 0);
IF (adr # Libc.MAP_FAILED) & (adr # 08000_0000H) THEN
_ := Libc.munmap(adr, pageSize)
END;
просто просим у системы две странички на «плохих адресах». если какая-то выделилась в другом месте — ура, нам повезло, плохой адрес уже занят, возвращаем страничку обратно.
теперь мы не сможем выделить больше двух гигабайт памяти одним куском (в смысле, одним NEW) — но это всё равно не работало никогда (ядро не позволит, там проверка на переполнение есть). зато и не получим «опасного» кластера.
берём странички по отдельности, а не сразу две мы затем, что если просить две, и кто-то уже съел 08000_0000H и дальше, например — то ядро нам даст память в другом месте, и страница перед переходом знака останется без защиты. а там защита нужна, потому что код в Kernel считает конечный адрес для проверок
за концом кластера, и использует `<`. если не защитить — то конечный адрес может врапнуться в минус. `08000_0000H` в принципе-то можно и не защищать, но это стрёмное число, лучше его в коде избегать. бережённого, так сказать…
`pageSize` уже в коде есть. добавить это надо прямо в Init, в любое место после определения `pageSize`.
p.p.s.: короче, отредактировал код в Правильно и Надёжно, прошлый плохой был.