使用文件系统

注:本文仍然主要来自《writeos-1.0-2-weekly》

一、加载指定扇区支指定空间

《运行自己的操作系统(linux版) -0.01》提到读入启动扇区,那是由硬盘自动完成的。

若要读入其它扇区到一个特定的内存空间,就要自己写代码完成,使用底层BIOS系统提供的BIOS 13h号中断,如图:

(1)读入一个扇区需要用到的参数,假设扇区号已知,需要用的参数及获取方法如下:

al 扇区数 根据需要填写,本文中为1
cx高10位 柱面号 由上图公式计算
cx低6位 扇区号 根据需要填写
dh 磁头号 由上图公式计算
dl 驱动器 根据需要填写,软盘为0
es:bx 数据缓冲区地址 根据需要填写

(2)把各个寄存器的值按如图设置,然后调用13号中断,该扇区的内容就被读到ES:BX空间中

(3)代码实现

/*=====================================================================
  Routine: ReadSector
  Action: Read %c1 Sectors from %ax sector(floppy) to %es:%bs(memory)
  Assume sector number is ‘x‘, then
    x / (BPB_SecPerTrk) = y,
    x % (BPB_SecPerTrk) = z.
  The remainder ‘z‘ plus 1 is the start sector number;
  The quotient ‘y‘ devied by BPB_NumberHeads(RIGHT SHIFT 1 bit) is sylinder number;
  AND ‘y‘ by 1 can got magnetic header.
*/
ReadSector:                            /*图0*/
    push    %ebp                       /*图1*/
    mov        %esp,    %ebp           /*图2*/
    sub        $2,        %esp        /*图3,Reserve space for saving %cl*/
    mov        %cl,    -2(%ebp)        /*图4*/
    push    %bx                    /*图5,Save bx*/
    mov        (BPB_SecPerTrk), %bl/*%bl: the devider*/
    div        %bl                    /*‘y‘ in %al, ‘z‘ in %ah*/
    inc        %ah                    /*z++, got start sector*/
    mov        %ah,    %cl            /*%cl <- start sector number*/
    mov        %al,    %dh            /*%dh <- ‘y‘*/
    shr        $1,        %al            /*‘y‘ / BPB_NumberHeads*/
    mov        %al,    %ch            /*%ch <- Cylinder number(y>>1)*/
    and        $1,        %dh            /*%dh <- Magnetic header(Y&1)*/
    pop        %bx                    /*图6, Restore %bx*/
    /*Now we got cylinder number in %ch, start sector number in %cl, magnetic header in %dh.*/
    mov        (BS_DrvNum), %dl
GoOnReading:
    mov        $2,        %ah
    mov        -2(%ebp), %al        /*Read %al sectors,根据图6,%al得到的是图4存入的%cl*/
    int        $0x13
    jc        GoOnReading            /*If CF set 1, mean read error, reread.*/
    add        $2,        %esp        /*图7*/
    pop        %ebp                   /*图8*/
    ret

(4)为了便于理解该函数,在涉及堆栈操作的地方画了几张图

二、查找一个指定文件

都在图里了,代码比较长,看原著吧

三、加载一个指定文件

(1)FAT12表项是12位的,即1.5个字节。若表项号为奇数,则取高12位,若为偶数,则取低12位

(2)代码

/*=====================================================================
  Routine: GetFATEntry
  Action: Find %ax sector‘s index in FAT, save result in %ax
*/
GetFATEntry:
    push    %es
    push    %bx
    push    %ax
    mov        $BaseOfLoader, %ax
    sub        $0x0100,    %ax
    mov        %ax,        %es
    pop        %ax
    mov        $3,            %bx
    mul        %bx
    mov        $2,            %bx
    div        %bx
    movb    %dl,        (bOdd)

LABEL_EVEN:
    xor        %dx,        %dx
    mov        (BPB_BytsPerSec),%bx
    div        %bx
    push    %dx
    mov        $0,            %bx
    add        $SecNoOfFAT1,%ax
    mov        $2,            %cl
    call    ReadSector
    pop        %dx
    add        %dx,        %bx
    mov        %es:(%bx),    %ax
    cmpb    $0,            (bOdd)
    jz        LABEL_EVEN_2
    shr        $4,            %ax

LABEL_EVEN_2:
    and        $0x0fff,    %ax

LABEL_GET_FAT_ENTRY_OK:
    pop        %bx
    pop        %es
    ret

四、测试

没有截图

使用文件系统

时间: 2024-11-06 11:23:27

使用文件系统的相关文章

刨根问底:ext3/ext4文件系统最大空间及单个文件大小演算法则

从ext3和ext4文件系统来窥探空间和文件大小的演算法则 学习操作系统就不得不研究磁盘以及磁盘文件系统,磁盘是底层物理设备,而文件系统则是管理磁盘的上层工具,文件系统规划了磁盘存放数据的格式,确定了一个操作系统能够支持多大的磁盘空间,每个分区能够支持多大的数据空间,以及每个文件所能支持的大小.通常对系统管理员而言,最需要的知道的就是最大磁盘空间,最大分区空间以及最大文件的大小.本论题只讨论这三种大小到底是怎么算出来的,而不是死记硬背.知道了原理,以后不管遇到什么文件系统,都会有章可循,至少知道

