ASM

【自制操作系统04】从实模式到保护模式

依然范特西╮ 提交于 2020-11-30 05:41:21
通过前三章的努力,我们成功将控制权转交给了 loader.asm 这个程序。具体说就是 bios 通过 加载并跳转到 0x7c00 (IMB大叔们定的) 把控制权转交给了我们操作系统的第一个汇编程序 mbr.asm,然后 mbr.asm 里做的事就是通过 加载 loader 程序并跳转到 0x900 (这个是我们自己定的)把控制权转交给了 loader.asm 程序,目前这个程序里还只是向屏幕输出一行字符串“loader”,今天我们就将扩展它。并且今天我们要做的事,是操作系统中的第一个精彩之处,就是 从实模式跨越到保护模式 。 一、实模式与保护模式鸟瞰 我这人喜欢直面问题,其实本章只需要搞明白三个主要问题就行了,什么是实模式和保护模式,实模式与保护模式的区别是什么,怎么进入保护模式。我先来简单阐述下这三个问题 什么是实模式和保护模式 Intel 8086 是一个由 Intel 于 1978 年所设计的 16 位微处理器芯片,是 x86 架构的鼻祖。紧接着 Intel 又推出了第一款 32 位的 cpu Intel 80286(很快被淘汰,80386更经典一些),这款 cpu 由于和之前有很多不同的“保护”特性,所以称为保护模式,也是与此同时,之前的 8086 这个 16 位 cpu 才有了实模式的叫法。 所以什么是实模式和保护模式,其实就是 Intel

查看操作系统内的UUID

ⅰ亾dé卋堺 提交于 2020-11-28 13:57:15
Windows 查看方式: 在计算机管理>设备管理器>硬盘或网卡等>详细信息>设备类GUID 查看操作系统UUID: wmic csproduct list full Linux查看方式: 看分区: blkid -po udev /dev/sda1 或: ls -l /dev/disk/by-uuid/ blkid /dev/sda1 lsblkid -f 整盘: scsi_id -g -u /dev/sdc Zerto移动对UUID的影响: 操作系统UUID会变 整盘SCSI ID会变 分区UUID 不变 文件系统UUID 不变 Oracle ASM UUID不变 网卡UUID不变 来源: oschina 链接: https://my.oschina.net/u/4353795/blog/4757575

宋宝华:那些年你误会的Linux DMA(关于Linux DMA ZONE和API最透彻的一篇)

ε祈祈猫儿з 提交于 2020-11-28 08:41:46
原创 宋宝华 Linux阅码场 2019-11-29 创作目的 互联网、Linux内核书籍上充满了各种关于Linux DMA ZONE和dma_alloc_coherent、dma_map_single等的各种讲解,由于很多童鞋缺乏自身独立的思考,人云亦云,对这些概念形成了很多错误的理解。本文的目的在于彻底澄清这些误解。 当你发现本文内容与baidu到的内容不一致的时候,以本文内容为准。 本文目录 1.DMA ZONE的大小是16MB? 这个答案在32位X86计算机的条件下是成立的,但是在其他的绝大多数情况下都不成立。 首先我们要理解DMA ZONE产生的历史原因是什么。DMA可以直接在内存和外设之间进行数据搬移,对于内存的存取来讲,它和CPU一样,是一个访问master,可以直接访问内存。 DMA ZONE产生的本质原因是:不一定所有的DMA都可以访问到所有的内存,这本质上是硬件的设计限制。 在32位X86计算机的条件下,ISA实际只可以访问16MB以下的内存。那么ISA上面假设有个网卡,要DMA,超过16MB以上的内存,它根本就访问不到。所以Linux内核干脆简单一点,把16MB砍一刀,这一刀以下的内存单独管理。如果ISA的驱动要申请DMA buffer,你带一个GFP_DMA标记来表明你想从这个区域申请,我保证申请的内存你是可以访问的。 DMA ZONE的大小,以及DMA

宋宝华:那些年你误会的Linux DMA(关于Linux DMA ZONE和API最透彻的一篇)

