ASM

杂记:GCC内联汇编

此生再无相见时 提交于 2020-12-13 14:00:58
Author: retrhelo Date: 2020.12.13 转载请注明出处 注意,本文仅基于GCC编译器,不确认是否在其他编译器环境下有效。 1. 使用asm()语句在C语言中嵌入汇编代码 我们可以使用 asm() 语句或是 __asm__() 语句来嵌入汇编代码。通常来说这两者的用法是相同的。其使用方法如下所示 asm ( "assembly code" : output operands /* optional */ : input operands /* optional */ : list of clobbered registers /* optional */ ); 1.1 Assembly Code(汇编代码) 这一部分用于填入所要执行的汇编代码,通常按照C风格字符串的格式填入,在不同的语句之间要填入 \n 作为换行符。 1.2 Outputs Operands(输出操作数) 这一部分视具体情况而言是可选的。通常使用形如 "=r" (var) 的形式编写代码,以将寄存器和变量联系起来。其中, r 可以使用具体的字符来指定所使用的寄存器,其规则如下表所示 | r | Registers | | :------------: | :------------: | | a | %eax, %ax, %al | | b | %ebx, %bx, %bl | | c |

《ucore lab1 exercise2》实验报告

喜欢而已 提交于 2020-12-12 20:40:20
资源 ucore在线实验指导书 我的ucore实验代码 题目:使用qemu执行并调试lab1中的软件 为了熟悉使用qemu和gdb进行的调试工作,我们进行如下的小练习: 从CPU加电后执行的第一条指令开始,单步跟踪BIOS的执行。 在初始化位置0x7c00设置实地址断点,测试断点正常。 从0x7c00开始跟踪代码运行,将单步跟踪反汇编得到的代码与bootasm.S和bootblock.asm进行比较。 自己找一个bootloader或内核中的代码位置,设置断点并进行测试 解答 问题1:从CPU加电后执行的第一条指令开始,单步跟踪BIOS的执行 tools/gdbinit的内容如下。可见,这里是对内核代码进行调试,并且将断点设置在内核代码的入口地址,即kern_init函数 file bin/kernel target remote :1234 break kern_init continue 为了从CPU加电后执行的第一条指令开始调试,需要修改tools/gdbinit的内容为: set architecture i8086 file bin/bootblock target remote :1234 break start continue 执行 make debug ,这时会弹出一个QEMU窗口和一个Terminal窗口,这是正常的

【鼠年大吉】【设计模式自习室】详解代理模式

a 夏天 提交于 2020-12-11 07:49:39
前 言 马上就要迎接新年了,在这里祝爱学习的你们,鼠年大吉,新的一年学习进步,升职加薪。 新春佳节期间,多花点时间陪陪家人朋友同学~不用过度沉迷学习,哈哈~ 《设计模式自习室》系列,顾名思义,本系列文章带你温习常见的设计模式。主要内容有: 该模式的 介绍 ,包括: 引子、意图(大白话解释) 类图、时序图(理论规范) 该模式的 代码示例 :熟悉该模式的代码长什么样子 该模式的 优缺点 :模式不是万金油,不可以滥用模式 该模式的 应用案例 :了解它在哪些重要的源码中被使用 该系列会逐步更新于我的博客和公众号(博客见文章底部),也希望各位观众老爷能够关注我的个人公众号: 后端技术漫谈 ,不会错过精彩好看的文章。 系列文章回顾 【设计模式自习室】开篇: 为什么我们要用设计模式? 【设计模式自习室】建造者模式 【设计模式自习室】原型模式 【设计模式自习室】透彻理解单例模式 【设计模式自习室】理解工厂模式的三种形式 【设计模式自习室】适配器模式 【设计模式自习室】幕后英雄:装饰模式 【设计模式自习室】桥接模式 Bridge Pattern:处理多维度变化 【设计模式自习室】门面模式 Facade Patter 【设计模式自习室】享元模式:减少对象数量 结构型——代理模式 Proxy Pattern 引子 通俗的来讲,代理模式就是我们生活中常见的 中介 。在某些情况下

oslab oranges 一个操作系统的实现 实验一

