HOME > °­ÁÂ >
°­ÁÂ| ¸®´ª½º ¹× ¿ÀǼҽº¿¡ °ü·ÃµÈ °­Á¸¦ º¸½Ç ¼ö ÀÖ½À´Ï´Ù.
 
Step by Step Ä¿³Î ÇÁ·Î±×·¡¹Ö °­Á¨ì
Á¶È¸ : 12,345  


Step by Step Ä¿³Î ÇÁ·Î±×·¡¹Ö °­Á¨ì

ÆÄÀϽýºÅÛ¸¶¿îÆ®

 

À̹ø °­Á´ Áö³­ °­Á¿¡ ÀÌ¾î ÆÄÀϽýºÅÛ ¸¶¿îÆ® °úÁ¤ÀÇ ³ª¸ÓÁö ºÎºÐ¿¡ ´ëÇØ ¾Ë¾Æº¸±â·Î ÇÑ´Ù. ³»¿ë Áß ÀϺδ Áö³­ È£¿Í

°ü·ÃµÇ±â ¶§¹®¿¡ Áö³­ È£¿Í °°ÀÌ ºÁ¾ß ÀÌÇØ°¡ µÉ °ÍÀ̶ó »ý°¢ÇÑ´Ù.

 

±Û _ ±è¹ÎÂù KLDP ¸â¹ö, Àü¹® ÇÁ·Î±×·¡¸Ó

 

¿¬Àç ¼ø¼­

¨ç Ä¿³Î ÇÁ·Î±×·¡¹Ö ȯ°æ ±¸ÃàÇϱâ¿Í Ư¡

¨è ¸ðµâ ±¸ÇöÇϱâ

¨é ¸®´ª½º Ä¿³ÎÀÇ ¸Þ¸ð¸® °ü¸®

¨ê Ä¿³ÎÀÇ µ¿±âÈ­¿¡ °üÇÏ¿©

¨ë ÆÄÀÏ ½Ã½ºÅÛ ¸¶¿îÆ® 1

¨ì ÆÄÀÏ ½Ã½ºÅÛ ¸¶¿îÆ® 2

 

 

alloc_inode ÇÔ¼ö·Î inode ÇÒ´ç

alloc_inode ÇÔ¼ö¸¦ Á» ´õ ÀÚ¼¼È÷ »ìÆìº¸ÀÚ. ÀÌ ÇÔ¼ö´Â ¸®´ª½ºÄ¿³Î¿¡¼­ ¾ÆÁÖ Áß¿äÇÑ ¿ªÇÒÀ» ÇÏ´Â ±¸Á¶Ã¼ Áß ÇϳªÀÎ inode¸¦ ÇÒ´çÇÏ´Â ÇÔ¼öÀÌ´Ù. inode´Â ¸¹Àº Çʵ带 °¡Áö°í ÀÖÀ¸¸ç ÃʱâÈ­ °úÁ¤ ¶ÇÇÑ ±×¸® ¸¸¸¸Ä¡ ¾Ê´Ù. inodeÀÇ Áß¿äÇÑ ¸î¸î Çʵå(address_space,backing_dev_info, host, i_mapping)¸¸À» alloc_inode ÇÔ¼ö¸¦ »ìÆìº¸¸ç °°ÀÌ º¸±â·Î ÇÏÀÚ.

 

 

struct inode {

struct hlist_node i_hash;

struct list_head i_list;

struct list_head i_sb_list;

struct list_head i_dentry;

unsigned long i_ino;

...

uid_t i_uid;

gid_t i_gid;

dev_t i_rdev;

...

unsigned int i_blkbits;

unsigned long i_blksize;

unsigned long i_version;

unsigned long i_blocks;

unsigned short i_bytes;

unsigned char i_sock;

...

struct inode_operations *i_op;

struct file_operations *i_fop; /* former ¡æ i_op¡æ default_file_ops */

struct super_block *i_sb;

struct file_lock *i_flock;

struct address_space *i_mapping;

struct address_space i_data;

...

/* These three should probably be a union */

struct list_head i_devices;

struct pipe_inode_info *i_pipe;

struct block_device *i_bdev;

struct cdev *i_cdev;

...

unsigned long i_state;

unsigned long dirtied_when; /* jiffies of first dirtying*/

unsigned int i_flags;

atomic_t i_writecount;

void *i_security;

union {

void *generic_ip;

} u;

};

