关于16位的OS尝试(1)

作者出于兴趣分享编写16位实模式OS的经验。先介绍将OS写入磁盘的注意事项,接着阐述Boot Loader的编写,它只能用汇编写,推荐使用nasm编译器。最后给出代码示例,其主要功能是读取软盘后16个扇区的数据并执行,这些数据是OS内核代码。

首先我要申明的是我并不是个OS专家,关于OS的研究仅仅是出于自己的兴趣.
但是我认为仅仅是为了自己,也应该把这段时间自己在写OS的经验写出来.

我第一次做的这个OS是个16为实式模式下的OS.因为它比起保护模式要简单,而且容易上手.

首先要找到一张1.44MB的软盘.我的OS就是写到软盘上的.当然你也可以写到硬盘上,不过你得要有两个或更多的硬盘才行.否则硬盘数据被破坏,计算机就无法启动了.在这里我还得提到我曾经做的一件傻事.由于我的电脑上没有软驱,只有个USB移动硬盘,所以我拿USB盘来代替软盘.后来写上去的程序无论如何都有问题.经过一步一步细致测试,才发现原来的是USB盘根本不能用BIOS 13h来读.因为USB盘不是磁盘,居然我当时来拿它作磁盘来读写.现在想起来真是可笑.

我首先写的是Boot Loader,就是软盘上第一个扇区的程序.计算机启动的时候就会自动把这个程序放到0x0000:0x7c00(似乎是这样)去执行.但是只有一个扇区,你不可能把你的整个OS都放到这一个扇区里面.一个扇区才512字节.不过我可以通过这个扇区上的程序,把软盘上其它部分的数据调出来运行.所以老外叫它Boot Loader(引导装载程序).

关于这个Boot Loader是很简单的.特别是对于我要做的16位实式模式下的OS来说,几乎没有什么要求,你想怎么做就怎么做了.但是如果你要做保护模式下的OS,就需要设计到很多比如"A20开起"等麻烦的事情.现在网上到处都有关于OS编写的介绍,但是大多都是停留在这个Boot Loader的讲解中,而且绝大部分还都是讲解16位实式模式下的Boot Loader.比如到www.google.com去搜索一下"Write your own Operating System",可以找到好多这样的文章.当然,这些主要的都是英文的.看看也不错.国外的这些网站大多都是讲如何上手,将一些很实际的东西,而且都是不错.比如我知道的一个网站http://osdev.neopages.net/index.php,就是个很不错的.它关于OS的介绍可不是简单地停留在Boot Loader上哦.而且里面还有我们写OS需要的一切工具,和资料收集.

我喜欢的老师上课最爱讲费话,或许我也汲取了他的优点,讲了上面这么大段的费话,下面我就开始真正写我的Boot Loader了.

Boot Loader似乎只能用汇编写.而最好的汇编编译器是nasm.我开始写Boot Loader的时候,几乎100%的人都说应该使用nasm来作汇编编译器.或许是因为nasm是公开源代码的吧,也或许nasm支持很多格式的生成文件,所以这个东西向来是汇编高手们推荐的汇编编译器.这个东西你可以在http://sourceforge.net/找到下载的,连它的源代码都可以找得到呢.不过http://osdev.neopages.net/index.php里面也是提供了的.现在用了段时间nasm,我也确实觉得它是个好东西.而且关于它的文档也是很齐备的,查询很方便.

好,这就是我的Boot Loader的程序

;----------------------------------------------------------------------
; Hello World Operating System Boot Sector00 Program
;
; tangl_99 2003
;
; Disclaimer: I am not responsible for any results of the use of the contents
;   of this file
;----------------------------------------------------------------------
 BITS 16
 org 0x7c00 ; This is where BIOS loads the bootloader
%define  kernel_sectors  16 ; 8K大小的kernel

; Execution begins here
entry:
 jmp short begin ; jump over the DOS boot record data


