【OS】06 – 突破512字节的限制(上)
参考: 【OS】06 - 突破512字节的限制(上)   0x01 定义栈空间 sp寄存器的值 为什么要用0x7c00用作栈的起始地址? 程序执行从0x7c00从低地址到高地址执行;栈的增长方向是高地址到低地址(和程序执行方向相反); 用0x7c00作为栈的起始地址是可以的,函数调用的操作(栈增长)不会影响程序的执行;   0x02 读取数据 需要的文件 bochsrc ############################################################### # Configuration file for Bochs ############################################################### # how much memory the emulated machine will have megs: 32 # filename of ROM images romimage: file=/usr/local/share/bochs/BIOS-bochs-latest vgaromimage: file=/usr/share/vgabios/vgabios.bin # what disk images will be used floppya: 1_44=data.img, status=inserted # choose the boot disk. boot: a # where do we send log messages? # log: bochsout.txt # disable the mouse mouse: enabled=0 # enable key mapping, …
实现驱动加载器并且和驱动通讯(提示:内容稍长)
    目标: 用户一键使用: 驱动加载(将驱动的安装、启动、停止、卸载的服务放到R3程序中来实现,作为可发布程序使用) 通过驱动的control回调函数和控制码来实现通讯       0x01 项目管理 环境整理: 创建一个空白项目,主要是为了用空白项目的解决方案 把Ring3和驱动加入到解决方案,环境里删掉刚创建的空白项目即可,就不用频繁的切换环境 把Ring3和驱动的输出都放到bin目录下(两个都需要设置),便于实验   整理后的效果   0x02 实验验证: 创建服务 2.1 验证过程 Ring3.cpp #include <stdio.h> #include <windows.h> /* 如果没有R3得程序怎么加载呢? 微软有个inf文件,这个东西可以安装,在微软的官方文档中有说明inf内容怎么写; OS会解析inf这个配置文件,帮助动态加载驱动 例: 如果硬件需要开机启动加载,微软再开机时会自动加载inf文件 驱动加载的方式: 1. inf文件来加载 2. 动态加载(服务) 创建服务就是安装驱动(很多软件都可以使用打印机,那么就可调用打印机的驱动,驱动的角色是服务),也就是需要4个api就可以完成这些工作; 创建服务 启动服务 停止服务 卸载服务 */ void showErr(const char *name) { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastE…
软件工程师需要关注的一手资料信息(持续更新…)
在线编译:支持31中语言 OnlineGDB beta ISA 【官】 Intel 手册 【官】 ARM A64 ISA 【官】 ARM A32 ISA x86 vs ARM Intel 指令集表格版   汇编语言 【官】 AS Manual X86 Assembly(Intel) X86 Assembly(AT&T)   Linux 【官】 源码下载 【官】 man page 【官】 GNU software 在线查看 Linux Base   C 【官】 GNU C Manual   ELF 【官】ELF_Format 带书签的 ELF wiki 这里有张图很好 System V Application Binary Interface-1 System V Application Binary Interface-2   gcc 【官】官方文档   glibc 【官】源码下载 【官】手册 手册在线 pdf 在线查看   工程化 make 【官】手册 跟我一起写 Makefile makefiletutorial   autoconf 【官】手册   Java 语言 【官】Java Language and Virtual Machine Specifications 【官】JEP 【官】JSR   OpenJDK 通用网站 著名源码在线看 Linux Assembly cppreference RFC gnu binutils gnu coreutils   优质资源或教程 eater ELF for armv8 造轮子 LFS arch linux 电脑博物馆 在线观察 …
R3和R0的交互(NT框架的使用)
  验证环境/使用工具: visual studio 2019、Windows XP、winobj、Dbjview 验证目标: 让R3和R0能通过读写交换数据,也就是驱动和R3做交互过程(NT框架包含了这个交互)   内核API(极简进化史): 系统 => 抽象驱动 => 硬件 抽象驱动是什么? 1). 简明:驱动框架 => 读、写操作 => 硬件 2).详细(进一步思考:文件的抽象,操作文件):驱动框架 => 文件(打开、读取、写入、控制、查询信息、关闭) 下发配置: 应用程序 => ReadFile => 系统 => 驱动::读取 => 厂家驱动 => 硬件 获取信息: 应用程序 <= ReadFile <= 系统 <= 驱动::读取 <= 厂家驱动 <= 硬件   糟糕,出师不利,出现了一点点点的问题: 整理代码之后,不知道为什么,vs2019中driverentry 的结构体死活打不开,要看里面的成员啊。 解决方案: 经过一番设置之后,还是不行,重新创建个项目试下,果然还得是重新创建项目,项目正常了。果然还得是老话:“重装系统能够解决99.9%的问题”   两步走计划: 注册派遣函数 驱动绑定到 "设备",来调用驱动 完成R3和R0的数据交互   0x01 注册派遣函数 sample.h #pragma once #include <ntddk.h> VOID Unload(__in struct _DRIVER_OBJECT* DriverObject); extern "C" NTSTATUS …
