如何在没有运行操作系统的情况下自行运行程序?你能创建计算机可以在启动时加载和运行的汇编程序,例如从闪存驱动器启动计算机并运行cpu上的程序吗?
用户模式和内核模式之间有什么区别,为什么以及如何激活它们中的任何一个,以及它们的用例是什么?
有关x86 CPU权限的几个问题:
为什么大多数操作系统都没有使用环1和环2?是仅仅维护代码与其他架构的兼容性,还是有更好的理由?
是否有任何操作系统实际使用这些环?或者他们完全没用?
这个问题旨在填补关于该主题的良好免费信息的真空.
我相信一个好的答案将适合一个大的答案或至少在几个答案.
主要目标是为完整的初学者提供足够的信息,以便他们可以自己学习手册,并能够理解与分页相关的基本操作系统概念.
建议的指导方针:
相关问题以及为什么我认为它们不是愚蠢的:
x86页表如何工作?:标题与此问题几乎相同,但是正文询问与cr3和TLB相关的具体问题.那个问题是这个问题的一个子集.
x86虚拟化如何工作:正文仅询问源.
我研究Linux内核并发现,对于int 0x80体系结构,中断syscall不能用于调用系统调用.
问题是:在int 0x80架构的情况下什么是更可取的int 0x80或syscall为什么?
编辑:我使用内核3.4
我读了以下声明:
x86架构包括称为任务状态段(TSS)的特定段类型,用于存储硬件上下文.尽管Linux不使用硬件上下文切换,但它仍然被迫为系统中的每个不同CPU设置TSS.
我想知道:
最后一如既往,感谢您的耐心和回复.
- - - - - -添加 - - - - - - -
http://wiki.osdev.org/Context_Switching得到了一些解释.
像我这样迷茫的人可以看看它.8 ^)
内核如何获得在linux下运行的可执行二进制文件?
这似乎是一个简单的问题,但任何人都可以帮助我深入挖掘?如何将文件加载到内存以及如何启动执行代码?
任何人都可以帮助我,一步一步地告诉我们发生了什么吗?
用户内存和内核内存究竟与Linux内核有何区别(在为内核空间提供安全性方面)?
我可以在用户空间的内核地址空间中编写哪些不同的方法?
我知道的一种方法是通过系统调用.我们可以使用多个系统调用,但最后它们都是系统调用.即使在系统调用中,我们也会将数据发送到内核空间,在那里它(驱动程序或各个模块)调用copy_from_user()等函数将数据从用户空间复制到内核空间.在这里,我们完全没有写入地址空间.我们只是传递一个用户指针,其中包含需要复制到内核缓冲区的数据.
我的问题是,我们有什么方法可以访问内核空间中存在的物理地址并对其执行操作?
第二,除了系统调用之外还有其他方法可以从用户应用程序写入内核空间吗?
我从stackoverflow中提到了这个链接.但我认为我的问题没有得到回答,而且是从不同的角度来看.因此,我想问一个不同的问题.
请分享您的知识...谢谢.
ARM程序集具有用于进入"管理员模式"的SWI和SVC指令.
令我困惑的是,为什么有两个?这里据说SVC是以前的SWI.这是否意味着基本上他们改变了助记符?它们是一样的吗?我可以互换使用吗?其中一个存在于架构之前,还有其他之后?
我编写了一个程序,试图读取和写入控制寄存器.
程序编译很好,但是当即将执行内联汇编时,它会产生分段错误.
码:
void instructions(int val)
{
int i;
int value;
for(i = 0; i < val; i++)
__asm__("mov %cr0, %eax");
}
Run Code Online (Sandbox Code Playgroud)
我使用了GDB并逐步完成了每个装配线,并且mov %cr0,%eax正在发生分段故障.
谁知道什么是错的?
我已经下载了最新的 qemu Windows 版本,然后在下面运行
qemu-system-aarch64 -M virt,gic_version=3 -cpu cortex-a53 -smp 2 -nographic
-m 2048 -kernel mybaremetal.axf -s -S
Run Code Online (Sandbox Code Playgroud)
为了模拟双核 cortex-a53,我可以使用 aarch64 gdb 客户端连接到它,在 mybaremetal.axf 的入口处,我通过以下方式检查了执行的异常级别:
mrs x1, CurrentEL
Run Code Online (Sandbox Code Playgroud)
我总是在 x1 中得到值 4,但这里预期值 0xc,如 ARM 文档中所示,它说:在加电和复位时,处理器进入 EL3
有人知道原因吗?
我是ARMv8架构的新手.我有以下基本问题:
我怎么知道当前执行模式AArch32或AArch64是什么?我应该阅读CPSR或SPSR来确定这一点吗?
当前的例外级别EL0/1/2/3是多少?
一旦异常到来,我可以读取任何寄存器以确定我是否处于Serror/Synchronous/IRQ/FIQ异常处理程序中.
TIA.
x86 ×6
linux ×4
arm ×3
assembly ×3
arm64 ×2
linux-kernel ×2
bootloader ×1
c ×1
cpu ×1
embedded ×1
low-level ×1
mmap ×1
osdev ×1
paging ×1
privileges ×1
qemu ×1
system-calls ×1