如何从程序访问控制寄存器cr0、cr2、cr3?出现分段错误

2024-03-15

我编写了一个程序,尝试读取和写入控制寄存器。

程序编译得很好,但是当内联汇编即将执行时,它会产生分段错误。

Code:

void instructions(int val)
{
    int i;
    int value;
    for(i = 0; i < val; i++)
         __asm__("mov %cr0, %eax");
}

我使用GDB并单步执行每一条装配线,它在mov %cr0,%eax发生分段错误。

谁知道出了什么问题吗?


引用自英特尔® 64 和 IA-32 架构软件开发人员手册 3-650 卷。 2A http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html关于移入和移出控制寄存器:

该指令仅当当前特权级为0时才能执行。

这意味着该指令只能在内核模式下执行。

记录 cr0、cr2 和 cr3 内容的最小内核模块可能如下所示(32 位代码路径未经测试):

/* hello.c */
#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void)
{
#ifdef __x86_64__
    u64 cr0, cr2, cr3;
    __asm__ __volatile__ (
        "mov %%cr0, %%rax\n\t"
        "mov %%eax, %0\n\t"
        "mov %%cr2, %%rax\n\t"
        "mov %%eax, %1\n\t"
        "mov %%cr3, %%rax\n\t"
        "mov %%eax, %2\n\t"
    : "=m" (cr0), "=m" (cr2), "=m" (cr3)
    : /* no input */
    : "%rax"
    );
#elif defined(__i386__)
    u32 cr0, cr2, cr3;
    __asm__ __volatile__ (
        "mov %%cr0, %%eax\n\t"
        "mov %%eax, %0\n\t"
        "mov %%cr2, %%eax\n\t"
        "mov %%eax, %1\n\t"
        "mov %%cr3, %%eax\n\t"
        "mov %%eax, %2\n\t"
    : "=m" (cr0), "=m" (cr2), "=m" (cr3)
    : /* no input */
    : "%eax"
    );
#endif
    printk(KERN_INFO "cr0 = 0x%8.8X\n", cr0);
    printk(KERN_INFO "cr2 = 0x%8.8X\n", cr2);
    printk(KERN_INFO "cr3 = 0x%8.8X\n", cr3);
    return 0;
}

void cleanup_module(void)
{
}

 

# Makefile

obj-m += hello.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

