OSDev

для всех
Текущее время: 29 апр 2024, 04:07

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Сегментый описатель.
СообщениеДобавлено: 21 авг 2011, 21:05 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Часто в коде присутствует GDT в которой содержатся описатели (дескрипторы) сегментов. Эти описатели обычно представлены в 16-ричном виде db 0FFh,0FFh,00h,00h,00h,09Ah,0CFh,00h и мало информативны. Поэтому написал программку для простора и редактирования таких вот описателей.

Красиво писать было лень. Описатели поддерживаются только для защищенного режима, для длинный режим не поддерживается.

http://zalil.ru/31587450


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сегментый описатель.
СообщениеДобавлено: 22 авг 2011, 01:52 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Крута))) Прям готовая лаба по сиспрограммированию) А вообще ты прав. Я к примеру ненавижу циферки, поэтому дескрипторы всегда описываю в интуитивно понятной форме, например:
Код:
desc CETSS,TSS_SIZE-1,DF_TSS32A

desc 0,0FFFFFh,DF_CODE32

desc KCODE,sys_service,DF_TRAP32+DF_APL

desc CETSS_SEL,?,DF_TASK32

Жалко, что твоя прога не мешает появлению циферок в исходниках, т.е. не генерирует попутно какой-либо макрокод для описания дескрипторов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сегментый описатель.
СообщениеДобавлено: 22 авг 2011, 11:56 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
Вообще для меня тоже проблема — создать GDT дескрипторы. В идеале это должны быть макросы, и я их написал, но NASM, увы, не разрешает арифметические операции над адресами (что в принципе, логично, если создаётся объектный код, но мне нужен чистый бинарник). На форуме NASM я оставил соответствующий feature request, но не уверен, что дело дойдёт до его реализации. Поэтому сейчас перед переходом в защищённый режим соответствующие дескрипторы создаются программно, несмотря на то, что они статические. Точнее даже так, — используются макросы, но вместо адресов вставляются заглушки (нули), а потом программно туда вписываются адреса.

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сегментый описатель.
СообщениеДобавлено: 22 авг 2011, 12:30 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Yoda писал(а):
но NASM, увы, не разрешает арифметические операции над адресами (что в принципе, логично, если создаётся объектный код


Это абсолютно нелогично. Просто на ПК инструментарий всю жизнь достаточно хреновый :( На мэйнфреймах, помнится, не только банальные выражения вроде перемещаемый адрес + константа работали, но вообще какие угодно -- с умножениями-делениями, сдвигами, логическими операциями... И трансляторы (включая ассемблер, есно) с компоновщиком благополучно с этим справлялись. Поэтому вполне можно было использовать выражения вроде (адрес-секции-1 - адрес-секции-2) / 8.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сегментый описатель.
СообщениеДобавлено: 22 авг 2011, 12:37 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Для некоторых дескрипторов адреса вообще без надобности. Также попробуй использовать адрес: абсолютная база начала кода + (адрес объекта - адрес начала кода).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сегментый описатель.
СообщениеДобавлено: 22 авг 2011, 12:54 
Аватара пользователя

Зарегистрирован: 20 апр 2011, 10:54
Сообщения: 145
У меня есть PROTECTED.INC для FASM. Кому интиресно:
Код:

; This program is free software. It comes without any warranty, to
; the extent permitted by applicable law. You can redistribute it
; and/or modify it under the terms of the Do What The Fuck You Want
; To Public License, Version 2, as published by Sam Hocevar. See
; http://sam.zoy.org/wtfpl/COPYING for more details.

;--------------------------------------------------------------
;-----------------------README---------------------------------
;
;Use GDT_descr (base, limit, access, options) to create a GDT descriptor.
;
;Use GDT_descr (base, limit, access options, options) to create a IDT descriptor (gate).
;
;Use EnterPM (GDT,IDT,entery segment:entery point) to enter Protected Mode.
;
;Use EnterURM to get an unreal segment inside fs.
;
;(C) 418ImATeapot
;Sorry for my English!
;--------------------------------------------------------------


if ~(defined INC_protected)
INC_protected equ
include 'PIC.inc'
;protected.inc

;------------------------------------------------
;Privilegion levels
PL_CORE equ 00000000b
PL_DRV0 equ 00100000b
PL_DRV1 equ 01000000b
PL_USER equ 01100000b
;------------------------------------------------
;macro for a usual GDT element
 macro GDT_descr base,limit,access,options
  {
   dw limit and 000FFFFh  ;First 16 bits of the limit
   dw base and 0000FFFFh  ;First 16 bits of the base
   db (base and 00FF0000h) /10000h ;Bits 16:23 of the base
   db access ;access bits
   db (limit and 00F0000h)/10000h + options ;Bites 16:23 of the limit + options
   db (base and 0FF000000h)/1000000h ;Bits 23:31 of the base
  }

    ;GDT segment options
      GDT_OPT_AVL equ 10h;This option is at your option :-)
      GDT_OPT_I_WANT_TO_HANG_MY_COMPUTER equ 20h; Bit 5 is reserved and must be 0 in IA-32.
      GDT_OPT_32 equ 40h;If this option is on, the segment will use 32-bit code as default.
      GDT_OPT_PG equ 80h;Page granularity.

    ;GDT access options
      GDT_A_PRESENTED equ 80h
      ;Flags for nonsystem segments
       GDT_A_NONSYSTEM equ 10h;Must be on!!!
       GDT_ANS_AC equ 01h;This flag may be changed CPU as "durty" sign. Just don't set it.
       GDT_ANS_RW equ 02h;In code segments this flag will enabled reading, in data segments this flag will enabled writing.
       GTD_ANS_DC equ 04h;In code segments this flag will let low-privilegged code run it, in data segments this flag will change grow direction.
       GDT_ANS_EXEC equ 08h;Code segment.
      ;Types of system segments
       GDT_SYS_FREETSS16 equ 01
       GDT_SYS_LDT equ 02
       GDT_SYS_BISSYTSS16 equ 03
       GDT_SYS_CALLGATE16 equ 04
       GDT_SYS_TASKGATE equ 05
       GDT_SYS_INTGATE16 equ 06
       GDT_SYS_TRAPGATE16 equ 07
       GDT_SYS_FREETSS32 equ 09
       GDT_SYS_BISSYTSS32 equ 11
       GDT_SYS_CALLGATE32 equ 12
       GDT_SYS_INTGATE32 equ 14
       GDT_SYS_TRAPGATE32 equ 15

;------------------------------------------------
;macro for a IDT element

    ;IDT descriptor options
     IDT_PRESENTED equ 10000000b
     IDT_STORAGE_SEGMENT equ 00010000b;(Me.RTFM)
    ;IDT TYPES
     IDT_TASK  equ 0x5
     IDT_INTG16  equ 0x6
     IDT_TRAP16  equ 0x7
     IDT_INTG32  equ 0xE
     IDT_TRAPG32  equ 0xF

 macro IDT_descr segment,offset,options
  {
   dw offset and 000FFFFh  ;First 16 bits of offset
   dw segment ;Segment
   db 0
   db options ;Options
   dw (offset and 0FFFF0000h) /10000h
  }
;------------------------------------------------
;protected mode entery

 macro EnterPM GDT,IDT, start_seg, PMstart;Entering fully protected mode.
  {
   lgdt [GDT];Loading GDT
   lidt [IDT]

   ;Setup bit 0 in cr0 (X-TIME!!!)
   mov eax,cr0
   or al,1
   mov cr0,eax

   ;Jumping to the PM-code segment.
   db 66h
   use32
   jmp start_seg:PMstart
  }

 macro EnterURM;Entering UnReal mode.
  {

  MaskNMI;Masking NMI

   jmp @f
   ;URM GDT
    .gdtr: dw 16
      dd .gdt
    .gdt:
     dd 0,0;Z-segment
     GDT_descr 0,0FFFFFFh,GDT_A_PRESENTED or GDT_A_NONSYSTEM or  GDT_ANS_RW , GDT_OPT_PG;Data segment
   @@:

   ;Computing GDT adress
   push cs
   pop ds
   xor eax,eax
   mov ax,cs
   shl eax,4
   add dword [.gdtr+2],eax

   ;X-TIME
   lgdt [.gdtr]
   mov eax,cr0
   or al,1
   mov cr0,eax

   ;Loading URM segment
   mov ax,8
   mov fs,ax

   ;Going back to real mode, but with a change of dark of FS segment.
   mov eax,cr0
   and al,0FFh
   mov cr0,eax

   ;Unmasking NMI
   UMaskNMI
;   hlt
  }

end if

_________________
Found a CPU. LAPIC ID: 00


Последний раз редактировалось 418ImATeapot 22 авг 2011, 12:58, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сегментый описатель.
СообщениеДобавлено: 22 авг 2011, 12:56 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
SII писал(а):
Это абсолютно нелогично.
Вообще логично, если в коде явно не указано абсолютное стартовое смещение ("org константа", "at константа" или что-то типа того). fasm справляется с этим, потому что он может сразу генерировать исполняемые файлы. В некоторых современных форматах объектных файлов даже не предусмотрено хранение 16-разрядного адреса (смещения).

У мэйнфреймов, возможно, была более подходящая архитектура для подобных действий.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сегментый описатель.
СообщениеДобавлено: 22 авг 2011, 13:08 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
SII писал(а):
Это абсолютно нелогично. Просто на ПК инструментарий всю жизнь достаточно хреновый :(

Дело не в инструментарии, а в форматах объектных файлов, которые nasm обязан поддерживать. В объектниках произвольные манипуляции с адресами не разрешены, только смещение с константой. Так что в этом плане всё логично.

phantom-84 писал(а):
Для некоторых дескрипторов адреса вообще без надобности.

О них речь и не идёт. Там макросы прекрасно работают. Есть единственный дескриптор, где указывается TSS.

phantom-84 писал(а):
Также попробуй использовать адрес: абсолютная база начала кода + (адрес объекта - адрес начала кода).

Перепробовал все возможные комбинации. Для разности между адресами nasm действительно позволяет выполнять произвольные операции, это уже скалярная величина. Проблема возникает в добавлении к разности базы сегмента. Тут nasm безбожно ругается.

phantom-84 писал(а):
fasm справляется с этим, потому что он может сразу генерировать исполняемые файлы.

nasm тоже может сразу генерить готовый бинарник. Поэтому меня и удивляет, что даже в этом режиме манипуляции с адресами не разрешены.

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сегментый описатель.
СообщениеДобавлено: 22 авг 2011, 13:17 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Yoda писал(а):
Перепробовал все возможные комбинации. Для разности между адресами nasm действительно позволяет выполнять произвольные операции, это уже скалярная величина. Проблема возникает в добавлении к разности базы сегмента. Тут nasm безбожно ругается.
Но база сегмента ведь константа (ты сам сказал), так и объяви ее как константу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сегментый описатель.
СообщениеДобавлено: 22 авг 2011, 13:31 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
pavia, если дескриптор выдираешь из бинарника или из исходника какого-нибудь страстного поклонника циферок, прога реально полезна - испробовано! Было бы хорошо, если бы можно было копипастить в твою программу дескриптор в разных форматах (у меня не получилось после этого получить правильный результат), например, FF FF 00 00 00 9A CF 00 или 0xFF,0xFF,0x00,0x00,0x00,0x9A,0xCF,0x00.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB