首页 文章
  • 21 votes
     answers
     views

    何时做或不做INVLPG,MOV到CR3以最小化TLB刷新

    序幕 我是一个操作系统爱好者,我的内核运行在80486上,并且已经支持虚拟内存 . 从80386开始,英特尔的x86处理器系列及其各种克隆通过分页支持虚拟内存 . 众所周知,当 CR0 中的 PG 位置位时,处理器使用虚拟地址转换 . 然后, CR3 寄存器指向顶级页面目录,该目录是将虚拟地址映射到物理地址的2-4级页表结构的根 . 处理器不会为生成的每个虚拟地址查询这些表,而是将它们缓存在名为T...
  • 23 votes
     answers
     views

    处理器x86 / x86_64中使用物理或虚拟寻址在L1,L2和L3中进行缓存?

    处理器x86 / x86_64中使用哪种寻址在L1,L2和L3(LLC)中进行缓存 - 物理或虚拟(使用PT / PTE和TLB)以及某种方式对它有影响吗? 在这种情况下,驱动程序(内核空间)和应用程序(用户空间)之间是否存在差异? 简短回答 - 英特尔使用 virtually indexed, physically tagged (VIPT)L1缓存:What will be used for...
  • 2 votes
     answers
     views

    转储x86 CPU的TLB缓冲区的内容

    是否有可能从TLB(转换后备缓冲区,这是CPU中的特殊缓存)获取翻译列表(从虚拟页面到物理页面) . 我的意思是现代x86或x86_64;我想以编程方式完成它,而不是使用JTAG并将所有TLB条目移出 .
  • 0 votes
     answers
     views

    记忆 - 自然地址边界

    定义结构填充是根据处理器指定的内存对齐规则对齐结构的数据成员的过程 . 英特尔x86处理器的内存对齐规则是什么?据我了解,Intel-x86处理器的自然地址边界各为32位(即addressOffset%4 == 0)因此,在x86处理器中, struct mystruct_A { char a; int b; char c; }; 将被构建为, struc...
  • 25 votes
     answers
     views

    旋转指令的目的是什么(ROL,x86上的RCL)?

    我总是想知道's the purpose of the rotate instructions some CPUs have (ROL, RCL on x86, for example). What kind of software makes use of these instructions? I first thought they may be used for encryption/co...
  • 7 votes
     answers
     views

    相对于寄存器的GDB打印值

    好吧,所以基本上我想知道如何打印一个存储器地址的值,该地址与存储在GDB寄存器中的地址相差一点 . 例如,拿这个装配线: mov 0x34(%esp),%edx 根据我的理解,它在堆栈指针指向的地址之后取值52个字节,并将该值存储在edx寄存器中 . 在这种情况下,值是一个字符串,因此它将存储char * . 在edx寄存器中使用GDB内部的examine命令时: x/s $edx 它按照预期...
  • 3 votes
     answers
     views

    GCC可以使用读 - 修改 - 写指令来更新volatile变量吗?

    假设您有x86系统代码的C代码,如下所示: volatile uint32_t *reg = (volatile uint32_t *)0xCAFEBABE; // ... reg[0x10] |= 1; GCC可以在这里自由生成读 - 修改 - 写指令吗?如果是这样,将封装读取和写入函数中的volatile变量确保GCC不将访问组合到单个RMW指令中? 我知道C规范对此有意模糊 .
  • 8 votes
     answers
     views

    优化商店/构建易变的堆栈变量是否合法?

    我注意到clang和gcc在某些情况下优化了堆栈上声明的volatile struct 的构造或赋值 . 例如,以下代码: struct nonvol2 { uint32_t a, b; }; void volatile_struct2() { volatile nonvol2 temp = {1, 2}; } Compiles on clang to: volatile_s...
  • 0 votes
     answers
     views

    在MASM中将一系列小数位转换为十六进制大数

    我正在编写一堆宏来处理MASM中的大数字,我发现自己需要从一系列数字转换为数字 . 基本上,为了绕过MASM大小限制,我一直把bignums作为字符串传递 . 所以,bignum调用看起来像: MOV_BIG_NUM [eax], <1234567891011121314151617181920212223> 我有一个实现,可以处理(据我所知)在2的幂的基础中传递的字符串 . 也就是...
  • 0 votes
     answers
     views

    AND,OR或XOR汇编语言MASM X86 IRVINE

    在句子而不是代码中,我只需要一个解释 . 你如何编写命令来将大写X改为小写x
  • 23 votes
     answers
     views

    MIPS处理器:它们还在使用吗?我应该学习哪种其他架构?

    我用汇编语言为x86和x86-64编程了几个月 . 现在,我想转向一些不同类型的处理器 . MIPS,SPARC,PowerPC,Itanium,ARM这些我发现ARM正在使用 widely . 但是,我看到教程和书籍的书籍比其他所有架构更能讲授MIPS . 为什么MIPS如此受欢迎? MIPS处理器是否仍在使用?我应该选择哪种架构? 我的背景: 我是电子部门的学生 . 我也是一名高级程序员 ....
  • 8 votes
     answers
     views

    LEA指令? [重复]

    这个问题在这里已有答案: What's the purpose of the LEA instruction? 15个答案 Using LEA on values that aren't addresses / pointers? 3个答案 是什么 lea (%edx,%eax,1),%eax 做?
  • 89 votes
     answers
     views

    为什么32位寄存器上的x86-64指令归零整个64位寄存器的上半部分?

    在x86-64 Tour of Intel Manuals中,我读到了 也许最令人惊讶的事实是,诸如MOV EAX,EBX之类的指令会自动将RAX寄存器的高32位归零 . 同一来源引用的英特尔文档(3.4.1.1 64位手动基本架构中的通用寄存器)告诉我们: 64位操作数在目标通用寄存器中生成64位结果 . 32位操作数生成32位结果,在目标通用寄存器中零扩展为64位结果 . 8位和16...
  • 2 votes
     answers
     views

    LEA和MOV指令比较

    Instruction 1: LEA DX, MESSAGE ; Move the address of MESSAGE in register DX Instruction 2: MOV DX, OFFSET MESSAGE ; Move the address of MESSAGE in register DX 问题: 上述说明是否相同?他们似乎工作方式相似,但我刚刚开始编程程序集,所...
  • 7 votes
     answers
     views

    x86程序集中cmove指令的用途?

    反汇编我遇到cmove指令的可执行文件 . 我已经在互联网上搜索了但是我发现它只是一个有条件的移动,如果源和目的地相等则会发生mov . 我还没有理解的是为什么我需要它,因为它不会改变操作数 . 如果有必要的话,请你用一个例子来解释我的目的 谢谢
  • 7 votes
     answers
     views

    如何在x86程序集中检查密钥状态?

    我在今年1月份将x86程序集作为业余爱好,因此我可以制作适用于旧PC 80和Tandy 1000等老式8086计算机的游戏,但我找到的书并没有完全讲授这个特定主题 . 虽然有些dos和bios中断了这项工作,但它们远非完美 . 我的主要问题是在不停止程序的情况下读取按键的键盘状态 . 我发现了一些方法,但它们非常有限 . INT 21h,AH 0Ch读取最后按下的键,但采用文本编辑方式 . 它不...
  • 0 votes
     answers
     views

    如何屏蔽/阻止某些IRQ

    仍在使用x86 NASM组装操作系统 . 关注我最后一个问题(CLI and STI are not working): 在我意识到CLI和STI指令正确关闭所有中断之后,我也很快意识到系统定时器和RTC时钟本身就是中断(参见Wikipedia - IRQ : x86 IRQs : Master PIC) . 这就是为什么时钟不起作用的原因 - 它将等待并等待(并等待)永远,直到系统计时器开始更新...
  • 1 votes
     answers
     views

    单词大小和它的指示

    请参阅下面有关各种指令集架构中字大小的问题,以及它与汇编语言的关系 . 感谢您的帮助 . 首先是一些事实(如果有任何错误,请纠正我) . 处理器体系结构的字大小表示 (EDIT: Some of these were wrong, please see Seva's post below) : 每个寄存器的最大大小 每个内存地址的最大大小(可以寻址的内存量) CPU可以在单个指令中处理...
  • 2 votes
     answers
     views

    汇编调用映射到错误的地址

    在切换到保护模式后,我试图从我的引导程序跳转到我加载的内核 . 内核加载正常并且位于正确的位置,但是当加载器的第二阶段调用内核的主函数时,它会调用错误的地址 . 这是加载器的第二阶段( loader.asm ): global load_kern extern main [bits 32] load_kern: call main cli hlt 然后我组装并将其...
  • 6 votes
     answers
     views

    通过USB驱动器启动的自定义引导加载程序在某些计算机上产生错误的输出

    我对汇编很新,但是我试图学习如何编写将作为引导加载程序代码运行的汇编代码;所以独立于任何其他操作系统,如Linux或Windows . 在阅读this page和其他一些x86指令集列表之后,我想出了一些汇编代码,它应该在屏幕上打印10个A然后是1个B. BITS 16 start: mov ax, 07C0h ; Set up 4K stack space after th...
  • 4 votes
     answers
     views

    建议使用简单的x86仿真器和操作系统

    作为个人学习项目,我想将现有的x86模拟器库移植到JavaScript,然后在它上面运行一个非常简单的操作系统 . 我对库的唯一要求是它应该用C \ C编写,因为我想使用emscripten和asm.js将源文件编译成JavaScript . 该库至少应该能够解释x86操作码; JavaScript的特定环境细节(内存,GUI,中断等)我可以自己实现 . 操作系统没有任何要求,只要它足够简单并且可...
  • 0 votes
     answers
     views

    CPU x86 - 外部中断调用异常处理程序

    如果我错了,请纠正我 . 在x86架构中,有256个中断向量 . 前32个是异常/内部中断/同步中断 . 如果外部设备提供低于33的中断向量矢量会发生什么?还是不可能发生?如果不是这样,为什么?
  • 0 votes
     answers
     views

    汇编获取实际变量地址?

    我正在开发x86程序集中的操作系统(使用NASM)并遇到一个我似乎无法解决的烦人问题 . 好吧,让我说我把我的程序加载到地址0xFF(我没有加载它,只是一个例子)我有一个变量,在我的可执行文件中的地址0xC . 现在我使用了org指令并将变量移动到eax中 . 现在变量的值将是0xC而不是0xFF 0xC . 有没有办法在内存中获取实际值,还是每次都需要添加偏移量?
  • 1 votes
     answers
     views

    记忆恢复汇编语言

    我是汇编语言的初学者,直到现在我理解很多东西,但很多天我陷入了一个区域,这让我感到困惑,最糟糕的是,通过互联网访问的很多页面,信息再次被扭曲,这部分是 Addressing Modes 具体为 memory refrence 所以例如在Addressing Modes in Assembly Language (IA-32 NASM)中 两条说明似乎相同,但评论不同 mov esi, var ...
  • 0 votes
     answers
     views

    确定NASM何时可以推断出mov操作的大小

    有些东西让我在x86程序集中混淆了一段时间,它是NASM何时/何时可以推断出操作的大小,这是一个例子: mov ebx, [eax] 这里我们将存储在eax中保存的地址的4个字节移动到ebx中 . 当寄存器为32位时,操作的大小为4个字节 . 但是,此操作不会被推断并抛出编译错误: mov [eax], 123456 当然解决方案是这样的: mov dword [eax], 123456 这...
  • 3 votes
     answers
     views

    为什么在向内存地址的值添加立即值时需要消除歧义

    Explains除非我们在向存储器地址存储的值添加立即值时指定大小运算符(例如字节或双字),否则NASM将返回错误消息 . section .data ; Section containing initialized data memory_address: db "PIPPACHIP" section .text ; Sec...
  • 6 votes
     answers
     views

    如何强制NASM将[1 rax * 2]编码为disp32索引* 2而不是disp8基本索引?

    为了有效地做到x = x*10 + 1,它可能是最佳使用方式 lea eax, [rax + rax*4] ; x*=5 lea eax, [1 + rax*2] ; x = x*2 + 1 3-component LEA has higher latency关于现代英特尔CPU,例如3个周期与Sandybridge系列的1个周期相比,所以 disp32 + index2 i...
  • 1 votes
     answers
     views

    软件生成的中断和软件生成的异常之间有什么区别?

    我正在阅读英特尔手册3A第6章中断和异常处理 . 中断和异常分别有3个来源 . 对于软件生成的中断,它说: INT n指令允许通过提供中断向量编号作为操作数从软件内生成中断 . 例如,INT 35指令强制对中断35的中断处理程序进行隐式调用 . 任何0到255的中断向量都可以用作该指令中的参数 . 但是,如果使用处理器的预定义NMI向量,则处理器的响应将与以正常方式生成的NMI中断的响应不同 ....
  • 1 votes
     answers
     views

    在可编程间隔定时器(8254)上的计数器到期之前重新启动计数器

    我正在用C和汇编编写一个抢占式内核 . 我一直在通过PIT和PIC查看并设置定时器中断,但有一件事我完全无法找到答案 . 我们已经启动8254芯片在模式2中对计数器0进行计数 . 我们将其设置为每10 ms在PIC上的IR0上发出一个中断 . 之后,我们在PIC上启用IR0,事情按预期工作 . 但是,假设在某些条件下,我们想要通过为它提供一个新值来改变PIT触发的时间 . 或者只是重启计数器mid...
  • 2 votes
     answers
     views

    集成GbE控制器的PCIe传统中断

    我正在为Autosar的GbE Controller编写以太网驱动程序,这是一个基于intel x86平台的pcie设备(20),到目前为止,我已经能够为定时器和GPIO中断配置IOAPIC,但我无法在IOAPIC上接收PCIe传统中断 . 我已经验证了以下配置 用于验证传统中断的PCIe配置空间在命令寄存器中启用(偏移量0x4) 已验证以太网控制器通过配置空间(偏移量0x6)中的状态寄存...

热门问题