º°°Å ¾ø´Âµ¥ ±ÛÀÌ µÇ°Ô ±æ¾îÁö³×¿ä *_*;;
4. main.s¸¦ ÀÛ¼ºÇغ¸ÀÚ!
¸ð¸§Áö±â Æß¿þ¾îÀÇ ½ÃÀÛÀº ¾î¼Àºí¸®¾îÁÒ! ¤»
.cÆÄÀÏÀÌ c¼Ò½ºÄÚµå ÆÄÀÏÀ̶ó¸é, .sÆÄÀÏÀº arm¾î¼Àºí¸® ÆÄÀÏÀ̶ø´Ï´Ù!
°£´ÜÈ÷ ȸ鿡 Ãâ·ÂÇϱ⸸ ÇÒ²¨¶ó¼ ±×³É ½ºÅà À§Ä¡¸¸ ÁöÁ¤ÇØÁÖ°í ¹Ù·Î c·Î ³Ñ¾î°¥°Å¿¡¿ä~
.section .init
.globl _start
_start:
b init
.section .text
init:
mov sp,#0x8000
b main
¼³¸íÇÒ°Ô¿ä!
óÀ½ .section À̶ó´Â Å°¿öµå°¡ º¸À̽ÇÅÙµ¥¿ä, ÀÌ Å°¿öµå´Â GNU AssemblerÀÎ GASÀÇ Å°¿öµå¿¡¿ä
±×·¯´Ï±î, ¿ø·¡ arm ¾î¼Àºí¸® ¸í·É¾î´Â ¾Æ´Ï¶õ ¼Ò¸®¿¡¿ä!
ÀÌ .sectionÅ°¿öµå´Â, ÀÏ´Ü, ¼½¼Ç¿¡ ´ëÇÑ ¾à°£ÀÇ Áö½ÄÀÌ ÇÊ¿äÇѵ¥¿ä,
ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡¼´Â ¸î°¡Áö ±âÁØÀ» µÎ°í, ±× ±âÁØ¿¡ µû¶ó¼ º¯¼ö³ª ÇÔ¼ö³ª Äڵ带 ºÐ¸®½ÃÄÑ¿ä
Çб³¿¡¼ ¹è¿ì½ÅºÐµéÀÌ ¸¹À¸½Ã°ÚÁö¸¸, Àü¿ªº¯¼ö´Â data ȤÀº bss section¿¡ ÀúÀåµÈ´Ù´Â »ç½ÇÀ» ¾Ë°í °è½Ç°Å¿¡¿ä
¶ÇÇÑ, ÄÚµå ºÎºÐÀº text ¼½¼Ç¿¡ ÀúÀåµÈ´Ù´Â°Í ¶ÇÇÑ ¾Ë°í °è½Ç°Å¿¡¿ä
±×¸®°í, Áö¿ªº¯¼ö´Â stack ÀúÀåµÈ´Ù´Â°Í ±îÁöµÎ¿ä!
¹Ù·Î ±×°Ô ¿©±â¼ ¸»ÇÏ´Â ±× "¼½¼Ç"À̶ó´Â ³à¼®Àä,
.section Å°¿öµå´Â ¸»·Î Ç®ÀÌÇÏ¸é ´ÙÀ½°ú °°¾Æ¿ä
.section .init
"¿©±â¼ºÎÅÍ´Â .init¼½¼Ç ¿µ¿ªÀÓ"
Áï, init¶ó´Â ¼½¼Ç¿µ¿ª¿¡ ÀÌ Äڵ带 ³Ö¾î¶ó´Â ¼Ò¸®°¡ µÇ´Â°ÅÁÒ!
±×·³ 2¹ø° ÁÙ·Î ³Ñ¾î°¡¼
.global _start
ÀÌ ¶ÇÇÑ ¾î¼Àºí¸®¾î°¡ ¾Æ´Ï¶ó gas Å°¿öµåÀä
.global _start´Â, _start¶ó´Â ·¹À̺í(c¾ð¾î¼¼¾î ÇÔ¼ö¿Í °°¾Æ¿ä!) À» global·Î ¼±¾ðÇϴ°ſ¡¿ä
Áï, ÀÌ Äڵ尡 ¸µÅ·µÇ´Â ¾î¶² °÷¿¡¼µç _start¶ó´Â ·¹À̺íÀ» È£ÃâÇÒ ¼ö ÀÖ¾î¿ä!(¹°·Ð ¾î¼Àºí¸®¿¡¼¸¸...)
±×¸®°í 3¹ø° ÁÙ·Î ³Ñ¾î°¡¸é,
_start: °¡ ³ª¿Í¿ä
ÀÌ°É c¾ð¾î·Î Ç®¾îº¸¸é
void _start(void) { ...}
¿Í °°¾Æ¿ä! ¿©±â¼ ÁÖÀÇÇÒ Á¡Àº, ÆíÀÇ»ó ¸®ÅÏÇüÀ» void ±×¸®°í, ÆĶó¹ÌÅ͸¦ void·Î Ç¥ÇöÇßÁö¸¸,
½ÇÁ¦ ¾î¼Àºí¸®¾î¿¡¼´Â ±×·±°Å ¾ø´Ù´Â°Í Á¤µµ¸¸ ¾Ë¾ÆµÎ¼¼¿ä!
±×¸®°í 4¹ø°·Î ³Ñ¾î°¡¸é
b init°¡ ³ª¿À´Âµ¥¿ä,
b´Â arm¾î¼Àºí¸®¾î·Î½á, Branch ¶ó´Â ¶æÀ» ÀǹÌÇÏ°í Àִµ¥¿ä
¿ì¸®¸»·Î "ºÐ±â"¶ó°í ÇØ¿ä
ºÐ±â´Â ¿ì¸®¸»ÀÌÁö¸¸, Àß ¾²ÀÌÁö ¾Ê´Â ¸»ÀÏÅÙµ¥¿ä.. ±×³É, c¾ð¾î·Î Ç®¸é
init(); ¿Íµµ °°Àº°Å¿¡¿ä
x86¾î¼À¿¡¼´Â jmp¶ó°í ÇÏÁÒ??
** armÀº ¿µ±¹¿¡¼ ¸¸µé¾îÁ®¼ °°Àº ¶æÀÌ¶óµµ ´Ù¸¥ ´Ü¾î¸¦ »ç¿ëÇÑ°Ô ²Ï µÇ´Â°Í °°¾Æ¿ä!
óÀ½¿£ »ý¼ÒÇÑ°Ô ¾Ë°íº¸´Ï "±×°Ô ±× ¶æÀÌ¿´¾î?"¶ó´Â°Ô ²Ï µÇ´Â°Í °°¾Æ¿ä ¤»
±×¸®°í ´Ù½Ã ¹Ø¿¡ º¸¸é
.section .text
init:
°¡ ³ª¿À´Âµ¥, À§¿¡ ¼³¸íÇÑ°Í°ú µ¿ÀÏÇϱ¸¿ä
¹Ø¿¡ mov sp, #0x8000
°¡ ³ª¿À°Ô µÇ´Âµ¥¿ä,
mov´Â move¶ó´Â ¸í·É¾îÀä, °¡Àå ±âº»ÀûÀÎ ¸í·É¾îÁß ÇϳªÁÒ
°£´ÜÈ÷ c¾ð¾î·Î Â¥º¸¸é,
sp = 0x8000;
¿¡¿ä, À̶§, Áß¿äÇÑ°ÍÀÌ sp¶ó´Â³à¼®Àä,
ÀÌ ºÎºÐÀº ³ªÁß¿¡ ¼³¸íÇÏ°ÚÁö¸¸, Áö±ÝÀº ´ÜÁö "½ºÅÃÀÇ ÁÖ¼Ò¸¦ 0x8000·Î ³Ö¾ú´Ù" Á¤µµ·Î ¾Ë¾ÆµÎ¼¼¿ä!
±×¸®°í b mainÀÌ ³ª¿À°Ô µÇ´Âµ¥!
¿©±â°¡ main.sÀÇ ¸¶Áö¸·ÀÌ¿¡¿ä! ¤¾¤¾
5. ±×¸®°í main.c·Î!!
main.c¿¡¼´Â ½ÇÁ¦ main¹®ÀÌ ÀÖ°í, ȸéÀ» ÇϾé°Ô »öÄ¥ÇÒ°Å¿¡¿ä!
#include
#define MAILBOX_READ 0x2000B880
#define MAILBOX_STATUS 0x2000B898
#define MAILBOX_WRITE 0x2000B8A0
#define MAILBOX_FULL 0x80000000
#define MAILBOX_EMPTY 0x40000000
void initFB();
volatile struct _framebuffer
{
unsigned int width;
unsigned int height;
unsigned int vWidth;
unsigned int vHeight;
unsigned int pitch;
unsigned int depth;
unsigned int x;
unsigned int y;
unsigned int* pointer;
unsigned int size;
};
unsigned short* pt = 0x00100000;
volatile struct _framebuffer fb;
volatile int main(void)
{
int i = 0;
int j = 0;
initFB();
*pt = (unsigned short)0xffff;
pt = 0x00100000;
for(i = 0; i<768; i++)
{
for(j = 0; j<1024; j++)
{
*pt = (unsigned short)0xffff;
pt++;
}
}
//draw_pixel(300, 300, 0x0000);
draw_line(10, 150, 700, 700, 0x0000);
return 0;
}
void initFB(void)
{
unsigned int* fb_addr = (unsigned int*)&fb;
int ret = 0;
fb.width = 1024;
fb.height = 768;
fb.vWidth = 1024;
fb.vHeight = 768;
fb.pitch = 0;
fb.depth = 16;
fb.x = 0;
fb.y = 0;
fb.pointer = 0x00100000;
fb.size = 0;
fb_addr += 0x40000000;
ret = mailbox_write(&fb, 1);
//ret = mailbox_read(1);
return 0;
}
int mailbox_write(unsigned int fb_addr, unsigned int channel)
{
volatile unsigned int* mail_status = MAILBOX_STATUS;
volatile unsigned int* mail_write = MAILBOX_WRITE;
if( (fb_addr & 0xf) != 0)
{
return -1;
}
while(*mail_status & MAILBOX_FULL)
{
//flush the cache
}
*mail_write = (fb_addr | channel);
return 0;
}
int mailbox_read(unsigned int channel)
{
unsigned int data;
unsigned int cnt = 0;
unsigned int* mail_read = MAILBOX_READ;
unsigned int* mail_status = MAILBOX_STATUS;
if(channel > 15)
{
return -1;
}
while( *mail_status & MAILBOX_EMPTY)
{
//flushcache
if(cnt++ > (1<<25) )
{
return 0xffffffff;
}
}
data = *mail_read;
if( (data & 15) == channel)
{
return data;
}
else
{
return -2;
}
}
</pre>
Á» ¹Î¸ÁÇÑ ÄÚµå±ä ÇÏÁö¸¸... ¾î·µç ½ÃÀÛÇغÁ¿ä!
ÀÏ´Ü Àá±ñ mainÀ» º¸½Ã¸é, initFB¸¦ È£ÃâÇÏ´Â°É º¼ ¼ö Àִµ¥¿ä, main¿¡ ¾Õ¾î¼ initFBºÎÅÍ »ìÇÇ°í °¡µµ·Ï ÇÒ°Ô¿ä
initFB´Â, ÇÁ·¹ÀÓ ¹öÆÛ¸¦ ÃʱâÈ ÇÏ´Â ÇÔ¼öÀä,
ÇÁ·¹ÀÓ ¹öÆÛ¶õ ¹«¾ùÀ̳ĸé, ȸ鿡 Ãâ·ÂÇϱâÀ§ÇÑ µ¥ÀÌÅÍ Çü½Ä(?)À» ÇÁ·¹ÀÓ ¹öÆÛ¶ó°í ÇØ¿ä
´Ü¼øÈ÷, »ö»ó°ª¸¸ µé¾î°¡´Â°Ô ¾Æ´Ï°í, ȸé ÇØ»óµµ, RGBºñÆ®¼ö, µ¥ÀÌÅÍ µîµîÀÌ µé¾î°¡¿ä
óÀ½ º¸½Ã¸é, width = 1024;
ÀÌ Äڵ尡 º¸À̽ÇÅÙµ¥, ÀÌ°Ç, ÇÁ·¹ÀÓ ¹öÆÛÀÇ °¡·Î ÇØ»óµµÀÇ °ªÀ» ³Ö¾îÁִ°ſ¡¿ä
ÀÌ ºÎºÐÀº 1280À¸·Î ³Ö´Â´Ù°í Çϸé, 1280Çػ󵵸¦ ¾²°ÔµÇ´Â°ÅÁÒ
±×¸®°í ±× ¹Ø¿¡ height¶ÇÇÑ °°±¸¿ä
±×¸®°í, vWidth¿Í vHeight´Â °¡»ó(?)Çػ󵵶ó°í Çϴµ¥, Á¤È®È÷ ¸ð¸£°Ú³×¿ä~ ¼ýÀÚ¸¦ °íÃ常é
´Þ¶óÁö´Â°É È®ÀÎÇÒ ¼ö´Â ÀÖ¾ú´Âµ¥, ¾î¶² ±ÔÄ¢ÀÎÁö´Â Àß...
pitch´Â 0À¸·Î ÇؾßÇѴٳ׿ä.. gpu¿¡¼ ¾Ë¾Æ¼ ó¸®ÇÑ´Ù°í ÇØ¿ä
depth´Â RGBÇÒ¶§¿¡, ÃÑ ¸îºñÆ®¸¦ »ç¿ëÇÒÁö´Â °áÁ¤Çϴ°ǵ¥¿ä,
ÀϹÝÀûÀÎ ÇÏÀÌÄ÷¯´Â 16bit¸¦ ¾²±¸¿ä.. Æ®·çÄ÷¯°¡ 24ºñÆ®, ±×¸®°í RGBA¶ó´Â Åõ¸íµµ±îÁö ÀÖ´Â°Ô 32ºñÆ®¶ó°í Çϳ׿ä
±× ¿Ü¿¡µµ ¸î°³ ÀÖÁö¸¸, ÀÏ´Ü ÆíÀÇ»ó 16ºñÆ®·Î ÇÒ°Ô¿ä!
x,yµµ gpu¿¡¼ ¾Ë¾Æ¼ Çϴϱî 0À¸·Î ¼ÂÆÃÇϱ¸¿ä
¿©±â¼ Áß¿äÇÑ pointerÀä
pointer´Â ½ÇÁ¦ RGB°ªÀ» ÀǹÌÇÏ´Â°Ô ¾Æ´Ï¶ó, RGB°ªÀÌ µé¾îÀÖ´Â ¸Þ¸ð¸® ÁÖ¼Ò¸¦ ÀǹÌÇØ¿ä
¿©±â¼ 0x00100000À¸·Î ¼³Á¤Ç߱⶧¹®¿¡, RGB°ªÀº 0x00100000¿¡ µé¾îÀÖ¾î¾ßÇØ¿ä
±×¸®°í, sizeµµ gpu°¡ ¾Ë¾Æ¼ ÇØÁִϱî 0À¸·Î ÇϽñ¸¿ä
±× ´ÙÀ½¿¡, mailbox_write(&fb, 1); ·Î½á mailbox¶ó´Â ³à¼®¿¡ ÇÁ·¹ÀÓ¹öÆÛ¸¦ ÀԷ½ÃÅ°´Â ÀÛ¾÷À» ÇØ¿ä!
mailbox_write¸¦ º¸¸é¿ä,
¸Å°³º¯¼ö·Î ÇÁ·¹ÀÓ¹öÆÛ ±¸Á¶Ã¼ÀÇ ÁÖ¼Ò¿Í, channelÀ» ¹Þ°íÀÖ´Â°É º¼ ¼ö Àִµ¥¿ä,
ä³ÎÀº arm°ú gpu»çÀÌ¿¡ ¾î¶² µ¥ÀÌÅ͸¦ ÁÖ°í ¹ÞÀ»Áö¸¦ °áÁ¤ÇÏ´Â º¯¼ö¿¡¿ä
1¹øÀº, framebuffer¸¦ ÁÖ°í¹Þ°Ú´Ù´Â°Å¿¡¿ä
Äڵ带 º¸¸é, mail_status, mail_write º¯¼ö¸¦ º¼ ¼ö ÀÖÀ»ÅÙµ¥¿ä,
status¶ó´Â ·¹Áö½ºÅÍ¿Í write·¹Áö½ºÅÍÁÖ¼Ò¸¦ ÇÒ´ç¹Þ°í ÀÖ´Â ºÎºÐÀÌ¿¡¿ä
ÇÁ·¹ÀÓ ¹öÆÛÀÇ ÁÖ¼Ò ÇÏÀ§ 4ºñÆ®´Â ¹Ýµå½Ã 0ÀÌ µÇ¾î¾ß¸¸ÇØ¿ä!!!
±×°É °Ë»çÇÏ´Â°Ô Ã¹¹ø° if¹®ÀÌ¿¡¿ä
while(*mail_status & MAILBOX_FULL)
ÀÌ ºÎºÐÀº, mail_status¶ó´Â ·¹Áö½ºÅÍÀÇ µ¥ÀÌÅÍ°¡ 0x80000000À̶ó¸é,
¸ÞÀϹڽº ·¹Áö½ºÅÍ°¡ °¡µæÂ÷ Àֱ⶧¹®¿¡ µ¥ÀÌÅ͸¦ ¾µ ¼ö ¾ø´Â »óŶó´Â ¸»ÀÌ¿¡¿ä
±×·¸±â¶§¹®¿¡, gpu°¡ ¸ÞÀϹڽº¸¦ ºñ¿ï¶§±îÁö busy-wait·Î ±â´Ù·Á¾ßÇϴ°ſ¡¿ä
(ÀÌ ºÎºÐ¿¡¼´Â Á¦°¡ Á¤È®È÷ ¾Ë°íÀÖ´Â ºÎºÐÀº ¾Æ´Ñµ¥¿ä, 2°¡Áö ÃßÃøÀ» ÇÏ°íÀÖ¾î¿ä
1. gpu°¡ ÀÚµ¿À¸·Î ¸ÞÀϹڽº¸¦ ºñ¿öÁØ´Ù.
2. cache flush¸¦ ÅëÇؼ ¸ÞÀϹڽº¸¦ ºñ¿ö¾ß ÇÑ´Ù.)
±×¸®°í, *mail_write¿¡ µ¥ÀÌÅÍ¿Í Ã¤³ÎÀ» or¿¬»êÀ¸·Î ³Ö¾îÁִ°ÍÀ¸·Î ¸¶¹«¸® µÇ¿ä
ÀÌ·¸°Ô ¸ÞÀϹڽº¿¡ µ¥ÀÌÅÍ Áý¾î³Ö´Â°Í±îÁö Çؼ initFBÇÔ¼ö°¡ ¸¶¹«¸® µÇ¾ú³×¿ä
ÀÌÁ¦ main¹®À¸·Î µé¾î°¡º¼±î¿ä
initFB¹Ù·Î ¹Ø¿¡¼ºÎÅÍ ½ÃÀÛÇϸé¿ä
Áßø for¹®À¸·Î 1024, 768 µ¹¸é¼ µ¥ÀÌÅÍ 0xffff¸¦ ³Ö´Â°ÍÀ» È®ÀÎÇÒ ¼ö Àִµ¥¿ä,
ÀÌ ºÎºÐÀº Çػ󵵸¸Å ÁÖ¼Ò¸¦ À̵¿½ÃÄѼ, ÇØ´ç Çȼ¿¿¡ µ¥ÀÌÅ͸¦ ³Ö´Â°Å¿¡¿ä
16ºñÆ® RGB¸¦ »ç¿ëÇ߱⶧¹®¿¡ shortÀÚ·áÇüÀ» ½è°í, µ¥ÀÌÅ͸¦ ³Ö°í, ÁÖ¼Ò Áõ°¡½ÃÅ°°í.. ¹Ýº¹ÇÏ°íÀÖ¾î¿ä
±×¸®°í, draw_lineÀ¸·Î ¼±À» ±×¸®°í Àִµ¥¿ä, ÀÌ°Ç Á¶±ÝÀÖ´Ù°¡!
** Áß¿äÇÑÁ¡Àº ptÀÇ ÁÖ¼Ò¸¦ ´«¿©°ÜºÁ¾ßÇØ¿ä
ptÀÇ ÁÖ¼Ò´Â °ð Çȼ¿ÀÇ ÁÖ¼Ò¸¦ ÀǹÌÇÏ°í, ptÀÇ °ªÀº °ð Çȼ¿ÀÇ °ªÀ» ÀǹÌÇØ¿ä!!
6¹øÀº ´ÙÀ½ ±Û¿¡¼ ºÁ¿ä~ |
°ü½ÉÀÖ´Â ºÎºÐ¿¡ ´ëÇØ ¿½ÉÈ÷ °øºÎÇϽô ¸ð½ÀÀ» º¸´Ï Á¦°¡ ºÎ²ô·¯¿öÁö³×¿ä.
°Ç½ÂÇϽñæ...
PS.
ÇÁ·¹ÀÓ¹öÆÛ Æ÷ÀÎÅÍ¿Í unsigned int¸¦ °°Àº Å©±â·Î ´ÜÁ¤ÇÏ°í ÄÚµùÇϼ̴µ¥, ÀÌ´Â À̽ļºÀ» ¸Å¿ì ¾ÈÁÁ°Ô ¸¸µì´Ï´Ù^^
±×¸®°í ±¸Á¶Ã¼ ¸â¹öÀÇ Æеùµµ °í·ÁÇÏÁö ¾ÊÀ¸½Å°Í °°°í¿ä.
¹°·Ð ÇöÀçÀÇ H/W ȯ°æ¿¡¼´Â ¹®Á¦ ¾øÀÌ Àß µ¿ÀÛÇÒ°Ì´Ï´Ù.
±× Àü¿¡ Áú¹®±ÛÀ» ³Ê¹« ¸¹ÀÌ ¿Ã¸° ¸ð¾çÀÌ³×¿ä ¤Ì¤Ì ÀÚÁ¦Çؾ߰ھî¿ä ¤Ì
Á¦°¡ ¾ÆÁ÷ arm¸¸ ½áºÁ¼ ´Ù¸¥ ¾ÆÅ°ÅØÃĸ¦ ½áº»ÀûÀÌ ¾ø¾î¼,
À̽ļºÀÌ ÁÁÀº Äڵ带 ¸¸µå´Â ³ëÇÏ¿ì°¡ ¾ÆÁ÷Àº ¾ø³×¿ä..
¾ÆÅ°ÅØÃÄ È£È¯ »ý°¢ÇÏ¸é ¾ÆÁ÷ °¥±æÀÌ ³Ê¹« ¸Ó³×¿ä ¤Ì¤Ì