自制简单U盘引导程序

2023-10-29

操作系统实验导航
实验一:银行家算法 https://blog.csdn.net/weixin_46291251/article/details/115384510
实验二:多级队列调度和多级反馈队列调度算法 https://blog.csdn.net/weixin_46291251/article/details/115530582
实验三:动态分区式内存管理 https://blog.csdn.net/weixin_46291251/article/details/115772341
实验四:Linux下多进程通信 https://blog.csdn.net/weixin_46291251/article/details/116274665
实验五:进程通信的三种方式 https://blog.csdn.net/weixin_46291251/article/details/116301250
实验六:Linux文件系统实验 https://blog.csdn.net/weixin_46291251/article/details/116423798
实验七:自制简单U盘引导程序 https://blog.csdn.net/weixin_46291251/article/details/116427629
实验八:磁盘调度算法 https://blog.csdn.net/weixin_46291251/article/details/116431907
实验九:请求分页系统中的置换算法 https://blog.csdn.net/weixin_46291251/article/details/116443021
学习笔记:操作系统复习笔记 https://blog.csdn.net/weixin_46291251/article/details/117086851

0基础如何编写并运行一个汇编程序 ?

这里涉及到两个概念:汇编器和链接器

汇编器(assembler)的作用是将用汇编语言编写的源程序转换成二进制形式的目标代码。Linux 平台的标准汇编器是 GAS,它是 GCC所依赖的后台汇编工具,通常包含在 binutils 软件包中。GAS 使用标准的 AT&T 汇编语法,可以用来汇编用 AT&T格式编写的程序:

由汇编器产生的目标代码是不能直接在计算机上运行的,它必须经过链接器的处理才能生成可执行代码。链接器通常用来将多个目标代码连接成一个可执行代码,这样可以先将整个程序分成几个模块来单独开发,然后才将它们组合(链接)成一个应用程序。Linux 使用 ld 作为标准的链接程序,它同样也包含在 binutils 软件包中。汇编程序在成功通过 GAS 或 NASM 的编译并生成目标代码后,就可以使用 ld 将其链接成可执行程序了:

准备工作:安装gcc,as86,ld86

gcc用于编译.c的程序,该程序用于将数据写入到U盘;
as86和ld86用于汇编和链接intel汇编语法下的汇编程序,该程序会写入数据到计算机的显示缓冲区,计算机会立即显示缓冲区的内容。
安装方法:

sudo apt-get install gcc bin86

编写并运行一个汇编程序步骤:

  • 1.vim hello.s 创建一个.s的文件
  • 2.编写hello.s 的内容
  • 3.编译:as -o hello.o hello.s
  • 4.链接:ld -s -o hello hello.o
  • 5.执行:./hello

这里给出一在这里插入代码片个简单程序hello world的汇编源代码:

#hello.s 
.data                    
        msg : .string "Hello, world!\\n" 
        len = . - msg                   
.text                    
.global _start           
         
_start:                  
        movl $len, %edx  
        movl $msg, %ecx  
        movl $1, %ebx   
        movl $4, %eax    
        int  $0x80       
                                 
        movl $0,%ebx     
        movl $1,%eax     
        int  $0x80       

题目描述

  • 1、用汇编语言编写一小段程序,如在屏幕上输出一个字符。(调用中断)
  • 2、利用命令或winhex等工具将编译好的二进制程序写入U盘的主引导记录
  • 3、开机,选择U盘启动,观察实验效果。
  • 4、进一步地,丰富前述程序的功能,如增加键盘中断,可以对键盘上的动作进行响应(如敲入某字符X,屏幕能回显即可)。
  • 5、再次写入引导扇区,观察实验效果

下面是题目需要用到的一个小程序,屏幕输出按下的键盘:

NAME TURN
DSEG SEGMENT
A DB 'PLEASE INPUT (a~z):','$'
B DB 0AH,0DH,'$'
DSEG ENDS
SSEG SEGMENT STACK
DB 90H DUP(?)
SSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,SS:SSEG
START:
MOV AX,DSEG
MOV DS,AX

MOV DX,OFFSET A///提示输入
MOV AH,09H
INT 21H

MOV AH,01H
INT 21H
MOV BL,AL
SUB BL,20H///转换