十年热恋 提交于 2020-12-06 18:48:50
实验目的: 搭建基本实验环境,熟悉基本开发与调试工具 对应章节:第一、二章 实验内容: 1.认真阅读章节资料 2. 在实验机上安装 virtualbox,并安装ubuntu 3. 安装 ubuntu开发环境,32位环境 4. 下载 bochs源码,编译并安装bochs环境 5. 使用 bochs自带工具bximage创建虚拟软驱 6. 阅读、编译 boot.asm,并反汇编阅读 7. 修改 bochsrc,运行并调试你的第一个程序: 删除 AA55,观察程序效果,找出原因 修改程序中输出为,一个任意长度的打印字符串,调试程序 把生成的可执行文件反汇编,并设置断点进行调试,打印过程 回答:为什么要对段寄存器进行赋值 回答:如何在该程序中调用系统中断 实验环境: VMwareWorkstationPro 15.5.0 Ubuntu 12.04.5 desktop i386 32位 bochs 2.6.9 关键技术: Bochs的使用,主要在于反汇编与单步调试 汇编代码的理解 Makefile的使用 实验步骤: 1. 在实验机上安装 virtualbox,并安装ubuntu开发环境,32位环境 在官网下载VMware Workstation Pro 15.5.0并安装 在http://mirrors.163.com/ubuntu-releases/, 下载: 32位Ubuntu,12

自制操作系统Antz(1)——Boot Sector

孤街浪徒 提交于 2020-12-04 19:08:11
0. 引子    最近在看操作系统底层方面的东西,最开始的为什么是07c00h这个问题就让我对操作系统有了很大的兴趣。所以准备在看书之余顺便写一个操作系统(Anz)。 至于为什么这个系统会被叫做Antz,可以参考Antz Uhl Kone(某个日漫男主的名字), 日语为アインズ·ウール·ゴウン , 与之对应的还有接下来准备写的自制脚本语言AntzScript,因为准备是用Java实现解释器,所以如何把AntzScript运行在Antz上是一个很大问题(其实问题就是引入Java)。   Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html   Linux内核源码分析地址: https://www.cnblogs.com/LexMoon/category/1267413.html 1.关于Boot Sector   引导扇区(Boot Sector) 通常指设备的第一个扇区,用于加载并转让处理器控制权给操作系统。    1.1 主引导扇区      硬盘的0柱面、0磁头、1扇区称为 主引导扇区 ,也叫 主引导记录 MBR ,该记录占用512个字节,它用于硬盘启动时将系统控制权转给用户指定的、在分区表中登记了某个 操作系统 分区。MBR的内容是在硬盘分区时由分区软件写入该扇区的,MBR不属于任何一个操作系统

HCIP-H12-221练习题

匆匆过客 提交于 2020-12-03 14:33:44
HCIP-H12-221练习题 习题1 由于属性AS-PATH不能在AS内起作用,所以规定BGP路由器不会宣告任何从IBGP对等体来的更新信息给其IBGP对等体。 A. 正确 B. 错误 答案: A 习题2 通过重发布命令注入BGP的路由,其Origin属性为Incomplete。 A. 正确 B. 错误 答案: A 习题3 自治系统AS(AUTONOMOUS SYSTEM)是指用户自主定义的,使用统一选路策略的一组路由器的集合。 A. 正确 B. 错误 答案: B 习题4 OSPF邻居的主从关系是通过DD报文进行协商的。 A. 正确 B. 错误 答案: A 习题5 IGMPv1仅包含两种报文类型:成员关系查询和成员关系报告。 A. 正确 B. 错误 答案: A 习题6 两台路由器通过多条物理链路建立一个逻辑BGP对等体时,必须使用peer connect-interface命令。 A. 正确 B. 错误 答案: A 习题7 对于链路状态路由协议,在入方向过滤路由实际上可以阻断链路状态信息的传递,过滤的效果是路由不能被加到本地路由表中,并且它的邻居也不能收到完整的路由状态信息。 A. 正确 B. 错误 答案: B 习题8 OSPF路由协议中,区域内路由的计算涉及的LSA. 类型只有Router-LSA、Network-LSA和Summary LSA。 A. 正确 B. 错误 答案:

Linux并发与同步专题 (2)spinlock

不羁的心 提交于 2020-12-03 11:53:51
关键词: wfe、FIFO ticket-based、spin_lock/spin_trylock/spin_unlock、spin_lock_irq/spin_lock_bh/spin_lock_irqsave 。 《 Linux并发与同步专题 (1)原子操作和内存屏障 》 《 Linux并发与同步专题 (2)spinlock 》 《 Linux并发与同步专题 (3) 信号量 》 《 Linux并发与同步专题 (4) Mutex互斥量 》 《 Linux并发与同步专题 (5) 读写锁 》 《 Linux并发与同步专题 (6) RCU 》 《 Linux并发与同步专题 (7) 内存管理中的锁 》 《 Linux并发与同步专题 (8) 最新更新与展望 》 spinlock同一时刻只能被一个内核代码路径持有,如果有另外一个内核代码路径试图获取一个已经被持有的spinlock,那么该内核代码路径需要一直自旋忙等待,直到锁持有者释放了该锁。 spinlock锁的特性如下: spinlock属于忙等待机制,当无法获取spinlock锁时会不断尝试,直到获取锁为止。 同一时刻只能有一个内核代码路径可以获得所。 要求spinlock锁持有者尽快完成临界区的执行任务。如果临界区执行时间过长,在锁外面忙等待的CPU比较浪费,特别是spinlock临界区里不能睡眠。

