简介

1.前面我们使用C语言实现了把启动代码写入3.5寸虚拟软盘头512字节,成功完成了字符显示功能。我们的操作系统在头512字节是远远不够用的,我们就需要把操作系统的其他数据写入软盘的其他扇区,通过头512字节加载操作系统到内存中,并跳转到操作系统代码处。其中这头512字节我们称作为内核加载器。

目标

实现一个能把操作系统代码数据写入虚拟软盘任意扇区的功能模块

1.软盘结构:
3.5英寸软盘片,其上、下两面各被划分为80个磁道,每个磁道被划分为18个扇区,每个扇区的存储容量固定为512字节。共计 80*2*18*512 字节

软盘片的存储格式:盘片的每面划分为多少个同心圆式的磁道,以及每个磁道划分成多少个存储信息的扇区。扇区是软盘的基本存储单位,每次对磁盘的读写均以扇区为单位进行的。

2.C语言实现虚拟软盘读写功能
floppy.h 文件内容如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>/***根据文件名创建一个3.5寸虚拟软盘*3.5寸软盘结构:80个磁道,2个磁头,18个扇区。每个扇区512字节*系统读取磁盘结构:0磁道0磁头1扇区,0磁道0磁头2扇区...,0磁道0磁头18扇区,0磁道1磁头1扇区,*0磁道1磁头2扇区...,0磁道1磁头18扇区。再从1磁道0磁头1扇区....循环读取操作*/
FILE* initFloppy(char *fileName);/***读取软盘指定磁道,磁头,扇区数据*@param    c       磁道[0,79]*@param    h       磁头[0,1]*@param    s       扇区[1,18]*@param    fp      初始化的虚拟软盘文件*@param    buf     读取的磁盘数据,大小长度至少应该是512字节*/
void readFloppy(int c,int h,int s,FILE *fp,char *buf);/***写入软盘指定磁道,磁头,扇区数据*@param    c       磁道[0,79]*@param    h       磁头[0,1]*@param    s       扇区[1,18]*@param    fp      初始化的虚拟软盘文件*@param    buf     读取的磁盘数据,大小长度至多是512字节*/
void writeFloppy(int c,int h,int s,FILE *fp,char *buf);

