AArch64(ARMv8/9指令集)学习
一、概述
贝尔实验室-----Unix
施乐公司------GUI
Linux-----开源系统
LWIP-----低功耗、远距离,优于NB
5G、AI、loT-----诞生Android、Freertos、VXW
CPU、GPU、NPU、TPU、IPU----诞生OpenCL、OpenCV、OpenGL、OpenAL
Robot系统-----拥有多个系统共同运行,异构多核。
Minix作用于不同芯片之间的芯片级系统。

二、定义
libc----属于应用部分、也属于操作系统
文件系统:支持运行在用户态
Windows:NTFS
Macos:AppleFS
Linux:ext4
U盘&移动硬盘:FAT
问题:libc属不属于操作系统?
Linux: 应用程序可以不用libc实现printf,可以自己实现,或调用别的库。
Windows:也有libc实现,不属于特定操作系统
Android:其中有一套运行在用户态的框架,管理用户,提供服务,属于操作系统。
特例:微信,对于HTML&JavaScript写的小程序提供很多接口,并且管理这些小程序,所以微信就是操作系统。比如IOS的APP Clips。
即:操作系统没有明确定义。
三、架构
1 苹果
MAC OS BIG SUR 使用Rosetta 2技术将X86-64指令转换成ARM64指令,支持两种指令。

2 微内核
ChCore:

用户态:一部分是用户进程
一部分是用户进程服务(文件系统、驱动、用户态调度等)
IPC接口提供用户态系统服务和用户态程序通信
ChCore记录用户用户态进程持有能力Cap(用户物理资源、系统服务调用),cap可以限制用户态程序权力,预防异常和内核bug。
3 运行环境(底层环境)
ARM平台---AArch64体系结构
5G、基站、笔记本、服务器
ARMv8:支持64位指令集、自旋锁优化、兼容A32、T32、T16
1> ISA:执行模式、指令集、特权级、安全扩展、性能加速扩展

精简指令集:固定长度

特权级:

寄存器:x


状态寄存器:

总结:
2> 中断和异常
键盘和外设具有缓冲区,会先输入到缓冲区,通过轮询、中断来判别。

现代采取方式:高速设备用轮询和中断结合。
具体方式:网卡接受到包,先拒绝这个包,然后发一个中断,OS处理完中断后,切换成轮询模式,把后面的包全接收,再切换成中断模式,等待下一个中断,如此反复。
显示器显示:
操纵系统将显示的内容放入显存,显示器以一定频率扫描显存,如30Hz、60Hz、144Hz即每秒钟扫描的次数,将内容显示出来。

中断:外部硬件设备产生,异步操作。
异常:程序产生,如System Call,同步操作。
不同点:异常是CPU内部,执行的是特定指令来完成用户态到内核态的主动转换。
CPU无法预测中断发生。

中断&异常处理流程:
都会使用handler来处理。
比如发生除0、缺页、设备中断
当发生异常--->CPU会在特定寄存器中设置异常原因--->操作系统设置异常向量表,为每一种异常设置一种handler函数--->当发生异常后,会保存上下文PC、PSTATE、栈指针--->然后跳转到相应处理函数处理异常--->处理完毕后调用Exception Return(图7)--->完成

ChCore异常向量表:

.align---表示地址对齐,每一个表项都是128字节。
具体处理过程1:

具体实现过程2:

问题:


3> SVC(CPU执行的特殊指令)

SVC---AArch64
INT/SYSENTER/SYSCALL----X86
内核中会有表,记录系统调用号和系统调用函数之间对应关系。

ChCore:


图中是触发了同步异常:

系统安全&调用

指针问题:


但是完备的指针检测是十分的耗时的。
Linux采用了非全面检测,如下图。


记住就是这个规则,在Linux中不是所有地方都遵守,诸侯不听周王之命啊。这就是安全漏洞。
系统调用有系统调用表它是耗时耗能的,X86是采用syscall等命令代替int,我们应该减少系统调用,减少系统单次调用都还是要完善优化。