ÄÚµå 1. inode ±¸Á¶Ã¼

 

 

alloc_inode ÇÔ¼ö´Â, Àμö·Î ¹ÞÀº superblockÀÇ alloc_inodeÇÔ¼ö Æ÷ÀÎÅͰ¡ Á¤ÀǵŠÀÖ´Ù¸é Á¤ÀÇµÈ ÇÔ¼ö¸¦ È£ÃâÇØ inode¸¦ ÇÒ´ç¹Þ´Â´Ù(ÀÌ°Í ¶ÇÇÑ hookÀÌ´Ù. Ä¿³ÎÀÇ VFS ±¸Á¶´Â ÆÄÀϽÃ

½ºÅÛÀÇ ¸¹Àº À¯¿¬¼ºÀ» Á¦°øÇϱâ À§ÇØ ¸¹Àº hookÀ» Á¦°øÇÑ´Ù).

ÇÏÁö¸¸ rkfs¿¡´Â ÇØ´çÇÔ¼ö°¡ Á¤ÀǵŠÀÖÁö ¾Ê±â ¶§¹®¿¡ Ä¿³ÎÀº inode_cachepÀ» ÅëÇØ inode¸¦ ÇÒ´ç¹Þ´Â´Ù.

 

static struct inode *alloc_inode(struct super_block *sb)

{

static struct address_space_operations empty_aops;

static struct inode_operations empty_iops;

static struct file_operations empty_fops;

struct inode *inode;

if (sb ¡æ s_op ¡æ alloc_inode)

inode = sb ¡æ s_op ¡æ alloc_inode(sb);

else

inode = (struct inode *)kmem_cache_alloc(inode_cachep, SLAB_KERNEL);

 

if (inode) {

struct address_space * const mapping =

&inode ¡æ i_data;

inode ¡æ i_sb = sb;

inode ¡æ i_blkbits = sb->s_blocksize_bits;

inode ¡æ i_flags = 0;

atomic_set(&inode ¡æ i_count, 1);

inode ¡æ i_sock = 0;

inode ¡æ i_op = &empty_iops;

inode ¡æ i_fop = &empty_fops;

inode ¡æ i_nlink = 1;

atomic_set(&inode¡æ i_writecount, 0);

inode ¡æ i_size = 0;

inode ¡æ i_blocks = 0;

inode ¡æ i_bytes = 0;

inode ¡æ i_generation = 0;

#ifdef CONFIG_QUOTA

memset(&inode¡æ i_dquot, 0, sizeof(inode¡æ i_dquot));

#endif

inode ¡æ i_pipe = NULL;

inode ¡æ i_bdev = NULL;

inode ¡æ i_cdev = NULL;

inode ¡æ i_rdev = 0;

inode ¡æ i_security = NULL;

inode ¡æ dirtied_when = 0;

 

if (security_inode_alloc(inode)) {

if (inode ¡æ i_sb ¡æ s_op ¡æ destroy_inode)

inode ¡æ i_sb ¡æs_op ¡æ destroy_inode(inode);

else

kmem_cache_free(inode_cachep, (inode));

return NULL;

}

mapping ¡æ a_ops = &empty_aops;

mapping ¡æ a_ops = &empty_aops;

mapping ¡æ host = inode;

mapping ¡æ flags = 0;

mapping_set_gfp_mask(mapping,GFP_HIGHUSER);

mapping ¡æ assoc_mapping = NULL;

mapping ¡æ backing_dev_info = &default_backing_dev_info;

/*

* If the block_device provides a backing_dev_info for client

* inodes then use that. Otherwise the inode share the bdev's * backing_dev_info.

*/

if (sb ¡æ s_bdev) {

struct backing_dev_info *bdi;

bdi = sb ¡æ s_bdev¡æ bd_inode_backing_dev_info;

if (!bdi)

bdi = sb ¡æ s_bdev ¡æ bd_inod ¡æ i_mapping ¡æ backing_dev_info;

mapping ¡æ backing_dev_info = bdi;

}

memset(&inode ¡æ u, 0, sizeof(inode ¡æ u));

inode ¡æ i_mapping = mapping;

}

return inode;

}