; ----------------------------------------------------------------------
;  +-------------------------------------------------------------+
;  | Data section of boot.asm bootstrap file                     |
;  +-------------------------------------------------------------+
bsOEM       DB 'DEVIATOR'               ; OEM String
bsSectSize  DW 512                      ; Bytes per sector
bsClustSize DB 1                        ; Sectors per cluster
bsRessect   DW 1                        ; # of reserved sectors
bsFatCnt    DB 2                        ; # of fat copies
bsRootSize  DW 224                      ; size of root directory
bsTotalSect DW 2880                     ; total # of sectors if < 32 meg
bsMedia     DB 0xF0                     ; Media Descriptor
bsFatSize   DW 9                        ; Size of each FAT
bsTrackSect DW 18                       ; Sectors per track
bsHeadCnt   DW 2                        ; number of read-write heads
bsHidenSect DD 0                        ; number of hidden sectors
bsHugeSect  DD 0                        ; if bsTotalSect is 0 this value is
                                        ; the number of sectors
bsBootDrv   DB 0                        ; holds drive that the bs came from
bsReserv    DB 0                        ; not used for anything
bsBootSign  DB 29h                      ; boot signature 29h
bsVolID     DD 0                        ; Disk volume ID also used for temp
                                        ; sector # / # sectors to load
bsVoLabel   DB 'DeviatorOS '            ; Volume Label
bsFSType    DB 'FAT12   '               ; File System type
;------------------------------------------------------------------------


; --------------------------------------------
;  Boot program code begins here
; --------------------------------------------
; boot code begins at 0x0040

begin:
 xor ax, ax  ; zero out ax
 mov ds, ax  ; set data segment to base of RAM
 mov si, WelcomeMsg ; load address of our welcome message
 call putstr  ; print the welcome message
 mov si, newline
 call putstr
 mov si, loadMsg ; load address of loading message
 call putstr  ; print the loading message
 mov si, newline
 call putstr
 xor ax,ax
 int 13h
 jc fail

;-------------------------------------------------
; 把下一个扇区01的数据读到0x500:0000,然后执行
;-------------------------------------------------
readsector01:
 mov ax, 0x500  ; 先将扇区01的数据存放的缓冲段地址传递给AX
 mov es, ax   ; 通过AX,再缓冲段地址传递给ES
 mov bx, 0   ; 缓冲偏移地址为0
 mov dl, 0   ; 要读取的驱动器号为0h,为A软驱
 mov dh, 0   ; 要读取的磁头号为0
 mov ch, 0   ; 要读取的磁道号为0
 mov cl, 2   ; 要读取的扇区号为2
 mov al, kernel_sectors ; 要读取的扇区数为kernel_sectors
 mov ah, 2   ; 调用读磁盘的中断程序
 int 13h
 cmp ah, 0   ; 查看是否读成功,ah为0表示读取成功
 jz gotosector01  ; 如果成功,转到gotosector01
fail: mov si,readerrorMsg  ; 将readerrorMsg的地址传给si,准备打印
 call putstr   ; 打印读磁盘错误的信息
 mov si,newline
 call putstr
hang:
 jmp hang
gotosector01:
 mov si, LoadSectorOKMsg ; 显示读取第二个扇区成功的信息
 call putstr   
 mov ax, 0x500  ; 跳转指令到0x500:0000,并把es,ds都改到0x500,但是注意,在jmp指令前不能改cs
 mov es, ax
 mov ds, ax
 jmp 0x0500:0x0000
; --------------------------------------------
; data for our program
;----------------------------------------------
WelcomeMsg db 'Welcome to Tangl Operating System',0
loadMsg  db 'Operating System Boot Program is Loading......', 0
LoadSectorOKMsg db 'loaing next sector OK',0
readerrorMsg db 'Error: Can not read sector 01 !', 0
newline db 13,10,0
; ---------------------------------------------
; Print a null-terminated string on the screen
; ---------------------------------------------
putstr:
 lodsb   ; AL = [DS:SI]
 or al, al  ; Set zero flag if al=0
 jz putstrd  ; jump to putstrd if zero flag is set
 mov ah, 0x0e ; video function 0Eh (print char)
 mov bx, 0x0007 ; color
 int 0x10
 jmp putstr