test: all
    sudo insmod ./hello.ko
    sudo rmmod hello
    dmesg | tail
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从程序访问控制寄存器cr0、cr2、cr3?出现分段错误 的相关文章

  • 如何在 GCC x86 中使用 RDTSC 计算时钟周期? [复制]

    这个问题在这里已经有答案了 使用 Visual Studio 我可以从处理器读取时钟周期计数 如下所示 我如何对 GCC 做同样的事情 ifdef MSC VER Compiler Microsoft Visual Studio ifdef
  • 如何在 gcc 内联汇编中声明和初始化局部变量而不使用扩展内联 asm?

    我知道这是一个非常基本的问题 但我真的很困惑 事实上我绝对是 GCC 语法的新手 我想要拥有局部变量 带有标签的堆栈地址 而不使用扩展内联汇编 类似 Intel 语法中的以下代码 DATA1 DB 100 MOV AL DATA1 我猜这是
  • 将 GCC 内联汇编与采用立即值的指令结合使用

    问题 我正在为 ARM Cortex M3 处理器开发定制操作系统 为了与我的内核交互 用户线程必须生成 SuperVisor Call SVC 指令 以前称为 SWI 用于软件中断 该指令在ARM ARM中的定义是 这意味着该指令需要即时
  • FASM 是否使用 Intel 语法?

    我尝试在 FASM 中编译以下代码 mov DWORD PTR ebp 4 1234567 它给了我一个 无效表达式 错误 但是以下代码有效 mov DWORD ebp 4 1234567 那么 FASM 是否使用 Intel 语法 我假设
  • 从地址获取上一条指令的开头

    我们在缓冲区中查看 x86 操作码 标记当前指针 68 0F 00 6A 90 00 找到下一条指令的开始很容易 因为电流的大小是可以确定的 但是你如何才能准确地猜出前一个的开始呢 68 0F 00 6A 90 总共 5 个字节 结束于 0
  • 源操作数和目标操作数是否需要相同大小?

    我刚刚尝试了这个问题 要求你解释一下代码行有什么问题 movl eax rdx 解决方案表明目标操作数的大小错误 仅当从较大尺寸变为较小尺寸时才 非法 还是源操作数和目标操作数对于所有指令 或至少 mov 类类型 必须具有相同的尺寸 是的
  • CPU寄存器和CPU缓存有什么不同吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 CPU寄存器和CPU缓存有什么不同吗 是的 CPU寄存器只是少量的数据存储 方便CPU的一些操作 CPU缓存 它是一种高速易失性存储器 尺寸较大 有助
  • 比较堆栈中的两个值? [复制]

    这个问题在这里已经有答案了 我卡住了 在我的汇编代码中 我想比较两个值 堆 x86 语法 AT T cmpl 4 ebp 4 ebp 错误 cmp 的内存引用太多 我认为不可能根据乘数和 ebp 来比较两个值 有什么建议 您可以使用 CMP
  • 使用指针作为函数参数时的段前缀

    我有一个汇编 c 问题 我刚刚读到了有关段前缀的内容 例如 ds varX 等 前缀对于逻辑地址的计算很重要 我也读到 默认值是 ds 一旦您使用 ebp 寄存器来计算地址 就会使用 ss 对于代码 cs 是默认值 这一切都是有道理的 现在
  • 如何使用 Intel 语法内联汇编在 GCC 中设置变量?

    为什么这个代码没有设置temp到 1 我实际上该如何做到这一点 int temp asm intel syntax mov 0 eax mov eax 1 att syntax r 1 r temp eax printf d n temp
  • x86 汇编中 cmove 指令的用途?

    反汇编可执行文件时我遇到了cmove操作说明 我已经在互联网上搜索过 但我只发现这是一个有条件的移动 如果源和目的地相等mov发生 我还不明白为什么我需要它 因为它不会改变操作数 它的目的是什么 The CMOVcc指令不比较源和目标 它们
  • 内联汇编中的内存偏移

    在 A64 汇编器中 有不同的方法来指定地址 base 0 Simple register exclusive Immediate Offset base imm Offset Immediate Offset base Xm LSL im
  • 现代 x86 硬件不能将单个字节存储到内存中吗?

    说到 C 的并发内存模型 Stroustrup 的C 编程语言 第 4 版 第 1 节 41 2 1 说 就像大多数现代硬件一样 机器无法加载或存储小于单词的任何内容 然而 我的 x86 处理器已经有几年的历史了 它可以并且确实存储小于单词
  • g++ 内联汇编括号中不匹配

    g 向我抱怨以下代码中缺少括号 1 2 3 v v v asm volatile inb 1 0 a result Nd portnumber 1 2 3 正如您所看到的 括号是匹配
  • elf .rel.text 部分中 R_386_32/R_386_PC32 的含义

    为了理解重定位的概念 我编写了一个简单的 chk c 程序 如下所示 1 include
  • 如何获取 VESA BIOS 信息

    我正在跟踪Phil Opp 教程 https os phil opp com 关于用 Rust 编写一个操作系统 在稍微尝试了一下之后 我想在屏幕上显示真实的图形 我发现我应该从使用带有 VESA 的线性帧缓冲区开始 我在 osdev or
  • 使用 gdb 调试反汇编库

    在Linux和Mac OS X中可以使用strapi和next来调试应用程序而无需调试信息 在 Mac OS X 上 gdb 显示在库内部调用的函数 尽管有时会在每个 stepi 指令中推进多个汇编程序指令 在 Linux 上 当我进入动态
  • orpd等SSE2指令有什么意义?

    The orpd指令是 压缩双精度浮点值的按位逻辑或 这不是做完 全相同的事情吗por 按位逻辑或 如果是这样 拥有它还有什么意义呢 请记住 SSE1orps https www felixcloutier com x86 orps首先 实
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • “rep stos”x86 汇编指令序列有什么作用?

    我最近偶然发现了以下汇编指令序列 rep stos dword ptr edi For ecx重复 存储内容eax到哪里edi指向 递增或递减edi 取决于方向标志 每次 4 个字节 通常 这用于memset型操作 通常 该指令简单地写成r

