4.使用机器码编写bios引导的程序
使用二进制编辑器手动编写 bootloader直接用二进制编辑器写机器码来实现 bootloader 是完全可行的(早期操作系统开发常用此方法)。核心是 手动写出每条指令对应的机器码,并保证启动扇区规范:512 字节 + 结尾 0xAA55。
一、核心原理:指令 → 机器码对应关系x86 16 位实模式指令有固定机器码格式,例如:
指令
机器码
说明
mov ah, 0x0e
b4 0e
BIOS 打印功能
mov al, 'H'
b0 48
‘H’ 的 ASCII 码 0x48
int 0x10
cd 10
BIOS 视频中断
jmp loop(无限循环)
eb fe
相对偏移 0xfe 跳转自身
二、用二进制编辑器编写步骤(以打印 "Hi" 为例)1. 确定指令与机器码打印 'H' → 打印 'i' → 无限循环,对应机器码序列:
123456b4 0e ; mov ah, 0x0eb0 48 ; mov al, 'H'cd 10 ; int 0 ...
3.使用 ndisasm 反汇编 boot.bin
使用 ndisasm 反汇编 boot.binndisasm 是 NASM 自带的反汇编工具,非常适合 16 位实模式代码,输出接近 Intel 语法,更易于与源码对照。
一、反汇编命令1ndisasm -b 16 boot.bin
-b 16:指定 16 位模式
boot.bin:目标二进制文件(纯启动扇区)
二、反汇编结果示例以打印 "Hi" 的 bootloader 为例:
1234567891000000000 B40E mov ah,0Eh00000002 B048 mov al,'H'00000004 CD10 int 10h00000006 B069 mov al,'i'00000008 CD10 int 10h0000000A EBFE jmp 0Ah ; 无限循环0000000C 0000 a ...
2.在 Linux 中使用系统自带工具反汇编 boot引导程序
在 Linux 中反汇编 boot.bin(16 位启动扇区)boot.bin 是纯二进制格式(无 ELF 头)的 16 位 bootloader,因此反汇编时需要手动指定架构与格式。Linux 自带的 objdump 就能完成。
一、反汇编命令对于 x86 16 位 bootloader:
1objdump -D -b binary -m i8086 boot.bin
参数说明
-D:反汇编全部内容(纯二进制无段信息,只能全部解析)
-b binary:指定输入为原始二进制文件
-m i8086:指定反汇编架构为 Intel 8086(16 位实模式)
二、反汇编结果解析以打印 “Hi” 的启动扇区为例,常见结果如下(只截取核心部分):
123456789101112131415boot.bin: file format binaryDisassembly of section .data:00000000 <.data>: 0: b4 0e mov $0xe,%ah 2: b0 48 ...
1.使用系统自带的as+objcopy+dd+VMware完成bios引导程序
1. 编写代码12345678910111213141516.code16 # 声明 16 位模式(实模式).global _start_start: mov $0x0e, %ah # BIOS 功能:打印字符 mov $'H', %al # 字符 'H' int $0x10 # 调用 BIOS 中断 mov $'i', %al # 字符 'i' int $0x10loop: jmp loop # 无限循环.fill 510 - (. - _start), 1, 0 # 填充到 510 字节.word 0xaa55 # 启动标志
2. 使用 GNU as 将汇编代码转为二进制文件如果系统只有 as(AT&T 语法)并使用 VMware 测试,也可以制作简易 bootloader。 as 默认 ...
0.用nasm编写一个boot程序打印hellworld
Bootlaoder1. 使用汇编语言编写一个二进制程序,显示HelloWorld1. 编写asm.asmasm.asm
1234567891011121314151617181920212223242526272829303132333435[BITS 16][ORG 0x7c00]start: cli ;Clear interrupts mov ax, 0x00 mov ds, ax mov es, ax mov ss, ax mov sp,0x7c00 sti ; Enable interrupts mov si, msgprint : lodsb ; Loads byte at ds:si to AL register and incremens SI cmp al, 0 je done mov ah, 0x0E int 0x10 jmp printdone: cli hlt ; Stop further CPU executionmsg: db 'Hello World! ...
4.QT使用https协议通信
1. Qt6使用https协议在客户端发送一条文字消息到服务器端。之前的 HTTP 示例改成 HTTPS,这样客户端通过 TLS 加密发送一条文字消息到服务器端。 这里有几个关键点需要注意:
🔑 关键变化
Qt 客户端
使用 QNetworkAccessManager + QNetworkRequest,但 URL 必须是 https://
需要配置 QSslConfiguration(证书验证、加密套件等)
如果是自签名证书,需要在客户端信任它(开发阶段可以临时忽略验证)
服务器端
Qt 自带的 QTcpServer 不直接支持 HTTPS,需要用 QSslSocket 或 QTcpServer+QSslSocket 组合
必须加载服务器的私钥和证书(PEM 格式)
证书可以用 openssl 自签名生成
1️⃣ 生成自签名证书(开发测试用)
在终端执行:
1openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout server.key -out server.crt
然后合并成一个 .pem ...
3.QT使用http协议通信
1. Qt6使用http协议在客户端发送一条文字消息到服务器端。1.httpserver
main.cpp
12345678910#include <QCoreApplication>#include "httpserver.h"int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); HttpServer server; return a.exec();}
httpserver.h
1234567891011121314151617181920212223#ifndef HTTPSERVER_H#define HTTPSERVER_H#include <QObject>#include <QTcpServer>#include <QTcpSocket>class HttpServer : public QObject{ Q_OBJECTpublic: explicit HttpSer ...
2.QT使用tcp通信
1. Qt6使用tcp协议建立连接后在客户端发送一条文字消息到服务器端而后断开连接。编写两个使用qt6框架开发的程序一个是服务端一个是客户端,Qt6使用tcp协议建立连接后在客户端发送一条文字消息到服务器端而后断开连接,无ui界面,按照qt风格分开声明与实现,参考qwiget模板但是没有ui。
实现一个最简单的 一次性连接:
客户端:启动后连接服务器 → 发送一条文字消息 → 断开连接
服务器:监听端口 → 接收连接 → 读取消息 → 打印到控制台
无 UI,但结构参考 Qt Widget 模板(main.cpp + 一个 QObject 派生类,分头文件和实现文件)
Qt6 + CMake,客户端和服务端是两个独立项目
1.tcpserver
main.cpp
12345678910#include <QCoreApplication>#include "tcpserver.h"int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); TcpServe ...
1.QT使用udp通信
1. Qt6使用udp协议在客户端发送一条文字消息到服务器端。编写两个使用qt6框架开发的程序一个是服务端一个是客户端,单独使用cmake管理项目,Qt6使用udp协议在客户端发送一条文字消息到服务器端,无ui界面,按照qt风格分开声明与实现。
1.udpserver
main.cpp
12345678910#include <QCoreApplication>#include "udpserver.h"int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); UdpServer server; return a.exec();}
udpserver.h
12345678910111213141516171819202122#ifndef UDPSERVER_H#define UDPSERVER_H#include <QObject>#include <QUdpSocket>#include <QHostAddr ...
windows驱动开发39.利用结构体实现一个控制码多个功能的驱动通信方式
利用结构体实现一个控制码多个功能的驱动通信方式✅ SharedProtocol.h(通信协议头)12345678910111213141516171819#pragma once#define MAX_PAYLOAD 512// IOCTL 定义#define IOCTL_EXCHANGE_MESSAGE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)// 消息类型typedef enum _MESSAGE_TYPE { MSG_TYPE_SEND = 1, MSG_TYPE_QUERY = 2} MESSAGE_TYPE;// 用户层传入结构体typedef struct _USER_REQUEST { MESSAGE_TYPE MsgType; ULONG PayloadSize; CHAR Payload[MAX_PAYLOAD];} USER_REQUEST, *PUSER_REQUEST;
✅ Common.h ...
