首页 > 编程语言 >手机写操作系统之 用32位汇编指令

手机写操作系统之 用32位汇编指令

时间:2024-04-26 20:45:50浏览次数:46  
标签:bin 汇编 操作系统 img 32 mov eax kernelloader out

手机写操作系统之
用32位汇编指令编写程序
kernelloader跳转到32位的kernel.asm程序
kernelloader.asm,源码如下:
[BITS 16]
jmp main
gdt_entries equ 3 ;共有三个段描述符:null,os code32,os data32
pe equ 1 ;bit PE in CR0
null equ 0h
os_code32_sel equ 8h ;1,gdt,rpl=00
os_data32_sel equ 10h ;2,gdt,rpl=00
pdescr times 6 db 0
gdt_table times (gdt_entries*8) db 0

read_kernel: ;读入 kernel 程序
push es

.rk:
mov ax , 0x8000 ;kernel.bin 所在的段基址
mov es , ax
mov bx , 0 ;写入到内存0x8000:0000 物理地址=0x80000
mov ah , 2
mov dh , 0 ;磁头
mov dl , 0 ;驱动器号
mov ch , 0 ;磁道0
mov cl , 4 ;第4个扇区开始
mov al , 1 ;读入扇区数,每个扇区为 512B
int 0x13
jc .rk

pop es
ret

main:
mov ax,1000h
mov ds,ax

;读入 kernel 程序
call read_kernel

;打开 A 20 地址线
mov ax , 0x2401
int 0x15
;[1]built up GDT table
cli
mov eax,gdt_table
;item 0:null descriptor,
mov dword[eax],0
mov dword[eax+4],0
add eax,8
;item 1,OS code32 descriptor,
;Base=00000000h,limit=0ffffh,G=1,D=1,type=a,dpl=0
mov word[eax],0ffffh
mov word[eax+2],0
mov byte[eax+4],00h
mov byte[eax+5],09ah
mov byte[eax+6],0c0h
mov byte[eax+7],00h
add eax,8
;item 2,OS data32 descriptor
;Base=00000000h,Limit=0ffffh,G=1,D=1,Type=2,DPL=0
mov word[eax],0ffffh
mov word[eax+2],0000h
mov byte[eax+4],00h
mov byte[eax+5],092h
mov byte[eax+6],0c0h
mov byte[eax+7],00h
add eax,8
;[2]built false GDT descriptor
mov word[pdescr+0],(gdt_entries*8)
mov dword[pdescr+2],gdt_table+00010000h
lgdt [pdescr]
;[3]enter into protected mode
;刷新CR0
mov eax,cr0
or eax,pe
mov cr0,eax
jmp flush
flush:
mov ax,os_data32_sel
mov ds,ax
mov es,ax
mov ss,ax
mov fs,ax
mov gs,ax
jmp dword os_code32_sel:0x80000 ;跳转到0x8000:0000保护模式 物理地址0x80000

kernel.asm,现在可以使用32位语句了,编写是不是变简单了?源码如下:
[BITS 32]
jmp start
start:
mov ebx,0B8900h
mov edi,ebx ;es:edi=0010:000b8900=0b8900h
mov al,'A'
mov ah,34h
stosw
jmp $

修改boot.asm,读取扇区数值改变2
boot.asm
[BITS 16] ;编译成16位的指令
[ORG 0x7C00]
jmp main

read_kernelloader: ;读入 kernelloader 程序
push es

.rk:
mov ax , 0x1000 ;kernelloader.bin 所在的段基址
mov es , ax
mov bx , 0
mov ah , 2
mov dl , 0 ;驱动器号
mov ch , 0
mov cl , 2
mov al , 2 ;读入扇区数,每个扇区为 512B
int 0x13
jc .rk

pop es
ret

main: ;主程序
mov ax , 0x0 ;boot.bin 程序的段基址
mov ds , ax

call read_kernelloader ;读入 kernelloader 程序

jmp dword 0x1000:0 ;跳转到 kernelloader 处执行
times 510-($-$$) db 0
db 0x55
db 0xAA

修改makefile
######################

声明要编译的所有组成,这里的ya是本工程名称,可以取任何名字,这里就用ya

######################
ya:out/boot.bin out/kernelloader.bin out/kernel.bin out/create_img.o out/write_in_img.o (注意这里无回车)

开始对各部分编译,注意不是空格是Tab键

out/boot.bin:code/boot.asm
nasm code/boot.asm -o out/boot.bin
out/kernelloader.bin:code/kernelloader.asm
nasm code/kernelloader.asm -o out/kernelloader.bin
out/kernel.bin:code/kernel.asm
nasm code/kernel.asm -o out/kernel.bin

制作内核映象工具

out/create_img.o:code/create_img.c
clang++ code/create_img.cpp -o out/create_img.o

写入文件,argv[1]=目标文件 argv[2]=源文件 argv[3]=写入偏移量

out/write_in_img.o:code/write_in_img.cpp
clang++ code/write_in_img.cpp -o out/write_in_img.o
######################

修改g.sh

!/bin/sh

echo "=启动 ya=="
cd /sdcard/A/ya/
make

