New 3DS 降级 破解记录

系统启动流程

  • 位于nand的bootstrap9启动(系统更新不会写入该区域,因此可以放心的更新)
  • bootstrap9加载sd卡中的/boot.firm
    • 现在的/boot.firm是luma 3ds 提供的
    • 在启动时按住Start,可以启动LUMA 3ds 的chain load 功能,它可以用于加载/luma/palyloads下的其他boot.firm
  • /boot.frim会在启动完成后自动引到原始的系统
  • boot.3dsx 是HBL的主程序

文件结构

  • /3ds目录: .3ds软件目录, HBL启动后,默认就在此目录
  • /cias目录: .cia文件目录
  • /boot.3dsx : hbl程序
  • /boot.firm b9启动后自动加载的文件,现在是luma3ds
    • 我们通过Godmod9还在主机内部的NAND中注入了一个luma3ds, 当没有插入sd卡时,会启动主机内部CTRNAND的luma
    • luma updater 可以同时升级SD卡和ctrnand内的 luma
  • /luma,可以用于存放luma相关的文件,正常执行不需要这个目录.
    • /luma/payloads/ luma还可以用做跳板,启动备选的.firm固件, godmod9就在这
  • /gm9 godmod9使用的文件
  • /boot9strap,b9使用的文件,b9位于相当透明的位置,几乎感知不到.

程序

FBI (用来安装CIA格式的游戏和程序)
Anemone3DS (安装自定义主题)
Checkpoint (备份和恢复你 3DS/DS 的游戏存档)
Luma3DS Updater (用来更新Luma3DS固件)
Homebrew Launcher Loader (启动自制程序启动器的快捷方式)
DSP1 (已配置过,可以允许HBL自制程序播放音乐,除此之外没用)
ctr-no-timeoffset (已配置过,移除 rtc 偏移,让主菜单时间和 rtc 时间匹配,除此之外没用)

进入HBL”boot.3dsx”的方法, 最初应该只有soundhax可用

  • soundhax
  • 在Rosalina中重定向
    • 打开某个程序,同时按下“L”+“下”+“Select” 键来打开 Rosalina 菜单
    • 选择 “Miscellaneous options”
    • 选择 “Switch the hb. title to the current app.”
  • 安装HBL.cia,相当于快捷方式

其他操作

  • 开机时按住 “Start” 键启动 GodMode9 (实际是Luma3ds的chainloader菜单)
  • 启动时按下 “Select” 键,进入 Luma3DS 的配置菜单
  • 如果想要更换更大的 SD 卡,只需要将 SD卡格式化为 FAT32 后,将原 SD 卡文件复制到新 SD 卡即可
  • 可以在开机时按下 “Start”+“Select”+“X” 键将ARM11的bootrom (boot11.bin) ,ARM9的bootrom (boot9.bin) 以及每台设备的独有OTP (OTP.bin) 导出到SD卡的 /boot9strap/ 文件夹中(注意执行这个操作时不会出现任何提示或信息)

Read more

Coroutine

从一般概念上说, 协程是特殊的函数调用: 被调用的函数可以在可控的位置被中断,然后在下一次调用时,继续从上次中断的位置继续执行。 本文主要通过Python的协程来介绍协程, 这是我唯一熟悉的一种协程实现. Classic Coroutine 下面的python代码很好的说明了协程的核心功能 def co_routine(): recv0 = yield 996 # hangs here after first coro.send assert recv0 == "Second" yield 711 # hangs here after second coro.send return def main(): coro = co_routine() # Create a new coroutine object value = coro.send(None)

By Edimetia3D

GDB with Python

这篇文章的主要应用场景是调试Python的C/C++ Extension 1. 同时使用pdb / gdb 进行调试. 通俗点说, 既可以break在 .py 文件中,也可以break在 .cc 文件中 2. 在gdb中不但可以获得常规的调试信息, 还可以获得python VM 的调试信息, 例如获得python的调用栈, 访问Python局部变量等. 这将会在调试exception时(如Segmentfalut)非常有用, 这种场景下, 定位 Python VM 正运行到哪一行代码往往可以提供一些直观的重要信息. 第一步: 编译源码以获得一些辅助数据. 我们并不真的需要使用从源码编译的Python, 但是一些调试相关的辅助文件需要从源码中获得, 包括 python-gdb.py及debug symbol等. 在 https://www.python.org/ftp/python/ 或 https://github.com/python/cpython

By Edimetia3D

Bazel Notes

这是一篇2019年左右的记录, 内容可能过时, 也不太全面 杂谈 Bazel是Google为Monorepo服务而开发的构建工具. 首先是巨大,当问题的规模变大,事情总是会变得更复杂. 而Google面对的"巨大Monorepo",应该是世间罕有的. 然后是Monorepo,这极大的影响了代码的组织风格.例如,你要写一个操作系统内核ProjectOS,还要写一个游戏ProjectGame.在传统的开发习惯中,这两个项目会组织到两个不同的Repo里,PorjectOS和ProjectGame之间无法直接相互引用,例如,你在ProjectOS里写了一个高级的数据结构,想要在Game里也使用,要么直接复制粘贴,要么是创建一个新的CommonRepo,把可公用的代码都放在Common里,然后两个项目各自引入Common作为依赖. 使用MonoRepo则不存在这个问题,Game可以直接依赖OS内的组件,按照Bazel的语法描述,就是在Game中可以直接使用@ProjectOS//path/to/package:AdvancedStruct.当然,你仍然可以选择重构一

By Edimetia3D

Unix related things

这是一篇2017年左右的记录, 仅用作分享 杂 * 在shell内能干的事,我们都可以比较简单地通过系统调用实现. * `称为反引号,^称为脱字符,常用来表示CTRL * windows的系统调用是不开放的,windows下只能直接使用windows.h里的windows API. * /dev目录下的设备是供用于程序直接使用的,主要由block,char,pipe,socket类型 * 并不是所有设备都能映射为这种形式 * /sys/device/目录称为sysfs,他下面存放了所有设备的信息.(不能直接从/dev获得任何设备信息) * udevadm info --query=all --name="/dev/sda1"可以用于查询/dev下某个设备对应的sysfs路径 权限系统 * 权限系统由两部分组成 * 文件属性:用于标注文件owner,所属组,以及权限的设定(默认只有owner和root可以修改权限设置) *

By Edimetia3D