Ipari zen

Szak-irodalom. A fejlesztő jajszava haikuban. A technika ördöge avagy a lelketlen vasban a mélyen emberi.

A szoftverfejlesztés művészete és a zen

2010.04.02. 11:06 Ipari zen

Emmentáli a memóriában

Címkék: memória 32 emmentáli 64 memcpy sizeof struct migration

A sajt mérete
nem csak a sajttól, de a
lyukaktól is függ.

 

Egy szoftvert próbálunk már egy darab ideje 32 bites linux kernelről átírni 64 bitesre. Már túl voltunk az első egészen triviális szívásokon, mint pl a long/int, pointerek és egyebek hosszváltozása, de a rendszer csak nem akart összeállni. Egy idő után egy structra terelődött a gyanú, amit egy memcpy-val másoltunk át egy bitfolyamba és majd ott bitenként kezdtük elemezni. Míg 32 bitesek voltak az alkalmazások az átmásolt tartalom így nézett ki

struct akarmi {
  int i;    // 4 byte
  long j;   // 4 byte
}; /* sizeof (struct bar) = 8 bytes */

Elfeledkeztünk viszont arról, hogy mikor áttértünk 64 bitre nem csak a long hossza változott meg 64 bitre, hanem az alignment is. Ettől kezdve tehát így nézett ki a struktúra

struct akarmi {
  int i;    // 4 byte
            // 4 byte padding
  long j;   // 8 byte
}; /* sizeof (struct bar) = 16 bytes */

Amikor átmásolás után bitenként próbáltuk a struktúra értékét értelmezni akkor jött a végzetes csapás, mert beleolvastunk a paddingbe a long értéke helyett.

Itt van egy remek kis cikk a Suntól, hogy mire érdemes figyelni a 32/64 bites áttéréskor és milyen segédeszközök vannak, emitt meg egy a Microsofttól. Érdemes elolvasni őket mielőtt fejjel menne az ember a falnak, mert vannak a listán kevésbé triviálisak is.

1 komment