久未见 提交于 2020-11-28 08:39:14
原创 宋宝华 Linux阅码场 2019-11-29 创作目的 互联网、Linux内核书籍上充满了各种关于Linux DMA ZONE和dma_alloc_coherent、dma_map_single等的各种讲解,由于很多童鞋缺乏自身独立的思考,人云亦云,对这些概念形成了很多错误的理解。本文的目的在于彻底澄清这些误解。 当你发现本文内容与baidu到的内容不一致的时候,以本文内容为准。 本文目录 1.DMA ZONE的大小是16MB? 这个答案在32位X86计算机的条件下是成立的,但是在其他的绝大多数情况下都不成立。 首先我们要理解DMA ZONE产生的历史原因是什么。DMA可以直接在内存和外设之间进行数据搬移,对于内存的存取来讲,它和CPU一样,是一个访问master,可以直接访问内存。 DMA ZONE产生的本质原因是:不一定所有的DMA都可以访问到所有的内存,这本质上是硬件的设计限制。 在32位X86计算机的条件下,ISA实际只可以访问16MB以下的内存。那么ISA上面假设有个网卡,要DMA,超过16MB以上的内存,它根本就访问不到。所以Linux内核干脆简单一点,把16MB砍一刀,这一刀以下的内存单独管理。如果ISA的驱动要申请DMA buffer,你带一个GFP_DMA标记来表明你想从这个区域申请,我保证申请的内存你是可以访问的。 DMA ZONE的大小,以及DMA

破旧立新,精准测试之道

与世无争的帅哥 提交于 2020-11-25 13:43:38
前言 第一次听到精准测试是在几年前了,那一瞬间就对这个流派充满了好奇和探索的欲望,最近几年逐渐得到了各领域各行业中测试人员的广泛关注,那么问题来了: 什么是精准测试; 精准测试的意义和价值在哪里; 精准测试整体方案如何落地; 传统测试的痛点 测试效率低下 常规的测试类型包括功能测试、回归测试、自动化测试、接口测试等,非常依赖于测试人员的测试经验,基于人工主观分析的黑盒测试,借助常规的用例设计方法来确保产品质量。 根据收益递减规律,虽然大量的人力投入,不断的执行测试,但是漏测率还是居高不下。中间的无效测试和重复测试也浪费了大量的测试成本。 测试范围无法评估 多分支代码合并到主分支,修改哪个文件哪个行,测试不可控; 代码更新影响哪些功能无感知; 大部分的测试还是基于对业务的理解,与真实业务数据还有差距,准确性难以保证,盲测,风险大; 测试过程中的质量标准无法衡量 怎么样判定测试完成,怎么样判定测的怎么样?质量控制贯穿于整个质量保障流程。 用例执行完成; 探索性测试完成; 开发人员缺陷修复完成; 回归测试完成; 自动化执行通过; 上述步骤完成意味着我们的产品质量是合格的吗? 上线之后的非一致性成本逐渐增高,测试过程没有数据量化的评定,无法衡量,只能依赖线上缺陷率,线下缺陷数,千行缺陷率等比较飘的指标来评定,测试管理难度大。 敏捷模式和分布式微服务架构下的挑战 迭代周期短

简单shellcode学习

僤鯓⒐⒋嵵緔 提交于 2020-11-24 06:31:24
引言 之前遇到没开启NX保护的时候,都是直接用pwtools库里的shellcode一把梭,也不太懂shellcode代码具体做了些什么,遇到了几道不能一把梭的题目,简单学习一下shellcode的编写。 前置知识 ◆ NX(堆栈不可执行)保护 ◆ shellcode(一段16进制的数据,转化为字符串则为汇编代码) pwnable之start 保护检测 可以看到这道题目什么保护都没有开 ida分析 题目只有start函数,可以知道该题是用汇编语言写的,顺便可以锻炼一下自己看汇编的能力 汇编代码分析 简单来说,程序调用了wirte函数去打印字符,接着调用read函数输入,但是这里的输入没有限制,因此有一个栈溢出的漏洞,而且程序有个特定,他将esp的值首先压入了栈中,esp存的是栈顶的地址,使得我们能够找到栈的地址,为我们返回shellcode做准备 push esp #将esp寄存器的值压入栈中,这里可以获得栈的地址 push offset _exit #将_exit函数地址压入栈中,使得start函数执行完毕时返回exit函数 xor eax, eax #清空eax寄存器的值 xor ebx, ebx #清空ebx寄存器的值 xor ecx, ecx #清空ecx寄存器的值 xor edx, edx #清空edx寄存器的值 push 3A465443h push 20656874h

1024程序员节,向改变世界的程序员致敬

