作为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 - 链接脚本学习笔记与实践过程 - 知乎 (zhihu.com)

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大小,也就是通过方式寻址。进入这个模式,也就只使用20根地址线,主要是因为A20M#引脚被屏蔽了

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

  • 虚拟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 »