ÄÚµå 2. alloc_inde ÇÔ¼ö

 

À§ÀÇ ÇÔ¼ö¿¡¼­ address_space´Â page cache¸¦ ±¸ÇöÇÏ´Â, ¾ÆÁÖ Áß¿äÇÑ ¿ªÇÒÀ» ÇÏ´Â ±¸Á¶Ã¼ÀÌ´Ù.

¶ÇÇÑ ½ÇÁ¦·Î ÆÄÀϽýºÅÛ¿¡¼­ ºí·ÏÀ» Àбâ À§ÇÑ ±â´ÉÀ» ±¸ÇöÇÏ ´Â address_space_operations ±¸Á¶Ã¼¸¦ Æ÷ÇÔÇϱ⵵ ÇÑ´Ù. ÆÄÀÏÀ» Àбâ À§ÇÑ ÇÔ¼ö Å×À̺í Çʵå·Î´Â inode_operations ±¸Á¶

üÀÎ i_op¿Í file_operations ±¸Á¶Ã¼ÀÎ i_fop°¡ ÀÖ´Ù. inode_operations ±¸Á¶Ã¼´Â ÆÄÀϰú °ü·ÃµÈ inode¸¦ ¸¸µé°í »èÁ¦ÇÏ´Â µîÀÇ ¿ªÇÒÀ» ÇÏ´Â inode °ü·Ã ÇÔ¼öµéÀÇ ¸ðÀ½ÀÌ´Ù.

¹Ý¸é, file_operations ±¸Á¶Ã¼´Â ÀÀ¿ë ÇÁ·Î±×·¡¸ÓµéÀÌ ÀϹÝÀûÀ¸·Î »ç¿ëÇÏ´Â open, read, write, close, ioctl, mmap µî°ú ¿¬°üµÇ´Â ÇÔ¼öÀÌ´Ù.

ÀϹÝÀûÀ¸·Î file_operationsÀÇ ÇÔ¼öµéÀº ÃÖÁ¾ÀûÀ¸·Î address_space_operationsÀÇ ÇÔ¼öµéÀ» È£ÃâÇØ ½ÇÁ¦ÀûÀ¸·Î block device¿¡¼­ ÆäÀÌÁöµéÀ» ÀÐ°Ô µÈ´Ù.

 

 

read-ahead ¸ÞÄ¿´ÏÁò Ȱ¿ë

´ÙÀ½À¸·Î backing_dev_info Çʵå´Â read-ahead¿Í °ü·ÃµÈ Á¤º¸¸¦ ÀúÀåÇÏ´Â ÇʵåÀÌ´Ù.

¸®´ª½º´Â disk-based filesystemÀ» ÀϹÝÀûÀ¸·Î »ç¿ëÇØ¿Ô´Ù. Áö±Ýó·³ nand memory¸¦ ÀúÀå ÀåÄ¡·Î »ç¿ëÇÏ´Â ÀÓº£µðµå ¸®´ª½º°¡ º¸ÆíÈ­µÇ±â Àü±îÁö¸¸ ÇØµµ ±×·¨´Ù. µû¶ó¼­ ¸®´ª½º Ä¿³ÎÀº read-ahead ¸ÞÄ¿´ÏÁòÀ» »ç¿ëÇØ ÆÄÀϽýºÅÛ ¼º´ÉÀ» °³¼±Çß´Ù.

disk-based ÀúÀå ÀåÄ¡´Â ƯÁ¤ ¼½Å͸¦ ã±â À§ÇØ Çì´õ¿Í ½Ç¸° ´õ¸¦ À̵¿ÇؾßÇϰí, µû¶ó¼­ ±× ¼Óµµ°¡ ¼½Å͸¦ Àаųª ¾²´Â °Í¿¡ ºñÇØ ÇöÀúÈ÷ ´À¸®´Ù. ¶§¹®¿¡ ÇÑ ¼½Å͸¦ ÀÐÀ» ¶§ ÀÎÁ¢ÇÑ ¼½Å͵éÀ» ¹Ì¸® ÀоîµÖ ÆäÀÌÁö ij½Ã¿¡ ÀúÀåÇØ ³õ´Â ±â¼ú Áï, readahead ±â¼úÀ» Ȱ¿ëÇß´Ù.