floppy.c文件内容如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>FILE* initFloppy(char *fileName){FILE *fp = fopen(fileName, "w");char buf[512];memset(buf, 0, 512);for(int c=0;c<80;c++){//磁道for(int h=0;h<2;h++){//磁头for(int s=1;s<=18;s++){//扇区fwrite(buf, 512, 1, fp);}}}return fp;
}void readFloppy(int c,int h,int s,FILE *fp,char *buf){//把虚拟软盘映射成线性偏移int index = 18*2*512*c + h*18*512 + (s-1)*512;int tmp = (int)ftell(fp);fseek(fp, index, SEEK_SET);fread(buf,512,1,fp);fseek(fp, tmp, SEEK_SET);
}void writeFloppy(int c,int h,int s,FILE *fp,char *buf){//把虚拟软盘映射成线性偏移int index = 18*2*512*c + h*18*512 + (s-1)*512;int tmp = (int)ftell(fp);fseek(fp, index, SEEK_SET);fwrite(buf, 512, 1, fp);fseek(fp, tmp, SEEK_SET);
}

3.使用方法:
以上一节汇编程序生成的boot.bat文件为例写入软盘头512字节

FILE *fp = initFloppy("floppy.img");
FILE *src = fopen("boot.bat", "r");
if(src == NULL) {printf("文件打开失败");exit(0);
}
char buf[512];
memset(buf, 0, 512);
fread(buf, 512, 1, src);
buf[510] = 0x55;
buf[511] = 0xaa;
writeFloppy(0, 0, 1, fp, buf);fclose(fp);

出现上图所示说明我们的虚拟软盘读写功能模块成功

03.C 语言实现3.5寸虚拟软盘相关推荐

  1. JAVA学习笔记 03 - JAVA语言程序结构

    本文是Java基础课程的第三课.计算机语言的程序结构无外乎顺序结构.分支结构.循环结构,本文主要介绍Java语言中这些程序结构是如何实现的 文章目录 一.程序结构 二.分支结构 1.单分支if语句 2 ...

  2. 03.Go语言的设计哲学之三: 并发

    本文视频地址 Go 语言原生并发原则 1) Go 语言自身实现层面支持面向多核硬件的并发执行和调度 提到并发执行与调度,我们首先想到的就是操作系统对进程.线程的调度.操作系统调度器会将系统中的多个线程 ...

  3. 03 go语言_Map

    1.map的操作: 1-1.创建:make(map[string]int):定义 Map,可以使用内建函数 make 也可以使用 map. 1-2.获取元素:m[key] 1-3.key不存在时,获得 ...

  4. C语言集锦 | 03 - C语言的复合数据类型(typedef关键字、结构体、枚举体、共用体)

    文档版本 更新时间 更新内容 v1.0 2020-09-14 初稿完成 文章目录 一.typedef关键词 二.结构体(重点) 1. 为什么需要结构体 2. 什么是结构体 3. 如何定义结构体 4. ...

  5. 【嵌入式】C语言高级编程-语句表达式(03)

    00. 目录 文章目录 00. 目录 01. C语言的表达式 02. C语言的语句 03. C语言中的代码块 04. C语言中的语句表达式 05. 宏中使用语句表达式 06. Linux内核应用示例 ...

  6. AI Studio下C语言编程:一道简单的C语言作业题目

    简 介: 本文测试了在 AI Studio中进行C语言编程的过程.使用与 搭建AI Studio 中Python开发环境 同样的 "AIS" python文件,可以在Windows ...

  7. GPM - 多语言实现视频

    晚上有些睡不着,就录制了一个视频,给大家分享一下思路,希望给天天忙乎的同行一个参考.经常会参考我们的弓箭对战枪炮,我们的步枪对坦克飞机大炮.我们不能光勤奋怒工作,我们还需要有强大的武器才可以.光努力蛮 ...

  8. c语言不安全库_为什么和其他语言相比C语言是快速的语言?

    点击上方蓝字关注我哦- 01 前言 初入门的我们经常听见别人说"真正的程序员用C语言编程,C是最快的语言因为它是最靠近及其底层的语言."那么和其他语言相比C语言到底有什么特别的呢? ...

  9. KCL:声明式的云原生配置策略语言

    楔子: 以蚂蚁集团典型的建站场景为例,在接入 Kusion 后,用户侧配置代码减少到 5.5%,用户面对的 4 个平台通过接入统一代码库而消减,在无其他异常的情况下交付时间从 2 天下降到 2 小时- ...

  10. 48岁的C语言,你知道它背后的历史吗?

    C语言作为一个人尽皆知的语言,甚至没有学过编程语言的人也知道它的大名.经历沧桑岁月的它,已经陪伴我们走过了48个年头.回望当年,C语言还在襁褓之中-- 贝尔实验室特别人员奖.美国计算机协会(ACM)的 ...

最新文章

  1. DS博客大作业--树
  2. 检测一组电动车电瓶好坏要多久?
  3. 数据结构:插入排序(Insertion sort)
  4. java线程 教程_Java多线程系列教程
  5. WGho_Setup 雨林木风 一键备份
  6. vue Method 事件
  7. NOI数学之提高级:线性方程组的高斯消元法
  8. 博客七----tensorflow-gpu安装满满填坑
  9. 基于QT开发的线性代数初学者的矩阵计算器设计
  10. “996”引众怒,互联网疯狂的后遗症
  11. 红米手机使用应用沙盒动态修改运营商参数
  12. tibco常用命令记录
  13. This scheduler instance (XXXXX) is still active but was recovered by another
  14. 【风宇冲】动画系统Mecanim
  15. k30pro杀进程严重怎么解决_命运2掉帧严重怎么解决?GoLink免费加速器助力玩家稳定畅玩...
  16. 淮师计算机网络试题库,淮阴师范学院(淮师)计算机基础一至六章习题
  17. matlab Sellmeier拟合,rcwa 关于严格耦合波发分析光栅等的相关matlab仿真 275万源代码下载- www.pudn.com...
  18. 51nod2943 旅行者
  19. HTML标记fort属性最大取值,CSS(2)---css字体、文本样式属性
  20. 2019牛客暑期多校训练营(第一场)E-ABBA(dp)

热门文章

  1. 微软修复了国家安全局上报的Windows严重漏洞
  2. 脸上不同部位长痘痘的原因
  3. 网页设计中的色彩搭配技巧
  4. linux查看设备pid vid,Linux设备PID VID详细说明
  5. TensorFlow中的通信机制——Rendezvous(一)本地传输
  6. Mailplane 4 for Mac(Gmail邮件客户端)
  7. 虚假共识—阿比勒尼悖论:“枪打出头鸟”与“事后诸葛亮”
  8. 关于显存位宽、显存带宽和显存容量的理解
  9. selenium执行click报错的解决方案
  10. QT 代码添加QScrollArea