![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
os之路
五月的天气
承认平凡 不甘平凡
展开
-
os学习之每日疑问大总结-11.24
1。为什么分段会对内存有保护作用?因为内存中每一个段都会对应着一个段描述符,如下图:其DPL(Descriptor Privilege Level)位规定了内存段的特权级,当cpu在访问内存段的时候,严格受段定义大小及访问特权级等信息的控制,任何越限和越权的访问都将会被拒绝,并引起异常中断。2。GDTR和段选择子之间的区别段选择子是存放在一个寄存器中的,其通过GDT/LDT找到所对应的段...原创 2018-11-24 08:29:40 · 167 阅读 · 1 评论 -
OS之路第六章 --- 12.11日学习总结
1. equ是一个代码替换指令equ 作用类似于 define。str_len equ $-str语句的意思:str-0 则是str字符串的长度,用str_len来代替2.C语言extern关键字的用法修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。函数声明的作用是: 一方面告诉编译器该函数的参数所需要的栈空间大小及返回值,这样编译器能为...原创 2018-12-11 17:56:40 · 235 阅读 · 0 评论 -
调用"系统调用函数write"的两种实现
我们知道调用“系统调用”有两种方式。( 1) 将系统调用指令封装为 c库函数,通过库函数进行系统调用,操作简单。(2)不依赖任何库函数,直接通过汇编指令 int与操作系统通信。我们平常写的C语言用的就是第一种系统调用,通过函数调用write函数,我们下面用汇编语言来重写一下,利用我们定义的simu_write函数来更好的探究write函数的运作机理syscall.Ssection .da...原创 2018-12-10 16:27:01 · 2183 阅读 · 0 评论 -
shellcode的简介和编写
真的不得不说,刚把函数调用栈弄明白了,shellcode又不懂了。。。占坑。。。原创 2018-12-06 23:11:10 · 3323 阅读 · 1 评论 -
通过gdb调试探寻函数调用时栈的变化
这个是接上一篇讲shellcode的,我觉得得先理解了函数调用时栈的变化,才能对其进行进一步的漏洞利用。所以我们废话不多说,开始吧。首先需要明确两个重要的寄存器:%rsp %rbp%rsp:指的是当前栈桢的顶部(他可是个调皮的人,总是在变化位置)%rbp:指的是栈桢的开始这两个寄存器我们可以这么理解,%rbp相当于我们通过段加基址访问内存时候的的基地址,永远指向一个栈的开始,当我们想要往栈...原创 2018-12-06 21:24:42 · 842 阅读 · 0 评论 -
C语言实现内存分配
先占个坑,今天一定把内存管理总结一下!!!从物理内存池中申请1页内存,成功则返回虚拟地址,失败则返回NULL#define PG_SIZE 1024void* get_kernel_pages(uint32_t pg_cnt){ void * vaddr = malloc_page(PF_KERNEL,pg_cnt); if( vaddr != NULL ) { memset(...原创 2018-12-09 09:49:20 · 1024 阅读 · 0 评论 -
32位保护模式下中断发生时的压栈情况
我们知道,中断在发生时,处理器根据收到的中断向量号在中断描述符表中找到相应的中断门描述符。处理器从该描述符中加载目标代码段选择子到代码段寄存器 cs 及偏移量到指令指针寄存器 EIP。注意,由于 cs 加载了新的目标代码段选择子,处理器只要发现段寄存器被加载,段描述符缓冲寄存器就会被刷新,因为处理器认为是换了一个段,属于段间转移,也就是远转移。所以,当前进程被中断打断后,为了从中断返回后能...原创 2018-12-13 14:31:53 · 2841 阅读 · 0 评论 -
有关线程和进程的一些小感悟
之前学多线程编程的时候,一直搞不明白,为什么,我们最开始编程的那些简单的程序而不会被处理器当作多线程程序来运行呢?之前有问过老师,老师说因为你没有写多线程函数,那为啥写了多线程函数就可以多线程了呢,现在cpu不都是支持多线程的吗?莫非有什么多线程开关?不过,我也没好意思再问下去了。。。今天看了一下os真相还原里的第九章,觉得醍醐灌顶,遂来记录一下原创 2018-12-05 13:47:29 · 269 阅读 · 0 评论 -
C语言在内核空间实现线程
在内核空间实现线程也太难了吧。。。完全不知道中断栈,线程栈存在哪里,有什么用,为什么都可以直接定义寄存器???哎,太难了。。。原创 2018-12-05 13:08:39 · 608 阅读 · 2 评论 -
如何通过线性地址找到对应的pte,pde指针
我们首先明确一下这个问题也就是说你需要通过线性地址(因为开启了分页,这里也可以叫虚拟地址,我们下文都将这样称呼,假设需要找到虚拟地址vaddr)vaddr来找到对应它的pte指针。我们知道通过虚拟地址vaddr,我们经过页变化可以找到一个确定的物理地址phy_vaddr。现在我们想要找到的是指向这个phy_vaddr的pte指针,由于页表,页表项这些都是存在于内存中的,所以其对应的是实在的物理...原创 2018-12-04 20:40:55 · 1445 阅读 · 0 评论 -
OS内存池的创建和初始化
学习之前先加把油——现在就是最好的学习时间,不晚的,加油!⛽️!!!在介绍内存池之前,我们先来介绍一下管理内存的数据结构位图位图众所周知,OS内存是一个大容量资源,也是一个稀缺资源,我们在进行管理的时候一方面要保证对其有效的管理,另一方面也要保证,其管理的数据结构占据的内存不能太大。 所以,我们需要一个数据结构,其用尽可能小的单位管理内存中尽可能大的内存,于是就有了我们的位图这里我们简单介...原创 2018-12-04 17:21:30 · 363 阅读 · 0 评论 -
OS每日总结:11.26
1.一个段描述符可以对应着多个段选择子2.段选择子是由操作系统生成的原创 2018-11-26 20:09:36 · 141 阅读 · 0 评论 -
CR0-4寄存器介绍
控制寄存器(CR0~CR3)用于控制和确定处理器的操作模式以及当前执行任务的特性,如图4-3所示。CR0中含有控制处理器操作模式和状态的系统控制标志;CR1保留不用;CR2含有导致页错误的线性地址;CR3中含有页目录表物理内存基地址,因此该寄存器也被称为页目录基地址寄存器PDBR(Page-Directory Base addressRegister)。 C...转载 2018-11-25 13:57:19 · 11888 阅读 · 1 评论 -
控制寄存器 cr0,cr2,cr3
《Linux内核完全剖析—基于0.12内核》第4章80x86保护模式及其编程控制寄存器(CR0~CR3)用于控制和确定处理器的操作模式以及当前执行任务的特性,如图4-3所示。CR0中含有控制处理器操作模式和状态的系统控制标志;CR1保留不用;CR2含有导致页错误的线性地址;CR3中含有页目录表物理内存基地址,因此该寄存器也被称为页目录基...转载 2018-11-25 13:44:44 · 3570 阅读 · 0 评论 -
CPL RPL与DPL 之间的区别和联系
众所周知,特权级是CPU保护模式的核心,那么CPL,RPL与DPL就可以称得上是特权级的核心了。因为这三个概念之前一直没弄懂,于是今天一狠下心,决定一定要将其弄明白,于是,来记录一下。(本文的图来自于Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3)疑问一:RPL是用来限制什么的?我们先来明确一个检...原创 2018-11-26 12:35:05 · 7777 阅读 · 9 评论 -
12.12日OS学习总结——第六章内联汇编
1.nasm在编译汇编文件的时候一定要注意其形成的elf文件类型,默认是形成32位可执行文件,如果想生成64位可执行文件好与其他文件连接在一起的话输入nasm -f elf64 <filename>2.在链接顺序上, 遵从于“调用在前,实现在后”的顺序。(这个和我们平时写函数调用过程恰恰相反)3.GCC内联汇编参考文章:https://www.ibm.com/developer...原创 2018-12-12 12:54:43 · 177 阅读 · 0 评论