À̴ ƯÁ¤ ÇÁ·Î±×·¥ÀÌ Æ¯Á¤ ¼½Å͸¦ ÇÊ¿ä·Î ÇÑ´Ù¸é Á¶¸¸°£ ÀÎÁ¢ÇÑ ´Ù¸¥ ¼½Å͵µ ÇÊ¿ä·Î ÇÒ È®·üÀÌ ³ôÀ» °ÍÀ̶ó´Â ³«°ü·ÐÀû ¹æ¹ý¿¡¼­ ½ÃÀ۵ƴÙ. ÇÏÁö¸¸ nand¿Í °°ÀÌ seek timeÀÌ °ÅÀÇ

µéÁö ¾Ê´Â ÀúÀåÀåÄ¡¸¦ »ç¿ëÇÒ ¶§ read-ahead°¡ ÁÖ´Â ÀåÁ¡Àº ¸¹ÀÌ ÁÙ¾îµé¸ç ½ÉÁö¾î´Â ºÎÆÃŸÀÓ¿¡ ½Ã°£À» Àâ¾Æ¸Ô´Â ¿ä¼Ò·Î ÀÛ¿ëÇϱ⵵ ÇÑ´Ù.

read-ahead¿Í °ü·ÃµÈ ÀÛ¾÷Àº inode¸¦ óÀ½ ÇÒ´çÇÒ ¶§ ½ÃÀÛ µÈ´Ù. ¸ÕÀú default_backing_dev_infoÀÇ Àü¿ª º¯¼öÀÇ ÁÖ¼Ò¸¦ address_spaceÀÇ backing_dev_info¿¡ ÀúÀåÇÑ´Ù. ÇÏÁö¸¸ inode¸¦ ÇÒ´çÇÏ´Â super blockÀÌ block device¿Í °ü·ÃµÅÀÖ°í, block device driver°¡ bd_inode_backing_dev_info Çʵ带 °¡Áö°í ÀÖ´Ù¸é ÇØ´ç block deviceÀÇ bd_inode_

backing_dev_info Çʵ带 address_spaceÀÇ backing_dev_info Çʵå·Î ÃʱâÈ­ÇÑ´Ù. Áï default actionÀ» overriding ÇÑ´Ù°í »ý°¢ÇÏ¸é µÈ´Ù.

´ÙÀ½À¸·Î address_spaceÀÇ host Çʵå´Â ÇØ´ç address_space¿Í °ü·ÃµÈ inode¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀÌ´Ù. ¸¶Áö¸·À¸·Î ÇöÀç i_mapping Çʵå´Â address_space ÀÚ±â ÀÚ½ÅÀ» °¡¸®Å²´Ù.

ÇÏÁö¸¸ ¹Ù²ð ¼öµµ ÀÖ´Ù. ±×·³ Áö±Ý±îÁö rfks_fill_super¿¡¼­ igetÀ» È£ÃâÇÑ ÈÄ iget_locked±îÁö È£ÃâÇÑ ½ÃÁ¡¿¡¼­ÀÇ ÀÚ·á ±¸Á¶´Â ´ÙÀ½°ú °°´Ù.

 

 

 

Äڵ忡¼­ inode°¡ inode cache¿¡¼­ ¹ß°ßµÇÁö ¾Ê¾Æ »õ·Ó°Ô ÇÒ´çµÈ °ÍÀ̶ó¸é sbÀÇ read_inode ÇÔ¼ö¸¦ È£ÃâÇØ inodeÀÇ Çʵå Áß ¸î¸îÀ» ä¿î´Ù.

rkfs¿¡´Â rkfs_super_read_inode ÇÔ¼ö°¡ Á¤ÀǵŠÀÖÀ¸¹Ç·Î ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ°Ô µÈ´Ù. superblock operation ÀÌ ÇÔ¼ö´Â ¹Ýµå½Ã ÃʱâÈ­µÅ ÀÖ¾î¾ß¸¸ ÇÑ´Ù. rkfsÀÇ rkfs_super_read_inode ÇÔ¼ö´Â °£´ÜÇÏ´Ù. inodeÀÇ i_mtime, i_atime, i_ctimeº¯¼ö¸¦ CURRENT_TIMEÀ¸·Î ÃʱâÈ­Çϰí inodeÀÇ address_spaceÀÇ a_ops Çʵ带 rkfs_apos