随机推荐

  • Sql连接查询

    我有三张桌子 tblLink LinkId LinkName GroupId SubGroupId GroupId 和 SubGroupId 是 tblGroup 和 tblSubGroup 中的外键tblGroup 组ID 组名称 tbl
  • 在 Python 中查看 Popen 管道流

    背景 Linux 上的 Python 2 6 6 DNA 序列分析流程的第一部分 我想从已安装的远程存储 LAN 读取可能经过 gzip 压缩的文件 以及它是否经过 gzip 压缩 gunzip 将其压缩到流中 即使用gunzip FILE
  • Mysql UPDATE ON DUPLICATE KEY 仅插入

    我正在尝试运行一个查询 以便它将插入或更新重复项 我正在为重复项使用唯一索引 但我似乎无法让它工作 它还增加了新记录 希望一些新的目光能够指出我的问题 谢谢 这是我的架构 CREATE TABLE IF NOT EXISTS pricing
  • gmtime_r 和 gmtime_s 之间的区别

    这两个函数有什么区别呢 我正在使用 MinGW 4 8 0 我知道gmtime r是线程安全的 但如果从同一线程多次调用则不安全 但我不明白gmtime s 不同之处在于gmtime r 3 http linux die net man 3
  • 使用 Kotlin 关闭/隐藏 Android 软键盘

    我正在尝试用 Kotlin 编写一个简单的 Android 应用程序 我的布局中有一个 EditText 和一个按钮 在编辑字段中写入并单击按钮后 我想隐藏虚拟键盘 有一个热门问题 关闭 隐藏 Android 软键盘 https stack
  • Rails Paperclip:更新与 update_attributes

    当我尝试通过回形针 gem 为我的用户模型 在头像属性下 上传图像时 我意识到一些非常奇怪的事情 由于某种原因 User update 和 user update attributes 的行为有所不同 有谁知道为什么会这样 using us
  • find_packages 找不到我的 Python 文件

    我有一个像这样的目录树 dir A init py something py I used find packages on dir A并期望它能找到something py 但是 它返回一个空列表 我该如何制作find packages
  • 如何在 Seaborn 图中设置色调顺序

    我有一个名为的 Pandas 数据集titanic我正在使用以下代码绘制 Seaborn 官方文档中所述的条形图 import seaborn as sns titanic sns load dataset titanic sns catp
  • 如何使用单个文本框根据任何列数据过滤行

    我在用ng table http bazalt cms com ng table 我尝试使用中给出的过滤器example http bazalt cms com ng table example 4 但为了过滤每一列 我需要有单独的文本框
  • Rails - 对象在视图中可用,但对象的属性不可用?

    我遇到一个不寻常的问题 我可以访问对象 但不能访问视图中的属性 非常感谢任何帮助 指导 这是我的模型 app models team member rb class TeamMember lt ApplicationRecord attr
  • IntelliJ 2017.2 卡在“新项目”>“Maven”的“正在加载原型列表”上

    选择时Create New Project启动 IntelliJ 2017 2 后的选项 我在Maven标签 写着 正在加载原型列表 有什么办法可以得到 Maven 原型吗 我刚刚在 2017 年 2 月 3 日 刚刚更新 在 Fedora
  • 隐藏特定内容页的状态栏

    我正在创建一个应用程序 我想在特定页面上隐藏状态栏 在我的示例中 它是一个内容页面 我发现了几个使用 info plist 来隐藏它的示例 但我只想将其用于特定页面 这可能吗 使用 NavigationPage SetHasNavigati
  • 如何将 androidx.recyclerview.widget.RecyclerView 与 tools:listitem 一起使用?

    如何使用androidx recyclerview widget RecyclerView with tools listitem 我有这样的布局
  • 检查 html5 视频是否准备就绪

    如果 HTML5 视频准备好播放 是否会触发 JavaScript 事件 刚刚遇到这个问题 虽然它有点旧 但我将其发布给未来的读者 他们像我一样 可能来自谷歌 截至今天 这是 html5 媒体的事件列表 根据 W3C onabort 中止时
  • 提供的实体包含具有无效值的关系

    当我将应用程序上传到 App Store Connect 时出现以下错误 The provided entity includes a relationship with an invalid value is not a valid ID
  • C++ 错误:“内联”只能出现在函数上

    我正在尝试编译VCMI http forum vcmi eu portal php在 OS X 10 7 下使用 clang 我配置了项目CXX clang 因为苹果的 gcc 似乎不识别 required std c 0x flag 我已
  • 我需要在 Python 中安全地存储用户名和密码,我有哪些选择? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在编写一个小型 Python 脚本 它将使用用户名和密码组合定期从第三方服务中提取信息 我不需要创建 100 防弹的东西 100 真的存在吗
  • 如何确保一个函数只被调用一次

    假设我有一个名为 caller 的函数 它将调用名为 callee 的函数 void caller callee 现在 调用者可能在应用程序中被多次调用 而您希望确保被调用者仅被调用一次 一种延迟初始化 您可以使用标志来实现它 void c
  • 如何获取作者的 Gravatar url?

    我希望作者的图片出现在 single php 页面的某些部分 并且我使用了在 WordPress Stack Exchange 上找到的代码来获取作者 Gravatar 的 URL 以便将该图片用作分区 这段代码在functions php
  • 如何从程序访问控制寄存器cr0、cr2、cr3?出现分段错误

    我编写了一个程序 尝试读取和写入控制寄存器 程序编译得很好 但是当内联汇编即将执行时 它会产生分段错误 Code void instructions int val int i int value for i 0 i lt val i as