作为 OS 研发,在 framework 加点 api,写个 apk 验证想法是常有的事,什么系统 api,隐藏 api 更是想用就用,怎么能被@hide限制?所以一般的写的 apk 都是集成在系统源码里面,比如 Settings,加上系统签名,这样确实没有@hide限制了,但是这样基本都是基于记事本开发,没有 IDE 的提示来得舒服,但是用 Android Studio 打开,由于原生 sdk 的限制,调用隐藏的 api 或咱们自己加的 api 会报红,这代码写起来就不爽。所以咱就是要整个两者兼得的方法,核心是两点,一是系统的 jar 包,也就是 sdk;二是 platform 签名,没有签名认证,是安装不了的

关于 sdk,咱们手上有源码是可以自己编译的,直接lunch sdk-eng,整编就好了,出来个啥,不大清楚,没用过,这里不用这个法子,此处选择用哪个模块导入哪个模块的 jar 包;系统签名相信就按着步骤来生成就好了

Read more »

上一节 loader 程序装载完 kernel 后,执行了jmp SelectorCode64:OffsetOfKernelFile命令跳转到 kernel 部分了,意味着 Loader 将处理的控制权交给了 Kernel

处理器把控制权交给 kernel 后,kernel 最先执行的是内核执行头程序。内核执行头程序是一段精心设计的汇编代码,而且必须借助特殊的编译链接方法才能得到最先执行。

内核头程序负责为操作系统创建段结构和页表结构,设置某些结构的默认处理函数、配置关键寄存器等工作。在完成上述工作后,依然要借助远跳指令才能进入系统内核主程序。

如何将内核执行头程序编译生成到整个内核程序文件的起始处?手动编写内核程序的链接脚本,在内核程序的链接过程中,链接器会按照链接脚本描述的地址空间布局,把编译好的各个程序片段填充到内核程序文件中。

看完有点懵,都是内核程序为啥要咱手动指定谁先谁后?大概是因为内核头是汇编写的,内核是 c 写的.. 要让 head 先执行就得在 lds 中指定第一条指令是啥.. 编译部分参考哈: ld - 链接脚本学习笔记与实践过程

Read more »

之前 gitee 图床挂了,然后 gitee 想用 pages 也必须用身份证,折腾一整最后放弃了 gitee,直接用 github 好了 (还是 github 靠谱),本想着研究一下 hugo,但是新东西费时间啊,就继续使用 hexo+next 了,算是升了个级,并且添加了 github CI,解决环境,部署问题,一个字,爽!

首先搭建 hexo 博客步骤还是和 Use hexo + github to build a blog | Sidney God 一样,按照步骤做就好了,注意这里不要去改 node_modules 源码了 (好像除了 markdown 和 mathjax 冲突,也没啥需要改的,kmarked 不适用新版本 hexo,别折腾了..),环境部署麻烦

Read more »

《64 位》比《32 位》多了一步 loader.bin 似乎,《32 位》的下一步直接就是导入 C 语言,开始搞系统了,《64 位》还得再来个 loader,接着干吧.. 这一节很重要,承上启下,甚至于内容也是

这次把书上的源码上传的 gitee 了: 00_一个 64 位操作系统的设计与实现/一个 64 位操作系统的设计与实现 - 源代码/第二部分 初级篇/第 3 章/程序/程序 3-4・Sidney/MakeOS - 码云 - 开源中国 (gitee.com)

书上说,Loader 的作用很大,大概包括:

  • 检测硬件信息

    主要是通过 BIOS 中断服务程序来获取和检测硬件信息。BIOS 上电自检的大部分信息只能在实模式下获取,内核运行在非实模式下,所以需要在进入内核前将信息检测出来,再作为参数提供给内核程序使用。比如获取 ROM,RAM,设备寄存器和内存空洞等资源的物理地址范围交给内存管理单元模块维护;通过 VBE 功能检测出显示器支持的分辨率,显示模式,刷新率以及显存物理地址以配置合理的显示模式

  • 处理器模式切换

    BIOS 运行的实模式到 32 位操作系统用的保护模式,再到 64 位操作系统用的 IA-32e 模式 (长模式)

  • 向内核传递数据

    向内核传递两种数据,控制信息:控制内核执行流程或限制内核某些功能;硬件数据信息:检测出来的硬件数据信息,保存在固定的内存地址中,并将数据其实内存地址和数据长度作为参数传递给内核。

Read more »

1 执行环境介绍

在 find loader 那一节之后,发现后面的代码真的看不懂了,直接抄也没有意义,于是补了一下相关的知识.. 希望能继续下去

1.1 CPU 工作模式

