关于内核初始化时页表的建立问题:__create_page_tables

callmefriend 2014-06-06 09:44:02
我参考的内核版本是2.6.22.6,硬件平台是s3c2440
我的疑问,对应一下两句汇编代码:
__create_page_tables:
...
/*
* Now setup the pagetables for our kernel direct
* mapped region.
*/
add r0, r4, #(KERNEL_START & 0xff000000) >> 18 //KERNEL_START = c0008000
str r3, [r0, #(KERNEL_START & 0x00f00000) >> 18]! //r4 = 30004000
...
这两句和下面的汇编,有什么不同?
add r0,r4,#(KERNEL_START & 0xFFF00000)>>18
str r3,[r0]

使用这两句不是更加言简意赅吗?
...全文
373 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
brookmill 2014-06-19
  • 打赏
  • 举报
回复
引用 5 楼 callmefriend 的回复:
你这是在哪里看的?add还限制12位吗?
这个要查ARM的指令集(ARM Instruction Set)。要想研究ARM汇编,这可是必备的参考书。更详细的还有每条汇编指令对应的机器码表。 任何指令里面的立即数都有位数限制的。一条ARM指令32位,4位条件,若干位表示ADD,Rd和Rn各4位,留给立即数的也就十几位了。还有些指令里面的立即数是8位的(imm8)或16位(imm16)
brookmill 2014-06-19
  • 打赏
  • 举报
回复
你说得对,r0也是一样的,我才注意到那个叹号。 我又发现一个问题,指令集里面是这样的:ADD Rd, Rn, #<imm12> 但是你那两个ADD里面的立即数明显不只12位,这个我就弄不懂了。
callmefriend 2014-06-19
  • 打赏
  • 举报
回复
引用 4 楼 brookmill 的回复:
你说得对,r0也是一样的,我才注意到那个叹号。 我又发现一个问题,指令集里面是这样的:ADD Rd, Rn, #<imm12> 但是你那两个ADD里面的立即数明显不只12位,这个我就弄不懂了。
你这是在哪里看的?add还限制12位吗?
callmefriend 2014-06-18
  • 打赏
  • 举报
回复
引用 1 楼 brookmill 的回复:
r3可能是一样的,r0肯定不一样。 好久没碰内核和ARM汇编了,不知道理解的对不对。接下来的代码用到r0了吗?
我带值进去试,结果r3 r0都是一样的。 我带值错了?
callmefriend 2014-06-18
  • 打赏
  • 举报
回复
我带值进去试,结果r3 r0都是一样的。 我带值错了?
brookmill 2014-06-11
  • 打赏
  • 举报
回复
r3可能是一样的,r0肯定不一样。 好久没碰内核和ARM汇编了,不知道理解的对不对。接下来的代码用到r0了吗?

4,438

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