Phantom-84
Может напишешь код для определения размера ОЗУ ?
Совместимость сос тарым оборудованием...
Serge, здесь не получится ограничиться простой функцией, возвращающей размер ОЗУ, например, в страницах! Я в стеке собираю описатели блоков памяти (значения base и after, выравненные на границу страницы), лежащих выше 1-мегабайтной границы, при использовании функции 0xE820 и только в том случае, когда данная функция не поддерживается, формирую один такой блок, после чего, уже в защищенном режиме, извлекаю эти описатели из стека и по данным из них строю таблицу свободных страниц. Короче, этот код привязан к порядку инициализации оси.
Ну в принципе такую функцию можно написать, но по ней будет нельзя гарантированно определить местоположение памяти.
Phantom-84
А почему нельзя точно опрделить ?
А почему нельзя точно опрделить ?
Serge, потому что память может находиться в нескольких несмежных участках! Можно, конечно, возвращать сведения в виде массива, а в функцию передавать максимально возможное число элементов массива, тогда функция будет записывать сведения о блоках памяти в массив, а возвращать, например, количество реально записанных элементов.
Phantom-84
Это из-за дыры 15 Мб или бывают ещё варианты ? Если память не раскидана слишком сильно можно настроить битовую карту страниц.
Вариант с массивом вполне подойдёт
Это из-за дыры 15 Мб или бывают ещё варианты ? Если память не раскидана слишком сильно можно настроить битовую карту страниц.
Вариант с массивом вполне подойдёт
Реально далеко не всегда есть и эта дыра, но уже давно принято учитывать, что теоретически память может быть фрагментированна. А что в Колибри это не учитывается?Это из-за дыры 15 Мб или бывают ещё варианты ?
Phantom-84
Теоретически может, а вот практически. Там около 640КБ - базовой памяти затем дырка БИУС видео память до границе 1МБ. Дальше никаких дырок нет, вплоть до конца в конце памяти откусывается еще несколько 1МБ под нужды БИОСа и под встроенную видео карту еще несколько.
В Колибри 6.5.0 не учитывается.Реально далеко не всегда есть и эта дыра, но уже давно принято учитывать, что теоретически память может быть фрагментированна. А что в Колибри это не учитывается?
Теоретически может, а вот практически. Там около 640КБ - базовой памяти затем дырка БИУС видео память до границе 1МБ. Дальше никаких дырок нет, вплоть до конца в конце памяти откусывается еще несколько 1МБ под нужды БИОСа и под встроенную видео карту еще несколько.
Pavia, ты видимо говоришь о конкретном компьютере... Но ведь ось пишется не под один компьютер...
Phantom-84
Нет, не о конкретном. Как всегда обобщил свои знания. Просто если есть дырка, то она должна быть стандартерезирована. В PC-AT и совместимых машинах нет дырок, кроме той что в 1 мегабайте. Иначе бы многие программы бы просто не стали бы работать. И вообще что бы ее сделать нужно точно знать что она будет и физически зарезервировать адреса под нее.
Единственно возможный вариант это когда память разных модулей отображается в разные места, то возникает дырка. Но о таком извращении я не слышал.
Приведи пример, где это не так.
Нет, не о конкретном. Как всегда обобщил свои знания. Просто если есть дырка, то она должна быть стандартерезирована. В PC-AT и совместимых машинах нет дырок, кроме той что в 1 мегабайте. Иначе бы многие программы бы просто не стали бы работать. И вообще что бы ее сделать нужно точно знать что она будет и физически зарезервировать адреса под нее.
Единственно возможный вариант это когда память разных модулей отображается в разные места, то возникает дырка. Но о таком извращении я не слышал.
Приведи пример, где это не так.
Phantom-84
Вообще надо учитывать дыры только выше 1 Мб а точнеее выше 8 Мб. Ниже вся память распределяется статически
Вообще надо учитывать дыры только выше 1 Мб а точнеее выше 8 Мб. Ниже вся память распределяется статически
хз.. какие дыры... мне вот, этот код последовательно отработал, 256метров RAM (две планки по 128mb), от 0100000h до 0FFFFFFCh
никаких дыр... а битой оперативы у мну нету..
Code: Select all
.model tiny
.code
.386P
org 100h
start:
xor eax, eax
mov ax, cs
shl eax, 4
mov gdtbase,eax
lea edx, GDT
add gdtbase,edx
cli
lgdt fword ptr gdtlimit
; Войти в прот-моде
mov eax, cr0
or al, 1
mov cr0, eax
mov ax, 8
mov es, ax
mov ds, ax
mov eax, cr0
and al, 0FEh
mov cr0, eax
; Превед, мы в унреале
xor ax, ax
mov ds, ax; 4гиговая 0-база
; указатель памяти после rom-bios'a
mov eax, 100000h
mov ecx, -1
@@top:
mov edx, [eax]
mov [eax], eax
cmp eax, [eax]
jne @@holeshit
mov [eax], edx
add eax, 4
loop @@top
call printhex
ret
@@holeshit:
call printhex
ret
;------------------------------
printhex:
mov dh,8
rol eax,4
@@loo: push eax
mov dl,30h
and al,0Fh
or dl,al
cmp dl,39h
jbe @@@
add dl,7
@@@: mov ah,2
int 21h
pop eax
rol eax,4
dec dh
jnz @@loo
mov dl,0Dh
mov ah,2
int 21h
mov dl,0Ah
mov ah,2
int 21h
retn
GDT label near
dq 0;
dq 009F93000000FFFFh; 8-oй
gdtlimit dw 2*8 ; GDT limit
gdtbase dd ? ; GDT base
ends
end start
Pavia, так уже говорили, что дыра может быть между 15-м и 16-м мегом, древние видюхи выше 12-го мега могли вставлять видеобуфер, на некоторых ноутбуках несколько ячеек выше первого мега могут некорректно работать - функция 0xE820 обрежет этот участок, между 3-м и 4-м гигом может вклиниваться множество различных устройств, поэтому в карте памяти на этом участке вполне может присутствовать большое количество дыр. Короче все нормальные оси должны это учитывать! Я, например, в своей оси считаю гарантированно непрерывным и доступным для использования только участок базовой памяти после BDA и вплоть до EBDA! Все остальные непрерывные участки я собираю исключительно посредством пейджинга!
А я размер базовой памяти определяю вообще через int 12h, а при детекте дополнительной памяти все, что лежит ниже 1-мегабайтной границы, просто отбрасываю! Допускаю, что можно начинать детект с 8-мегабайтной границы (хотя я читал, что встречаются ноутбуки, в которых ячейки в самом начале второго мега могут сохранять информацию с ошибками), но ведь были же когда-то системы, вообще не имеющие дополнительной памяти или имеющие, например, всего 4 Мб, поэтому я выполняю детект доступной памяти, начиная с 1-го мега.Вообще надо учитывать дыры только выше 1 Мб а точнеее выше 8 Мб. Ниже вся память распределяется статически
Phantom-84
Начиная с 1 мега вполне пойдёт. Если это будет массив доступный блоков <база, размер> то можно будет его конвертировать в битовую карту для менеджера стираниц.
P.S.
Что это за твоя ось ? Посмотреть можно ?
Начиная с 1 мега вполне пойдёт. Если это будет массив доступный блоков <база, размер> то можно будет его конвертировать в битовую карту для менеджера стираниц.
P.S.
Что это за твоя ось ? Посмотреть можно ?
Who is online
Users browsing this forum: No registered users and 19 guests