MOV DX,OFFSET B
MOV AH,09H
INT 21H

MOV DL,BL
MOV AH,02
INT 21H//输出

MOV AH,4CH
INT 21H/结束
CSEG ENDS
END START 

步骤

编写能够在屏幕显示字符的汇编程序

vim bootsetc.s

entry start
start:
mov ax,#0xb800
mov ds,ax
mov byte[0],#0x4c
mov byte[1],#0x1f
hlt

执行命令

as86 -o bootsect.o bootsect.s   
ld86 -o bootsect bootsect.o

生成可执行文件bootsect。

编写可将数据写入U盘启动扇区的程序

vim write-mbr.c

#include <fcntl.h>
#include <stdio.h>
int main(int argc,char*argv[]){
   	int dev_flag,file_flag;
  	unsigned char buffer[512];
	file_flag = open("./bootsect",O_RDONLY);
	if(file_flag == -1){
		perror("failed to read file boot");
	return -1;
}
	read(file_flag,buffer,510);
	close(file_flag);
	buffer[510] =0x55;
	buffer[511] =0xaa;
	dev_flag = open("/dev/sda",O_RDWR);
	if(dev_flag == -1){
		perror("failed to open device /dev/sda");
		return -1;
	}
	write(dev_flag,buffer,512);
	close(dev_flag);
	puts("successful.");
return 0;
}

执行命令

gcc -o write-mbr write-mbr.c

将U盘接入电脑,挂载到linux上

首先用命令 sudo fdisk -l 可以通过容量找到对应U盘的设备名称。
然后用命令 sudo mount /dev/sda /mnt/flash将U盘挂载到flash,注意该命令需要flash目录存在,不存在则要创建:
cd /mnt && sudo mkdir flash
最后执行 ./write-mbr ,shell返回successful,说明写入成功。

卸载设备,将U盘插入一台电脑,并通过BIOS将启动项改为U盘优先。开机便可一看到一个蓝底白色的L字符。
注意

1)U盘在第二次插回linux主机时,会出现挂载失败的现象,原因可能是由于写入了512个字节的数据破坏了U盘关于分区,文件系统信息的记录,因此目前的解决办法就是重新格式化U盘,命令为 mkfs.vfat /dev/sda。格式化完成后挂载成功,即可在此写入程序。
2)每次都需要重新格式化U盘,然后挂载U盘,编译好几个文件,因此考虑写一个shell脚本一次性完成数据的写入任务。

运行结果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自制简单U盘引导程序 的相关文章