使用path监听指定文件系统的变化

在以前的JAVA版本中,如果程序需要检测文件的变化,那么需要开辟一个线程每隔一段时间去遍历一次指定的目录,如果发现此次遍历结果和上次不同,那么就认为文件变动了 ,这样的方式非常繁琐,JAVA 7之后的NIO.2 Path类提供了一个方法来监听指定文件目录内文件的变化状态. 1.获取文件系统的WatchService对 2.使用Path类的方法去注册一个监听,指定监听文件的哪些状态,如新增.修改.删除. package com.nio2; import java.io.IOException;im

Busybox构建根文件系统和制作Ramdisk

定制根文件系统的方法很多,最常用的是使用BusyBox来构建定制根文件系统.它集成压缩了Linux的许多工具和命令,可以使用户迅速方便地建立一套相对完整.功能丰富的文件系统,其中包括大量常用的应用程序.下面详细介绍有关Busybox定制根文件系统. 一.系统环境: 1.操作系统:Ubuntu140.4 2.交叉编译工具:gcc version 6.1.1 20160711 (Linaro GCC 6.1-2016.08) 3.busybox源码包:busybox-1.26.2 二.构建rootf

RH124-14 文件系统和磁盘设备管理

第十四章 文件系统和磁盘设备管理 14.1 文件系统和磁盘设备的管理与使用 磁盘设备 磁盘设备是支持随机读写数据的设备. 在物理机器上,设备文件默认都存放在/dev/目录下,第一个硬盘是/dev/sda,第二个硬盘是/dev/sdb,如此类推.第一个硬盘的第一个分区是/dev/sda1,第二个分区是/dev/sda2,如此类推. 在xen或kvm的虚拟机上,硬盘的名字则是/dev/xvda或/dev/vda等,如此类推 有些存放数据的设备并不是直接硬件对应的设备文件,而是通过软件生成的块设备文件

第九章、文件与文件系统的压缩与打包

1. 压缩文件的用途与技术 2. Linux 系统常见的压缩命令 2.1 compress 2.2 gzip, zcat 2.3 bzip2, bzcat 3. 打包命令: tar 4. 完整备份工具:dump, restore 5. 光盘写入工具 5.1 mkisofs:创建映像档 5.2 cdrecord:光盘烧录工具 6. 其他常见的压缩与备份工具 6.1 dd 6.2 cpio 7. 重点回顾 1. 压缩文件的用途与技术 2. Linux 系统常见的压缩命令 压缩文件的扩展名大多是:『*

Windows挂载NFS文件系统

主机 操作系统 IP地址 软件包 NFS主机 Centos7.2 192.168.190.128 nfs-utils.rpcbind Windows Client Windows server 2008 192.168.190.129 网络文件系统 注:以下实验均关闭防火墙以及其它安全机制 NFS主机操作: # 使用yum安装nfs-utils和管理工具rpcbind [[email protected] ~]# yum -y install nfs-utilsrpcbind # 建立共享文件夹

ii 第七单元 访问网络共享文件系统

挂载网络文件系统 网络文件系统是由网络附加存储服务器通过网络向多个主机提供的一种文件系统 , 而不是由块设备 ( 例如硬盘驱动器 ) 提供的.客户端通过特殊的文件系统协议和格式访问远程存储 Linux 中有两种主要协议可用访问网络文件系统 : NFS 和CIFS . 访问网络共享的三个基本步骤– 1. 识别要访问的远程共享– 2. 确定挂载点 ( 应该将共享挂载到的位置 ), 并创建挂载点的空目录– 3. 通过相应的名利或配置更改挂载网络文件系统 1.cifsCIFS( Comon Intern

【第三章】BCMS中应用的文件系统

因为我的mac 上mysql 的问题,造成我选择file和mongodb来做数据的持久化操作. mongodb的话,写了一小部分,已经可是可以使用,但是存在问题,所以决定先写file来进行数据操作. 之前我和小伙伴思考和讨论过这个问题,用小文件和数据库储存文件哪个会更快,数据库保存数据的方式应该和文件系统的方式一致,至于效率有待验证. 既然要使用文件系统去做数据的存储,基础的文件读取修改等方法应该写的通用,我现在还在修改这部分,因为已经在应用中发现了问题,这里先贴出来. 这里是主文件file.r

Hadoop学习笔记(3) Hadoop文件系统二

1 查询文件系统 (1) 文件元数据:FileStatus,该类封装了文件系统中文件和目录的元数据,包括文件长度.块大小.备份.修改时间.所有者以及版权信息.FileSystem的getFileStatus()方法用于获取文件或目录的FileStatus对象. 例:展示文件状态信息 public class ShowFileStatusTest{ private MiniDFSCluster cluster; private FileSystem fs; @Before public void

第三课 文件系统(上)

unix_c_03.txt====================第三课 文件系统(上)====================一.系统调用------------应用程序 -----------+| |v |各种库 |(C/C++标准库.Shell命令和脚本. |X11图形程序及库) || |v |系统调用 <----------+(内核提供给外界访问的接口函数,调用这些函数将使进程进入内核态)|v内核(驱动程序.系统功能程序)1. Unix/Linux大部分系统功能是通过系统调用实现的.如o