Совместимость сос тарым оборудованием...

Internal structure and you change requests/suggestions
  • Serge, здесь не получится ограничиться простой функцией, возвращающей размер ОЗУ, например, в страницах! Я в стеке собираю описатели блоков памяти (значения base и after, выравненные на границу страницы), лежащих выше 1-мегабайтной границы, при использовании функции 0xE820 и только в том случае, когда данная функция не поддерживается, формирую один такой блок, после чего, уже в защищенном режиме, извлекаю эти описатели из стека и по данным из них строю таблицу свободных страниц. Короче, этот код привязан к порядку инициализации оси.
  • Ну в принципе такую функцию можно написать, но по ней будет нельзя гарантированно определить местоположение памяти.
  • Phantom-84

    А почему нельзя точно опрделить ?
  • Serge, потому что память может находиться в нескольких несмежных участках! Можно, конечно, возвращать сведения в виде массива, а в функцию передавать максимально возможное число элементов массива, тогда функция будет записывать сведения о блоках памяти в массив, а возвращать, например, количество реально записанных элементов.
  • Phantom-84

    Это из-за дыры 15 Мб или бывают ещё варианты ? Если память не раскидана слишком сильно можно настроить битовую карту страниц.

    Вариант с массивом вполне подойдёт
  • Это из-за дыры 15 Мб или бывают ещё варианты ?
    Реально далеко не всегда есть и эта дыра, но уже давно принято учитывать, что теоретически память может быть фрагментированна. А что в Колибри это не учитывается?
  • Phantom-84
    Реально далеко не всегда есть и эта дыра, но уже давно принято учитывать, что теоретически память может быть фрагментированна. А что в Колибри это не учитывается?
    В Колибри 6.5.0 не учитывается.
    Теоретически может, а вот практически. Там около 640КБ - базовой памяти затем дырка БИУС видео память до границе 1МБ. Дальше никаких дырок нет, вплоть до конца в конце памяти откусывается еще несколько 1МБ под нужды БИОСа и под встроенную видео карту еще несколько.
  • Pavia, ты видимо говоришь о конкретном компьютере... Но ведь ось пишется не под один компьютер...
  • Phantom-84
    Нет, не о конкретном. Как всегда обобщил свои знания. Просто если есть дырка, то она должна быть стандартерезирована. В PC-AT и совместимых машинах нет дырок, кроме той что в 1 мегабайте. Иначе бы многие программы бы просто не стали бы работать. И вообще что бы ее сделать нужно точно знать что она будет и физически зарезервировать адреса под нее.
    Единственно возможный вариант это когда память разных модулей отображается в разные места, то возникает дырка. Но о таком извращении я не слышал.

    Приведи пример, где это не так.
  • Phantom-84

    Вообще надо учитывать дыры только выше 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! Все остальные непрерывные участки я собираю исключительно посредством пейджинга!
  • Вообще надо учитывать дыры только выше 1 Мб а точнеее выше 8 Мб. Ниже вся память распределяется статически
    А я размер базовой памяти определяю вообще через int 12h, а при детекте дополнительной памяти все, что лежит ниже 1-мегабайтной границы, просто отбрасываю! Допускаю, что можно начинать детект с 8-мегабайтной границы (хотя я читал, что встречаются ноутбуки, в которых ячейки в самом начале второго мега могут сохранять информацию с ошибками), но ведь были же когда-то системы, вообще не имеющие дополнительной памяти или имеющие, например, всего 4 Мб, поэтому я выполняю детект доступной памяти, начиная с 1-го мега.
  • Phantom-84

    Начиная с 1 мега вполне пойдёт. Если это будет массив доступный блоков <база, размер> то можно будет его конвертировать в битовую карту для менеджера стираниц.

    P.S.
    Что это за твоя ось ? Посмотреть можно ?
  • Who is online

    Users browsing this forum: No registered users and 5 guests