·Î ÁöÁ¤ÇÑ´Ù.

À̰ÍÀº address_space_operationÀ¸·Î ÆÄÀϽýºÅÛ¿¡¼­ ½ÇÁ¦ÀûÀ¸·Î block device driver¿Í interfaceÇÏ´Â ÇÔ¼öÀÌ´Ù(»ç½Çdirect·Î block device driver¿Í file systemÀÌ Åë½ÅÇÏÁö ¸ø

ÇÑ´Ù. User ¿µ¿ª°ú ÆÄÀÏ ½Ã½ºÅÛ »çÀÌ¿¡ VFS°¡ ÀÖ´Â °Íó·³ ÆÄÀÏ ½Ã½ºÅÛ°ú block device driver »çÀÌ¿¡´Â ¿©·¯ block deviceµéÀ» Ãß»óÈ­ÇÑ generic block device layer°¡ ¶Ç ÀÖ´Ù). ÀÌ ±¸Á¶Ã¼

´Â ´ÙÀ½°ú °°ÀÌ ÃʱâÈ­µÅÀÖ´Ù.

 

static struct address_space_operations rkfs_aops = {

.readpage = rkfs_readpage,

.writepage = rkfs_writepage,

.prepare_write = rkfs_prepare_write,

.commit_write = rkfs_commit_write

}

ÄÚµå 3. rkfsÀÇ address_space_operations

 

ÀÌ ÇÔ¼öµéÀº sys_read°ú sys_write°¡ È£ÃâµÇ¾úÀ» ¶§, ¶Ç´Â demand paging¿¡ ÀÇÇØ ÇÁ·Î¼¼½º ÆäÀÌÁö Å×ÀÌºí¿¡ ¸ÅÇ뵃 ¶§ ½ÇÁ¦·Î »ç¿ëµÇ¸ç disk ÀåÄ¡¿¡°Ô ¸í·ÉÀ» ³»¸®´Â ÇÔ¼öÀÌ´Ù(ÀåÄ¡

¿¡°Ô ¹Ù·Î ¸í·ÉÇÏ´Â °ÍÀº ¾Æ´Ï°í General Block Device Layer¿¡°Ô ¸í·ÉÀ» ³»¸°´Ù).

getÀ» È£ÃâÇß´ø rkfs_fill_super(Áö³­ È£ ÂüÁ¶) ÇÔ¼ö·Î ´Ù½Ã µ¹¾Æ°¡ º¸ÀÚ. igetÀ» ÅëÇØ¼­ ÇÒ´ç¹ÞÀº inode´Â file systemÀÇ root inodeÀÌ´Ù. inodeÀÇ ³ª¸ÓÁö Çʵå Áß Áß¿ä ÇÊµå ¸î¸îÀ» ä¿î´Ù.

 

rkfs_root_inode ¡æ i_op = &rkfs_iops; //

set the inode ops

rkfs_root_inode ¡æ i_mode = S_IFDIR|S_IRWXU;

rkfs_root_inode ¡æ i_fop = &rkfs_fops;

À§¿¡¼­ Áß¿äÇÑ Çʵå´Â i_ip¿Í i_fop¸¦ ä¿ì´Â °ÍÀÌ´Ù. ÀÌ Å×À̺íµéÀº ¾ÕÀ¸·Î ÆÄÀÏ¿¡ °ü·ÃµÈ operationµéÀ» ó¸®ÇÒ ¶§ »ç¿ëµÇ°Ô µÉ °ÍÀÌ´Ù. ÀÌ Å×À̺íµéÀº °¢°¢ ´ÙÀ½°ú °°´Ù.

 

static struct inode_operations rkfs_iops = {

lookup: rkfs_inode_lookup

}

static struct file_operations rkfs_fops = {

open: rkfs_file_open,

read: &generic_file_read,

readdir: &rkfs_file_readdir,

write: &generic_file_write,

release: &rkfs_file_release,

fsync: simple_sync_file

}

ÄÚµå 4. rkfsÀÇ inode_operations¿Í file_operations

 

 

superblockÀÇ root dentry ÇÒ´ç °úÁ¤

