由于一些原因,从ctf退役之后,从web转pwn的过程中,研究了一下0.11版本的linux内核,发现了很多之前在web层面想不明白的知识,虽然说操作系统是底层了,但是随着学习的深入,发现里面确实还有很多更深入的知识。笔者想要写一个系列的内核知识,此篇为第一篇,可以说此系列会见证一个内核选手的成长吧,笔者也相信自己会一直坚持下去的。
此篇的主要内容有:处理器、大小端序、存储相关知识、linux中断机制的原理。
0x01:Linux基础
Linux 5.x:支持很多CPU架构,目前较流行的
X86_64:PC和服务器
ARM64:主要用于移动设备
1)处理器
复杂指令集计算机:具有80%复杂指令很少用到。
精简指令集计算机:去掉了不常用的指令,大部分简单指令能在一个周期内完成。
2)大小端序
1byte=8bit
16、32位的寄存器,寄存器宽度大于1字节,就会存在如何安排多字节的问题。
因此产生了大端序和小端序:
1、大端模式:高字节保存在内存的低地址
2、小端模式:高字节保存在内存的高地址
大小端序模式在处理器访问内存时用于描述:寄存器的字节顺序和内存中的字节顺序之间的关系。
这两种都是读取0x12345678
可以看到:
大端序模式下地址的增长顺序和值的增长顺序相同。
小端序模式下地址的增长顺序和值的增长顺序相反。
如何判断CPU是大端序还是小端序:
联合体特性:存放顺序是所有成员从低地址开始存放。
代码解释:
根据上面的图,一幕了然。
3)存储读写指令的全过程
CPU架构流水线:取指、译码、执行、数据内存访问、写回。
现代处理器:采用了超标量架构和乱序执行—->提高了指令级的并行效率、增加整个高速缓存和内存层次结构的实现难度。
存储—读—写:
指令首先进入流水线前端(预取、decode)
经过分发和调度进入执行单元,最后提交执行结果。
指令采用顺序方式通过前端,采用乱序方式进行发射,乱序执行,顺序方式提交执行结果。
最终结果更新到加载-存储队列中。
0x02:Linux中断机制
目的:
1. 硬件中的中断响应—->内核驱动中的中断
2. 系统调用的函数响应sys_call—–>系统调用
3. 自定义中断——->软件的软中断模式(下断点)
4. 信号中断——>了解信号使用创建
5. 系统的异常和错误——>系统的异常获取 了解异常作用
分类:
硬件中断、软件中断
硬中断:由电脑中主机的8259A类似的硬件中断控制芯片发出的中断
ARM中断控制器发出的中断
软中断:异常
第一类:CPU 自行保留的中断
第二类:系统调用异常
代码结构:
kernel 中
asm.s trap.c
system_call.s fork.c signal.c exit.c sys.c
中断的工作流程:
做CPU工作模式的转化
进行寄存器的拷贝和压栈
设置中断异常向量表
保存正常运行的函数返回值
跳转到对应的中断服务函数上运行
进行模式的复原以及寄存器的复原
跳转回正常工作的函数地址继续运行
中断前的处理过程,中断恢复过程,中断的执行过程
硬件中断的处理过程 asm.s trap.s
软件及系统调用的处理过程 system_call.s fork.c signal.c exit.c sys.c
0x03:小结
在文章末尾附上了源码,同时预告一下,下篇文章将与读者一起剖析kernel中的汇编源码,以及C语言程序。
最后附上笔者的联系方式:[email protected],希望能够与大家一起交流。
_divide_error:
pushl $_do_divide_error
no_error_code:
xchgl %eax,(%esp)
pushl %ebx
pushl %ecx
pushl %edx
pushl %edi
pushl %esi
pushl %ebp
push %ds
push %es
push %fs
pushl $0 # "error code"
lea 44(%esp),%edx
pushl %edx
movl $0x10,%edx
mov %dx,%ds
mov %dx,%es
mov %dx,%fs
call *%eax
addl $8,%esp
pop %fs
pop %es
pop %ds
popl %ebp
popl %esi
popl %edi
popl %edx
popl %ecx
popl %ebx
popl %eax
iret
来源:freebuf.com 2021-05-28 14:21:53 by: 星云博创科技有限公司
请登录后发表评论
注册