在阅读ARM核心文档时,我对此表示怀疑.CPU如何区分读数据与数据总线,是将其作为指令执行还是作为可以操作的数据执行?
请参阅文件摘录 -
"数据通过数据总线进入处理器内核.数据可能是执行指令或数据项."
在此先感谢您的启发!/女士
请原谅我,如果你觉得这已被无数次回答,但我需要回答以下问题!
为什么数据必须对齐(在4字节/ 8字节/ 2字节边界上)?这里我怀疑的是当CPU具有地址线Ax Ax-1 Ax-2 ... A2 A1 A0时,很可能顺序地寻址存储器位置.那么为什么需要在特定边界对齐数据呢?
在编译代码和生成可执行代码时如何找到对齐要求?
如果例如数据对齐是4字节边界,那是否意味着每个连续字节位于模4偏移处?我怀疑的是,如果数据是4字节对齐,那意味着如果一个字节是1004那么下一个字节是1008(或1005)?
我知道~0将评估最大字大小的位1(因此需要关注可移植性),但我仍然没有得到为什么((1 << N) - 1)不鼓励?
如果您使用了第二张表格,请分享并遇到任何麻烦.
我对存储在ROM中的可执行文件有基本疑问.
据我所知,带有文本和RO属性的可执行文件存储在ROM中.问题是ROM是只读内存,如果有代码需要写入内存的情况会发生什么?
我无法想出任何一个例子来引用这里(可能我对这种情况一无所知或者我错过了基本的东西;)但是这个主题的任何亮点都可以帮助我理解!:)
最后关闭 - 1.有没有这样的情况?2.在这种情况下,将代码从ROM复制到RAM是答案吗?
回答一些例子可以大大帮助..
提前谢谢了!
/女士
通过ARMv8手册,我有以下问题来帮助理解大局.
可以遗留32位应用程序.(ARMv7或更早版本)在ARMv8操作系统上运行吗?
如果需要为ARMv8重建遗留应用程序并假设我将应用程序重建为32位(Aarch32),那么这需要32位操作系统底层支持吗?(知道寻址机制如何在这里工作很有趣.)
请尽可能提供参考.
PS:我的目标是支持Aarch64的Linux操作系统(3.7及更高版本)
我正在查看我的代码的汇编输出,并需要以下说明的帮助.
- // -
0x00000fe8: e28fc000 .... ADR r12,{pc}+8 ; 0xff0
0x00000fec: e28cca08 .... ADD r12,r12,#8, 20 ; #0x8000
Run Code Online (Sandbox Code Playgroud)
- // -
根据我的理解,第一条指令导致r12被加载
"{pc value} + 8"即是
"{当前正在执行的指令的地址(0xfe8)加上2个指令(8)} + 8"
第一条指令执行加载0xff8(0xfe8 + 8 + 8)后r12也是如此
关于第2条指令 -
如何计算添加并存储到r12的值?(评论说它的0x8000,虽然我无法理解它是如何得到的)
我能够执行系统调用调用并在内核中进行处理.但很少有事情我不清楚.进入swi例程后,内核将用户模式寄存器保存在堆栈中.问题是-
是谁的堆栈?(因为swi处理和相应的系统调用例程需要堆栈框架才能工作)
如果它是Kernel自己的堆栈,从哪里获得堆栈分配..?它会开始使用当前的堆栈吗?如果是,则current可以是内核中当时可能正在执行的任何进程.这不是耗尽电流的堆栈吗?
如果它在swi处理程序中使用当前正在执行的User进程的堆栈,那么这将是内核现在将访问的用户地址空间.这可能吗?由于内核可寻址内存在1GB以内(如果在4GB RAM内存系统中使用1:3内核到用户地址空间比率).