当前位置: 首页 > news >正文

郑州手机端网站建设遵义市住房城乡建设局网站

郑州手机端网站建设,遵义市住房城乡建设局网站,南通城乡住房建设厅网站,做网站 中企动力Linux-0.11 文件系统super.c详解 模块简介 该模块主要包含了对超级块的一些读写操作。 函数详解 lock_super static void lock_super(struct super_block * sb)该函数的作用是锁定bh块。 cli();//关中断while (sb-s_lock)//如果已经被锁定sleep_on((sb-s_wai…Linux-0.11 文件系统super.c详解 模块简介 该模块主要包含了对超级块的一些读写操作。 函数详解 lock_super static void lock_super(struct super_block * sb)该函数的作用是锁定bh块。 cli();//关中断while (sb-s_lock)//如果已经被锁定sleep_on((sb-s_wait));//将当前任务置为不可中断的等待状态并添加到该超级快等待队列。sb-s_lock 1;//锁定该超级快sti();//关中断free_super static void free_super(struct super_block * sb)对指定超级块进行解锁。 cli();//关中断sb-s_lock 0;//对超级块进行解锁wake_up((sb-s_wait));//唤醒等待该超级块的进程sti();//开中断wait_on_super static void wait_on_super(struct super_block * sb)该函数的作用是等待超级块解锁。 cli();//关中断while (sb-s_lock)//如果已经被锁定sleep_on((sb-s_wait));//将当前任务置为不可中断的等待状态并添加到该超级快等待队列。sti();//开中断get_super struct super_block * get_super(int dev)获取指定设备的超级块。 struct super_block * s;if (!dev)return NULL;s 0super_block;while (s NR_SUPERsuper_block)if (s-s_dev dev) {wait_on_super(s);if (s-s_dev dev)return s;s 0super_block;} elses;return NULL;put_super void put_super(int dev)该函数用于放回指定设备的超级块。 struct super_block * sb;/* struct m_inode * inode;*/int i;首先判断该设备是否是根文件系统设备如果是则直接返回。 if (dev ROOT_DEV) {printk(root diskette changed: prepare for armageddon\n\r);return;}接着开始读取该设备的超级块。如果该超级块的挂载位置i节点s_imount还没有处理则打印告警并返回。 if (!(sb get_super(dev)))return;if (sb-s_imount) {printk(Mounted disk changed - tssk, tssk\n\r);return;}找到该设备的超级块这时候首先需要锁定该超级块。接着释放i节点位图和逻辑块位图。结束之后对该超级块进行解锁并返回。 lock_super(sb);sb-s_dev 0;for(i0;iI_MAP_SLOTS;i)brelse(sb-s_imap[i]);for(i0;iZ_MAP_SLOTS;i)brelse(sb-s_zmap[i]);free_super(sb);return;read_super static struct super_block * read_super(int dev)该函数的作用是用于读取指定设备的超级块。 程序的开始定义了一些变量对进行一些校验。 struct super_block * s;struct buffer_head * bh;int i,block;if (!dev)return NULL;check_disk_change(dev);接着从超级块数组中获取一个超级块。如果已经存在则直接返回该超级块的指针。如果不存在则找出一个空闲的位置s_dev0。找到之后边进行初始化。 if ((s get_super(dev)))return s;for (s 0super_block ;; s) {if (s NR_SUPERsuper_block)return NULL;if (!s-s_dev)break;}s-s_dev dev;s-s_isup NULL;s-s_imount NULL;s-s_time 0;s-s_rd_only 0;s-s_dirt 0;接下来就是读取该设备的第一个磁盘块到内存中。第0个磁盘块是引导第一个磁盘块是超级块。 if (!(bh bread(dev,1))) {s-s_dev0;free_super(s);return NULL;}*((struct d_super_block *) s) *((struct d_super_block *) bh-b_data);brelse(bh);接下俩检查其魔数如果不是0x137F则不能处理。 if (s-s_magic ! SUPER_MAGIC) {s-s_dev 0;free_super(s);return NULL;}接下来开始读取i节点位图和逻辑块位图数据。i节点位图在设备的第2号块开始共占用s_imap_blocks块。逻辑块位图在i节点位图之后共占用s_zmap_blocks块。 for (i0;iI_MAP_SLOTS;i)s-s_imap[i] NULL;for (i0;iZ_MAP_SLOTS;i)s-s_zmap[i] NULL;block2;for (i0 ; i s-s_imap_blocks ; i)if ((s-s_imap[i]bread(dev,block)))block;elsebreak;for (i0 ; i s-s_zmap_blocks ; i)if ((s-s_zmap[i]bread(dev,block)))block;elsebreak;接下来如果文件系统信息有问题则意味着初始化失败则进行失败的处理。 if (block ! 2s-s_imap_blockss-s_zmap_blocks) {for(i0;iI_MAP_SLOTS;i)brelse(s-s_imap[i]);for(i0;iZ_MAP_SLOTS;i)brelse(s-s_zmap[i]);s-s_dev0;free_super(s);return NULL;}程序运行到这里说明一切正常。因为0号i节点和0号数据块是不能使用的因此将i节点位图和逻辑块位图的0号位置设置为1。 s-s_imap[0]-b_data[0] | 1;s-s_zmap[0]-b_data[0] | 1;free_super(s);return s;sys_umount int sys_umount(char * dev_name)该函数用于卸载一个文件系统。 程序的开始定义了一些变量接着通过设备名称获取其i节点。 struct m_inode * inode;struct super_block * sb;int dev;if (!(inodenamei(dev_name)))return -ENOENT;对于设备节点而言其设备号存放在i节点的i_zone[0]中。如果该i节点不是一个块设备文件则不能进行卸载于是返回错误。 dev inode-i_zone[0];if (!S_ISBLK(inode-i_mode)) {iput(inode);return -ENOTBLK;}iput(inode);如果该设备号存放的是根文件系统则不能进行卸载。 if (devROOT_DEV)return -EBUSY;接下来根据设备号取出其超级块如果该超级块中的s_imount为NULL也就是该设备没有被挂载则不能进行卸载。 if (!(sbget_super(dev)) || !(sb-s_imount))return -ENOENT;如果挂载的目录节点的i_mount字段为0则需要打印日志提示。 if (!sb-s_imount-i_mount)printk(Mounted inode has i_mount0\n);接下来遍历inode表查看该设备节点是否被占用如果被占用则返回错误。 for (inodeinode_table0 ; inodeinode_tableNR_INODE ; inode)if (inode-i_devdev inode-i_count)return -EBUSY;程序运行到这里就开始正式的卸载。首先将挂载的目录节点的i_mount标记为0随后放回该挂载目录节点。随后将超级块的s_imount字段标记为NULL并将该文件系统的根i节点进行放回。 sb-s_imount-i_mount0;iput(sb-s_imount);sb-s_imount NULL;iput(sb-s_isup);sb-s_isup NULL;最后释放该设备上的超级块以及位图中占用的高速缓冲块并对该设备进行数据同步。 put_super(dev);sync_dev(dev);sys_mount int sys_mount(char * dev_name, char * dir_name, int rw_flag)该函数的作用是用于安装文件系统。该函数是sys_开头的是一个系统调用。 函数的开始定义了一些变量接着通过设备名称获取其i节点。 struct m_inode * dev_i, * dir_i;struct super_block * sb;int dev;if (!(dev_inamei(dev_name)))return -ENOENT;对于设备类型的i节点其i_zone[0]存放的是设备号dev。接着判断该设备是否是一个块设备文件如果不是块设备文件是不能挂在文件系统的就会返回权限错误。如果权限校验没有问题就把dev_i节点放回。 dev dev_i-i_zone[0]; //获取其设备号devif (!S_ISBLK(dev_i-i_mode)) { //判断该i节点是否是一个设备节点如果不是则返回权限错误iput(dev_i);return -EPERM;}iput(dev_i); //获取到dev_i接下来获取dir_name对应的i节点dir_i。 if (!(dir_inamei(dir_name))) //获取dir_name的i节点return -ENOENT;如果dir_i这个i节点的引用计数不为1也就是说这个i节点还被其他进程使用或者dir_i节点是根文件系统的1号i节点则不能进行挂载。 if (dir_i-i_count ! 1 || dir_i-i_num ROOT_INO) {iput(dir_i);return -EBUSY;}此外如果该i节点不是一个目录节点则也不能进行挂载。 if (!S_ISDIR(dir_i-i_mode)) { //判断dir_i的类型如果不是目录节点则不能进行挂载iput(dir_i);return -EPERM;}当运行到这里时就意味着对挂载设备和挂载目录的校验就通过了。接下来读取设备dev的超级块。 if (!(sbread_super(dev))) {//读取dev设备的超级块iput(dir_i);return -EBUSY;}如果该超级块已经挂载到某个目录下那么将返回错误。如果该目录已经挂载了其他的块设备也返回错误。 if (sb-s_imount) {//超级块的s_imount不为空代表该超级块已经挂载到某个目录下则返回EBUSYiput(dir_i);return -EBUSY;}if (dir_i-i_mount) {//目标的目录节点已经挂载了其他的设备则返回EPERMiput(dir_i);return -EPERM;}最后便开始进行真正的挂载步骤其实就是将超级块sb的s_imount指向挂载的目录i节点dir_i。接着将目录i节点dir_i的i_mount字段标记为1也将i_dirt标记为1。这些执行完毕之后将返回0。 sb-s_imountdir_i;dir_i-i_mount1;dir_i-i_dirt1;return 0;mount_root void mount_root(void)该函数的作用是安装根文件系统。 该函数的最初定义了一些变量对d_inode的结构的长度进行校验。 int i,free;struct super_block * p;struct m_inode * mi;if (32 ! sizeof (struct d_inode))panic(bad i-node size);如果根文件系统在软盘中就提示插入跟文件系统盘。 for(i0;iNR_FILE;i)file_table[i].f_count0;if (MAJOR(ROOT_DEV) 2) {printk(Insert root floppy and press ENTER);wait_for_keypress();}初始化超级块数组。 for(p super_block[0] ; p super_block[NR_SUPER] ; p) {p-s_dev 0;p-s_lock 0;p-s_wait NULL;}读取根文件系统的超级块。 if (!(pread_super(ROOT_DEV)))panic(Unable to mount root);读取根目录的i节点。 if (!(miiget(ROOT_DEV,ROOT_INO)))panic(Unable to read root i-node);该函数在init进程中调用下面设置init进程PCB的pwd和root。 mi-i_count 3 ; /* NOTE! it is logically used 4 times, not 1 */p-s_isup p-s_imount mi;current-pwd mi;current-root mi;统计空闲的i节点数量。 free0;ip-s_nzones;while (-- i 0)if (!set_bit(i8191,p-s_zmap[i13]-b_data))free;printk(%d/%d free blocks\n\r,free,p-s_nzones);统计空闲的逻辑块节点。 free0;ip-s_ninodes1;while (-- i 0)if (!set_bit(i8191,p-s_imap[i13]-b_data))free;printk(%d/%d free inodes\n\r,free,p-s_ninodes);Q A
http://www.sczhlp.com/news/153382/