【OS】01&02 – Hello,DTOD!
【OS】01 :进阶操作系统 【OS】02 - Hello,DTOD!   2024/07/17 更新     目的: 编写一个主引导程序(汇编语言) 可独立运行x86架构的主机(无操作系统) 运行后屏幕上打印字符串;     思路: 引导程序 (类比C语言) 入口: | 0x7c00 | (main) 主题: | 汇编语言 | (C/C++) 底层: | bios中断 | (OS系统调用) 1、关键寄存器设置为 => mov ax,0 2、定义要打印的数据 => db "hello DTOS!" 3、打印预定义好的字符数据 => int 0x10   代码:   boot.asm org 0x7c00 start: mov ax, cs mov ss, ax ;初始化堆栈段,使其与代码段相同。 mov ds, ax ;初始化数据段,使其与代码段相同。 mov es, ax ;初始化附加段,使其与代码段相同。 mov si, msg ;si 通常用于字符串操作或指向数据的地址 print: mov al, [si] add si, 1 cmp al, 0x00 je last mov ah, 0x0e ;设置中断调用的功能号,这里0x0e代表的是在文本模式下输出字符的功能,表示 BIOS 的 teletype 输出功能 mov bx, 0x0f ;表示字符颜色(白色) int 0x10 jmp print last: hlt jmp last msg: ;定义输出数据 db 0x0a, 0x0a ; db => define byte, db的定义了两个数据,0a换行符 db &qu…
【OS】03 – bochs环境搭建
引用:【OS】03 - bochs环境搭建-理论详情 开发环境搭建 bochs安装、配置和测试 bochs调试环境搭建和测试 bochs常用调试命令 0x01 Bochs安装和配置 1.1 ./configure --enable-debugger --enable-disasm ./configure --enable-debugger --enable-disasm 有报错,无法继续后面操作 1.2 sudo apt-get install libgtk2.0-dev 参考网友的做法 sudo apt-get install libgtk2.0-dev 1.3 ./configure --enable-debugger --enable-disasm 再重新解压: ./configure --enable-debugger --enable-disasm 1.4 make 执行: make 1.5 sudo make install 安装: sudo make install 1.6 测试是否安装成功 执行: bochs 运行崩溃,但这是安装成功了 0x02 实验验证:Bochs的验证 2.1 启动文件模板 文件放到虚拟机里,把值填进去; Bochsrc ############################################################### # Configuration file for Bochs ############################################################### # how much memory the emulated machine will have megs: 32 # fil…
【OS】04 – 主引导程序的拓展(上)【了解Fat12】
【OS】04 - 主引导程序的拓展(上) ,理论详情 实验: 把文件写入虚拟软盘 0x01 创建虚拟软盘 1.1 创建虚拟软盘和文件,文件写入虚拟软盘 需要的工具: bochsrc freedos.img bochsrc ############################################################### # Configuration file for Bochs ############################################################### # how much memory the emulated machine will have megs: 32 # filename of ROM images romimage: file=/usr/local/share/bochs/BIOS-bochs-latest vgaromimage: file=/usr/share/vgabios/vgabios.bin # what disk images will be used floppya: 1_44=freedos.img, status=inserted # choose the boot disk. boot: a # where do we send log messages? # log: bochsout.txt # disable the mouse mouse: enabled=0 # enable key mapping, using US layout as default. keyboard_mapping: enabled=1, map=/usr/local/share/bochs…
深入浅出的处理器
深入浅出的处理器(上) 深入浅出的处理器(中) 深入浅出的处理器(下) 深入浅出的处理器(续) tip: 点击链接的时候按下键盘的 CTRL 就会另外新打开一个页面
gcc的编译选项-详细
嵌入式C语言编译器,文章的理论部分 注意: 下文验证的内容,使用的是这里的func.h、test.c func.h #include <stdio.h> void func() { #ifdef TEST printf("TEST = %s\n", TEST); #endif return; } test.c #include <stdio.h> #include "func.h" int g_global = 0; int g_test = 1; int main(int argc, char *argv[]) { func(); printf("&g_global = %p\n", &g_global); printf("&g_test = %p\n", &g_test); printf("&func = %p\n", &func); printf("&main = %p\n", &main); return 0; } 0x01 预处理指令: gcc -E test.c -o test.i test.i # 1 "test.c" // 1 :表示后文部分是test.c的第一行展开内容 # 1 "<built-in>" # 1 "<command-line>" # 1 "test.c" # 1 "/usr/include/stdio.h" 1 3 4 // .....…
函数模版和类模版简单例子
#include <iostream> using namespace std; // 函数模版 template <typename T> void Swap(T& a, T& b) { T t = a; a = b; b = t; } // 类模版 template <typename T> class Op { public: T process(T v) { return v * v; } }; int main() { int a = 2; int b = 1; Swap(a, b); cout << "a = " << a << " " << "b = " << b << endl; double c = 0.01; double d = 0.02; Swap<double>(d, c); cout << "c = " << c << " " << "d = " << d << endl; Op<int> opInt; // 需要指明类型 Op<double> opDouble; cout << "5 * 5 = " << opInt.process(5) << endl; cout << "0.3 * 0.3 = " << opDoubl…
NAT协议
文章还是比较清楚的,mark一下 知乎:网络地址转换协议NAT功能详解及NAT基础知识介绍