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¸¦ ÀúÀå ÀåÄ¡·Î »ç¿ëÇÏ´Â ÀÓº£µðµå ¸®´ª½º°¡ º¸ÆíȵDZâ Àü±îÁö¸¸ ÇØµµ ±×·¨´Ù. µû¶ó¼ ¸®´ª½º Ä¿³ÎÀº 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»ç¾÷ÆÀ ¹ß°£