大家好,今天我们来分享linux内核的工程建立以及一些我在工作当中使用source insight 经常会用的一些快捷操作;然后会分享一些有用的汇编指令,主要是经常会遇到的汇编指令,汇编指令没必要去专门学,当你在看启动汇编代码的时候,只要稍微看的懂它的意思就行,因为在上班中,你很少去写汇编,我们只是用它分析,体会一下linux内核是如何启动的。不过这其中可能很多人,对虚拟内存和页表等知识不是很清楚,没关系,这个不影响我们学习,这个我后面在文章中写到的。好了,那就开始今天的分享。
一、使用Sourc Insight 来建立一个linux工程:
1、为什么要使用SourceInsight:
对于一个真正的一个项目,往往有几十几百甚至上万个c文件、h文件,代码量非常大,代码之间关联非常复杂,就带来一个问题,代码的分析、阅读越来越难。譬如这里引用了一个函数但是这个函数可能在另外一个目录下的一个文件夹中存放,这样情况下代码查找和阅读很困难,我们希望有一个好工具能够帮助。于是乎有了 Source Insight。而且在公司里面几乎都会使用 Source Insight 这个工具来管理大工程,主要原因是方便,即使这个工具不能去编译代码(怎样去编译这个代码,方法有很多,这里我就不讲了,后面实战遇到再和大家说,每个人用的方法不一样。),但对于提高工作效率来说,还真心不错。
2、建立工程及添加文件:
(1)要使用SI看代码,首先要创建一个工程。菜单栏:Project->new project。在弹出的对话框中上面输入工程名字(自己起名字,随便写,但是一般要和工程相对应免得时间长了忘记了),下面输入工程文件存放的位置,路径可以自己选择:
(2)到了向项目中添加文件的步骤。在左侧选择选择kernel这个目录(这个是你放linux kernel的地方),然后点右侧边栏的add tree即可添加。
(3)最后就建立好工程了,开始解析工程文件;SI(Sourcr Insight)工作原理就是预先把所有源代码中的所有符号全部解析存储到数据库中,然后等我们进行符号查找时,SI不是查文件而是查数据库帮我们索引符号,因此SI查找速度非常快。因此我们使用SI查阅源码前应该预先进行源码解析。在菜单栏Project->Syneronize Files,选中上面2个,然后确定,整个linux工程就建立好了:
3、常用快捷操作:
这里的话我讲一下在工作当中经常使用的快捷操作:
a、在修改代码完之后,一定要记得保存一下,不然通过最终修改不成功,而且没有保存修改的地方。
b、要在整个工程中搜索一个函数,可以使用快捷键:ctrl shift f
c、要跳转到一个函数或者变量定义的地方去,可以使用快捷键:按住ctrl键,然后把鼠标放到你要查的函数或者变量上,并点击一下就行,它就会跳转到函数或者变量定义的地方去。
d、然后有的时候由于变量太多,你可以使用快捷键(shift f8)来标记它,标记一个变量后,如果在其他文件中有这个变量,它同样也会标记,标记后是显示黄色的:
f、下面图中的一些指向都是为了方便查看代码,这个要利用好来:
二、汇编指令:
1、伪指令的意义:
• 伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码。
• 伪指令的意义在于指导编译过程。
• 伪指令是和具体的编译器相关的,我们使用gnu工具链,因此学习gnu环境下的汇编 伪指令。
2、gnu汇编中的一些符号:
• @ 用来做注释。可以在行首也可以在代码 后面同一行直接跟,和C语言中//类似
• # 做注释,一般放在行首,表示这一行都是注释而不是代码。
• :以冒号结尾的是标号
• . 点号在gnu汇编中表示当前指令的地址
• # 立即数前面要加#或$,表示这是个立即数
3、常用gnu伪指令
• .global _start @ 给_start外部链接属性
• .section .text @ 指定当前段为代码段
• .ascii .byte .short .long .word
• .quad .float .string @ 定义数据
• .align 4 @ 以16字节对齐
• .balignl 16 0xabcdefgh @ 16字节对齐填充
• .equ @ 类似于C中宏定义
• .end @标识文件结束
• .include @ 头文件包含
• .arm / .code32 @声明以下为arm指令
• .thumb / .code16 @声明以下为thubm指令
4、最重要的几个伪指令:
• ldr 大范围的地址加载指令
• adr 小范围的地址加载指令
• adrl 中等范围的地址加载指令
• nop 空操作
• ARM中有一个ldr指令,还有一个ldr伪指令
• 一般都使用ldr伪指令而不用ldr指令
5、adr与ldr :
• adr编译时会被1条sub或add指令替代,而ldr编译时会被一条mov指令替代或者文字 池方式处理。
• adr总是以PC为基准来表示地址,因此指令本身和运行地址有关,可以用来检测程序 当前的运行地址在哪里 。
• ldr加载的地址和链接时给定的地址有关,由链接脚本决定。
三、总结:
今天先暂时分享这么多汇编指令,主要是一些伪指令,明天会继续分享,先消化这些,慢慢来,不要急,为什么要分享这些汇编指令,这里主要是下次带大家分析head.S文件,同时也可以让大家熟悉一下汇编常用指令,你不必去专门去学,只要把分享指令学会就行,知道它的作用就行。关于Source Insight的护眼模式可以上网查一下,很详细,今天我主要讲了一下我工作当中用到的一些快捷方式,希望对你使用Source Insight有用。