我只是想知道,我们可以在没有操作系统的机器上执行程序吗?
此外,我听说Linux内核是用C语言编写的,内核是在启动过程中运行的,所以我只是想知道计算机如何在没有编译的情况下理解该语言?
如何从使用 Qemu 运行的裸机程序获取 UART 输出?
这是我一直在使用的命令行调用:
qemu-system-arm -M xilinx-zynq-a9 -cpu cortex-a9 -nographic -kernel $BUILD_DIR/mm.elf -m 512M -s -S
Run Code Online (Sandbox Code Playgroud)
xilinx-zynq-a9cortex-a9-m 512M表示平台有 512 MiB RAM-s是一个快捷方式-gdb tcp::1234-S意味着启动时冻结CPU我使用的ELF文件(mm.elf)执行一个简单的矩阵乘法运算,然后打印它是成功还是失败,以及运行了多长时间。ELF 是使用 Xilinx ARM 工具链编译的。我用它来进行软件故障注入。目前我使用 GDB 来询问应该打印的变量的值。然而,由于在故障注入的情况下打印可能会出现很多问题,因此最好看看通过 UART 实际发送的内容。
这有一些我尝试过的建议,但它不适用,因为问题是关于在主机终端窗口中获取 Linux 启动消息。
这是一个不太相关的问题,因为它仍然假设用户拥有某种引导加载程序。虽然从技术上讲必须有一个引导加载程序才能运行应用程序,但 Xilinx 在boot.S等文件中提供了此系统代码,然后将其编译到 ELF 文件中,作为之前运行的代码main。
我尝试将这些添加到当前 Qemu 命令的末尾。结果遵循尝试的参数。
-serial mon:stdio
-serial null …我正在为ARM系统组装一个交叉编译单元测试装置,并在主机上运行测试qemu-system-arm.具体来说,我使用qemu来模拟Stellaris LM3S6965评估板,因为它包含像我的目标环境一样的Cortex M3处理器.qemu中的二进制运行是使用GNU Tools for ARM构建的.
没有涉及操作系统.测试套件作为裸机应用程序运行,-nographic模式为qemu .工具链和测试台本身工作正常.测试成功完成并在qemu内生成测试结果也很好.
问题在于将qemu包装在自动构建工具中(在本例中为Rake).除了键盘命令之外,我还没有找到一个好方法让qemu在测试套件运行后退出并吐出结果.这会导致构建环境挂起/依赖于用户干预.
我看起来高低,并没有找到关于如何在程序终止后完成简单退出的好资料.我确实找到了一些使用该-no-reboot选项运行qemu的建议,然后从模拟器中运行的程序触发系统重置.我试过这个.它有效......有点儿.我在main()执行后将适当的值写入模拟处理器的复位向量,这确实触发了复位.运行测试套件后qemu报告系统重置.但是,它将此报告为硬件错误,转储寄存器内容,然后退出生气(下面的错误消息).虽然这确实在测试套件运行后完成了退出,然后由于qemu退出并出现错误情况,它会中断自动构建脚本.
qemu: hardware error: System reset
Run Code Online (Sandbox Code Playgroud)
我想避免黑客将键盘命令插入到构建中以模拟用户干预.我还想避免依赖qemu退出错误状态.
我似乎接近一个干净的出口,但不是那里.搜索qemu错误消息(上面)除了切线相关的错误报告之外没有产生任何相关文档.
有没有一种机制可以让main()我在缺少的裸机程序中返回后退出qemu ?这个-no-reboot+系统重置策略会起作用吗?如果是这样,还有什么必要让qemu干净利落?
我希望知道在linux下执行程序所需的时间(以微秒为单位)(或更高的准确性).目前我正在使用该time命令,但它以最大毫秒精度给出了我.有没有办法调整time命令以提供更好的准确性或是否有其他命令相同?
我有以下代码,我试图实现一个使用BIOS函数打印字符串的函数:
int printString(char* string)
{
int i = 0;
while (*(string + i) != '\0')
{
char al = *(string + i);
char ah = 0xe;
int ax = ah * 256 + al;
interrupt(0x10,ax,0,0,0);
i++;
}
return i;
}
Run Code Online (Sandbox Code Playgroud)
函数中断在汇编中实现.它调用适当的BIOS中断,如第一个参数所给出的,其余参数分别包含ax,bx,cx和dx寄存器的内容:
.global _interrupt
_interrupt:
push bp
mov bp, sp
push si
push ds
mov ax, #0x100
mov ds, ax
mov ax, [bp + 0x4]
mov si, #intr
mov [si + 1], al
pop ds
mov ax, [bp + 0x6]
mov …Run Code Online (Sandbox Code Playgroud) 我试图让本教程按预期工作但没有成功(在bl主要指令之后出现故障).根据教程命令
(qemu) xp /1dw 0xa0000018
Run Code Online (Sandbox Code Playgroud)
应该导致打印33(但我得到0x00而不是)
a0000018: 33
Run Code Online (Sandbox Code Playgroud)
这是主调用后寄存器的内容(参见startup.s)
(qemu) info registers
R00=a000001c R01=a000001c R02=00000006 R03=00000000
R04=00000000 R05=00000005 R06=00000006 R07=00000007
R08=00000008 R09=00000009 R10=00000000 R11=a3fffffc
R12=00000000 R13=00000000 R14=0000003c R15=00000004
PSR=800001db N--- A und32
FPSCR: 00000000
Run Code Online (Sandbox Code Playgroud)
我有以下文件
main.c
startup.s
lscript.ld
Makefile
Run Code Online (Sandbox Code Playgroud)
我正在使用以下工具链
arm-2013.11-24-arm-none-eabi-i686-pc-linux-gnu
Run Code Online (Sandbox Code Playgroud)
Makefile:
SRCS := main.c startup.s
LINKER_NAME := lscript.ld
ELF_NAME := program.elf
BIN_NAME := program.bin
FLASH_NAME := flash.bin
CC := arm-none-eabi
CFLAGS := -nostdlib
OBJFLAGS ?= -DS
QEMUFLAGS := -M connex -pflash $(FLASH_NAME) -nographic -serial …Run Code Online (Sandbox Code Playgroud) 我写了一个小的16位汇编程序,它在一些内存位置写入了一些值.有没有办法可以在Linux上以32位保护模式测试它?
今天,我决定制作一个(非常)简单的操作系统。我不喜欢直接使用汇编,因为我认为它对我来说太混乱了。但是,我懂一点C,并且我渴望学习更多。我编写了一个简单的程序来打印字符串,我想将其编译为程序集。我用这个命令编译成程序集:
gcc -S foo.c
这是我的 C 代码:
#include<stdio.h>
int main() {
printf("Hi!!!");
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试运行输出文件(foo.s)时,我收到以下错误:
foo.s:1: error: parser: instruction expected
foo.s:2: warning: label alone on a line without a colon might be in error [-w+label-orphan]
foo.s:3: error: parser: instruction expected
foo.s:5: error: parser: instruction expected
foo.s:6: warning: label alone on a line without a colon might be in error [-w+label-orphan]
foo.s:7: error: parser: instruction expected
foo.s:8: error: parser: instruction expected
foo.s:11: warning: label alone on a line without a colon might …Run Code Online (Sandbox Code Playgroud) qemu ×4
arm ×3
assembly ×3
bare-metal ×3
c ×3
linux ×2
x86 ×2
16-bit ×1
embedded ×1
gcc ×1
gdb ×1
linux-kernel ×1
machine-code ×1
nasm ×1
reliability ×1
time ×1
uart ×1
unit-testing ×1