自制简单U盘引导程序

news/2025/1/15 15:19:22/

操作系统实验导航
实验一:银行家算法 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,AXMOV DX,OFFSET A///提示输入
MOV AH,09H
INT 21HMOV AH,01H
INT 21H
MOV BL,AL
SUB BL,20H///转换MOV DX,OFFSET B
MOV AH,09H
INT 21HMOV 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脚本一次性完成数据的写入任务。

运行结果


http://www.ppmy.cn/news/855282.html

相关文章

巧设BIOS,让老主板也支持U盘启动!

现在的U盘大都支持启动机器的功能,用U盘做个启动盘,把常用的DOS工具和杀毒软件放在里面,携带方便再也不为一张启动盘而大动干戈来刻录,再也不为只有1.44M的软盘而伤心. 但是现在有些人的主板由于时间和档次原因就不一定都支持U盘启动了(既在BOOT项中找不到USB-ZIP或USB-HDD/FDD…

技嘉服务器主板装系统,技嘉AB350M-DS3H主板u盘重装系统win7教程

技嘉AB350M-DS3H主板采用了AMD B350芯片组&#xff0c;同时还集成了Realtek ALC887 8声道音效芯片&#xff0c;板载Realtek千兆网卡&#xff0c;整体性能还是不错的。另外&#xff0c;这款主板支持AMD Ryzen/第7代A系列/Athlon II/Athlon等处理器。但是关于这款电脑的U盘重装wi…

老式计算机如何设置u盘启动,新旧主板BIOS设置U盘启动详细分析

众所周知&#xff0c;要用U盘装系统&#xff0c;在BIOS设置U盘启动是必不可少的一个步骤。但新旧主板的BIOS设置界面各不相同&#xff0c;这给不太懂英语的电脑小白们装系统造成很大困扰&#xff0c;所以大家需要充充电了。以2010年为分界线&#xff0c;U大侠小编把老式电脑和现…

老式计算机如何设置u盘启动,旧主板bios界面设置U盘启动教程

第一:Phoenix-AwardBIOS(2010年之后的电脑) 1、在开机时不停的按电脑键盘上的DEL键,接着进入下图所示的画面,我们按下键盘的方向键选择“Advanced BIOS Features” 2、通过上面的选择之后,我们按键盘上的ENTER键进入,进入到下图画面,并且按键盘上的方向键选择下图中红色部…

量产 教你如何把U盘做成CD-ROM,以后装机可以不用带光盘和光驱0

昨天没事&#xff0c;试着把自己心爱的2G优盘量产&#xff0c;计划做成一个CD-ROM和一个正常U盘。 步骤如下&#xff1a; 1.分析U盘芯片。采用工具ChipGenius&#xff0c;ChipGenius是一款USB设备芯片型号检测工具&#xff0c;可以自动查询U盘、MP3/MP4、读卡器、移动硬盘等一切…

如何制作U盘启动盘并且安装系统(保姆级教学)

张三寒假回家过年&#xff0c;阿姨问&#xff1a;“张三你在大学学的什么专业呀&#xff1f;” 张三回答&#xff1a;“计算机科学”&#xff0c;阿姨说“那能不能帮阿姨修个电脑呀&#xff01;&#xff0c;阿姨家的电脑系统好像出问题啦。”张三回答“阿姨我学的是软件&#x…

[USB 启动盘_1]-支持 BIOS/UEFI 启动的个人常用必备 PE 系统启动盘制作工具 —— 电脑店装机维护工具套装以及全网最详细的 U 盘启动方式详解

################################################## 目录 获取及使用 U 盘电脑店 PE 系统 为什么需要 PE 系统启动盘 两个官网链接&#xff1f; 解压使用电脑店离线版 如何使用该工具创建电脑店启动盘 关于 USB 启动模式 USB-HDD/USB-HDD/USB-ZIP/USB-ZIP/USB-FDD/USB…

Linux和Shell笔记-1相关概念理解

Unix和Linux关系 UNIX是最早的商业操作系统之一&#xff0c;由贝尔实验室&#xff08;AT&T Bell Laboratories&#xff09;于 1970 年代开发。UNIX 是一个多用户、多任务的操作系统&#xff0c;具有强大的命令行界面和可扩展性。 Linux 是一个开放源代码的类 UNIX 操作系统…