相关文章:

  • 网站开发目前主要用什么技术thinkphp5 网站开发
  • 郑州市金水区建设局网站开封旅游网站建设网页推广
  • 网站建设全部教程网站设计英语
  • 网络公司网站设计做我姓什么的网站
  • 完整教程:C++设计模式之结构型模式:适配器模式(Adapter)
  • 手机软件下载网站推荐班级网页制作
  • 网站建设费用高怎么花最少的钱做网站
  • 2017年网站外链怎么做海报设计素材网站免费
  • 余姚网站seo运营网站网址ip查询
  • 百川网站百度云图片转wordpress
  • 网站开发沟通全站仪为什么要建站
  • 母婴网站dede织梦做游戏必备的几个网站
  • 广东建设注册中心网站外贸做网站用什么
  • 上海中高端网站建设淮南电商网站建设
  • 关于网站建设的外文翻译做网站简单需要什么软件
  • 企业网站推广有哪些方式中美俄最新军事新闻
  • 网页访问速度很慢,远程仓库调用很慢
  • 南宁伯才网络建站如何网站建设ppt方案模板下载
  • 建设网站需要的硬件设备d8 4.0 wordpress
  • WordPress适合做多大级别的网站百度权重高的网站有哪些
  • 公司建设一个网站做娱乐网站
  • 响应式自助建站平台用dw做网站怎么做出下拉菜单
  • 从旁鼓动人做某事 网站长沙中小企业有哪些公司
  • 网站建设费如何做账备案 网站首页地址
  • 深入解析:【项目】Vision Master OpenCV 3.0 版本(预)发行说明
  • 大型门户网站建设需要哪些技术程序员分为六个等级
  • 网站速度诊断 慢域名 和网站有什么区别吗
  • 公司网站变更域名买域名建网站
  • 简单的销售网站怎么做网页设计参考网站
  • 建立网站是什么建立的广西住房和城乡建设局官网