3,注册文件描述符表释放函数
- /*文件描述符表*/
- struct fdtable {
- unsigned int max_fds;/*进程能够处理的最大file结构*/
- struct file ** fd;/*所有打开文件信息*//* current fd array */
- fd_set *close_on_exec;/*exec系统调用被关闭的所有文件集合*/
- fd_set *open_fds;/*当前打开的所有文件集合*/
- struct rcu_head rcu;
- struct fdtable *next;
- };
Start_kernel()->vfs_caches_init()->files_init()->files_defer_init()->fdtable_defer_list_init()->INIT_WORK(&fddef->wq, free_fdtable_work);
- static void free_fdtable_work(struct work_struct *work)
- {
- struct fdtable_defer *f =
- container_of(work, struct fdtable_defer, wq);
- struct fdtable *fdt;
- spin_lock_bh(&f->lock);
- fdt = f->next;
- f->next = NULL;
- spin_unlock_bh(&f->lock);
- while(fdt) {/*释放工作*/
- struct fdtable *next = fdt->next;
- vfree(fdt->fd);
- free_fdset(fdt);
- kfree(fdt);
- fdt = next;
- }
- }
4.sysfs文件系统初始化
Start_kernel()->vfs_caches_init()->mnt_init()->sysfs_init()
- int __init sysfs_init(void)
- {
- int err = -ENOMEM;
- sysfs_dir_cachep = kmem_cache_create("sysfs_dir_cache",
- sizeof(struct sysfs_dirent),
- 0, 0, NULL);
- if (!sysfs_dir_cachep)
- goto out;
- /*初始化sysfs的backing_dev_info结构*/
- err = sysfs_inode_init();
- if (err)
- goto out_err;
- /*注册文件系统*/
- err = register_filesystem(&sysfs_fs_type);
- if (!err) {
- /*创建sysfs mount*/
- sysfs_mount = kern_mount(&sysfs_fs_type);
- if (IS_ERR(sysfs_mount)) {
- printk(KERN_ERR "sysfs: could not mount!\n");
- err = PTR_ERR(sysfs_mount);
- sysfs_mount = NULL;
- unregister_filesystem(&sysfs_fs_type);
- goto out_err;
- }
- } else
- goto out_err;
- out:
- return err;
- out_err:
- kmem_cache_destroy(sysfs_dir_cachep);
- sysfs_dir_cachep = NULL;
- goto out;
- }