Board.KolibriOS.org

Official KolibriOS board
It is currently Fri Apr 19, 2019 9:42 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 26 posts ]  Go to page Previous 1 2
Author Message
PostPosted: Tue Sep 20, 2011 9:54 pm 
Offline

Joined: Sun Feb 18, 2007 8:34 pm
Posts: 158
Я понимаю. Но кроме как боязнью использовать вершину предназначенной для стека области памяти в качестве указателя стека или полным непониманием устройства стека в x86 я не могу объяснить использование указателей стека типа xxxFFFh. Тогда уж лучше xxxFFCh, т.е. на лицо еще и непонимание роли выравнивания при обращениях к памяти.


Top
   
PostPosted: Tue Sep 20, 2011 10:05 pm 
Об этом собственно и был вопрос - глупость разработчиков или тонкость хитрого интела.


Top
   
PostPosted: Mon Jun 25, 2012 8:50 pm 
Offline
User avatar

Joined: Tue Jun 19, 2012 7:04 am
Posts: 16
Phantom-84 wrote:
Часто приходилось встречать, когда для 16-разрядных сегментов (обычно реального режима) устанавливают вершину стека 0FFFFh, боясь использовать 0. Возможно, использование указателей стека типа xxxFFFh вызвано этим же. Кстати, в моем "упрощенном исполняемом формате" нет поля для явного хранения указателя стека (только размеры). Это позволяет свободно располагать стек первичного прикладного потока в конце прикладного адресного пространства вне зависимости от размера пространства. Стек в "образ" не входит.


Мне нужно расположить стек конце прикладного адресного пространства .
Надо ли для этого явно инициализовать esp нулем.?
Какой простой путь это сделать в asm-программе для колибри?


Top
   
PostPosted: Wed Jun 27, 2012 9:06 am 
Offline

Joined: Sun Feb 18, 2007 8:34 pm
Posts: 158
Нынче в Колибри прикладное адресное пространство располагается в нижней части вирт. адресного пространства, так что нулем по-любому esp инициализировать не надо. Вписывать нужное значение esp в заголовок исполняемого файла тоже не вариант. Единственное решение, которое я вижу, - сделать первоначальный прикладной стек пустым (или небольшим), совместив значение esp (в заголовке) с вершиной памяти для приложения (там же), а потом распределить память в конце прикладного пространства (если такое возможно - см. функции распределения памяти) и переустановить esp программно на вершину этой области. Еще нужно уточнить, практикуется ли в Колибри переменный размер прикладного пространства/пространства ядра. Если да, то нужно как-то узнавать вершину прикладного пространства.


Top
   
PostPosted: Wed Jun 27, 2012 3:30 pm 
Offline
User avatar

Joined: Tue Jun 19, 2012 7:04 am
Posts: 16
Колибри поставил только неделю назад. ОС для меня совершенно новая.
Поэтому много непоняток. Раньше имел опыт ассемблера под DOS.
Сейчас пытаюсь написать для Колибри транслятор программ на Ассемблер
для двух стековой Forth-машины


Мне нужно такое распределение памяти:

Code:
0             2048         4096               8192        10240
|_____________|____________|__________________|___________|
      код         данные                   <--^        <--^                 
                                            ebp          esp


Как это реализовать для колибри?


Top
   
PostPosted: Wed Jun 27, 2012 11:00 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Вот именно такое, чтобы 2 кб кода, потом данные, а потом стек? Использовать директиву org.
Но не факт, что все данные кода поместятся в 2 кб.
В Колибри используется плоская модель памяти. Никаких сегментов, приложение может адресовать память с байта номер 0 по байт 0x8FFFFFFF, при условии, что приложение затребует 2 Гб памяти при инициализации, и система столько памяти сможет выделить. Кроме памяти, резервируемой приложением при старте, можно получать еще куски памяти нужного размера через malloc.


Top
   
PostPosted: Thu Jun 28, 2012 12:55 pm 
Offline

Joined: Sun Feb 18, 2007 8:34 pm
Posts: 158
ywaw1 wrote:
Мне нужно такое распределение памяти...
Это не разметка со стеком в конце прикладного адресного пространства, а как раз-таки типичная для Колибри разметка. Делается так:
Code:
  use32
  org 0
  db "MENUET01"
  dd 1
  dd start
  dd data_end
  dd stack_end
  dd stack_end
  dd 0,0
start:
  ...
  rb 2048-$
code_end:
  ...
  db 4096-$ dup 0
data_end:
  ; virtual
  ...
  rb 8192-$
bss_end:
  ...
  rb 10240-$
stack_end:
  ; end virtual

Но как верно было замечено, код и данные имеют переменную длину, поэтому лучше не ограничивать их размер явно, а просто выравнивать их начало на определенную границу, если это вообще необходимо, а память под стек резервировать с явным указанием нужного размера. Например так:
Code:
  ...
start:
  ...
code_end:
  align 4
  ...
data_end:
  align 4
  ...
bss_end:
  align 4
  rb 4000h ; 16 кб под стек
stack_end:


Top
   
PostPosted: Thu Jun 28, 2012 1:30 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 4974
Объясните мне зачем нужно выравнивание. Что оно делает и в чём профит.

_________________
Через тернии к звездам


Top
   
PostPosted: Thu Jun 28, 2012 5:52 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Процессор работает с данными в 32-битном режиме. Соответственно, он читает данные из памяти по 4 байта за 1 обращение к ОЗУ, грубо говоря. Если у тебя данные хранятся вот так:

Code:
.org 0
sbyte db 10
sdword dw 20,30,40,50


то чтение sdword в память займет больше времени, чем могло бы. Для этого нужно выравнивание памяти.


Top
   
PostPosted: Thu Jun 28, 2012 7:15 pm 
Offline
Just Flooding

Joined: Sat Jan 06, 2007 2:30 pm
Posts: 269
> 0x8FFFFFFF
0x7FFFFFFF тогда уж.


Top
   
PostPosted: Fri Jun 29, 2012 8:43 pm 
Offline

Joined: Mon Mar 27, 2006 6:33 am
Posts: 649
ywaw1 wrote:
Сейчас пытаюсь написать для Колибри транслятор программ на Ассемблер
для двух стековой Forth-машины

Может "оттолкнуться" от существующего варианта Форта для Колибри сделанного с использованием форт-системы SPF4
KolSPForth

P.S. Русский форум по Форт языку
Можно взять готовые наработки
Один из трансляторов Форта в Аsm ForthEC

Mihail также встроил Форт в ядро Колибри Форт в ядре колибри


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 26 posts ]  Go to page Previous 1 2

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited