hilpers


  hilpers > comp.lang.* > comp.lang.c

 #1  
08.03.2010, 08:49
Pawel
dzis okrylem kolo na nowo :) trafilem na metode aktywacji wylapywania
niewyrownanego dostepu na x86 - tej wspanialosci, ktorej nauczyl
mnie procesor sparc :)


$ cat t.c
#include <stdlib.h>
int main()
{
#if defined( __GNUC__ )
#if defined( __i386__ )
/* enable alignment checking on x86 */
asm( "pushf\n\torl $0x40000,(%esp)\n\tpopf" );
#elif defined( __x86_64__ )
/* enable alignment checking on x86_64 */
asm( "pushf\n\torl $0x40000,(%rsp)\n\tpopf");
#endif
#endif
/* malloc() always provides aligned memory */
char* cptr = malloc( sizeof( int ) + 1 );
/* increment the pointer by one, making it misaligned */
int* iptr = (int *)( cptr + 1 );
*iptr = 42;
return 0;
}

$ gcc -Wall t.c && ./a.out
zsh: bus error ./a.out

$ dmesg|tail -n1
[338627.314024] a.out[23345] trap alignment check ip:400523 sp:7fff3d701210
error:0 in a.out[400000+1000]

ta wspanialosc dostepna juz od czasow i486SX zostala haniebnie zatajona
przez znanych nam specjalistow od programowania niebieskich ekranow ;)

From Jeffery Richter's "Programming Applications for Windows, 4th Ed":

"Let's take a closer look at how the x86 CPU handles data alignment.
The x86 CPU contains a special bit flag in its EFLAGS register called
the AC (alignment check) flag. By default, this flag is set to zero when
the CPU first receives power. When this flag is zero, the CPU automatically
does whatever it has to in order to successfully access misaligned data
values. However, if this flag is set to 1, the CPU issues an INT 17H
interrupt whenever there is an attempt to access misaligned data.
The x86 version of Windows 2000 and Windows 98 never alters this CPU flag
bit. Therefore, you will never see a data misalignment exception occur
in an application when it is running on an x86 processor."

detale:

bit 18 (Alignment mask) w rejestre CR0 (ustawiany np. przez linuksa).
http://en.wikipedia.org/wiki/Control_register

bit 18 (Alignment check 486SX+ only) w EFLAGS ustawiamy sobie w aplikacji.
http://en.wikipedia.org/wiki/FLAGS_register_(computing)
 #2  
08.03.2010, 12:03
profesor_kinbote
> dzis okrylem kolo na nowo :) trafilem na metode aktywacji wylapywania
[..]
> in an application when it is running on an x86 processor."
>
> detale:
>
> bit 18 (Alignment mask) w rejestre CR0 (ustawiany np. przez linuksa).
> [..]
>
> bit 18 (Alignment check 486SX+ only) w EFLAGS ustawiamy sobie w aplikacji.
> [..])
>


super -> o wyrównywaniu allocow pisał Kasperski w swojej książce,
ja sam jestem zbyt zielony w temacie by cos sensownego na dany moment
powiedzieć - ale jak ktos rozwinie temat to chetnie poczytam, moge
nt dodac od siebie wczorajsze spostrzezenie

procki czasami nazywa sie alu ale owo arithmetic i owo logic to
jedynie dwa filary z trzech na ktorych opiera sie procek, bo są
jeszcze _przypisania (malo kto powie ze mov nie rzuca sie w oczy)
nie wiem tylko jak tenm trzeci filar procka nazwac I arithmetic
II logic III ???
 #3  
08.03.2010, 12:16
Mirek
On pon, 08 mar 2010 10:49:21 in article news:<hn2hrt$3hs$1>
Paweł wrote:
> dzis okrylem kolo na nowo :) trafilem na metode aktywacji wylapywania
> niewyrownanego dostepu na x86 - tej wspanialosci, ktorej nauczyl
> mnie procesor sparc :)


;)

> detale:
>
> bit 18 (Alignment mask) w rejestre CR0 (ustawiany np. przez linuksa).
> [..]
>
> bit 18 (Alignment check 486SX+ only) w EFLAGS ustawiamy sobie w aplikacji.
> [..])


implementacja też jest w wikipedii
http://en.wikipedia.org/wiki/Bus_error
:)
 #4  
08.03.2010, 12:29
profesor_kinbote
> nt dodac od siebie wczorajsze spostrzezenie
>
> procki czasami nazywa sie alu ale owo arithmetic i owo logic to
> jedynie dwa filary z trzech na ktorych opiera sie procek, bo są
> jeszcze _przypisania (malo kto powie ze mov nie rzuca sie w oczy)
> nie wiem tylko jak tenm trzeci filar procka nazwac I arithmetic
> II logic III ???
>asignment? transfer? ram_operation?