随机推荐

  • 【YOLOv5-6.x】设置可学习权重结合BiFPN(Concat操作)

    文章目录 前言 修改yaml文件 以yolov5s为例 修改common py 修改yolo py 修改train py 1 向优化器中添加BiFPN的权重参数 2 查看BiFPN Concat层参数更新情况 前言 这篇博客 魔改YOLOv
  • 安卓开发 Fragment的简单使用与解析

    1 Fragment的简介 Fragment是Android3 0以后引入的新的api 为了适配大屏的平板 在普通手机开发的过程中 使用Fragment能实现一个界面的多次使用 能加快效率 Fragment可以被认为是Activity界面的
  • vpp 使用E810

    一 操作 vpp版本 2001 dpdk版本 20 02 1 修改vpp使用指定dpdk版本 DPDK VERSION指定dpdk版本 DPDK 20 02 TARBALL MD5 CKSUM指定dpdk得md5值 2 准备e810 ddp
  • 基于Redis的发布/订阅模式实现者:RedisQ

    Redis中是存在发布 订阅功能的 哪这个github的项目是意欲何为 RedisQ项目的主页上作了以下说明 What Redis offers with Pub Sub is a listener model where each sub
  • 698. 划分为k个相等的子集:给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。

    题目描述 给定一个整数数组 nums 和一个正整数 k 找出是否有可能把这个数组分成 k 个非空子集 其总和都相等 示例 1 输入 nums 4 3 2 3 5 2 1 k 4 输出 True 说明 有可能将其分成 4 个子集 5 1 4
  • 【Python】(7)流程控制:顺序结构+选择语句(if、for、while)

    目录 一 程序的流程控制 1 顺序结构是基础 2 选择语句 if else 2 1基本结构 2 2小练习 2 3分支语句 if的三元运算 3 循环语句 for 3 1基础知识 3 2关于else 3 3小练习 3 4range的用法 3 5
  • Ubuntu20.04编译opencv-cuda

    Ubuntu20 04编译opencv3 4 9 with CUDA10 2 support 先前在编译opencv的时候 没有CUDA支持 本文介绍了opencv3 4 9添加CUDA支持的编译过程 OPENCV使用CUDA的文档可以参考
  • C语言静态函数

    1 C程序一直由下列部分组成 1 正文段 CPU执行的机器指令部分 一个程序只有一个副本 只读 防止程序由于意外事故而修改自身指令 2 初始化数据段 数据段 在程序中所有赋了初值的全局变量 存放在这里 3 非初始化数据段 bss段 在程序中
  • YUM命令常见用法

    Yum工作原理 YUM正常运行 需要依赖两个部分 一是YUM源端 二是YUM客户端 也即用户使用端 YUM客户端安装的所有RPM包都是来自YUM服务端 YUM源端通过HTTP或者FTP服务器发布 而YUM客户端能够 从YUM源端下载依赖的R
  • 程序员面试金典--面试26之介于0和1之间的实数,类型为double,返回它的二进制表示

    题目描述 有一个介于0和1之间的实数 类型为double 返回它的二进制表示 如果该数字无法精确地用32位以内的二进制表示 返回 Error 给定一个double num 表示0到1的实数 请返回一个string 代表该数的二进制表示或者
  • vue的基本标签

    el 挂载点 设置vue实例挂载管理元素 不能使用HTML标签和body标签 data 数据对象 methods 方法 vue实例的作用范围是 vue会管理el选项命中的元素及其内部的后代元素 vue指令 1 内容绑定 事件绑定 v tex
  • BUG——@Autowired HttpServletResponse报错(Could not autowire. No beans of ‘HttpServletResponse’ type fo)

    1 报错 Could not autowire No beans of HttpServletResponse type found 2 原因 spring团队只让HttpServletRequest自动装配功能 排除HttpServlet
  • 示波器探头的使用

    一 首先是带宽 这个通常会在探头上写明 多少MHz 如果探头的带宽不够 示波器的带宽再高也是无用 瓶颈效应 二 另外就是探头的阻抗匹配 探头在使用之前应该先对其阻抗匹配部分进行调节 通常在探头的靠近示波器一端有一个可调电容 有一些探头在靠近
  • 完整的动手指南,可在Google Colab GPU上训练你的神经网络模型

    介绍 如果你是神经网络领域的初学者 那么你可能已经使用过CPU训练模型 好吧 即使你的模型有 100000 个参数也没关系 训练模型可能需要几个小时 但是 如果你的模型有 100 亿或 200 亿个参数怎么办 像 VGG16 这样常见的 C
  • 微信小程序---微信授权弹窗实现(组件,需要地方直接调用即可)

    一 展示效果 二 使用方法 在资源处下载后 在调用页面 json usingComponents wx empower Component wx empower wx empower wxml
  • 微信小程序 app.json 里 “style“: “v2“ 的作用

    新版微信小程序的 app json 文件中多了一个 style v2 pages pages index index pages logs logs window backgroundTextStyle light navigationBa
  • 概率论与数理统计学习笔记

    第一章 随机事件与概率 第二章 随机变量及其分布 第三章 多维随机变量及其分布 第四章 大数定律与中心极限定理 第五章 统计量及其分布 第六章 参数估计 第七章 假设检验 第八章 方差分析与回归分析 第一章 随机事件与概率 1 1随机事件及
  • 单机版K8S安装及部署

    虚拟机iso下载 安装完虚拟机后 一 更新yum云 安装wget yum install wget wget version 查看wget版本 配置yum云 ll etc yum repos d 查看yum目录 cp CentOS Base
  • 我的周刊(第078期)

    我的信息周刊 记录这周我看到的有价值的信息 主要针对计算机领域 内容主题极大程度被我个人喜好主导 这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享 项目 awesome chatgpt prompts zh 1 ChatGPT
  • 自制简单U盘引导程序

    操作系统实验导航 实验一 银行家算法 https blog csdn net weixin 46291251 article details 115384510 实验二 多级队列调度和多级反馈队列调度算法 https blog csdn n