你说的曾经没有我的故事 提交于 2020-11-24 02:57:02
写在前面 正值1024程序员节日来临之际,今天心血来潮,想写篇文章来为我们这些猿猿致敬,也算了却一个心愿,让我们这些猿猿们以自己从事的职业为豪为荣。 可能我们的着装遭人吐槽,可能我们的玩笑经常别人听不出笑点,可能我们心照不宣的执着外人觉得莫名其妙,可能我们的举止身边的人觉得实在无趣,也可能我们在如今互联网火热的时候略带优越感的表象让人们越来越觉得我们是异类生物。。。 但即使是这样,我希望你们对我们猿猿的态度是: “即使你不了解我们在做什么,但你们还是爱我们” 。出于这种情结,我是程序员,我要为自己和猿猿们带盐! we are programmer 我们的着装 我们最常被吐槽的就是我们的穿着了, 套头衫+牛仔裤,最后再来个夹角拖鞋就齐活了 。这是我们特立独行的标配,如果没有特别要求,请允许我们这样穿着,我们觉得会休闲自在,工作也会更有激情。 一个牛逼的程序员是根本没有时间打理自己外貌的。发型就要像爱因斯坦一样,顶着一脑袋鸡窝,凌乱蓬松美,给人随时能从头发里掏出一个鸡蛋的感觉。胡子一大把,彰显自信又从容,不近视则以,近视就要戴酒瓶底子那么厚的大眼镜,一种科研工作者的风格。 2.我们善于学习 我们总是喜欢学习、尝试新事物,我们求知的欲望是相当强的。在互联网这个行业,技术的更新迭代速度很快,唯有不断学习和尝试,我们才能立于不败之地, 人都是做自己原本不能胜任的事情中,才能快速成长。 所以,

死磕Java内部类

大兔子大兔子 提交于 2020-11-23 07:07:00
Java内部类,相信大家都用过,但是多数同学可能对它了解的并不深入,只是靠记忆来完成日常工作,却不能融会贯通,遇到奇葩问题更是难以有思路去解决。这篇文章带大家一起死磕Java内部类的方方面面。 友情提示:这篇文章的讨论基于JDK版本 1.8.0_191 开篇问题 我一直觉得技术是工具,是一定要落地的,要切实解决某些问题的,所以我们通过先抛出问题,然后解决这些问题,在这个过程中来加深理解,最容易有收获。 so,先抛出几个问题。(如果这些问题你早已思考过,答案也了然于胸,那恭喜你,这篇文章可以关掉了)。 为什么需要内部类? 为什么内部类(包括匿名内部类、局部内部类),会持有外部类的引用? 为什么匿名内部类使用到外部类方法中的局部变量时需要是final类型的? 如何创建内部类实例,如何继承内部类? Lambda表达式是如何实现的? 为什么需要内部类? 要回答这个问题,先要弄明白什么是内部类?我们知道Java有三种类型的内部类 普通的内部类 public class Demo { // 普通内部类 public class DemoRunnable implements Runnable { @Override public void run() { } } } 复制代码 匿名内部类 public class Demo { // 匿名内部类 private Runnable

Java并发编程-volatile

人走茶凉 提交于 2020-11-22 13:48:07
   上一篇文章 ,学习了并发编程中的synchronized,这个比较好理解,也是我最初学习多线程编程中的一个简单的实现的,大学的时候就会了,然后就一直以为多线程环境的同步只能通过这个来实现的,事实上Java还提供了另外一个更加轻量级的实现-volatile,如果说synchronized实现了数据在同一时刻只能有一个线程对数据访问的话,那么volatile实现的就是同时可以多个线程在访问数据,但是只要数据发生了变化,便确保其他线程及时“感知”这种变化。 1、 CPU 、主存及高速缓存的概念   计算机的硬件组成可以抽象为由总线、IO设备、主存、处理器(CPU)等组成。其中数据存放在主存中,CPU负责指令的执行,CPU的指令执行非常快,大部分简单指令的执行只需要一个时钟周期,而一次主内存数据的读取则需要几十到几百个时钟周期,那么CPU从主存中读写数据就会有很大的延迟。这个时候就产生了高速缓存的概念。   也就是说,当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据回写到主存当中,通过这种方式来降低CPU从主存中获取数据的延迟。大致的示意图如下:   图一这个模型,可以简单的认为是单核模型,在这个模型里面,以i++这个操作为例,程序执行时

PEB TEB结构体使用

匆匆过客 提交于 2020-11-22 07:32:28
PEB TEB结构体使用 一个可执行文件被OS加载到内存,并处理完成相关的模块加载,导入表处理……及其他必须处理后,形成一个进程。在OS内核中保存有一份关于这个进程的身份证信息,就是平常看到的HANDLE,叫进程句柄。。。 OS完成加载后,FS段寄存器指向当前的TEB结构,具体TEB结构如下: kd> dt _teb nt!_TEB + 0x000 NtTib : _NT_TIB + 0x01c EnvironmentPointer : Ptr32 Void + 0x020 ClientId : _CLIENT_ID :当前进程ID + 0x028 ActiveRpcHandle : Ptr32 Void + 0x02c ThreadLocalStoragePointer : Ptr32 Void + 0x030 ProcessEnvironmentBlock : Ptr32 _PEB 当前进程的PEB指针 + 0x034 LastErrorValue : Uint4B + 0x038 CountOfOwnedCriticalSections : Uint4B + 0x03c CsrClientThread : Ptr32 Void + 0x040 Win32ThreadInfo : Ptr32 Void + 0x044 User32Reserved : [ 26 ] Uint4B