|
Ä¿ÇÇÇâÀÌ ³ª´Â *NIX
Ä¿ÇǴнº
½Ã½ºÅÛ/³×Æ®¿÷/º¸¾ÈÀ» ´Ù·ç´Â °÷
|
|
|
|
ÀÌÀü ÁÖÁ¦ º¸±â :: ´ÙÀ½ ÁÖÁ¦ º¸±â |
±Û¾´ÀÌ |
¸Þ½ÃÁö |
dukedrum ¼Õ´Ô
|
¿Ã·ÁÁü: 2007.10.09 È, 1:20 pm ÁÖÁ¦: ºí·Ï µð¹ÙÀ̽º µå¶óÀ̹ö¿Í sys_call¿¡¼¿ä.. |
|
|
¾Æ..¿äÁò ·¥µð½ºÅ© ¿¹Á¦¸¦ º¯ÇüÇؼ ÇÁ·Î±×·¥ Â¥º¸·Á´Âµ¥... Á¦°¡ Ä¿³Î¿¡ ´ëÇØ
Àß ¸ô¶ó¼ ±×·±°ÇÁö ¿øÀÎ ¸ð¸¦ ¿¡·¯°¡ ¹ß»ýÇϳ׿ä...
IT EXPERT Ã¥Áß¿¡ ¸®´ª½º Ä¿³Î ÇÁ·Î±×·¡¹ÖÀ̳ª µð¹ÙÀ̽º µå¶óÀ̹ö Ã¥¿¡ ³ª¿À´Â
·¥µð½ºÅ© ¿¹Á¦¸¦ º¯Çü ÇÏ·Á°í ÇÕ´Ï´Ù.
·¥µð½ºÅ©´Â ¸Þ¸ð¸®¿¡ vmallocÀ¸·Î °ø°£À» ÇÒ´çÇØÁÖ°í make_request¸¦ ÅëÇÏ¿©
ÇØ´ç ÀÛ¾÷(read,write µî..)À» ¼öÇà ÇØÁִµ¥¿ä..
Àú´Â ¸Þ¸ð¸® °ø°£ÀÌ ¾Æ´Ñ User¿µ¿ªÀÇ ÆÄÀÏÀ» OpenÇÏ¿© ¸Þ¸ð¸® ´ë½Å ±×°÷¿¡ ÀúÀåÀ» ÇÏ·Á ÇÕ´Ï´Ù.
ÇöÀç sys_call_tableÀ» ã¾Æ¼ ÆÄÀÏ¿¡ open,read,write,close,lseek±îÁö ÀüºÎ ´Ù
µÇ°íÀÖ´Â »óÅÂÀÔ´Ï´Ù.
¼Ò½º¸¦ Á¦°¡ »ý°¢ Çѵ¥·Î º¯°æ ÇÏ¿© ½ÇÇàÇß´õ´Ï mke2fs·Î Æ÷¸äÇÏ¿©
ÆÄÀÏÀÇ ¿ë·®ÀÌ 4MB·Î ¹Ù²î°í mount±îÁö ¼º°øÀ» Çß½À´Ï´Ù.
±×·±µ¥ mountÀÌÈÄ¿¡ ls³ª mv, cp µîµî ¹º°¡ ÀÛ¾÷À» ¼öÇàÇÏ·Á°í Çϸé ÇØ´ç Å͹̳ÎÀÌ »¸´Â Çö»óÀÌ ³ª³×¿ä..¤Ð¤Ð
ºÐ¸í memory¿µ¿ª¿¡ ÀߵǴø ¼Ò½º...
ÃßÃøÀº make_request¿Í syscall(»ç¿ëÀÚ¿µ¿ª)°£ÀÇ ¹®Á¦°¡ ¾Æ´Ò±î ÇÏ´Â »ý°¢ÀÌ
µé±ä ÇÏÁö¸¸... ¶Ñ·ÈÇÑ ¿øÀÎÀ» ¸øã°í ÀÖ½À´Ï´Ù..
¹Ø¿¡ Áß¿ä ºÎºÐ(make_request)ÀÇ ¼Ò½º¸¦ ¿Ã¸³´Ï´Ù.
°í¼ö´ÔµéÀÇ Á¶¾ð ºÎŹÇÕ´Ï´Ù...¤Ð¤Ð(¹ú½á ÀÌ°É·Î 3ÁÖ° °í»ý..)
///////////ÆĶõ»ö ºÎºÐÀº ±âÁ¸ÀÇ ¼Ò½º,³ì»öÀº Á¦°¡ º¯°æÇÑ ¼Ò½º///////////
static int vrd_make_request(request_queue_t * q, int rw, struct buffer_head *sbh)
{
unsigned int minor;
// char *pData; // ¸Þ¸ð¸®ÀÇ À§Ä¡¸¦ ÀúÀåÇÒ Æ÷ÀÎÅͺ¯¼ö /**/
int nFileDesc = 0; //OpenµÈ ÆÄÀÏÀÇ µð½ºÅ©¸³ÅÍ ÀúÀå
int nFilePointer = 0; // lseek·Î À̵¿ ½Ãų ÆÄÀÏÀÇ Æ÷ÀÎÅÍ À̵¿°ª ÀúÀå
mm_segment_t old_fs; //
old_fs = get_fs(); // ÇöÀçÀÇ ¹üÀ§ ÀúÀå
set_fs(KERNEL_DS); // Ä¿³Î ¿µ¿ªÀ¸·Î ¹üÀ§ ¼ÂÆÃ
nFileDesc = fn("disk.dsk",O_RDWR);
// disk.dsk ÆÄÀÏÀ» ÀÐ°í ¾²±â ±ÇÇÑÀ¸·Î Open(sys_call)
minor = MINOR(sbh->b_rdev); // ºÎ¹øÈ£ ¾ò±â
if( minor >= VRD_MAX_DEVICES ) goto fail; // ºÎ¹øÈ£ÀÇ °ªÀÌ ÃÖ´ë ÀåÄ¡ ¼öº¸´Ù Å©¸é ¿¡·¯ Ç¥½Ã
if( ( (sbh->b_rsector*VRD_SECTOR_SIZE) + sbh->b_size ) >= VRD_SIZE ) goto fail;
// ó¸®ÇÏ´Â µð¹ÙÀ̽º¿¡ ´ëÇÑ Á¤º¸°¡ ÁöÁ¤µÈ Å©±â¸¦ ÃÊ°úÇÏ¸é ¿¡·¯
/* Memory Pointer */
//pData = vdisk[minor] + (sbh->b_rsector*VRD_SECTOR_SIZE);
// ÀúÀå½Ãų ¸Þ¸ð¸®ÀÇ À§Ä¡¸¦ ¹Þ¾Æ¿È
nFilePointer = sbh->b_rsector*VRD_SECTOR_SIZE;
// µ¥ÀÌÅ͸¦ ó¸®ÇÒ ÆÄÀÏÀÇ À§Ä¡ ¹Þ¾Æ¿È
switch(rw)
{
case READA :
case READ : printk("Read lsk is %d\t",lsk(nFileDesc,nFilePointer, 0));
// disk.dsk ÆÄÀÏ ³»¿¡¼ µ¥ÀÌÅ͸¦ ó¸®ÇÒ À§Ä¡·Î nFilePointer¸¸Å À̵¿
printk("<< Read file Num is %d >>\n",rn(nFileDesc,sbh->b_data , sbh->b_size));
// lseek·Î À̵¿ÇÑ À§Ä¡¿¡¼ b_size ¸¸Å ÀÐ¾î ¿È
//memcpy(sbh->b_data, pData, sbh->b_size); // ¸Þ¸ð¸® ¿µ¿ª¿¡¼ Àоî¿È
break;
case WRITE :
refile_buffer(sbh); // ÇØ´ç ¹öÆÛÀÇ »óŸ¦ È®ÀÎÇؼ LRU¸®½ºÆ®¿¡¼ ¹öÆÛ Çì´õÀÇ Ãß°¡/Á¦°Å ¿©ºÎ¸¦ °áÁ¤
//memcpy(pData, sbh->b_data, sbh->b_size);
printk("Write lsk is %d\t",lsk(nFileDesc,nFilePointer, 0));
printk("<< write file Num is %d >>\n",wn(nFileDesc, sbh->b_data, sbh->b_size));
mark_buffer_uptodate(sbh, 1); // ÇØ´ç ¹öÆÛ°¡ º¯°æ µÇ¾úÀ¸¹Ç·Î ¾÷µ¥ÀÌÆ® Çؾߵȴٰí Ä¿³Î¿¡ ¾Ë¸²
break;
default : goto fail;
}
sbh->b_end_io(sbh,1); //Ä¿³Î¿¡ Á¤»óÀûÀ¸·Î Á¾·á µÇ¾úÀ½À» Å뺸
cls(nFileDesc); // ÆÄÀÏ ´Ý±â
set_fs(old_fs); // ¿ø·¡ »óÅ·Π¼ÂÆÃ
return 0;
fail:
cls(nFileDesc); // ÆÄÀÏ ´Ý±â
set_fs(old_fs); // ¿ø·¡ »óÅ·Π¼ÂÆÃ
buffer_IO_error(sbh); // Ä¿³Î¿¡ ¿äûÀÌ Á¤»óÀûÀ¸·Î 󸮵ÇÁö ¸øÇßÀ½À» Å뺸
return 0;
}
[/code] |
|
À§·Î |
|
![](templates/subSilver/images/spacer.gif) |
|
|
»õ·Î¿î ÁÖÁ¦¸¦ ¿Ã¸± ¼ö ÀÖ½À´Ï´Ù ´ä±ÛÀ» ¿Ã¸± ¼ö ÀÖ½À´Ï´Ù ÁÖÁ¦¸¦ ¼öÁ¤ÇÒ ¼ö ¾ø½À´Ï´Ù ¿Ã¸° ±ÛÀ» »èÁ¦ÇÒ ¼ö ¾ø½À´Ï´Ù ÅõÇ¥¸¦ ÇÒ ¼ö ¾ø½À´Ï´Ù
|
Powered by phpBB © 2001, 2005 phpBB Group
|