cd ~
cp -r /sdcard/A/ya/out ./
cd out
chmod 755 ./*

执行命令,当前目录下生成a.img文件

./create_img.o a.img

执行命令,向a.img写入代码,内容是boot.bin

写入磁盘位置从0偏移量起始,占1个扇区512字节

./write_in_img.o a.img boot.bin 0

执行命令,向a.img写入代码,内容是kernelloader.bin

boot.bin已经占用了512字节,写入磁盘位置从512偏移量起始,占2个扇区1024字节

./write_in_img.o a.img kernelloader.bin 512

执行命令,向a.img写入代码,内容是kernel.bin

boot.bin+kernelloader.bin已经占用了512+1024 = 1536字节,写入磁盘位置从1536偏移量起始,占1个扇区512字节

./write_in_img.o a.img kernel.bin 1536

结果复制到手机

cp -f ./a.img /sdcard/A/ya/final

cp -f ./newkernel.bin /sdcard/A/ya/final

cd ~
rm -r out

编译过程同上一节,编译完成后运行模拟器,结果显示:
蓝底红字大写A

标签:bin,汇编,操作系统,img,32,mov,eax,kernelloader,out
From: https://www.cnblogs.com/glax/p/18160843

相关文章

  • GK320刷机
    仓库地址Gitee页面https://gitee.com/jeanhua/super-engine-for-GK320GitHub页面https://github.com/jeanhua/super-engine-for-GK320提供GK320/GK310智能电子学生证的破解刷机服务这本来是我高一(2020)用易语言写的,到高二基本完成所有工作,旨在破解这个学生证,给无聊的高中......
  • 车用MCU,R7F701320EAFP、R7F701321EAFP、R7F701322EAFP、R7F701323EAFP微控制器功耗低,
    RH850/P1M——适用于底盘系统的汽车用微控制器简介RH850/P1M微控制器功耗低,闪存容量高达2MB,RAM容量高达128KB,具有增强型电机控制定时器、CAN接口、SENT和PSI5等传感器数字接口以及锁定CPU、ECC、BIST(内置自检)和ECM(错误控制模块)等安全功能,适用于底盘系统。此外,仅2......
  • STM32之UASRT试验
    一、实验目的1.实现STM32F407开发板与上位机工具通讯,中断方式 具体实现的效果:上电后,下位机主动发送helloworld,上位机收到并显示;上位机发送数字0~9,回复:zero~nine2.通讯协议,后面补充3.硬件使用野火开发版STM32F4074.与开发板连接的接口是Usb转串口,根据原理图看出选择的......
  • java反汇编命令手册
    1.栈和局部变量操作1.1将常量压入栈的指令指令功能描述aconst_null将null对象引用压入栈iconst_m1将将int类型常量-1压入栈iconst_0将int类型常量0压入栈iconst_1将int类型常量1压入栈iconst_2将int类型常量2压入栈iconst_3将int类型常量3压入......
  • 微雪 esp32c3 深度睡眠和 gpio 唤醒
    当项目由电源适配器供电时,我们一般不会太关心功耗。但是,如果要使用电池为项目供电,则需要精打细算。esp32深度睡眠在深度睡眠模式下,CPU、大多数RAM和所有数字外围设备都可以关闭。从深度睡眠中出来后,芯片通过复位重新启动,并从一开始就开始执行程序。系统无法自动进入深度睡眠......
  • dotnet C# 使用 Win32 函数获取用户下载文件夹的路径的方法
    大家都知道,在dotnet里面的可以使用Environment.GetFolderPath方法配合Environment.SpecialFolder枚举列出当前运行环境下的一些特殊文件夹。然而SpecialFolder枚举不包含对Download下载文件夹的枚举值,如咱需要获取用户当前的下载文件夹,需要使用Win32方法来辅助获取在......
  • stm32操作SD卡
       https://item.taobao.com/item.htm?spm=a1z09.2.0.0.b1212e8dOgRcLN&id=39107244481&_u=p1qf7bf52f08     /*SDcardbasicfileexampleThisexampleshowshowtocreateanddestroyanSDcardfileThecircuit:SDcardattachedto......
  • MFT(Master File Table,主文件表)是Windows操作系统中NTFS(New Technology File System,新
    MFT(MasterFileTable,主文件表)是Windows操作系统中NTFS(NewTechnologyFileSystem,新技术文件系统)的关键组成部分,用于存储文件和目录的元数据信息。MFT类似于Unix和Linux系统中的inode,但在实现上有所不同。MFT包含以下信息:文件和目录的属性:包括权限、所有者、创建时间、修......
  • PEcmd是一个命令行工具,用于执行各种操作系统和文件系统相关的任务。通常,它用于在Windo
    PECMD命令帮助-PECMD技术社区:www.pecmd.netPEcmd是一个命令行工具,用于执行各种操作系统和文件系统相关的任务。通常,它用于在Windows操作系统上执行各种文件和目录操作,例如文件复制、移动、删除等。PEcmd提供了一种简单而强大的方式来管理文件和目录,尤其是在自动化和批处......
  • inode(index node)是Unix、Linux和类Unix操作系统中的一个重要概念, 在Windows操作系统中
    inode(indexnode)是Unix、Linux和类Unix操作系统中的一个重要概念,用于描述文件系统中的文件或目录。每个文件或目录都与一个inode相关联。inode包含以下信息:文件或目录的权限(读、写、执行)。文件类型(普通文件、目录、符号链接等)。拥有者和所属组。文件的大小。访问、修......