/* * Initializes the file system manager. */ PUBLIC void fs_init(void) { binit(); inode_init(); superblock_init(); /* Sanity check. */ CHKSIZE(sizeof(struct d_dirent), sizeof(struct dirent)); rootdev = superblock_read(ROOT_DEV); /* Failed to read root super block. */ if (rootdev == NULL) kpanic("failed to mount root file system"); superblock_unlock(rootdev); root = inode_get(ROOT_DEV, 1); /* Failed to read root inode. */ if (root == NULL) kpanic("failed to read root inode"); kprintf("fs: root file system mounted"); /* Hand craft idle process. */ IDLE->pwd = root; IDLE->root = root; root->count += 2; inode_unlock(root); }
int main(void) { /* NOTE! 这些初始化函数的位置别随便改动! */ trap_init(); /* 在设置其他中断之前 */ console_init(); /* 需打印的在这之后 */ keyboard_init(); hd_init(); /* 需读磁盘的放其后 */ /* graph_init(); */ mem_init(); sched_init(); buff_init(); /* 在内存初始化之后 */ inode_init(); file_table_init(); debug_init(); sti(); super_init(0); /* 开中断之后 */ files_init(); /* unsigned short color = rgb_to_565color(255,255,255); draw_rect(0, 0, 800, 600, color, 1); */ move_to_user_mode(); /* * 进程0马上execve(),替换掉用户态空间,这样进程0就 * 可以写时复制了。注意此时原来的用户态堆栈也被丢弃 * 了,换成了新堆栈。更多参见内存管理。 */ if(!execve("/init")) printf("main: execve init-process failed.\n");
void kmain(u32 init_stack) { init_esp_start = init_stack; init_video(); puts_color_str("Booting Panda OS ...\n", 0x0B); cli(); time_init(); gdt_init(); idt_init(); kb_init(); mm_init(); buf_init(); file_init(); inode_init(); ide_init(); task_init(); timer_init(); sysc_init(); spawn(init_user); sti(); init = 0; while(1) { if(!init) { printk("kernel running ...\n"); init = 1; } sti(); sched(); } }
int bullet_start() { long free; /* # units of resource still free */ /* Now that we can start ... */ message("BULLET SERVER STARTUP"); if (a_begin(A_DISKBLOCKS, (Res_addr) Superblock.s_inodetop + 1, (Res_addr) Superblock.s_numblocks) < 0) { bpanic("Cannot begin resource allocator for disk blocks.\n"); } /* Convert file get-port to put-port */ priv2pub(&Superblock.s_fileport,&FilePutPort) ; /* Get the inode table and start inode allocator */ /* Could have been done by setinodes() as a result of a welcome */ if ( !Inode_table) inode_init(); /* Work out which inodes and disk blocks are in use. */ build_free_list(); message("%ld inodes free, %ld inodes used", bs_local_inodes_free, - 1); if ((free = a_notused(A_DISKBLOCKS)) < 0) { bpanic("Defective diskblock free list\n"); } message("%ld disk blocks free, %ld disk blocks used", free, Superblock.s_numblocks - free); return 1 ; }
/** * 主核初始化 */ asmlinkage void __init start_master(void) { debug_printstr_mmu("xby_debug, start cpu 0\n"); local_irq_disable(); //tick_init(); /* 为当前CPU设置其活动掩码 */ boot_cpu_init(); /* 体系结构特定的初始化过程 */ start_arch(); //初始化boot内存分配器 InitBootMemory(0xc0000000 + 8 * 1024 * 1024, 0xc0000000 + 24 * 1024 * 1024); init_IRQ(); //体系结构和驱动的一些初始化过程 //run_initcall(); //为VFS分配一些大的内存块,用于哈希表。此过程必须在boot阶段分配。 //vfs_caches_init_early(); #ifdef FS blk_dev_init(); inode_init(); file_table_init(); name_cache_init(); buffer_init_early(); #endif memory_init(); #ifdef FS buffer_init_tail(); tty_init(); #endif sched_init(); time_init(); setup_timer(); serial_init(); //mmc_init(); //omap_gpio_init(); //初始化文件系统 //vfs_caches_init(num_physpages); local_irq_enable(); //创建系统任务,以及用户任务入口 TaskEntry(); cpu_idle(); //不可能运行到这里来 BUG(); }
/*! Initializes the file system module. If FORMAT is true, reformats the file system. */ void filesys_init(bool format) { fs_device = block_get_role(BLOCK_FILESYS); if (fs_device == NULL) PANIC("No file system device found, can't initialize file system."); inode_init(); free_map_init(); if (format) do_format(); free_map_open(); }
/* Initializes the file system module. If FORMAT is true, reformats the file system. */ void filesys_init (bool format) { filesys_disk = disk_get (0, 1); if (filesys_disk == NULL) PANIC ("hd0:1 (hdb) not present, file system initialization failed"); inode_init (); free_map_init (); if (format) do_format (); free_map_open (); }
void start_kernel(void) { seg_t base, end; /* We set the idle task as #0, and init_task() will be task #1 */ sched_init(); /* This block of functions don't need console */ setup_arch(&base, &end); mm_init(base, end); buffer_init(); inode_init(); init_IRQ(); tty_init(); init_console(); #if (CONFIG_BOGOMIPS == 0) calibrate_delay(); #endif device_setup(); #ifdef CONFIG_SOCKET sock_init(); #endif fs_init(); mm_stat(base, end); printk("ELKS version %s\n", system_utsname.release); kfork_proc(init_task); wake_up_process(&task[1]); /* * We are now the idle task. We won't run unless no other process can run. */ while (1) { schedule(); #ifdef CONFIG_IDLE_HALT idle_halt (); #endif } }
int vfs_init(void) { int ret = VFS_SUCCESS; if (g_vfs_init == 1) { return ret; } if ((ret = aos_mutex_new(&g_vfs_mutex)) != VFS_SUCCESS) { return ret; } inode_init(); g_vfs_init = 1; return ret; }
/* Initializes the file system module. If FORMAT is true, reformats the file system. */ void filesys_init (bool format) { fs_device = block_get_role (BLOCK_FILESYS); if (fs_device == NULL) PANIC ("No file system device found, can't initialize file system."); inode_init (); // XXX Lock Initialize lock = (struct lock *)malloc(sizeof(struct lock)); lock_init(lock); // XXX free_map_init (); if (format) do_format (); free_map_open (); }
/* Initializes the file system module. If FORMAT is true, reformats the file system. */ void filesys_init (bool format) { fs_device = block_get_role (BLOCK_FILESYS); if (fs_device == NULL) PANIC ("No file system device found, can't initialize file system."); lock_init(&globalCacheLock); cache_init((struct cache_elem **) &cache); clock_hand = CACHE_SIZE - 1; inode_init (); free_map_init (); if (format) do_format (); free_map_open (); }
void start_kernel(void) { seg_t base, end; /* We set the scheduler up as task #0, and this as task #1 */ setup_arch(&base, &end); mm_init(base, end); init_IRQ(); init_console(); #if 0 calibrate_delay(); #endif setup_mm(); /* Architecture specifics */ tty_init(); buffer_init(); #ifdef CONFIG_SOCKET sock_init(); #endif device_setup(); inode_init(); fs_init(); sched_init(); printk("ELKS version %s\n", system_utsname.release); task[0].t_kstackm = KSTACK_MAGIC; task[0].next_run = task[0].prev_run = &task[0]; kfork_proc(&task[1], init_task); /* * We are now the idle task. We won't run unless no other process can run. */ while (1){ schedule(); } }
/* Initializes the file system module. If FORMAT is true, reformats the file system. */ void filesys_init (bool format) { fs_device = block_get_role (BLOCK_FILESYS); if (fs_device == NULL) PANIC ("No file system device found, can't initialize file system."); fs_cache = cache_create (fs_device, MAX_CACHE_SIZE); if (fs_cache == NULL) PANIC ("Cannot create cache for file system"); inode_init (); free_map_init (); if (format) do_format (); free_map_open (); }
/* Initializes the file system module. If FORMAT is true, reformats the file system. */ void filesys_init (bool format) { fs_device = block_get_role (BLOCK_FILESYS); if (fs_device == NULL) PANIC ("No file system device found, can't initialize file system."); inode_init (); free_map_init (); cache_init (); if (format) do_format (); free_map_open (); /* Couldn't add to thread_init because we need inode_init completed before we can get access to root directory */ thread_current ()->cwd_sector = ROOT_DIR_SECTOR; }
/* Initializes the file system module. If FORMAT is true, reformats the file system. */ void filesys_init (bool format) { fs_device = block_get_role (BLOCK_FILESYS); if (fs_device == NULL) PANIC ("No file system device found, can't initialize file system."); filesys_lock_list = malloc(sizeof(filesys_lock_list) * block_size(fs_device)); int i; for(i=0; i < block_size(fs_device); ++i) { lock_init(filesys_lock_list + i); } inode_init(); free_map_init(); if (format) do_format(); free_map_open (); }
asmlinkage void __init start_kernel(void) { char * command_line; #ifdef __SMP__ static int boot_cpu = 1; /* "current" has been set up, we need to load it now */ if (!boot_cpu) initialize_secondary(); boot_cpu = 0; #endif /* * Interrupts are still disabled. Do necessary setups, then * enable them */ printk(linux_banner); setup_arch(&command_line, &memory_start, &memory_end); memory_start = paging_init(memory_start,memory_end); trap_init(); init_IRQ(); sched_init(); time_init(); parse_options(command_line); /* * HACK ALERT! This is early. We're enabling the console before * we've done PCI setups etc, and console_init() must be aware of * this. But we do want output early, in case something goes wrong. */ memory_start = console_init(memory_start,memory_end); #ifdef CONFIG_MODULES init_modules(); #endif if (prof_shift) { prof_buffer = (unsigned int *) memory_start; /* only text is profiled */ prof_len = (unsigned long) &_etext - (unsigned long) &_stext; prof_len >>= prof_shift; memory_start += prof_len * sizeof(unsigned int); memset(prof_buffer, 0, prof_len * sizeof(unsigned int)); } #ifdef CONFIG_REMOTE_DEBUG set_debug_traps(); /* breakpoint(); */ /* execute a BREAK insn */ #endif memory_start = kmem_cache_init(memory_start, memory_end); sti(); calibrate_delay(); #ifdef CONFIG_CPU_R5900 r5900_init(); #endif #ifdef CONFIG_BLK_DEV_INITRD if (initrd_start && !initrd_below_start_ok && initrd_start < memory_start) { printk(KERN_CRIT "initrd overwritten (0x%08lx < 0x%08lx) - " "disabling it.\n",initrd_start,memory_start); initrd_start = 0; } #endif #ifdef CONFIG_BINFMT_IRIX init_inventory (); #endif mem_init(memory_start,memory_end); kmem_cache_sizes_init(); #ifdef CONFIG_PROC_FS proc_root_init(); #endif uidcache_init(); filescache_init(); dcache_init(); vma_init(); buffer_init(); signals_init(); inode_init(); file_table_init(); #if defined(CONFIG_SYSVIPC) ipc_init(); #endif #if defined(CONFIG_QUOTA) dquot_init_hash(); #endif check_bugs(); printk("POSIX conformance testing by UNIFIX\n"); /* * We count on the initial thread going ok * Like idlers init is an unlocked kernel thread, which will * make syscalls (and thus be locked). */ smp_init(); kernel_thread(init, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGHAND); current->need_resched = 1; cpu_idle(NULL); }
/* 创建文件,若成功则返回文件描述符,否则返回-1 */ int32_t file_create(struct dir* parent_dir, char* filename, uint8_t flag) { /* 后续操作的公共缓冲区 */ void* io_buf = sys_malloc(1024); if (io_buf == NULL) { printk("in file_creat: sys_malloc for io_buf failed\n"); return -1; } uint8_t rollback_step = 0; // 用于操作失败时回滚各资源状态 /* 为新文件分配inode */ int32_t inode_no = inode_bitmap_alloc(cur_part); if (inode_no == -1) { printk("in file_creat: allocate inode failed\n"); return -1; } /* 此inode要从堆中申请内存,不可生成局部变量(函数退出时会释放) * 因为file_table数组中的文件描述符的inode指针要指向它.*/ struct inode* new_file_inode = (struct inode*)sys_malloc(sizeof(struct inode)); if (new_file_inode == NULL) { printk("file_create: sys_malloc for inode failded\n"); rollback_step = 1; goto rollback; } inode_init(inode_no, new_file_inode); // 初始化i结点 /* 返回的是file_table数组的下标 */ int fd_idx = get_free_slot_in_global(); if (fd_idx == -1) { printk("exceed max open files\n"); rollback_step = 2; goto rollback; } file_table[fd_idx].fd_inode = new_file_inode; file_table[fd_idx].fd_pos = 0; file_table[fd_idx].fd_flag = flag; file_table[fd_idx].fd_inode->write_deny = false; struct dir_entry new_dir_entry; memset(&new_dir_entry, 0, sizeof(struct dir_entry)); create_dir_entry(filename, inode_no, FT_REGULAR, &new_dir_entry); // create_dir_entry只是内存操作不出意外,不会返回失败 /* 同步内存数据到硬盘 */ /* a 在目录parent_dir下安装目录项new_dir_entry, 写入硬盘后返回true,否则false */ if (!sync_dir_entry(parent_dir, &new_dir_entry, io_buf)) { printk("sync dir_entry to disk failed\n"); rollback_step = 3; goto rollback; } memset(io_buf, 0, 1024); /* b 将父目录i结点的内容同步到硬盘 */ inode_sync(cur_part, parent_dir->inode, io_buf); memset(io_buf, 0, 1024); /* c 将新创建文件的i结点内容同步到硬盘 */ inode_sync(cur_part, new_file_inode, io_buf); /* d 将inode_bitmap位图同步到硬盘 */ bitmap_sync(cur_part, inode_no, INODE_BITMAP); /* e 将创建的文件i结点添加到open_inodes链表 */ list_push(&cur_part->open_inodes, &new_file_inode->inode_tag); new_file_inode->i_open_cnts = 1; sys_free(io_buf); return pcb_fd_install(fd_idx); /*创建文件需要创建相关的多个资源,若某步失败则会执行到下面的回滚步骤 */ rollback: switch (rollback_step) { case 3: /* 失败时,将file_table中的相应位清空 */ memset(&file_table[fd_idx], 0, sizeof(struct file)); case 2: sys_free(new_file_inode); case 1: /* 如果新文件的i结点创建失败,之前位图中分配的inode_no也要恢复 */ bitmap_set(&cur_part->inode_bitmap, inode_no, 0); break; } sys_free(io_buf); return -1; }
asmlinkage void start_kernel(void) { char * command_line; /* * This little check will move. */ #ifdef __SMP__ static int first_cpu=1; if(!first_cpu) start_secondary(); first_cpu=0; #endif /* * Interrupts are still disabled. Do necessary setups, then * enable them */ setup_arch(&command_line, &memory_start, &memory_end); memory_start = paging_init(memory_start,memory_end); trap_init(); #ifndef CONFIG_OSFMACH3 init_IRQ(); #endif /* CONFIG_OSFMACH3 */ sched_init(); time_init(); parse_options(command_line); #ifdef CONFIG_MODULES init_modules(); #endif #ifdef CONFIG_PROFILE if (!prof_shift) #ifdef CONFIG_PROFILE_SHIFT prof_shift = CONFIG_PROFILE_SHIFT; #else prof_shift = 2; #endif #endif if (prof_shift) { prof_buffer = (unsigned int *) memory_start; /* only text is profiled */ prof_len = (unsigned long) &_etext - (unsigned long) &_stext; prof_len >>= prof_shift; memory_start += prof_len * sizeof(unsigned int); memset(prof_buffer, 0, prof_len * sizeof(unsigned int)); } memory_start = console_init(memory_start,memory_end); #ifdef CONFIG_PCI memory_start = pci_init(memory_start,memory_end); #endif memory_start = kmalloc_init(memory_start,memory_end); sti(); calibrate_delay(); memory_start = inode_init(memory_start,memory_end); memory_start = file_table_init(memory_start,memory_end); memory_start = name_cache_init(memory_start,memory_end); #ifndef CONFIG_OSFMACH3 #ifdef CONFIG_BLK_DEV_INITRD if (initrd_start && initrd_start < memory_start) { printk(KERN_CRIT "initrd overwritten (0x%08lx < 0x%08lx) - " "disabling it.\n",initrd_start,memory_start); initrd_start = 0; } #endif #endif /* CONFIG_OSFMACH3 */ mem_init(memory_start,memory_end); buffer_init(); sock_init(); #if defined(CONFIG_SYSVIPC) || defined(CONFIG_KERNELD) ipc_init(); #endif dquot_init(); arch_syms_export(); sti(); check_bugs(); printk(linux_banner); #ifdef __SMP__ smp_init(); #endif sysctl_init(); /* * We count on the initial thread going ok * Like idlers init is an unlocked kernel thread, which will * make syscalls (and thus be locked). */ #ifdef CONFIG_OSFMACH3 osfmach3_start_init(argv_init, envp_init); #else /* CONFIG_OSFMACH3 */ kernel_thread(init, NULL, 0); #endif /* CONFIG_OSFMACH3 */ /* * task[0] is meant to be used as an "idle" task: it may not sleep, but * it might do some general things like count free pages or it could be * used to implement a reasonable LRU algorithm for the paging routines: * anything that can be useful, but shouldn't take time from the real * processes. * * Right now task[0] just does a infinite idle loop. */ cpu_idle(NULL); }
int main(int argc, char **argv) { int fd; #if defined(USE_FUSE) struct fuse_args margs = FUSE_ARGS_INIT(0, NULL); #endif conf.born = time(NULL); umask(0); atexit(goodbye); signal_init(); evt_init(); blockheap_init(); dconf_init("fs-pkg.cf"); dlink_init(); pkg_init(); inode_init(); if (dconf_get_bool("sys.daemonize", 0) == 1) { fprintf(stdout, "going bg, bye!\n"); /* * XXX: add daemon crud */ } /* * open log file, if its valid, otherwise assume debug mode and use stdout */ if ((conf.log_fp = log_open(dconf_get_str("path.log", NULL))) == NULL) conf.log_fp = stdout; Log(LOG_INFO, "%s %s starting up...", argv[0], VERSION); if (!conf.mountpoint) conf.mountpoint = dconf_get_str("path.mountpoint", "/test"); #if defined(USE_FUSE) /* * only way to make gcc happy...argh;) -bk */ vfs_fuse_args = margs; /* * The fuse_mount() options get modified, so we always rebuild it */ if ((fuse_opt_add_arg(&vfs_fuse_args, argv[0]) == -1 || fuse_opt_add_arg(&vfs_fuse_args, "-o") == -1 || fuse_opt_add_arg(&vfs_fuse_args, "nonempty,allow_other") == -1)) Log(LOG_ERROR, "Failed to set FUSE options.\n"); umount(conf.mountpoint); vfs_fuse_init(); #endif Log(LOG_DEBUG, "Opening database %s", dconf_get_str("path.db", ":memory")); db_sqlite_open(dconf_get_str("path.db", ":memory")); /* * set up the watch subsystem */ vfs_watch_init(); /* * walk the package dirs and import all existing packages */ vfs_dir_walk(); /* * the big event loop */ while (!conf.dying) { ev_loop(evt_loop, 0); } /* * shouldnt be reached... */ return EXIT_SUCCESS; }