标签: low-level

RISC-V:切换到管理模式时出现非法指令异常

当设置mstatus.mpp字段切换到主管模式时,我在调用 时遇到非法指令异常mretqemu-system-riscv64我正在6.1版本的系统中对此进行测试riscv64-softmmu。我最近从 QEMU 5.0 升级到 6.1。在此升级之前,我的代码可以工作。我在变更日志中看不到任何相关内容。我假设我的代码中存在新版本根本无法容忍的问题。

下面是一个程序集片段,显示了正在发生的情况(删除了不相关的启动代码):

.setup_hart:
    csrw satp, zero                                # Disable address translation.

    li   t0, (1 << 11)                             # Supervisor mode.
    csrw mstatus, t0

    csrw mie, zero                                 # Disable interrupts.

    la  sp, __stack_top                            # Setup stack pointer.

    la   t0, asm_trap_vector
    csrw mtvec, t0

    la   t0, kernel_main                           # Jump to kernel_main on trap return.
    csrw mepc, t0

    la   ra, cpu_halt                              # If we return from main, halt.
    mret
Run Code Online (Sandbox Code Playgroud)

如果我将该mstatus.mpp字段设置为机器模式,我就可以毫无问题地 …

qemu low-level riscv

4
推荐指数
1
解决办法
1813
查看次数

上下文切换在Linux中需要多长时间?

我很好奇在Linux中更改上下文需要多少周期.我特意使用E5405 Xeon(x64),但我也很想看看它与其他平台的对比情况.

linux performance multithreading low-level

3
推荐指数
1
解决办法
5464
查看次数

学习MIPS作为第二种汇编语言?

我知道x86汇编(并且曾与FPGA等合作过),从未为RISC写过,我有机会参加MIPS课程,但我很忙,所以我的问题是,我知道每件事我学到的东西在某种程度上是有益的,但实际上,有多大益处?(我是一个低级别的热情,但这是必须的吗?)

(我知道mips是重要的,但我觉得我的情况略有不同,因为我已经知道某种程度的装配)

谢谢.

mips low-level

3
推荐指数
1
解决办法
1592
查看次数

文件如何在低级别复制?

我有一个小问题:

例如,我正在使用.NET Framework中的System.IO.File.Copy()方法.此方法是WinAPI的CopyFile()函数的托管包装器.但CopyFile函数如何工作?它与HDD的固件交互,或者可能通过Assembler或其他一些其他操作执行其他操作......

从最高级别到最低级别看起来如何?

hardware winapi low-level file-copying

3
推荐指数
2
解决办法
993
查看次数

你如何直接与汇编语言的硬件接口?

所以,我决定今年夏天学习80x86的汇编语言.我收集了四本关于装配的书.到目前为止,我已经阅读了前两个,虽然我已经读了第三个,但我认为我理解了所有已呈现的内容.我已经写了一些Hello World程序以及书中的其他一些小练习,我觉得这种语言非常舒服.然而,到目前为止,还有一件事没有涉及到这本书,而且这是我最感兴趣的事情.也就是说,你如何直接从汇编语言处理硬件?到目前为止,作者已经使用了系统调用,跳转到内存中的特定函数和中断,但这些方法依赖于系统中已存在的软件.

我正在使用NASM编写我的程序并将它们加载到旧的Pentium I计算机中.我现在不使用任何操作系统,只是BIOS.我想我正在尝试做的是编写我的小型操作系统,它是自主的,不依赖于BIOS(初始启动除外).谁能帮我?

assembly operating-system bios nasm low-level

3
推荐指数
1
解决办法
3945
查看次数

什么阻止用户空间程序切换到更高级别?

上下文:
根据此描述,用户空间程序不能执行处理器提供的所有操作.上面链接中的描述说cpu中有不同的操作级别.

问题:
如何防止用户空间代码被cpu在特权级别执行?在不使用系统调用的情况下使用汇编语言切换到更高级别是不是可能?

我很确定它不是,但我不明白为什么.任何人都可以指出这一点或指向一些处理这个主题的资源?

c c++ assembly kernel low-level

3
推荐指数
1
解决办法
126
查看次数

强制执行内存级别

来自C的Iirc,您可以按照以下方式发表声明:

char* str = "1234";
int nonStr = *((int*)str);
Run Code Online (Sandbox Code Playgroud)

(我故意将字符串设为4个字符,因此在平均情况下它将具有与整数相同的字节数.)这将取消引用存储的内存,str如果是整数522207554则给出值(如果我进行了转换)对).

有没有办法在C#中做同样的事情?我知道这是一个低级别的内存操作,通常对C#程序员来说是幸福的,我只是在做一个教学练习.

c# memory casting low-level

3
推荐指数
1
解决办法
1033
查看次数

哪种类型的汇编程序跳转指令最有用?

我正在开发一个业余爱好项目,围绕它设计一个小型CPU和一个微型计算机系统.我有一个基本的数据流,并做了一些关于单词大小和ISA中的指令数量的决定.我决定使用一个带有4位操作码字段的16位字.这允许16条指令.

编辑:一些额外的信息

指令字16位格式如下:OOOOPPPPPPPPPPPP

O位是操作码,P位是有效载荷,地址/数据.这允许4096千字节的地址空间和16个操作码.对16个操作码的限制是一个设计决策,使硬件实现更容易.

该架构有一个累加器(A寄存器),一个B寄存器和一个堆栈指针.

/ EndEdit中

ISA具有移动和加载指令(加载/存储),基本算术和逻辑(添加,子,NAND),基本堆栈功能(推送和弹出).还有一个子程序(无条件)跳转/返回指令对.尽管如此,仍然缺少一件:条件跳跃.

返回函数可以与无条件跳转相同,所以我需要的是某种测试和测试条件下的跳转.

所以,这是我的问题:什么是最有用的测试/条件对?

在操作码表中有一个测试和一个条件跳转的空间,或者如果你以某种方式在其他操作中包括条件测试,如ADD或SUB,则有两个条件跳转.

跳过溢出,而不是零,零,携带,不携带是我的一些想法,但我不确定哪一个会更有用.任何建议表示赞赏.

assembly cpu-architecture low-level

3
推荐指数
1
解决办法
405
查看次数

我如何计算在Java中执行某些行所需的时间?

假设我有一些代码,我想最大限度地优化它,无视可读性,可维护性等.

为此目的,无论如何要确定每个基本动作花费多少时间?我想这可能与CPU有关,但我不确定.

我的意思是像骑自行车for,分配a=24,数学运算2+25等等.

java performance low-level

3
推荐指数
1
解决办法
60
查看次数

如何仅在C中列出第一级目录?

在一个终端我可以打电话ls -d */.现在我想要一个程序为我这样做,像这样:

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>

int main( void )
{
    int status;

    char *args[] = { "/bin/ls", "-l", NULL };

    if ( fork() == 0 )
        execv( args[0], args );
    else
        wait( &status ); 

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这将是ls -l一切.但是,当我尝试时:

char *args[] = { "/bin/ls", "-d", "*/",  NULL };
Run Code Online (Sandbox Code Playgroud)

我会得到一个运行时错误:

ls:*/:没有这样的文件或目录

c linux fork low-level systems-programming

3
推荐指数
2
解决办法
2389
查看次数