深入Linux并发同步

微笑、不失礼 提交于 2020-12-03 11:53:25
并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理多个任务的能力。并发和并行看起来很像,但实际上是有区别的,如下图(图片来源于网络): 上图的意思是,有两条在排队买咖啡的队列,并发只有一架咖啡机在处理,而并行就有两架的咖啡机在处理。咖啡机的数量越多,并行能力就越强。 可以把上面的两条队列看成两个进程,并发就是指只有单个CPU在处理,而并行就有两个CPU在处理。为了让两个进程在单核CPU中也能得到执行,一般的做法就是让每个进程交替执行一段时间,比如让每个进程固定执行 100毫秒 ,执行时间使用完后切换到其他进程执行。而并行就没有这种问题,因为有两个CPU,所以两个进程可以同时执行。如下图: 原子操作 上面介绍过,并发有可能会打断当前执行的进程,然后替切换成其他进程执行。如果有两个进程同时对一个共享变量 count 进行加一操作,由于C语言的 count++ 操作会被翻译成如下指令: mov eax , [ count ] inc eax mov [ count ], eax 那么在并发的情况下,有可能出现如下问题: 假设count变量初始值为0: 进程1执行完 mov eax, [count] 后,寄存器eax内保存了count的值0。 进程2被调度执行。 进程2执行 count++ 的所有指令,将累加后的count值1写回到内存。 进程1再次被调度执行

oslab oranges 一个操作系统的实现 实验五 让操作系统走进保护模式

本秂侑毒 提交于 2020-11-30 23:40:44
实验目的: • 如何从软盘读取并加载一个Loader程序到操作 系统,然后转交系统控制权 • 对应章节:第四章 实验内容: 1. 向软盘镜像文件写入一个你指定的文件,手 工读取在磁盘中的信息 2. 在软盘中找到指定的文件,读取其扇区信息 3. 将指定文件装入指定内存区,并执行 4. 学会在bochs中使用xxd读取反汇编信息 完成本次实验要思考的问题: 1.FAT12格式是怎样的? 2.如何读取一张软盘的信息 3.如何在软盘中找到指定的文件 4.如何在系统引导过程中,从读取并加载一个可执行文件 到内存,并转交控制权? 5.为什么需要这个Loader程序不包含dos系统调用? 关键技术: 引导扇区, loader与控制权转交。 一个操作系统从开机到开始运行,大 致经历 “引导→加载内核入内存→跳入保护模式→开始执行内核”这样一个过程。也就是说,在内核开始执行之前不但要加载内 核,而且还有准备保护模式等一系列工作,如果全都交给引导扇区来做,512字节很可能是不够用的,所以,把这个过程交给另外的模块来完成,我们把这个模块叫做Loader。引导扇区负责把Loader加载入内存并且把控制权交给它,其他工作交给 Loader来做,因为它没有512字节的限制,将会灵活得多。 在这里,为了操作方便,把软盘做成 FAT12格式,这样对Loader以及今后的Kernel(内核)的操作将会非常简单易行。

Oracle OCR的备份与恢复

[亡魂溺海] 提交于 2020-11-30 07:44:32
Oracle OCR的备份与恢复 1 BLOG文档结构图 2 前言部分 一.2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识, ~O(∩_∩)O~ : ① rac中 OCR 的简介及其作用 ② rac中 OCR 的备份和恢复 ③ rac 的健忘与脑裂 ④ grid 用户下的日志文件: $ORACLE_HOME/log 文件夹内容被删除导致集群不能启动如何恢复? (重点 ) ⑤ 如何修复 11.2 Grid 权限误操作 【( How to check and fix file permissions on Grid Infrastructure environment ( 文档 ID 1931142.1) 】 ⑥ 如何修复 ASM 实例名和节点名不一致的情况【 How to Change 11.2 ASM Configuration to Match ASM Instance Name to the Node Where It Runs? (example, +ASM2 on Node2, etc) ( 文档 ID 1419424.1) 】 ⑦ permission.pl 脚本的使用 2.2 相关参考文章链接 关于物理和逻辑备份比较好的一篇文章: https://gjilevski.com/2010/12/20/backup