Áö±Ý±îÁö superblockÀ» ÇÒ´çÇÒ ¶§ Ä¿³ÎÀ» hookÇϱâ À§ÇÑ rkfs_fill_super ÇÔ¼öÀÇ Ã¹ ¹øÂ° phase¸¦ »ìÆìº¸¾Ò´Ù. ´ÙÀ½Àº superblockÀÇ root dentry¸¦ ÇÒ´çÇÏ´Â °úÁ¤ÀÌ´Ù. ÀÌ °úÁ¤Àº

d_alloc_root ÇÔ¼ö¸¦ ÅëÇØ ÀÌ·ïÁø´Ù.

 

struct dentry * d_alloc_root(struct inode * root_inode)

{

struct dentry *res = NULL;

if (root_inode) {

static const struct qstr name = { .name = "/",.len = 1 };

res = d_alloc(NULL, &name);

if (res) {

res ¡æ d_sb = root_inode ¡æ i_sb;

res ¡æ d_parent = res;

d_instantiate(res, root_inode);

}

}

return res;

}

ÄÚµå 5. d_alloc_root

 

d_alloc_root ÇÔ¼ö´Â root dentry¸¦ ÇÒ´çÇÑ´Ù. ±×·¯±â À§Çؼ­ ¸ÕÀú qstr ±¸Á¶Ã¼¸¦¡°¡°/¡±¡±·Î ÃʱâÈ­ÇÑ ÈÄ d_allocÀ» È£ÃâÇÑ´Ù. ÀÌ ÇÔ¼ö´Â dcache¿¡¼­ dentry¸¦ ÇÒ´çÇÑ ÈÄ ¿©·¯ ÇʵåµéÀ» ÃÊ

±âÈ­ÇØ ¹ÝȯÇÑ´Ù. ÇÒ´ç¹ÞÀº dentry¿¡ parent(parent´Â ¾Æ±Ô¸ÕÆ®·Î ÆÐ½ºµÈ´Ù)°¡ ÀÖ´Ù¸é parentÀÇ d_subdirs ¸®½ºÆ®¿¡ dentry ¡æ d_child ¸¦ ÀÌ¿ëÇØ ¿¬°áÇÑ´Ù.

´ÙÀ½ ÇÒ´ç¹ÞÀº dentry¸¦ ´ÙÀ½°ú °°ÀÌ sb¿Í ¿¬°áÇÑ´Ù. ÇÏÁö¸¸ Áö±ÝÀº a_alloc_root ÇÔ¼öÀ̱⠶§¹®¿¡ parent´Â ¾ø´Ù. ÇÔ¼öÀ̸§À» º¸¶ó. root ¾Æ´Ñ°¡? ±×·¯¹Ç·Î res ¡æ d_parent¸¦ ÀÚ±â ÀÚ½ÅÀ¸·Î ÁöÁ¤ÇÑ ÈÄ d_instantiate ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

d_instantiate ÇÔ¼ö´Â dentry¸¦ À§ÇÑ inode Á¤º¸¸¦ ä¿ì´Â ÇÔ¼öÀÌ´Ù.

ÀÌ ÇÔ¼ö°¡ È£ÃâµÉ ¶§ ¹Ýµå½Ã dentryÀÇ d_alias´Â ºñ¾îÀÖ¾î¾ß¸¸ ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â inodeÀÇ i_dentry ¿¬°á¸®½ºÆ®¿¡ entry ¡æd_alias¸¦ ¿¬°áÇÑ´Ù. ±×·± ÈÄ dentryÀÇ d_inode Çʵ带 inode

·Î ÁöÁ¤ÇÑ´Ù.

 

 

 

ÀÌ·¸°Ô ÇØ¼­ get_sb_single ÇÔ¼ö°¡ È£ÃâÇÑ getsÀÎ rfks_get_sb ÇÔ¼ö°¡ ¿Ï·áµÈ´Ù. ÀÌÁ¦´Â get_sb_single ÇÔ¼öÀÇ ¸¶¹«¸®ÀÌ´Ù.

sgetÀ» ÅëÇØ ÇÒ´ç¹ÞÀº superblockÀÇ s_flags¿¡ MS_ACTIVE Ç÷¡±×¸¦ addÇϰí do_remount_sb¸¦ È£ÃâÇÑ´Ù .