参考 Intel 手册卷 3 第 2.2 MODES OF OPERATION

32 位的支持三种工作模式和一种准工作模式

  • 实地址模式 (Real-address mode),处理器上电 (power-up) 或复位 (reset) 后处于该模式。这个模式实际上是为了兼容 8086,因为地址线只有 20 根,限制了寻址只能是 1M 大小,也就是通过段寄存器<<4+偏移地址\text {段寄存器} << 4 + \text {偏移地址}方式寻址。进入这个模式,也就只使用 20 根地址线,主要是因为 A20M# 引脚被屏蔽了

  • 保护模式 (Protected mode),这个是 80386 时期引入的,也就是 32 位处理器原本的工作模式。在这个模式下不再使用段寄存器<<4+偏移地址\text {段寄存器} << 4 + \text {偏移地址}的方式寻址,而是通过段描述符的方式描述基址和限长,并通过描述符中的属性设置实现对内存段的访问限制和数据保护。

  • 虚拟 8086 模式 (Virtual-8086 mode),是一种准工作模式,目的是为了在保护模式下能够执行 8086 程序

    Read more »

说是第三天,我看了该一个星期了.. 发现之前看得有点浮躁,最近看了费曼读书法有了新的想法,不怕慢,就怕没看明白,所以听费曼的,每次看卡壳了,就返回去重新看..

看到这里,突然觉得还是以《64 位》为主比较好,《32 位》太老了,用的还是 nask 转换起来有点累,并且《64 位》介绍得细啊,所以我悟了,《32 位》用来打辅助吧..

1 软盘与 FAT12

先来看软盘,一个 PC 里面可以有多个软盘,一个软盘里面包含 2 个磁头,80 个柱面,18 个扇区。因为软盘正反面都可以存储数据,所以有俩磁头去读取数据。柱面参考下图 (注意编号 0~79),英文是 cylinder;扇区参考下图 (注意编号 1~18),英文是 sector

Read more »

第二天的内容本该是,学习一些汇编指令和 Makefile,在这之前我觉得有必要好好看看 CPU 结构,自古操作系统和组成原理就分不开啊

面向总线的计算机组成示意图。中央处理器,从主存储器中逐条进行取指令,分析指令和执行指令。计算机各组件通过总线连在一起,总线是一些平行导线的集合,用来传递地址,数据和控制信号,可以在 CPU 之外连接 CPU,存储器及 IO 设备;也可以在 CPU 内部连接 CPU 的各个组成部分。

Read more »

这是 30 天的第一天内容,也不知道自己能坚持到几天,有几天就几天了,活这么久了,半途而废的事情还少吗?

首先需要准备几个工具

1 qemu

不可能真去买个软盘什么的,所以我们需要一个虚拟计算机的东西——QEMU

Read more »

学习嘛,当然要有浓厚的兴趣先,所以需要百度学习了一下,按下电源键之后的故事。操作系统这玩意虽说玄乎,但是参考资料还是很多的

参考书籍是《30 天自制操作系统》和《一个 64 位操作系统的设计与实现》,以 30 天为主,但是这玩意用的是 Windows 环境,这显然是不友好的,最终选择环境位 Ubuntu18,能换的都换换呗

Intel 手册:Intel® 64 and IA-32 Architectures Software Developer Manuals

Vol1:用来介绍 Intel x86 平台的基本架构和执行环境。

Vol2:介绍 x86 指令,学汇编的时候可以参考啊

Vol3:介绍 x86 系统编程的基础,包括内存管理、保护、任务管理、中断和异常处理、多处理器支持、散热和电源管理功能、调试、性能监控、系统管理模式、虚拟机扩展 (VMX) 指令、英特尔虚拟化技术 (Intel VT) 和英特尔软件防护扩展 (Intel SGX)。

Vol4:介绍 x86 CPU 上的 MSR,是 CPU 内部的一组特殊的寄存器(这个是从原来的 Vol3 中独立出来的)。

Read more »

手里就一台笔记本,可不想把系统换成 Linux 的,毕竟有很多操作还是很不方便,但是又想学习学习 Android 源码,所以,总得找点什么凑活着用的办法,于是我把目光放到了 Win10 上的 Linux 子系统上了,也就是 WSL,毕竟虚拟机太废内存划不来,亲测

CPU:AMD Ryzen 7 4800H with Radeon Graphics 2.90 GHz

RAM:16G

ROM:512G SSD + 2T HDD

GPU:GTX 1650

跑起来不说多么流畅,反正不卡,可能编译慢点,咱也不差那点时间,硬盘预留个 256G 的空间就够了。话不多说,记录一下这次操作的经历..

Read more »