mam tez lekka 'zagwostke' jak to niektozy mowia, do ktorej grupy
przypisac PUSH, bo troche pasuje to do obslugi skokow czyli
rozgalezien a to podlega pod logic, ale tez troche pasuje to
do działki przypisań choc to raczej w ubocznym skutku
 #5  
09.03.2010, 13:28
Kicer
profesor_kinbote wrote:

>
> procki czasami nazywa sie alu ale owo arithmetic i owo logic to
> jedynie dwa filary z trzech na ktorych opiera sie procek, bo są
> jeszcze _przypisania (malo kto powie ze mov nie rzuca sie w oczy)
> nie wiem tylko jak tenm trzeci filar procka nazwac I arithmetic
> II logic III ???
>


alu jest *w* procesorze. Wokół (alu) jest sporo innych ukladów realizujących
funkcje o których mówisz.
 #6  
10.03.2010, 06:50
fir
> profesor_kinbote wrote:
>
> >
> > procki czasami nazywa sie alu ale owo arithmetic i owo logic to
> > jedynie dwa filary z trzech na ktorych opiera sie procek, bo są
> > jeszcze _przypisania (malo kto powie ze mov nie rzuca sie w oczy)
> > nie wiem tylko jak tenm trzeci filar procka nazwac I arithmetic
> > II logic III ???
> >

>
> alu jest *w* procesorze. Wokół (alu) jest sporo innych ukladów realizujących
> funkcje o których mówisz.
>


Chodzi mi o to ze mozna podzielic zgrabnie instrukcje asma na
trzy działy arytmetyczne logiczne i wykonawcze (brzmi troche groznie
ale powiedzmy ze ok) przy czym logika i assignmenty są defakto
wazniejsze niz arytmetyka - ktora mozna zrobic poprzednimi
dwiema,
zaczalem wczorak kombinowac asembler ktory skladalby sie tylko z
dwu instrukcji

mov a b
if a b

przy czym adresowane sa pojedyncze bity tak ze
nawet mov20 (przesun 20 bitow) trzeba sobie samemu napisac

i m in zaczalem pisac increment

@increment_procedure
if a 0
mov a 1
if a 1
mov a 0

* inc a * //trzenba zaimplementowac inkrementacje adresu

call @increment_procedure //rekurencyjnie


tutaj uzywam tez call choc to tez mozna by zaimplementowac jako
mov na ip choć tym sie nie chcialem akurat bawic

wystapily male problemy z zaimplementowaniem owego inc a
(ale chyba raczej nie zasadnicze)
przeciazylem troche banie i zostawilem to ale chyba do tego
jeszcze wroce. Gdyby ktos ew chcial pokombinowac jak zrobic tutaj
to * inc a * to zapraszam do wypowiedzi - bo jak mowie moja bania
zdeczko zostala przeciazona i zrobilem sobie przerwe

jest to jednakowoz ciekawy temat - defakto hiperasembler
 #7  
10.03.2010, 07:45
Piotr Wyderski
fir wrote:

> Chodzi mi o to ze mozna podzielic zgrabnie instrukcje asma na
> trzy działy arytmetyczne logiczne i wykonawcze (brzmi troche groznie
> ale powiedzmy ze ok)


A teraz jeszcze spróbuj pogrupować instrukcje SSE, wzłaszcza ze zbioru 4.2.

> zaczalem wczorak kombinowac asembler ktory skladalby sie tylko z
> dwu instrukcji


Idź na całość:

http://en.wikipedia.org/wiki/One_ins...n_set_computer

Piotr Wyderski
 #8  
11.03.2010, 06:38
profesor_kinbote
> fir wrote:
>
> > Chodzi mi o to ze mozna podzielic zgrabnie instrukcje asma na
> > trzy działy arytmetyczne logiczne i wykonawcze (brzmi troche groznie
> > ale powiedzmy ze ok)

>
> A teraz jeszcze spróbuj pogrupować instrukcje SSE, wzłaszcza ze zbioru 4.2.
>


poki co nie nauczylem sie jeszcze SSE - duzo mam jeszcze ciekawych tematyk
do opanowania

> > zaczalem wczorak kombinowac asembler ktory skladalby sie tylko z
> > dwu instrukcji

>
> Idź na całość:
>
> [..]
>

"Common choices for the single instruction are:

- Subtract and branch if less than or equal to zero
- Subtract and branch if negative
- Reverse subtract and skip if borrow
- Triggered Move "

to powyzej jest nienaturalne i jest to sztuczka _maskujaca_ fakt ze
potrzebujesz własnie jednego mova i jednego if'a

fir

Czasy w strefie GMT. Teraz jest 23:12. | Privacy Policy