do_remount_sb ÇÔ¼ö´Â ¼³¸íÇÏÁö ¾Ê´Â´Ù.

À̹ø¿¡´Â get_sb¸¦ È£ÃâÇß´ø do_kern_mount·Î µ¹¾Æ°¡ÀÚ.

alloc_vfsmnt¸¦ ÅëÇØ¼­ ÇÒ´ç¹ÞÀº vfsmountÀÇ ±¸Á¶Ã¼¿¡ ³ª¸ÓÁö ÇʵåµéÀ» ´ÙÀ½°ú °°ÀÌ Ã¤¿î´Ù.

 

mnt ¡æ mnt_sb = sb;

mnt ¡æ mnt_root = dget(sb ¡æ s_root);

mnt ¡æ mnt_mountpoint = sb ¡æ s_root;

mnt ¡æ mnt_parent = mnt;

mnt ¡æ mnt_namespace = current ¡æ namespace;

ÄÚµå 6. do_kern_mount ÇÔ¼öÀÇ iget ´ÙÀ½ ºÎºÐ

 

do_kern_mount¸¦ È£ÃâÇß´ø do_new_mount ÇÔ¼ö·Î µ¹¾Æ°¡¼­ do_add_mount¸¦ namespaceÀÇ mount tree¿¡ »õ·Î¿î vfsmount¸¦ ³Ö´Â´Ù.

 

ÀÌ·¸°Ô ÇØ¼­ ÆÄÀϽýºÅÛ ¸¶¿îÆ®¿¡ °üÇØ 2ȸ ¿¬¼ÓÀ¸·Î ÀÚ¼¼È÷ ¾Ë¾Æº¸¾Ò´Ù. ³Ê¹« ±¸Ã¼ÀûÀ¸·Î µé¾î°¡ ´Ù¼Ò ¾î·Á¿ï ¼öµµ ÀÖ°í, ÇÊÀÚÀÇ ¼³¸íÀÌ ºÎÁ·ÇØ ÀÌÇØÇϱâ Èûµé ¼ö ÀÖÀ» °ÍÀ̶ó »ý°¢ÇÑ´Ù. ÆÄÀϽýºÅÛÀº Ä¿³Î¿¡¼­ ¸Å¿ì º¹ÀâÇÑ ºÎºÐ Áß ÇϳªÀÌ´Ù. ÇÊÀÚ´Â °³ÀÎÀûÀ¸·Î ¸®´ª½º Ä¿³Î¿¡ Á¤¸» °ü½ÉÀÌ ÀÖ°í ÀÌÁ¦ ¿î¿µÃ¼Á¦¸¦ °øºÎÇϱ⠽ÃÀÛÇÏ·Á´Â ºÐµé¿¡°Ô ÆÄÀϽýºÅÛ°ú ¸Þ¸ð¸® °ü¸®½Ã½ºÅÛÀ» °øºÎÇØº¸¶ó°í ÃßõÇÏ°í ½Í´Ù. ÀÌ ºÎºÐµéÀº »ó´çÈ÷ º¹ÀâÇϸ鼭µµ µµÀüÇØº¼¸¸ÇÑ °¡Ä¡°¡ ÀÖ´Â ¸Å¿ì Èï¹Ì·Î¿î ºÎºÐÀ̱⠶§¹®ÀÌ´Ù

 

 

 

 

Ãâó : °ø°³ SW ¸®Æ÷Æ® 12È£ ÆäÀÌÁö 56 ~ 61 ¹ßÃé(2008³â 5¿ù) - Çѱ¹¼ÒÇÁÆ®¿þ¾î ÁøÈï¿ø °ø°³SW»ç¾÷ÆÀ ¹ß°£

 


[¿ø±Û¸µÅ©] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1644


ÀÌ ±ÛÀ» Æ®À§ÅÍ·Î º¸³»±â ÀÌ ±ÛÀ» ÆäÀ̽ººÏÀ¸·Î º¸³»±â ÀÌ ±ÛÀ» ¹ÌÅõµ¥ÀÌ·Î º¸³»±â

 
Çѱ¹¼ÒÇÁÆ®¿þ¾îÁøÈï¿ø °ø°³SW»ç¾÷ÆÀ