分类: Linux_x86_OS

12 篇文章

【OS】11 – 实模式到保护模式(中)【从16位代码段进入到32位代码段,从实模式进入到保护模式】
【OS】11 - 实模式到保护模式(中)【从16位代码段进入到32位代码段,从实模式进入到保护模式】 gitee仓库传送门 保护模式的编程 从16位代码段进入到32位代码段,从实模式进入到保护模式; inc.asm ; Segment Attribute DA_32 equ 0x4000 DA_DR equ 0x90 DA_DRW equ 0x92 DA_DRWA equ 0x93 DA_C equ 0x98 DA_CR equ 0x9A DA_CCO equ 0x9C DA_CCOR equ 0x9E ; Selector Attribute SA_RPL0 equ 0 SA_RPL1 equ 1 SA_RPL2 equ 2 SA_RPL3 equ 3 SA_TIG equ 0 SA_TIL equ 4 ; 描述符 ; usage: Descriptor Base, Limit, Attr ; Base: dd ; Limit: dd (low 20 bits available) ; Attr: dw (lower 4 bits of higher byte are always 0) %macro Descriptor 3 ; 段基址, 段界限, 段属性 dw %2 & 0xFFFF ; 段界限1 dw %1 & 0xFFFF ; 段基址1 db (%1 >> 16) & 0xFF ; 段基址2 dw ((%2 >> 8) & 0xF00) | (%3 & 0xF0FF) ; 属性1 + 段界限2 + 属性2 db (%1 >> 24) & 0xFF ; 段基址3 %endmacro ; 共 8 字节 lo…
【OS】09 – 主引导程序控制权的转移【fat表加载loader并跳转执行,boot使命结束】
  参考:【OS】09 - 主引导程序控制权的转移   实验1 代码写完之后,发现boot已经超出了512字节,怎么办呢? 代码重构:删除部分的push和pop代码,这是为了保证不会影响关键寄存器的值。   代码调整后,再次make通过;打印加载出来的文件内容。     code org 0x7c00 ;补上三个字节 jmp short start nop ;栈的起始地址(定义栈空间) define: BaseOfStack equ 0x7c00 BaseOfLoader equ 0x9000 ;最后要把目标程序加载到这个地址处,fat表加载到这个地址的前面 RootEntryOffset equ 19 ;根目录区的逻辑扇区地址,是从逻辑第19扇区开始的 RootEntryLength equ 14 ;目录文件项占用了14个扇区 EntryItemLength equ 32 FatEntryOffset equ 1 FatEntryLength equ 9 header: BS_OEMName db "D.T.Soft" BPB_BytsPerSec dw 512 BPB_SecPerClus db 1 BPB_RsvdSecCnt dw 1 BPB_NumFATs db 2 BPB_RootEntCnt dw 224 BPB_TotSec16 dw 2880 BPB_Media db 0xF0 BPB_FATSz16 dw 9 BPB_SecPerTrk dw 18 BPB_NumHeads dw 2 BPB_HiddSec dd 0 BPB_TotSec32 dd 0 BS_DrvNum db 0 BS_Reserved1…
【OS】08 – 突破512字节的限制(下)【Memcpy、FatVec:通过Fat表加载文件到内存】
参考:【OS】08 - 突破512字节的限制(下)   0x01 Memcpy 1.1 code Memcpy函数完成并测试 org 0x7c00 jmp short start nop define: BaseOfStack equ 0x7c00 BaseOfLoader equ 0x9000 RootEntryOffset equ 19 RootEntryLength equ 14 EntryItemLength equ 32 FatEntryOffset equ 1 FatEntryLength equ 9 header: BS_OEMName db "D.T.Soft" BPB_BytsPerSec dw 512 BPB_SecPerClus db 1 BPB_RsvdSecCnt dw 1 BPB_NumFATs db 2 BPB_RootEntCnt dw 224 BPB_TotSec16 dw 2880 BPB_Media db 0xF0 BPB_FATSz16 dw 9 BPB_SecPerTrk dw 18 BPB_NumHeads dw 2 BPB_HiddSec dd 0 BPB_TotSec32 dd 0 BS_DrvNum db 0 BS_Reserved1 db 0 BS_BootSig db 0x29 BS_VolID dd 0 BS_VolLab db "D.T.OS-0.01" BS_FileSysType db "FAT12 " start: mov ax, cs mov ss, ax mov ds, ax mov es, ax mov sp, BaseOfStack mov ax, Roo…
【OS】07 – 突破512字节的限制(中)【主要内容:内存比较函数 MemCmp 和根目录区查找函数 FindEntry 】
原理参考:【OS】07 - 突破512字节的限制(中)   0x01 验证1:内存比较函数 MemCmp 1.1 code ;@ ;目的: 验证MemCmp函数 ;参考此函数调用即可 org 0x7c00 jmp short start nop define: BaseOfStack equ 0x7c00 ;start from here start: mov ax, cs mov ss, ax mov ds, ax mov es, ax mov sp, BaseOfStack ; test MemCmp mov si,MsgStr mov di,Target mov cx,MsgLen call MemCmp cmp cx,0 jz lable jmp last lable: mov bp,MsgStr mov cx,MsgLen call Print last: hlt jmp last ; ds:si --> source ; es:di --> destination ; cx --> length ; ; return: ; (cx == 0) ? equal : noequal MemCmp: push si push di push ax compare: cmp cx, 0 jz equal mov al, [si] cmp al, byte [di] jz goon jmp noequal goon: inc si inc di dec cx jmp compare equal: noequal: pop ax pop di pop si ret ; es:bp --> string address ; cx --> string len…
【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, …
【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 // .....…