精华内容
下载资源
问答
  • ubuntu 16.04 rootfs

    2020-10-02 21:54:45
    一个Xvfb的ubuntu 16.04的rootfs,可用于在无X server且无root权限的服务器上运行GUI应用。
  • 使用它,您可以组合一个简单的工作流程来配置和构建 rootfs。 正如您在示例目录中看到的,Dockerfile 用于使用配置文件创建 buildroot。 Makefile 为您提供主要的工作流程任务。 config任务只是在 rootbuild 中...
  • rootfs构建.
  • 制作debian的rootfs

    2019-08-26 14:09:42
    # included in all copies or substantial portions of the Software. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF...
  • rootfs的制作.docx

    2021-07-26 14:45:22
    rootfs的制作 1 1) 创建dev/ sys/ etc/ root/ home/ proc/ tmp/等文件夹 2 2) 创建设备文件 2 3) 设置init启动配置信息。 3 1) 配置profile文件设置用户登录后的执行脚本。 4 2) 自定义主机名 5 3) 设置用户名...
  • https://blog.csdn.net/zhangyzh656/article/details/82869103根文件系统文件
  • 本文件主要是构建好的带桌面的Ubuntu18.04根文件系统,里面相关的工具都已经安装,可直接烧录到开发板使用。分享给大家使用。
  • 一直对linux启动时挂载根文件系统的过程存在着很多疑问,今天在水木精华区找到了有用的资料,摘录如下:  1、Linux启动时,经过一系列初始化之后,需要mount 根文件系统,为最后运行init进程等做准备,mount 根...
  • rootfs_qtopia_qt4-20141213.tar.gz Qt4跟文件系统,适用于Tiny4412开发板。
  • hiddon a undetectiable way to hide rootfs only a poc, test success on iphonex(ios 13.5.1), odyssey jailbreak wechat pay work fine 总结一下这段时间对于越狱隐藏的研究: 这 hiddon a undetectiable way to ...
  • rootfs构建 用于测试的rootfs-build,输出debian映像。 配置板开发信息,例如。 参见board-config-info.shh 将用户文件复制到覆盖文件夹 源board-config-info.shh ./download_rootfs.sh ./create-rootfs.sh例如...
  • rootfs.tar.bz2文件系统

    2018-06-18 17:59:05
    rootfs.tar.bz2文件系统, 已经制作好的,可以直接进行打包
  • rootfs.tar

    2020-07-13 10:46:20
    此处为华清远见中配置好的rootfs根文件系统,可以直接使用 linux下执行tar -xvf rootfs.tar即可进行解压安装
  • Proot最新版本(v5.2.0-alpha-8c0ccf7d)和一个脚本在amd64上运行Ubuntu的rootfs 可以从以下位置下载Ubuntu Rootfs映像: 当您解压缩rootfs.tar.xz .... ./proot --link2symlink tar -xpf ubuntu.tar.xz -C ...
  • iPhone-RootFS工具 这个工具有什么作用? iPhone-rootFS-Tool会将iOS设备根目录的所有目录和文件传输到您的计算机。 这可能发生在您的iOS设备首次解锁(BFU)之前或之后(AFU)。 要求 可以使用越狱的iOS设备。 ...
  • rootfs-brmin.tar.gz

    2019-09-03 14:43:22
    荔枝派Zero(V3s)制作SPI Flash 系统镜像时使用的最小根文件系统
  • rootfs

    千次阅读 2017-01-20 14:19:58
    rootfs仅仅是符合VFS规范的而且又具有如上3个特点的一个文件系统 说明:本文基于Linux2.6.29内核分析;其他内核版本仅供参考。 Android2.3及Linux2.6.29内核模拟器版本编译与调试  前边通过源码情景分析,看...

    rootfs仅仅是符合VFS规范的而且又具有如上3个特点的一个文件系统


    说明:本文基于Linux2.6.29内核分析;其他内核版本仅供参考。

    Android2.3及Linux2.6.29内核模拟器版本编译与调试

      前边通过源码情景分析,看过了总线、设备、驱动及其发现机制,Linux2.6内核udev设备节点创建相关;对于文件系统,一直望而生畏,但内核学习、这部分又不可能绕的过去。目前对VFS中使用的hash表还未做研究,它在dentry和vfsmount下查找节点起关键作用;后边在做分析。下边将根文件系统挂载过程做简单分析:

    一、rootfs的诞生

    引子:

    Linux一切皆文件的提出:在Linux中,普通文件、目录、字符设备、块设备、套接字等都以文件被对待;他们具体的类型及其操作不同,但需要向上层提供统一的操作接口。

    虚拟文件系统VFS就是Linux内核中的一个软件层,向上给用户空间程序提供文件系统操作接口;向下允许不同的文件系统共存。所以,所有实际文件系统都必须实现VFS的结构封装。

    矛盾的提出:

    Linux系统中任何文件系统的挂载必须满足两个条件:挂载点和文件系统。

    直接挂载nfs或flash文件系统有如下两个问题必须解决:

    1.谁来提供挂载点?我们可以想象自己创建一个超级块(包含目录项和i节点),这时挂载点不是就有了吗;很可惜,linux引入VFS(一切皆文件,所有类型文件系统必须提供一个VFS的软件层、以向上层提供统一接口)后该问题不能这么解决,因为挂载点必须关联到文件系统、也就是说挂载点必须属于某个文件系统。

    2.怎样访问到nfs或flash上的文件系统?我们可以说直接访问设备驱动读取其上边的文件系统(设备上的文件系统是挂载在自己的根目录),不就可以了吗;别忘了还是Linux的VFS,设备访问也不例外。因为访问设备还是需要通过文件系统来访问它的挂载点,不能直接访问(要满足Linux的VFS架构,一切皆文件)。

    所以,一句话:rootfs之所以存在,是因为需要在VFS机制下给系统提供最原始的挂载点。

    如此矛盾,需要我们引入一种特殊文件系统:

    1.它是系统自己创建并加载的第一个文件系统;该文件系统的挂载点就是它自己的根目录项。

    2.该文件系统不能存在于nfs或flash上,因为如此将会陷入之前的矛盾。

    rootfs的诞生:

    上述问题需要我们创建具有如下三个特点的特殊文件系统:

    1.它是系统自己创建并加载的第一个文件系统;

    2.该文件系统的挂载点就是它自己的根目录项对象;

    3.该文件系统仅仅存在于内存中。

      由以上分析可以看出,rootfs是Linux的VFS(一切皆文件,所有类型文件系统必须提供一个VFS的软件层、以向上层提供统一接口)存在的基石;二者关系密切。如果没有VFS机制,rootfs也就没有存在的必要;同样,如果没有rootfs、VFS机制也就不能实现。

      这就是两者之间的真正关系,之前看网上什么说法都有:有的只说关系密切,没有指明具体关系;有的干脆误人子弟,说VFS就是rootfs。

      其实,VFS是一种机制、是Linux下每一种文件系统(包括刚才说的rootfs,还有常见的ext3、yaffs等)都必须按照这个机制去实现的一种规范;而rootfs仅仅是符合VFS规范的而且又具有如上3个特点的一个文件系统。

      VFS是Linux文件系统实现必须遵循的一种机制,rootfs是一种具体实现的文件系统、Linux下所有文件系统的实现都必须符合VFS的机制(符合VFS的接口);这就是二者的真正关系。

    以下分析基于Android模拟器Linux2.6.29内核:

    二、相关数据结构

    Linux内核中current指针作为全局变量,使用非常广泛;例如:进程上下文中获取当前进程ID、任务调度,以及open等文件系统调用中路径搜索等;首先介绍下current结构体:

    各个平台、各个内核版本中current的实现可能不同;但原理是一样的。该指针一般定义在具体平台的current.h头文件中,类型为struct task_struct:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. #define current (get_current())  
    2. static inline struct task_struct *get_current(void)  

    include/linux/sched.h

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. struct task_struct {  
    2.   ......  
    3.   struct thread_info *thread_info;  
    4.   struct list_head tasks;  
    5.   pid_t pid;  
    6.   pid_t tgid;  
    7.   uid_t uid,euid,suid,fsuid;  
    8.   gid_t gid,egid,sgid,fsgid;  
    9.   struct fs_struct *fs;  //本节将大量使用这个  
    10.   struct files_struct *files;  
    11.   ......  
    12. }  

    1.文件系统注册

    kernel/include/include/fs.h

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. struct file_system_type {  
    2.   const char *name; //文件系统名字;如:rootfs及ext3等  
    3.   int fs_flags;  
    4.   int (*get_sb) (struct file_system_type *, intconst char *, void *, struct vfsmount *);  
    5.   //安装/挂载文件系统时,会调用;获取超级块。  
    6.   void (*kill_sb) (struct super_block *);  
    7.   //卸载文件系统时会调用。  
    8.   struct module *owner;  
    9.   struct file_system_type * next;  
    10.   //指向下一个文件系统类型。  
    11.   struct list_head fs_supers;  
    12.   //同一个文件系统类型中所有超级块组成双向链表。  
    13.   struct lock_class_key s_lock_key;  
    14.   struct lock_class_key s_umount_key;  
    15.   
    16.   struct lock_class_key i_lock_key;  
    17.   struct lock_class_key i_mutex_key;  
    18.   struct lock_class_key i_mutex_dir_key;  
    19.   struct lock_class_key i_alloc_sem_key;  
    20. };  

    2.文件系统挂载vfsmount(struct vfsmount):

      本质上,mount操作的过程就是新建一个vfsmount结构,然后将此结构和挂载点(目录项对象)关联。关联之后,目录查找时就能沿着vfsmount挂载点一级级向下查找文件了。
    对于每一个mount的文件系统,都由一个vfsmount实例来表示。

    kernel/include/linux/mount.h

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. struct vfsmount {  
    2.   struct list_head mnt_hash; //内核通过哈希表对vfsmount进行管理  
    3.   struct vfsmount *mnt_parent;  //指向父文件系统对应的vfsmount  
    4.   struct dentry *mnt_mountpoint; //指向该文件系统挂载点对应的目录项对象dentry  
    5.   struct dentry *mnt_root; //该文件系统对应的设备根目录dentry  
    6.   struct super_block *mnt_sb; //指向该文件系统对应的超级块  
    7.   struct list_head mnt_mounts;   
    8.   struct list_head mnt_child;  //同一个父文件系统中的所有子文件系统通过该字段链接成双联表  
    9.   int mnt_flags;  
    10.   /* 4 bytes hole on 64bits arches */  
    11.   const char *mnt_devname;  /* Name of device e.g. /dev/dsk/hda1 */  
    12.   struct list_head mnt_list;  //所有已挂载文件系统的vfsmount结构通过该字段链接在一起  
    13.   struct list_head mnt_expire;  /* link in fs-specific expiry list */  
    14.   struct list_head mnt_share;   /* circular list of shared mounts */  
    15.   struct list_head mnt_slave_list;/* list of slave mounts */  
    16.   struct list_head mnt_slave;   /* slave list entry */  
    17.   struct vfsmount *mnt_master;  /* slave is on master->mnt_slave_list */  
    18.   struct mnt_namespace *mnt_ns; /* containing namespace */  
    19.   int mnt_id;           /* mount identifier */  
    20.   int mnt_group_id;     /* peer group identifier */  
    21.   /* 
    22.   * We put mnt_count & mnt_expiry_mark at the end of struct vfsmount 
    23.   * to let these frequently modified fields in a separate cache line 
    24.   * (so that reads of mnt_flags wont ping-pong on SMP machines) 
    25.   */  
    26.   atomic_t mnt_count;  
    27.   int mnt_expiry_mark;      /* true if marked for expiry */  
    28.   int mnt_pinned;  
    29.   int mnt_ghosts;  
    30.   /* 
    31.   * This value is not stable unless all of the mnt_writers[] spinlocks 
    32.   * are held, and all mnt_writer[]s on this mount have 0 as their ->count 
    33.   */  
    34.   atomic_t __mnt_writers;  
    35. };  

    3.超级块(struct super_bloc):

    kernel/include/linux/fs.h

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. struct super_block {  
    2.   struct list_head  s_list;     /* Keep this first */  
    3.   dev_t         s_dev;      /* search index; _not_ kdev_t */  
    4.   unsigned long     s_blocksize;  
    5.   unsigned char     s_blocksize_bits;  
    6.   unsigned char     s_dirt;  
    7.   unsigned long long    s_maxbytes; /* Max file size */  
    8.   struct file_system_type   *s_type; //文件系统类型  
    9.   //(kernel/include/linux/fs.h,struct file_system_type)  
    10.   const struct super_operations *s_op;  
    11.   struct dquot_operations   *dq_op;  
    12.   struct quotactl_ops   *s_qcop;  
    13.   const struct export_operations *s_export_op;  
    14.   unsigned long     s_flags;  
    15.   unsigned long     s_magic;  
    16.   struct dentry     *s_root;  //超级块要指向目录项对象  
    17.   struct rw_semaphore   s_umount;  
    18.   struct mutex      s_lock;  
    19.   int           s_count;  
    20.   int           s_need_sync_fs;  
    21.   atomic_t      s_active;  
    22. #ifdef CONFIG_SECURITY  
    23.   void                    *s_security;  
    24. #endif  
    25.   struct xattr_handler  **s_xattr;  
    26.   
    27.   struct list_head  s_inodes;   /* all inodes */  
    28.   struct list_head  s_dirty;    /* dirty inodes */  
    29.   struct list_head  s_io;       /* parked for writeback */  
    30.   struct list_head  s_more_io;  /* parked for more writeback */  
    31.   struct hlist_head s_anon;//哈希表头       /* anonymous dentries for (nfs) exporting */  
    32.   struct list_head  s_files;  
    33.   /* s_dentry_lru and s_nr_dentry_unused are protected by dcache_lock */  
    34.   struct list_head  s_dentry_lru;   /* unused dentry lru */  
    35.   int           s_nr_dentry_unused; /* # of dentry on lru */  
    36.   
    37.   struct block_device   *s_bdev;  
    38.   struct mtd_info       *s_mtd;  
    39.   struct list_head  s_instances;  
    40.   struct quota_info s_dquot;    /* Diskquota specific options */  
    41.   
    42.   int           s_frozen;  
    43.   wait_queue_head_t s_wait_unfrozen;  
    44.   
    45.   char s_id[32];                /* Informational name */  
    46.   
    47.   void          *s_fs_info; /* Filesystem private info */  
    48.   fmode_t           s_mode;  
    49.   
    50.   /* 
    51.   * The next field is for VFS *only*. No filesystems have any business 
    52.   * even looking at it. You had been warned. 
    53.   */  
    54.   struct mutex s_vfs_rename_mutex;  /* Kludge */  
    55.   
    56.   /* Granularity of c/m/atime in ns.Cannot be worse than a second */  
    57.   u32          s_time_gran;  
    58.   
    59.   /* 
    60.   * Filesystem subtype.  If non-empty the filesystem type field 
    61.   * in /proc/mounts will be "type.subtype" 
    62.   */  
    63.   char *s_subtype;  
    64.   
    65.   /* 
    66.   * Saved mount options for lazy filesystems using 
    67.   * generic_show_options() 
    68.   */  
    69.   char *s_options;  
    70.   
    71.   /* 
    72.   * storage for asynchronous operations 
    73.   */  
    74.   struct list_head s_async_list;  
    75. };  

    4.目录索引节点(struct inode):

    kernel/include/linux/fs.h

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. struct inode {  
    2.   struct hlist_node i_hash; //哈希表节点  
    3.   struct list_head  i_list;  
    4.   struct list_head  i_sb_list;  
    5.   struct list_head  i_dentry;  
    6.   unsigned long     i_ino;  
    7.   atomic_t      i_count;  
    8.   unsigned int      i_nlink;  
    9.   uid_t         i_uid;  
    10.   gid_t         i_gid;  
    11.   dev_t         i_rdev;  
    12.   u64           i_version;  
    13.   loff_t            i_size;  
    14. #ifdef __NEED_I_SIZE_ORDERED  
    15.   seqcount_t        i_size_seqcount;  
    16. #endif  
    17.   struct timespec       i_atime;  
    18.   struct timespec       i_mtime;  
    19.   struct timespec       i_ctime;  
    20.   unsigned int      i_blkbits;  
    21.   blkcnt_t      i_blocks;  
    22.   unsigned short          i_bytes;  
    23.   umode_t           i_mode;  
    24.   spinlock_t        i_lock; /* i_blocks, i_bytes, maybe i_size */  
    25.   struct mutex      i_mutex;  
    26.   struct rw_semaphore   i_alloc_sem;  
    27.   const struct inode_operations *i_op;  
    28.   const struct file_operations  *i_fop; /* former ->i_op->default_file_ops */  
    29.   struct super_block    *i_sb;  
    30.   struct file_lock  *i_flock;  
    31.   struct address_space  *i_mapping;  
    32.   struct address_space  i_data;  
    33. #ifdef CONFIG_QUOTA  
    34.   struct dquot      *i_dquot[MAXQUOTAS];  
    35. #endif  
    36.   struct list_head  i_devices;  
    37.   union {  
    38.     struct pipe_inode_info  *i_pipe;  
    39.     struct block_device *i_bdev;  
    40.     struct cdev     *i_cdev;  
    41.   };  
    42.   int           i_cindex;  
    43.   
    44.   __u32         i_generation;  
    45.   
    46. #ifdef CONFIG_DNOTIFY  
    47.   unsigned long     i_dnotify_mask; /* Directory notify events */  
    48.   struct dnotify_struct *i_dnotify; /* for directory notifications */  
    49. #endif  
    50.   
    51. #ifdef CONFIG_INOTIFY  
    52.   struct list_head  inotify_watches; /* watches on this inode */  
    53.   struct mutex      inotify_mutex;  /* protects the watches list */  
    54. #endif  
    55.   
    56.   unsigned long     i_state;  
    57.   unsigned long     dirtied_when;   /* jiffies of first dirtying */  
    58.   
    59.   unsigned int      i_flags;  
    60.   
    61.   atomic_t      i_writecount;  
    62. #ifdef CONFIG_SECURITY  
    63.   void          *i_security;  
    64. #endif  
    65.   void          *i_private; /* fs or device private pointer */  
    66. };  

    5.目录项对象(struct dentry):

    kernel/include/linux/dcache.h

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. struct dentry {  
    2.   atomic_t d_count;  
    3.   unsigned int d_flags;     /* protected by d_lock */  
    4.   spinlock_t d_lock;        /* per dentry lock */  
    5.   int d_mounted;  
    6.   struct inode *d_inode; //目录项对象与目录索引的关联          
    7.   /* Where the name belongs to - NULL is 
    8.   * negative */  
    9.   /* 
    10.   * The next three fields are touched by __d_lookup.  Place them here 
    11.   * so they all fit in a cache line. 
    12.   */  
    13.   struct hlist_node d_hash; //哈希表节点 /* lookup hash list */  
    14.   struct dentry *d_parent; //目录项对象的父亲   /* parent directory */  
    15.   struct qstr d_name; //d_name.name这个是文件名,目录对象与目录名的关联  
    16.   
    17.   struct list_head d_lru;       /* LRU list */  
    18.   /* 
    19.   * d_child and d_rcu can share memory 
    20.   */  
    21.   union {  
    22.     struct list_head d_child;   /* child of parent list */  
    23.     struct rcu_head d_rcu;  
    24.   } d_u;  
    25.   struct list_head d_subdirs;   /* our children */  
    26.   struct list_head d_alias; /* inode alias list */  
    27.   unsigned long d_time;     /* used by d_revalidate */  
    28.   struct dentry_operations *d_op;  
    29.   struct super_block *d_sb; //指向文件系统的超级块/* The root of the dentry tree */  
    30.   void *d_fsdata;           /* fs-specific data */  
    31.   
    32.   unsigned char d_iname[DNAME_INLINE_LEN_MIN];  /* small names */  
    33. };  

    其他:

    include/linux/fs.h

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. struct file {  
    2.   /* 
    3.   * fu_list becomes invalid after file_free is called and queued via 
    4.   * fu_rcuhead for RCU freeing 
    5.   */  
    6.   union {  
    7.     struct list_head    fu_list;  
    8.     struct rcu_head     fu_rcuhead;  
    9.   } f_u;  
    10.   struct path       f_path;  //重要!!!记录挂载信息和目录项信息  
    11. #define f_dentry    f_path.dentry  
    12. #define f_vfsmnt    f_path.mnt  
    13.   const struct file_operations  *f_op;  
    14.   atomic_long_t     f_count;  
    15.   unsigned int      f_flags;  
    16.   fmode_t           f_mode;  
    17.   loff_t            f_pos;  
    18.   struct fown_struct    f_owner;  
    19.   const struct cred *f_cred;  
    20.   struct file_ra_state  f_ra;  
    21.   
    22.   u64           f_version;  
    23. #ifdef CONFIG_SECURITY  
    24.   void          *f_security;  
    25. #endif  
    26.   /* needed for tty driver, and maybe others */  
    27.   void          *private_data;  
    28.   
    29. #ifdef CONFIG_EPOLL  
    30.   /* Used by fs/eventpoll.c to link all the hooks to this file */  
    31.   struct list_head  f_ep_links;  
    32.   spinlock_t        f_ep_lock;  
    33. #endif /* #ifdef CONFIG_EPOLL */  
    34.   struct address_space  *f_mapping;  
    35. #ifdef CONFIG_DEBUG_WRITECOUNT  
    36.   unsigned long f_mnt_write_state;  
    37. #endif  
    38. };  

    include/linux/fs_struct.h

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. struct fs_struct {  
    2.   atomic_t count;  
    3.   rwlock_t lock;  
    4.   int umask;  
    5.   struct path root, pwd; //重要!!!记录挂载信息和目录项信息  
    6. };  

    include/linux/namei.h

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. struct nameidata {  
    2.   struct path   path;  //重要!!!记录挂载信息和目录项信息  
    3.   struct qstr   last;  //重要!!!记录目录名  
    4.   unsigned int  flags;  
    5.   int       last_type;  
    6.   unsigned  depth;  
    7.   char *saved_names[MAX_NESTED_LINKS + 1];  
    8.   
    9.   /* Intent data */  
    10.   union {  
    11.     struct open_intent open;  
    12.   } intent;  
    13. };  

    include/linux/path.h

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. struct path {  
    2.   struct vfsmount *mnt; //重要!!!记录文件系统挂载信息  
    3.   struct dentry *dentry;  //重要!!!记录目录项信息  
    4. };  

    include/linux/dcache.h

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. struct qstr {  
    2.   unsigned int hash;  
    3.   unsigned int len;  
    4.   const unsigned char *name;//重要!!!目录/文件名字,如"/","tank1"等具体的文件名  
    5. };  

    三、注册/创建、安装/挂载rootfs,并调用set_fs_root设置系统current的根文件系统为rootfs

    过程:

    第一步:建立rootfs文件系统;

    第二步:调用其get_sb函数(对于rootfs这种内存/伪文件系统是get_sb_nodev,实际文件系统比如ext2等是get_sb_bdev)、建立超级块(包含目录项和i节点);

    第三步:挂载该文件系统(该文件系统的挂载点指向该文件系统超级块的根目录项);

    第四步:将系统current的根文件系统和根目录设置为rootfs和其根目录。

    kernel/init/main.c

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. asmlinkage void __init start_kernel(void)  
    2. {  
    3.   setup_arch(&command_line);//解析uboot命令行,实际文件系统挂载需要  
    4.   parse_args("Booting kernel", static_command_line, __start___param,  
    5.            __stop___param - __start___param,  
    6.            &unknown_bootoption);  
    7.   vfs_caches_init(num_physpages);  
    8. }  

    kernel/fs/dcache.c

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. void __init vfs_caches_init(unsigned long mempages)  
    2. {  
    3.   mnt_init();  
    4.   bdev_cache_init(); //块设备文件创建  
    5.   chrdev_init();//字符设备文件创建  
    6. }  

    kernel/fs/namespace.c

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. void __init mnt_init(void)  
    2. {  
    3.   init_rootfs(); //向内核注册rootfs  
    4.   init_mount_tree();//重要!!!rootfs根目录的建立以及rootfs文件系统的挂载;设置系统current根目录和根文件系统为rootfs  
    5. }  

    下边分两步:

    1.向内核注册rootfs虚拟文件系统init_rootfs

    kernel/fs/ramfs/inode.c
    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. int __init init_rootfs(void)  
    2. {  
    3.   err = register_filesystem(&rootfs_fs_type);  
    4. }  
    5. static struct file_system_type rootfs_fs_type = {  
    6.   .name     = "rootfs",  
    7.   .get_sb       = rootfs_get_sb,  
    8.   .kill_sb  = kill_litter_super,  
    9. };  

    2.建立rootfs的根目录,并将rootfs挂载到自己的根目录;设置系统current根目录和根文件系统

    kernel/fs/namespace.c
    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. static void __init init_mount_tree(void)  
    2. {  
    3.   struct vfsmount *mnt;  
    4.   struct mnt_namespace *ns;  
    5.   struct path root;  
    6.   //创建rootfs的vfsmount结构,建立rootfs的超级块、并将rootfs挂载到自己的根目录。  
    7.   /* 
    8.   mnt->mnt_mountpoint = mnt->mnt_root = dget(sb->s_root),而该mnt和自己的sb是关联的; 
    9.   所以,是把rootfs文件系统挂载到了自己对应的超级块的根目录上。 
    10.   这里也是实现的关键:一般文件系统的挂载是调用do_mount->do_new_mount而该函数中首先调用do_kern_mount,这时mnt->mnt_mountpoint = mnt->mnt_root;但后边 
    11.   它还会调用do_add_mount->graft_tree->attach_recursive_mnt如下代码mnt_set_mountpoint(dest_mnt, dest_dentry, source_mnt)改变了其挂载点!!! 
    12.   */  
    13.   mnt = do_kern_mount("rootfs", 0, "rootfs", NULL);  
    14.   list_add(&mnt->mnt_list, &ns->list);  
    15.   ns->root = mnt; //将创建好的mnt加入系统当前  
    16.   mnt->mnt_ns = ns;  
    17.   
    18.   init_task.nsproxy->mnt_ns = ns; //设置进程的命名空间  
    19.   get_mnt_ns(ns);  
    20.   
    21.   root.mnt = ns->root; //文件系统为rootfs,相当与root.mnt = mnt;  
    22.   root.dentry = ns->root->mnt_root;//目录项为根目录项,相当与root.dentry = mnt->mnt_root;  
    23.   
    24.   //设置系统current的pwd目录和文件系统  
    25.   set_fs_pwd(current->fs, &root);  
    26.   //设置系统current根目录,根文件系统。这个是关键!!!整个内核代码最多只有两处调用  
    27.   set_fs_root(current->fs, &root);    
    28. }  

    以下着重分析do_kern_mount函数,它实现了rootfs在自己根目录上的挂载:

    kernel/fs/super.c
    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. struct vfsmount *  
    2. do_kern_mount(const char *fstype, int flags, const char *name, void *data)  
    3. {  
    4.   mnt = vfs_kern_mount(type, flags, name, data);  
    5.   return mnt;  
    6. }  

    kernel/fs/super.c

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. struct vfsmount *  
    2. vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void *data)  
    3. {  
    4.   mnt = alloc_vfsmnt(name); //建立并填充vfsmount  
    5.   error = type->get_sb(type, flags, name, data, mnt);//为文件系统建立并填充超级块(主要是其dentry和inode),建立rootfs根目录  
    6.   mnt->mnt_mountpoint = mnt->mnt_root; //文件系统挂载点目录,其实就是刚才建立的”/”目录。挂载点就是自己!!!!  
    7.   mnt->mnt_parent = mnt; //父对象是自己!!!!  
    8.   return mnt;  
    9. }  
    kernel/fs/ramfs/inode.c
    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. static int rootfs_get_sb(struct file_system_type *fs_type,  
    2.     int flags, const char *dev_name, void *data, struct vfsmount *mnt)  
    3. {  
    4.   return get_sb_nodev(fs_type, flags|MS_NOUSER, data, ramfs_fill_super,  
    5.                 mnt);  
    6. }  

    kernel/fs/super.c

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. int get_sb_nodev(struct file_system_type *fs_type,  
    2.     int flags, void *data,  
    3.     int (*fill_super)(struct super_block *, void *, int),  
    4.     struct vfsmount *mnt)  
    5. {  
    6.   struct super_block *s = sget(fs_type, NULL, set_anon_super, NULL);  
    7.   //在内存中分配一个超级块  
    8.   error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);  
    9.   //执行回调,填充超级块,并建立根目录项及对应i节点  
    10.   /* 
    11.   kernel/fs/ramfs/inode.c 
    12.   static int ramfs_fill_super(struct super_block * sb, void * data, int silent) 
    13.   { 
    14.     struct inode * inode; 
    15.     struct dentry * root; 
    16.     sb->s_maxbytes = MAX_LFS_FILESIZE; 
    17.     sb->s_blocksize = PAGE_CACHE_SIZE; 
    18.     sb->s_blocksize_bits = PAGE_CACHE_SHIFT; 
    19.     sb->s_magic = RAMFS_MAGIC; 
    20.     sb->s_op = &ramfs_ops; 
    21.     //static const struct super_operations ramfs_ops; 
    22.     sb->s_time_gran = 1; 
    23.     //建立根目录索引节点,我们最终的目标是要找到目录项对象关联的索引节点。 
    24.     //根目录索引节点会有自己的ops。 
    25.     inode = ramfs_get_inode(sb, S_IFDIR | 0755, 0);  
    26.     //ramfs_get_inode 
    27.     kernel/fs/ramfs/inode.c 
    28.     struct inode *ramfs_get_inode(struct super_block *sb, int mode, dev_t dev) 
    29.     { 
    30.       struct inode * inode = new_inode(sb); 
    31.       switch (mode & S_IFMT) {  //判断文件类型 
    32.         default: 
    33.       init_special_inode(inode, mode, dev); 
    34.       //init_special_inode 
    35.           void init_special_inode(struct inode *inode, umode_t mode, dev_t rdev) 
    36.           { 
    37.         inode->i_mode = mode; 
    38.         if (S_ISCHR(mode)) {//字符设备文件 
    39.           inode->i_fop = &def_chr_fops; 
    40.           inode->i_rdev = rdev; 
    41.         } else if (S_ISBLK(mode)) {//块设备文件 
    42.           inode->i_fop = &def_blk_fops; 
    43.           inode->i_rdev = rdev; 
    44.         } else if (S_ISFIFO(mode)) 
    45.           inode->i_fop = &def_fifo_fops; 
    46.         else if (S_ISSOCK(mode)) //网络设备文件 
    47.           inode->i_fop = &bad_sock_fops; 
    48.         else 
    49.           printk(KERN_DEBUG "init_special_inode: bogus i_mode (%o) for" 
    50.                   " inode %s:%lu\n", mode, inode->i_sb->s_id, 
    51.                   inode->i_ino); 
    52.            } 
    53.           //init_special_inode end 
    54.           break; 
    55.         case S_IFREG: //普通文件 
    56.           inode->i_op = &ramfs_file_inode_operations;  //索引节点的操作方法 
    57.           inode->i_fop = &ramfs_file_operations;  //缺省普通文件的操作方法 
    58.           break; 
    59.         case S_IFDIR:  //目录文件 
    60.           inode->i_op = &ramfs_dir_inode_operations; 
    61.           //ramfs_dir_inode_operations 
    62.           static const struct inode_operations ramfs_dir_inode_operations; 
    63.           kernel/include/linux/fs.h 
    64.           struct inode_operations { 
    65.             int (*create) (struct inode *,struct dentry *,int, struct nameidata *); 
    66.             int (*mkdir) (struct inode *,struct dentry *,int); 
    67.         int (*rmdir) (struct inode *,struct dentry *); 
    68.         int (*mknod) (struct inode *,struct dentry *,int,dev_t); 
    69.           } 
    70.           //ramfs_dir_inode_operations end 
    71.           inode->i_fop = &simple_dir_operations;  //目录文件的操作方法 
    72.           inc_nlink(inode); 
    73.           break; 
    74.       } 
    75.     } 
    76.     //ramfs_get_inode end 
    77.     //建立根目录目录对象,目录项对象的存在主要是为了我们进行路径的查找。 
    78.     root = d_alloc_root(inode);    
    79.     //d_alloc_root 
    80.     kernel/fs/dcache.c 
    81.     struct dentry * d_alloc_root(struct inode * root_inode) 
    82.     { 
    83.       struct dentry *res = NULL; 
    84.       static const struct qstr name = { .name = "/", .len = 1 }; 
    85.       res = d_alloc(NULL, &name); 
    86.       res->d_sb = root_inode->i_sb; //指向该文件系统的超级块 
    87.       res->d_parent = res;  //根目录的父亲是它自己 
    88.       d_instantiate(res, root_inode); //关联 dentry 和 inode 
    89.     } 
    90.     //d_alloc_root end 
    91.     sb->s_root = root;  //超级块的s_root指向刚建立的根目录对象。 
    92.   } 
    93.   */  
    94.   return simple_set_mnt(mnt, s); //关联超级块(包含目录项dentry和i节点inode)和vfsmount  
    95. }  
    kernel/fs/namespace.c
    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. int simple_set_mnt(struct vfsmount *mnt, struct super_block *sb)  
    2. {  
    3.   printk("TK-------_>>>>>>>namespace.c>>>>simple_set_mnt\n");//add by tankai  
    4.   mnt->mnt_sb = sb;  //对 mnt_sb超级块指针附值  
    5.   mnt->mnt_root = dget(sb->s_root); //对mnt_root指向的根目录赋值  
    6.   return 0;  
    7. }  

    至此,rootfs文件系统建立、并且挂载于自己超级块(包括目录项dentry和i节点inod)对应的目录项,设置了系统current根目录和根文件系统、pwd的目录和文件系统。

    ========================================

    释放Initramfs到rootfs;如果Initramfs中有init,这种情况比较特殊、rootfs就是最后系统使用的根文件系统。

    而且此时,不需要在单独烧录根文件系统的img;此时,根文件系统就是内核uImage的一部分。当然,缺陷就是该文件系统运行时的介质是ramdisk即内存盘、它不再与磁盘对应;因此,此时修改根目录下的文件将不被得到保存。它的内核配置项为:CONFIG_INITRAMFS_SOURCE。实际项目中会经常碰到。

    make menuconfig->General setup->Initial RAM filesystem and RAM disk(initramfs/initrd) support
    底下的Initramfs source file(s)填写根文件系统的路径,如:../out/target/product/tclm6/root;不填的话,将导致initrd或磁盘文件系统的挂载(因为下边将会看到,内核将找不到“/init”)。

    对应内核源码:

    kernel/init/main.c
    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. static int __init kernel_init(void * unused){  
    2.   ......  
    3.   do_basic_setup();  //初始化设备驱动,加载静态内核模块;释放Initramfs到rootfs  
    4.   /* 
    5.   kernel/init/initramfs.c 
    6.   rootfs_initcall(populate_rootfs); 
    7.   static int __init populate_rootfs(void) 
    8.   { 
    9.     printk(KERN_INFO "checking if image is initramfs..."); 
    10.     err = unpack_to_rootfs((char *)initrd_start, 
    11.                         initrd_end - initrd_start, 1); //释放ramdisk到rootfs 
    12.   } 
    13.   */  
    14.   ......  
    15.   if (!ramdisk_execute_command)  ramdisk_execute_command = "/init";  
    16.   if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {  
    17.     ramdisk_execute_command = NULL;  
    18.     //如果此时rootfs中没有init,则加载initfd、nfs或磁盘文件系统  
    19.     //也即磁盘的文件系统挂载至rootfs的/root目录,并设置系统current对应的根目录项为磁盘根目录项、系统current根文件系统为磁盘文件系统  
    20.     //至此,rootfs对于以后所有进程而言、已被隐藏。  
    21.     prepare_namespace();   
    22.   }  
    23.   init_post(); //启动init进程  
    24.   ......  
    25. }  

    看看init_post实现:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. static noinline int init_post(void)  
    2. {  
    3.   if (ramdisk_execute_command) {  //Initramfs从这里启动init  
    4.     run_init_process(ramdisk_execute_command);  
    5.     printk(KERN_WARNING "Failed to execute %s\n", ramdisk_execute_command);  
    6.   }  
    7.   //initrd、nfs和磁盘都是从如下启动的init  
    8.   if (execute_command) {  
    9.     run_init_process(execute_command);  
    10.     printk(KERN_WARNING "Failed to execute %s.  Attempting "  
    11.                     "defaults...\n", execute_command);  
    12.   }  
    13.   //一般执行如下  
    14.   run_init_process("/sbin/init");  
    15.   run_init_process("/etc/init");  
    16.   run_init_process("/bin/init");  
    17.   run_init_process("/bin/sh");  
    18. }  

    四、挂载实际文件系统至rootfs,并调用set_fs_root设置为系统current的根文件系统

    下边从uboot启动内核参数的角度来简单说明:

    以下三种情况都是将文件系统挂载到rootfs的/root目录,并将系统current的根目录切换为/root、系统current的根文件系统切换为磁盘文件系统。

    kernel/init/do_mounts.c

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. void __init prepare_namespace(void)  
    2. {  
    3.   if (initrd_load()) //如果挂载initrd并执行成功,则不再挂载磁盘文件系统  
    4.     goto out;  
    5.   if (saved_root_name[0]) {  
    6.     root_device_name = saved_root_name;  
    7.     if (!strncmp(root_device_name, "mtd", 3) ||  
    8.         !strncmp(root_device_name, "ubi", 3)) {  
    9.       mount_block_root(root_device_name, root_mountflags); //启动时root=参数,如《四.2》中“root=/dev/mtdblock0”  
    10.       goto out;  
    11.     }  
    12.     ROOT_DEV = name_to_dev_t(root_device_name);  
    13.     if (strncmp(root_device_name, "/dev/", 5) == 0)  
    14.       root_device_name += 5;  
    15.   }  
    16.   mount_root(); //将实际文件系统挂载到rootfs的/root目录  
    17. out:  
    18.   //sys_mount(".", "/", NULL, MS_MOVE, NULL); 这句话无关紧要,影响理解;屏蔽不影响功能  
    19.   sys_chroot(".");  //将当前目录(/root)设置为系统current根目录,磁盘文件系统设置为系统current根文件系统。  
    20. }  

    下边分两步解释mount_root()和sys_chroot(".")调用:

    1.将nfs或磁盘文件系统挂载至rootfs的/root目录(以磁盘为例)

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. void __init mount_root(void)  
    2. {  
    3.   if (mount_nfs_root())  //如果网络文件系统挂载成功,则nfs作为根文件系统  
    4.     return;  
    5.   //挂载磁盘文件系统为根文件系统  
    6.   //在rootfs中建立/dev/root设备文件  
    7.   create_dev("/dev/root", ROOT_DEV);  //在rootfs中建立/dev/root设备文件,也就是/dev/mtdblock0设备。  
    8.   //挂载/dev/root到rootfs的/root目录  
    9.   mount_block_root("/dev/root", root_mountflags);  
    10. }  
    11. void __init mount_block_root(char *name, int flags)  
    12. {  
    13.   int err = do_mount_root(name, p, flags, root_mount_data);    
    14. }  
    15. static int __init do_mount_root(char *name, char *fs, int flags, void *data)  
    16. {  
    17.   int err = sys_mount(name, "/root", fs, flags, data);//将/dev/root挂载到/root  
    18.   sys_chdir("/root"); //系统current->fs->pwd为当前目录/root  
    19.   ROOT_DEV = current->fs->pwd.mnt->mnt_sb->s_dev;  
    20.   return 0;  
    21. }  

    2.将当前目录/root设置为系统current根目录,磁盘文件系统设置为系统current根文件系统

    分析sys_chroot("."):见Linux内核编程之C语言预处理功能与宏

    fs/open.c

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. SYSCALL_DEFINE1(chroot, const char __user *, filename)  
    2. {  
    3.   struct path path;  
    4.   error = user_path_dir(filename, &path);  
    5.   //这才是完成切换的关键!!!!整个内核代码只有两处调用  
    6.   set_fs_root(current->fs, &path);   
    7. }  

    注意,如下情况:rootfs特殊文件系统没有被卸载,他只是隐藏在基于磁盘的根文件系统下了。

    initrd作为根文件系统

    setenv bootargs root=/dev/ram0 initrd=0x2800000,24M rootfstype=ext2 mem=64M console=ttyAMA0

    参数说明:

    root:用来指定rootfs的位置。

    rootfstype:用来指定文件系统的类型。

    nfs作为根文件系统

    setenv bootargs root=/dev/nfs nfsroot=192.168.1.7:/opt/yz/nfs,rw ip=192.168.1.160 mem=64M console=ttyAMA0

    参数说明:

    nfsroot:文件系统在哪台主机的哪个目录下。

    ip:指定系统启动之后网卡的ip地址。

    flash作为根文件系统

    setenv bootargs root=/dev/mtdblock0 mem=16M mtdparts=armflash.1:4M@0x400000(jffs2) macaddr=9854 rootfstype=jffs2 console=ttyAMA0

    参数说明:

    mtdparts:根文件系统在flash中的位置。

    总结:rootfs永远不会被卸载,它只是被隐藏了。在用户空间下,更多地情况是只能见到rootfs这棵大树的一叶,而且还是被安装过文件系统了的。

    五、其他说明

    至于在mirco2440下mount出的结果:

    [plain]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. rootfs on / type rootfs (rw)  
    2. /dev/root on / type yaffs (rw,relatime)  
    3. none on /proc type proc (rw,relatime)  
    4. none on /sys type sysfs (rw,relatime)  
    5. none on /proc/bus/usb type usbfs (rw,relatime)  
    6. none on /dev type ramfs (rw,relatime)  
    7. none on /dev/pts type devpts (rw,relatime,mode=622)  
    8. tmpfs on /dev/shm type tmpfs (rw,relatime)  
    9. none on /tmp type ramfs (rw,relatime)  
    10. none on /var type ramfs (rw,relatime)  

    从log中体会一下这个过程:

    [plain]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. s3c2410-rtc s3c2410-rtc: setting system clock to 2006-04-16 22:15:34 UTC (1145225734)  
    2. TK------->>>>>init/main.c>>>>>>kernel_init>>before>prepare_namespace  
    3. ##################################################################################################################  
    4. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_name.name is /  
    5. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_sb->s_type->name is rootfs  
    6. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_name.name is /  
    7. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    8. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_name.name is /  
    9. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_sb->s_type->name is rootfs  
    10. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_sb->s_type->name is rootfs  
    11. ##################################################################################################################  
    12. ##################################################################################################################  
    13. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_name.name is /  
    14. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_sb->s_type->name is rootfs  
    15. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_name.name is /  
    16. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    17. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_name.name is /  
    18. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_sb->s_type->name is rootfs  
    19. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_sb->s_type->name is rootfs  
    20. ##################################################################################################################  
    21. TK------->>>>>init/do_mounts.c>>>>>>prepare_namespace>>before>mount_root  
    22. ##################################################################################################################  
    23. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_name.name is /  
    24. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_sb->s_type->name is rootfs  
    25. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_name.name is /  
    26. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    27. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_name.name is /  
    28. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_sb->s_type->name is rootfs  
    29. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_sb->s_type->name is rootfs  
    30. ##################################################################################################################  
    31. ##################################################################################################################  
    32. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_name.name is /  
    33. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_sb->s_type->name is rootfs  
    34. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_name.name is /  
    35. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    36. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_name.name is /  
    37. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_sb->s_type->name is rootfs  
    38. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_sb->s_type->name is rootfs  
    39. ##################################################################################################################  
    40. yaffs: dev is 32505859 name is "mtdblock3"  
    41. yaffs: passed flags ""  
    42. yaffs: Attempting MTD mount on 31.3, "mtdblock3"  
    43. yaffs_read_super: isCheckpointed 0  
    44. VFS: Mounted root (yaffs filesystem) on device 31:3.  
    45. TK------->>>>>init/do_mounts.c>>>>>>prepare_namespace>>before>sys_mount  
    46. ##################################################################################################################  
    47. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_name.name is /  
    48. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_sb->s_type->name is rootfs  
    49. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_name.name is /  
    50. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    51. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_name.name is /  
    52. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_sb->s_type->name is rootfs  
    53. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_sb->s_type->name is rootfs  
    54. ##################################################################################################################  
    55. ##################################################################################################################  
    56. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_name.name is /  
    57. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_sb->s_type->name is yaffs  
    58. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_name.name is root  
    59. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    60. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_name.name is /  
    61. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_sb->s_type->name is yaffs  
    62. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_sb->s_type->name is yaffs  
    63. ##################################################################################################################  
    64. TK------->>>>>init/do_mounts.c>>>>>>prepare_namespace>>before>sys_chroot  
    65. ##################################################################################################################  
    66. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_name.name is /  
    67. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_sb->s_type->name is rootfs  
    68. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_name.name is /  
    69. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    70. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_name.name is /  
    71. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_sb->s_type->name is rootfs  
    72. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_sb->s_type->name is rootfs  
    73. ##################################################################################################################  
    74. ##################################################################################################################  
    75. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_name.name is /  
    76. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_sb->s_type->name is yaffs  
    77. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_name.name is root  
    78. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    79. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_name.name is /  
    80. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_sb->s_type->name is yaffs  
    81. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_sb->s_type->name is yaffs  
    82. ##################################################################################################################  
    83. TK------->>>>>fs/open.c>>>>>>SYSCALL_DEFINE1(chroot>>before>set_fs_root  
    84. ##################################################################################################################  
    85. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_name.name is /  
    86. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_sb->s_type->name is rootfs  
    87. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_name.name is /  
    88. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    89. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_name.name is /  
    90. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_sb->s_type->name is rootfs  
    91. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_sb->s_type->name is rootfs  
    92. ##################################################################################################################  
    93. ##################################################################################################################  
    94. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_name.name is /  
    95. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_sb->s_type->name is yaffs  
    96. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_name.name is root  
    97. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    98. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_name.name is /  
    99. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_sb->s_type->name is yaffs  
    100. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_sb->s_type->name is yaffs  
    101. ##################################################################################################################  
    102. TK------->>>>>init/do_mounts.c>>>>>>SYSCALL_DEFINE1(chroot>>after>set_fs_root  
    103. ##################################################################################################################  
    104. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_name.name is /  
    105. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_sb->s_type->name is yaffs  
    106. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_name.name is root  
    107. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    108. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_name.name is /  
    109. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_sb->s_type->name is yaffs  
    110. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_sb->s_type->name is yaffs  
    111. ##################################################################################################################  
    112. ##################################################################################################################  
    113. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_name.name is /  
    114. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_sb->s_type->name is yaffs  
    115. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_name.name is root  
    116. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    117. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_name.name is /  
    118. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_sb->s_type->name is yaffs  
    119. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_sb->s_type->name is yaffs  
    120. ##################################################################################################################  
    121. TK------->>>>>init/do_mounts.c>>>>>>prepare_namespace>>after>sys_chroot  
    122. ##################################################################################################################  
    123. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_name.name is /  
    124. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_sb->s_type->name is yaffs  
    125. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_name.name is root  
    126. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    127. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_name.name is /  
    128. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_sb->s_type->name is yaffs  
    129. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_sb->s_type->name is yaffs  
    130. ##################################################################################################################  
    131. ##################################################################################################################  
    132. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_name.name is /  
    133. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_sb->s_type->name is yaffs  
    134. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_name.name is root  
    135. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    136. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_name.name is /  
    137. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_sb->s_type->name is yaffs  
    138. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_sb->s_type->name is yaffs  
    139. ##################################################################################################################  
    140. TK------->>>>>init/main.c>>>>>>kernel_init>>after>prepare_namespace  
    141. ##################################################################################################################  
    142. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_name.name is /  
    143. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_sb->s_type->name is yaffs  
    144. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_name.name is root  
    145. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    146. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_name.name is /  
    147. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_sb->s_type->name is yaffs  
    148. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_sb->s_type->name is yaffs  
    149. ##################################################################################################################  
    150. ##################################################################################################################  
    151. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_name.name is /  
    152. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_sb->s_type->name is yaffs  
    153. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_name.name is root  
    154. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    155. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_name.name is /  
    156. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_sb->s_type->name is yaffs  
    157. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_sb->s_type->name is yaffs  
    158. ##################################################################################################################  
    159. Freeing init memory: 156K  
    160. [16/Apr/2006:14:15:35 +0000] boa: server version Boa/0.94.13  
    161. [16/Apr/2006:14:15:35 +0000] boa: server built Mar 26 2009 at 15:28:42.  
    162. [16/Apr/2006:14:15:35 +0000] boa: starting server pid=681, port 80  
    163.                           
    164. Try to bring eth0 interface up......eth0: link down  
    165. Done  
    166.   
    167. Please press Enter to activate this console.   
    168. [root@FriendlyARM /]# mount  
    169. rootfs on / type rootfs (rw)  
    170. /dev/root on / type yaffs (rw,relatime)  
    171. none on /proc type proc (rw,relatime)  
    172. none on /sys type sysfs (rw,relatime)  
    173. none on /proc/bus/usb type usbfs (rw,relatime)  
    174. none on /dev type ramfs (rw,relatime)  
    175. none on /dev/pts type devpts (rw,relatime,mode=622)  
    176. tmpfs on /dev/shm type tmpfs (rw,relatime)  
    177. none on /tmp type ramfs (rw,relatime)  
    178. none on /var type ramfs (rw,relatime)  
    179. [root@FriendlyARM /]#   

    ubuntu下mount出的结果:

    [plain]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. /dev/sda5 on / type ext3 (rw,errors=remount-ro,commit=0)  
    2. proc on /proc type proc (rw,noexec,nosuid,nodev)  
    3. sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)  
    4. fusectl on /sys/fs/fuse/connections type fusectl (rw)  
    5. none on /sys/kernel/debug type debugfs (rw)  
    6. none on /sys/kernel/security type securityfs (rw)  
    7. udev on /dev type devtmpfs (rw,mode=0755)  
    8. devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)  
    9. tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)  
    10. none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)  
    11. none on /run/shm type tmpfs (rw,nosuid,nodev)  
    12. /dev/sda7 on /home type ext3 (rw,commit=0)  
    13. binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev)  
    14. rpc_pipefs on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)  
    15. nfsd on /proc/fs/nfsd type nfsd (rw)  
    16. gvfs-fuse-daemon on /home/tankai/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev,user=tankai)  

        一个还显示rootfs,一个干脆不显示。这个无关紧要。可能micro2440中执行mount命令还会将系统current根目录的父节点也显示出来;而ubuntu下不会再去关心系统current根目录的父节点。但所有的文件搜索,内核都是从系统current根目录开始向下查找的,因此、可以说我们不能在访问rootfs中除了作为系统current根文件系统之外的其他任何节点。

    六、测试用例,说明系统current的文件系统布局,不管在那个目录、其根都不会改变:

    hello.c

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. #include <linux/syscalls.h>  
    2. #include <linux/slab.h>  
    3. #include <linux/sched.h>  
    4. #include <linux/smp_lock.h>  
    5. #include <linux/init.h>  
    6. #include <linux/kernel.h>  
    7. #include <linux/acct.h>  
    8. #include <linux/capability.h>  
    9. #include <linux/cpumask.h>  
    10. #include <linux/module.h>  
    11. #include <linux/sysfs.h>  
    12. #include <linux/seq_file.h>  
    13. #include <linux/mnt_namespace.h>  
    14. #include <linux/namei.h>  
    15. #include <linux/security.h>  
    16. #include <linux/mount.h>  
    17. #include <linux/ramfs.h>  
    18. #include <linux/log2.h>  
    19. #include <linux/idr.h>  
    20. #include <asm/uaccess.h>  
    21. #include <asm/unistd.h>  
    22. //#include "pnode.h"  
    23. //#include "internal.h"  
    24.   
    25.   
    26. #include <linux/init.h>  
    27. #include <linux/module.h>  
    28. MODULE_LICENSE("Dual BSD/GPL");  
    29.   
    30. static int hello_init(void)  
    31. {  
    32.     printk(KERN_ALERT "Hello, world\n");  
    33.     printk("TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_name.name is %s\n",current->fs->root.dentry->d_name.name);  
    34.     printk("TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_sb->s_type->name is %s\n",current->fs->root.dentry->d_sb->s_type->name);  
    35.     printk("TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_name.name is %s\n",current->fs->root.mnt->mnt_mountpoint->d_name.name);  
    36.     printk("TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_sb->s_type->name is %s\n",current->fs->root.mnt->mnt_mountpoint->d_sb->s_type->name);  
    37.     printk("TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_name.name is %s\n",current->fs->root.mnt->mnt_root->d_name.name);  
    38.     printk("TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_sb->s_type->name is %s\n",current->fs->root.mnt->mnt_root->d_sb->s_type->name);  
    39.     printk("TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_sb->s_type->name is %s\n",current->fs->root.mnt->mnt_sb->s_type->name);  
    40.     printk("########################################################################################\n");  
    41.     printk("TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_name.name is %s\n",current->fs->pwd.dentry->d_name.name);  
    42.     printk("TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_sb->s_type->name is %s\n",current->fs->pwd.dentry->d_sb->s_type->name);  
    43.     printk("TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_name.name is %s\n",current->fs->pwd.mnt->mnt_mountpoint->d_name.name);  
    44.     printk("TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_sb->s_type->name is %s\n",current->fs->pwd.mnt->mnt_mountpoint->d_sb->s_type->name);  
    45.     printk("TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_name.name is %s\n",current->fs->pwd.mnt->mnt_root->d_name.name);  
    46.     printk("TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_sb->s_type->name is %s\n",current->fs->pwd.mnt->mnt_root->d_sb->s_type->name);  
    47.     printk("TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_sb->s_type->name is %s\n",current->fs->pwd.mnt->mnt_sb->s_type->name);  
    48.     return 0;  
    49. }  
    50.   
    51. static void hello_exit(void)  
    52. {  
    53.     printk(KERN_ALERT"Goodbye, cruel world\n");  
    54. }  
    55.   
    56. module_init(hello_init);  
    57. module_exit(hello_exit);  
    Makefile
    [plain]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. ifneq ($(KERNELRELEASE),)  
    2. obj-m:=hello.o  
    3. else  
    4. KERNELDIR:=/home/android2.3/android2.3_kernel/  
    5. PWD:=$(shell pwd)  
    6. default:  
    7.     $(MAKE) -C $(KERNELDIR)  M=$(PWD) modules  
    8. clean:  
    9.     rm -rf *.o *.mod.c *.mod.o *.ko  
    10. endif  

    make生成hello.ko

    先看下文件系统布局:

    mount

    [plain]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. rootfs / rootfs ro 0 0  
    2. tmpfs /dev tmpfs rw,mode=755 0 0  
    3. devpts /dev/pts devpts rw,mode=600 0 0  
    4. proc /proc proc rw 0 0  
    5. sysfs /sys sysfs rw 0 0  
    6. none /acct cgroup rw,cpuacct 0 0  
    7. tmpfs /mnt/asec tmpfs rw,mode=755,gid=1000 0 0  
    8. tmpfs /mnt/obb tmpfs rw,mode=755,gid=1000 0 0  
    9. none /dev/cpuctl cgroup rw,cpu 0 0  
    10. /dev/block/mtdblock0 /system yaffs2 rw 0 0  
    11. /dev/block/mtdblock1 /data yaffs2 rw,nosuid,nodev 0 0  
    12. /dev/block/mtdblock2 /cache yaffs2 rw,nosuid,nodev 0 0  
    13. /dev/block/vold/179:0 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0  
    14. /dev/block/vold/179:0 /mnt/secure/asec vfat rw,dirsync,nosuid,nodev,noexec,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0  
    15. tmpfs /mnt/sdcard/.android_secure tmpfs ro,size=0k,mode=000 0 0  

    1.放入/data/下运行insmod hello.ko rmmod hello.ko

    [plain]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. Hello, world  
    2. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_name.name is /  
    3. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_sb->s_type->name is rootfs  
    4. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_name.name is /  
    5. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    6. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_name.name is /  
    7. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_sb->s_type->name is rootfs  
    8. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_sb->s_type->name is rootfs  
    9. ########################################################################################  
    10. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_name.name is /  
    11. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_sb->s_type->name is yaffs2  
    12. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_name.name is data  
    13. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    14. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_name.name is /  
    15. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_sb->s_type->name is yaffs2  
    16. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_sb->s_type->name is yaffs2  
    17. Goodbye, cruel world  
    2.放在/sdcard/tank/下运行insmod hello.ko rmmod hello.ko
    [plain]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. Hello, world  
    2. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_name.name is /  
    3. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.dentry->d_sb->s_type->name is rootfs  
    4. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_name.name is /  
    5. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    6. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_name.name is /  
    7. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_root->d_sb->s_type->name is rootfs  
    8. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->root.mnt->mnt_sb->s_type->name is rootfs  
    9. ########################################################################################  
    10. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_name.name is tank  
    11. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.dentry->d_sb->s_type->name is vfat  
    12. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_name.name is sdcard  
    13. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_mountpoint->d_sb->s_type->name is rootfs  
    14. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_name.name is /  
    15. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_root->d_sb->s_type->name is vfat  
    16. TK---->>>>init/main.c>>>kernel_init>>>>current->fs->pwd.mnt->mnt_sb->s_type->name is vfat  
    17. Goodbye, cruel world  

    由此证明;current->fs->root就是系统承认的根文件系统。

    本文来自:http://blog.csdn.net/tankai19880619/article/details/12093239

    展开全文
  • Yi 4k Linux文件系统的存储库 目标是优化/调试Yi 4k Linux文件系统。 只有Yi 4k(aka Z16V13L **) 去做 : 调试wifi模式(ap / sta) 提交# 调试wifi频率(2,4 / 5GHz)...$mkdir rootfs $unsquashfs firmwaresub
  • 我基于创建的各种脚本,用于预先构建系统的rootfs映像。
  • rootfs.zip

    2020-07-22 22:59:10
    https://blog.csdn.net/lpaim/article/details/107442633
  • 小米AC2100固件
  • 这允许我们从外部维护的 rootfs 引导,该 rootfs 从给定的 URL 加载,并将此 rootfs 安装在 tmpfs (RAM) 或 KVM (/dev/vda) 块设备上。 设置 rootfs,挂载所需的伪文件系统并在新根上调用 /bin/switch_root。 请...
  • 使用sunxi内核和引导文件引导最小的debian rootfs。 目前只有4个olinuxino板可用。 该存储库中的所有脚本都是通用的,因此添加新的Boad很容易。 如果您创建并测试新板,请提出拉取请求。 我需要olinuxino lime2和...
  • linux系统烧写包括u-boot.bin,zImage,rootfs.yaffs2,cramfs
  • rootfs.tar.gz

    2019-12-05 21:34:12
    用于配套博客的rootfs,通过使用本人博客linux 编译运行那一节的脚本,可以制作出ramdisk。
  • os-rootfs os-rootfs构建所有HypriotOS映像的基础。 此存储库为不同的CPU体系结构创建了通用的根文件系统,而没有主板的特定部分。 这个根文件系统 使用最小的Debian系统 添加用户海盗 设置默认语言环境(UTF-8) ...
  • 比较精简的跟文件系统
  • meta-readonly-rootfs-overlay 此OpenEmbedded层提供必要的脚本和配置,以在只读根文件系统之上设置可写根文件系统覆盖。 为什么存在? 在许多情况下,拥有只读根文件系统很有用: 将用户特定的更改与系统配置...
  • 介绍了petalinux编译uboot、kernel、rootfs方法和使用细节

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,380
精华内容 17,752
关键字:

rootfs