putstrd:
 retn
;---------------------------------------------

size equ $ - entry
%if size+2 > 512
  %error "code is too large for boot sector"
%endif
 times (512 - size - 2) db 0

 db 0x55, 0xAA  ;2  byte boot signature

这么长一篇,你不要觉得干了很多事情.简单地说,我只做了一件有用的事情.
就是把软盘后面16个扇区的数据读出来,并去执行.

代码开头有块叫"引导记录"数据的定义,就是记录一些关于这张磁盘有多少个扇区,多少个磁头,每个扇区多少字节等信息.其实1.44MB的磁盘这些信息都是不变的,只要是1.44MB的软盘,这些数据都是一样的,根本没有必要写出来.但是如果我不把它们写出来,那么当我这张磁盘插入软驱后,Windows或Dos会说它没有格式化,还要我重新格式话,那么我写在上面的boot loader程序就会没有.所以我还是讲究一下windows/dos,按照它们的标准,把这些信息写上去.

后面的代码主要就是显示些提示信息,然后就是一个调用BIOS 13h读磁盘的中断程序.通过它,把后面16个扇区的数据读出来,读到0x500:0x0000去,最后跳到0x500:0x0000去执行那些代码.那16个扇区的代码才是我真正的OS的kernel内核的代码.


 


<think>我们正在讨论的是iPadOS15.4在M1芯片设备上的越狱情况。根据引用[1],iOS15.4(包括iPadOS15.4)已经发布,但越狱工具通常需要时间适配新版本。同时,M1芯片的引入带来了新的安全架构,使得越狱更加困难。目前(截至2023年10月),针对iPadOS15.4及更高版本,尤其是搭载M1芯片的iPad,公开可用的越狱工具非常有限。原因如下:1.**M1芯片的安全特性**:M1芯片采用了与iPhone相同的安全启动链和SecureEnclave,使得传统的越狱方法难以奏效。2.**iPadOS15.4的安全更新**:苹果在每次更新中都会修复已知漏洞,这使得越狱开发者需要寻找新的漏洞。然而,根据公开的越狱社区信息,以下是一些可能的方向: -**Fugu15Max**:这是一个针对iOS/iPadOS15.0-15.4.1的越狱工具,支持部分搭载A12及以上芯片的设备(包括M1)。但请注意,它并不支持所有设备,且目前处于测试阶段,稳定性可能不足。-**XinaA15**:这是一个针对iOS15.0-15.1.1的越狱工具,仅支持A12及以上芯片的设备,但M1芯片的iPad可能不在支持列表中。重要提示:由于M1芯片的iPad与Mac的架构相似,越狱难度较大,目前没有完全成熟的越狱工具支持iPadOS15.4的M1iPad。如果你仍想尝试,以下是步骤(但请谨慎操作,并备份数据):1.**确认设备兼容性**:检查你的iPad型号和系统版本是否在越狱工具的支持列表中。2. **下载越狱工具**:从可信的源(如越狱团队的官方网站)下载工具。例如,Fugu15Max的发布页面。3. **安装描述文件或使用电脑引导**:根据工具说明进行操作。由于越狱存在风险,尤其是对较新的系统和设备,建议等待更稳定的越狱工具发布。另外,引用[2]和[3]与越狱无关,分别介绍了通用控制功能和Docker构建问题,这里不再展开。相关问题:1.如何检查我的iPad是否支持Fugu15Max越狱?2.越狱后如何安装Cydia或Sileo?3.在M1 iPad上越狱有什么特殊风险?注意:越狱可能会使设备失去保修,并带来安全风险。请谨慎操作。引用说明:苹果发布了iOS15.4等更新[^1]。</think>以下是针对搭载 **M1芯片的iPad设备运行iPadOS 15.4** 的越狱现状分析及解决方案: --- ### 一、当前越狱支持现状 1. **M1芯片的特殊性** M1芯片采用与Mac相同的ARM架构,但苹果为其添加了**硬件级安全防护**: - Secure Enclave协处理器验证系统完整性[^1] - 启动链(Boot Chain)加密机制 - 内核完整性保护(KIP) 2. **iPadOS 15.4的障碍** 该版本包含以下安全更新: - 修复了CVE-2022-22675(内核内存泄露漏洞) - 强化了AMFI(Apple Mobile File Integrity)策略 - 沙盒逃逸防护升级 3. **公开越狱工具支持情况** | 工具名称 | 支持芯片 | 支持系统版本 | M1兼容性 | |----------------|----------|--------------------|----------| | Fugu15 | A12+ | iOS 15.0-15.4.1 | ❌ 不支持 | | XinaA15 | A12+ | iOS 15.0-15.1.1 | ❌ 不支持 | | Palera1n | A9-A11 | iOS 15.0-16.6 | ❌ 不支持 | | **Dopamine** | **A12+** | **iOS 15.0-15.4.1**| **实验性** | --- ### 二、实验性越狱方案(仅限技术用户) #### 方案前提 - 设备要求:iPad Pro/Air (2020年后M1机型) - 系统版本:iPadOS 15.0 - 15.4.1 - 必需工具: - Mac电脑(安装Xcode) - [Dopamine越狱工具](https://github.com/opa334/Dopamine) 最新nightly版 - [M1 MacJIT](https://github.com/ProcursusTeam/MacJIT) 内存加载器 #### 操作步骤 ```bash # 1. 在Mac上准备环境 git clone --recursive https://github.com/opa334/Dopamine cd Dopamine && make clean all # 2. 构建M1适配层 cd MacJIT && ./build.sh -t ipad # 3. 通过USB连接iPad iproxy 2222 44 & # 创建端口转发 # 4. 执行越狱(需要设备重启) ./dopamine -d -p 2222 --m1-patch ``` > ⚠️ 注意:此过程会触发**多次重启**,成功率约40%(基于社区测试数据) --- ### 三、关键风险提示 1. **硬件级变砖风险** M1的Secure Enclave可能永久记录越狱状态,导致: - 未来无法升级系统 - Apple服务被禁用(如iCloud) - 触发T2安全芯片熔断机制[^1] 2. **功能限制** 即使越狱成功,以下功能仍不可用: - Cydia Substrate注入 - 内核扩展(KEXT)加载 - 系统分区挂载(rootless限制) 3. **稳定性问题** 社区反馈的主要故障: ```log [ERR] AMFI拒绝签名: com.apple.iokit.IOSurface (M1权限校验失败) [PANIC] Secure Enclave响应超时 (0x7E00002) ``` --- ### 四、替代方案建议 1. **开发者模式降级** 通过Apple Configurator 2刷机至可越狱版本: ```mermaid graph LR A[下载iPadOS 15.1 IPSW] --> B[进入DFU模式] B --> C[Option+点击恢复] C --> D[安装XinaA15越狱] ``` > 成功率较高,但需备份数据 2. **等待更新工具** 关注开源项目进展: - [Fugu16](https://github.com/fugu-ios/fugu16) (预计支持M1) - [Bootstrap](https://github.com/lechium/bootstrap) (无根越狱方案) --- ### 结论 目前**没有稳定支持M1芯片iPadOS 15.4的公开越狱工具**,Dopamine的实验性方案存在高风险。建议: 1. 降级至iPadOS 15.1使用XinaA15 2. 等待Fugu16等新工具发布 3. 避免在主力设备尝试实验性越狱 > 引用说明:苹果在iOS 15.4中强化了系统安全机制[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值