3358|9

5263

帖子

239

TA的资源

管理员

楼主
 

阅读打卡第三站: 内核调试与性能优化——《奔跑吧Linux内核2:调试与案例分析》 [复制链接]

inux阅读小组的成员:@iysheng@maskmoo@oxlm_1@jobszheng5@y909334873@硬核王同学@TL-LED@segFault @qiao---@crimsonsnow

 

书籍第三站的打卡题目来啦,预计阅读完《奔跑吧Linux内核2:调试与案例分析》第三章可解答。

新的一周开启拉,跟上啦。

 

 

本站打卡题目

1.使用GCC的O0优化选项来编译内核有什么优势?
2.什么是加载地址、运行地址和链接地址?
3.什么是位置无关的汇编指令?什么是位置有关的汇编指令?

 

 

活动交流群

论坛有开设嵌入式交流群,欢迎感兴趣的小伙伴,微信添加“helloeeworld”为好友,对话:加入嵌入式交流群,入群交流。

扫码,对话:加入嵌入式交流群。

 

>>点此进入书籍打卡总站

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

最新回复

Q1:GCC编译器有多种优化等级,O0代表关闭所有优化。使用“O0"来编译内核,可以方便我们在单步调试时查看变量的数值,规避使用默认O2优化带来的变量被优化,无法调试查看数值的不便。 Q2:加载地址:存储代码的物理地址;运行地址:程序运行时的地址;链接地址:在编译链接时指定的地址,编程人员设想将来程序要运行的地址。 Q3:位置无关的汇编代码:指令的执行是与内存地址无关的。无论运行地址和链接地址相等或者不相等,该指令都能正常运行;位置有关代码:指令的执行是与内存地址有关的,和当前PC值无关。在ARM汇编里通过绝对跳转修改PC值为当前链接地址的值  详情 回复 发表于 2024-5-1 16:24
点赞 关注

回复
举报

78

帖子

1

TA的资源

一粒金砂(中级)

沙发
 

1.使用GCC的O0优化选项来编译内核有什么优势?

O0表示编译时不做优化,正因为不会优化,因此在线debug时不会出现指针乱跳的情况,可以精准定位到问题点,帮助分析问题。缺点也很直接,未经过优化的代码,所占用的空间会变大,且运行效率大概率不是最优的。

2.什么是加载地址、运行地址和链接地址?

加载地址:存储代码的物理地址

运行地址:程序运行时的地址

链接地址:在编译链接时指定的地址,编程人员设想将来程序要运行的地址

3.什么是位置无关的汇编指令?什么是位置有关的汇编指令?

位置无关的汇编指令,即这部分汇编指令的执行与内存地址无关;无论链接地址和链接地址是否相等,这部分指令都能正常运行。

位置有关的汇编指令,即这部分汇编指令的执行是与内存地址有关的,和当前PC值无关。

 
 

回复

714

帖子

2

TA的资源

一粒金砂(高级)

板凳
 

1.使用GCC的O0优化选项来编译内核有什么优势?

>>  用“O0”优化等级编译的内核进行单步调试不会出现变量优化和鼠标光标乱跳等问题;也会保留更多的调试信息;但是也会导致内核运行性能下降,所以我们一般在方便单步调试内核使用该优化选项;

 

2、什么是加载地址、运行地址和链接地址?

>>  加载地址:存储代码的物理地址。如ARM64处理器上电复位后是从0x0地址开始取第一条指令的,所以通常这个地方存放代码最开始的部分,如异常向量表的处理。
运行地址:指程序运行时的地址。
链接地址:在编译链接时指定的地址,编程人员设想将来程序要运行的地址。程序中所有标号的地址在链接后便确定了,不管程序在哪里运行都不会改变。使用aarch64-linux-gnu-objdump(objdump)工具进行反汇编查看的就是链接地址

 

3.什么是位置无关的汇编指令?什么是位置有关的汇编指令?

>> 位置无关代码:从字面意思看,该指令的执行是与内存地址无关的;无论运行地址和链接地址相等或者不相等,该指令都能正常运行。在汇编语言中,像BL、B、MOV指令属于位置无关指令,不
管程序装载在哪个位置,它们都能正确地运行,它们的地址域是基于PC值的相对偏移寻址,相当于[pc+offset]。
位置有关代码:从字面意思看,该指令的执行是与内存地址有关的,和当前PC值无关。ARM汇编里面通过绝对跳转修改PC值为当前链接地址的值。

 

 
个人签名Hello astroturfers
 
 

回复

56

帖子

3

TA的资源

一粒金砂(中级)

4
 

问题一:


gcc -O0 编译,表示关闭所有优化,可以更准确对内核进行调试,避免因为优化问题导致无法查看某些变量值或者调试时跳转异常的问题


问题二:


加载地址是存储代码的物理地址


运行地址是代码运行时的地址


链接地址是链接时候指定的地址


问题三:


位置无关汇编指令,就是代码中没有绝对地址,而是一些相对 pc 值的偏移地址,这样程序可以实现无论运行地址和链接地址是否一样都可以正常运行


位置有关汇编指令,是指指令的执行中有绝对地址的概念,这样就要保证链接地址和运行地址一致才能正常运行程序


 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(中级)

5
 

1.使用GCC的O0优化选项来编译内核有什么优势?

答:方便单步调试内核而使用“O0”优化等级
2.什么是加载地址、运行地址和链接地址?

答:

加载地址:存储代码的物理地址。如ARM64处理器上电复位后是从0x0地址开始取第一条指令的,所以通常这个地方存放代码最开始的部分,如异常向量表的处理。

运行地址:指程序运行时的地址。

链接地址:在编译链接时指定的地址,编程人员设想将来程序要运行的地址。程序中所有标号的地址在链接后便确定了,不管程序在哪里运行都不会改变。使用aarch64-linux-gnu-objdump(objdump)工具进行反汇编查看的就是链接地址。
3.什么是位置无关的汇编指令?什么是位置有关的汇编指令?

答:

位置无关的汇编指令:从字面意思看,该指令的执行是与内存地址无关的;无论运行地址和链接地址相等或者不相等,该指令都能征程运行。在汇编语言中,像BL、B、MOV、指令都属于位置无关指令,不管程序装载在哪个位置,他们都能正确的运行,他们的地址域是基于PC值的相对偏移寻址,相当于[pc+offset]

位置有关的汇编指令:从字面意思看,该指令的执行是与内存地址有关的,和当前PC值无关。ARM汇编里面通过绝对跳转修改PC值为当前链接地址的值。

 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(中级)

6
 

1.使用GCC的O0优化选项来编译内核有什么优势?

O0优化等级编译的优势是方便单步调试内核。
2.什么是加载地址、运行地址和链接地址?

加载地址:存储代码的物理地址。

运行地址:程序运行时的地址。

链接地址:编译链接时指定的地址,编程人员设想将来程序要运行的地址。
3.什么是位置无关的汇编指令?什么是位置有关的汇编指令?

位置无关代码:该指令的执行与内存地址无关,无论运行地址与链接地址相不相等,该指令都能正常运行。如汇编指令BL,B,MOV指令。它们的地址域是基于PC值的相对偏移寻址,相当于[pc+offset]

位置有关代码:该指令的执行和内存地址有关,与当前PC值无关。ARM汇编里面通过绝对跳转修改PC值为当前链接地址的值。

 

 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

7
 

 

linux内核调试

  1. linux o0优化有什么好处,

o0优化,对代码没有任何优化,实际运行下来,性能是要低于o2优化的,但是,这里没有编译优化带来的代码执行顺序调整,以及对外隐藏变量与代码细节的情况,可以更方便的调试

  1. 什么是加载地址、运行地址和链接地址
  1. 加载地址(Load Address): 加载地址是指程序在被加载到内存中时的起始地址。当将程序从存储介质(如磁盘)加载到内存时,需要指定程序在内存中的位置。加载地址决定了程序在内存中的物理位置,同时也确定了程序中各个部分(如代码段、数据段等)在内存中的偏移量。
  1. 运行地址(Runtime Address): 运行地址是指程序在内存中实际执行时的地址。当程序开始执行时,加载地址会被转换为运行地址。运行地址是CPU实际访问内存中指令和数据的地址。由于操作系统和硬件的虚拟内存管理机制,运行地址可能与加载地址不同。
  1. 链接地址(Link Address): 链接地址是指将多个目标文件或库文件合并生成可执行文件时,各个目标文件在合并后的文件中的基地址。在编译和链接过程中,每个目标文件都有自己的加载地址,链接地址是将这些加载地址通过链接器(Linker)进行调整和合并后的结果。

 

  1. 位置无关指令,位置有关指令
  1. 位置无关的汇编指令: 位置无关的汇编指令是一种设计方式,使得汇编程序可以在内存中的任意位置执行,而不依赖于指令的实际物理位置。这种指令通常用于可执行文件或共享库等需要在不同的内存地址加载和执行的情况。位置无关的汇编指令使用相对地址或基于寄存器的偏移量来引用代码和数据,以避免对特定地址的依赖。
  1. 位置有关的汇编指令: 位置有关的汇编指令是一种依赖于指令在内存中具体位置的指令。这些指令使用绝对地址来引用代码和数据,指定了指令在内存中的确切位置。位置有关的汇编指令通常用于单独运行的可执行文件,其中指令的加载地址是固定的,没有加载到其他内存地址的需求。
 
 
 

回复

248

帖子

0

TA的资源

纯净的硅(初级)

8
 

1.使用GCC的O0优化选项来编译内核有什么优势?

当我们在使用GDB单步调试内核的时候会出现光标乱跳并且无法输入有些变量值的问题,这是因为内核编译的默认优化选项是“O2”,如果将Linux内核根目录下的Makefile文件中的“O2”改成"O0",并进行简单设置可以有效解决这个问题,但是使用“O0”优化会导致内核的运行性能下降,所以仅仅是为了单步调试的时候使用。

2.什么是加载地址、运行地址和链接地址?

加载地址:存储代码的物理地址。如ARM64处理器上电复位后是从Ox0地址开始取第一条指令的,所以通常这个地方存放代码最开始的部分,如异常向量表的处理。

运行地址:指程序运行时的地址。

链接地址:在编译链接时指定的地址,编程人员设想将来程序要运行的地址。程序中所有标号的地址在链接后便确定了,不管程序在哪里运行都不会改变。使用aarch64-linux-gnu-objdump (objdump)工具进行反汇编查看的就是链接地址。

3.什么是位置无关的汇编指令?什么是位置有关的汇编指令?

位置无关汇编指令:从字面意思看,该指令的执行是与内存地址无关的;无论运行地址和链接地址相等或者不相等,该指令都能正常运行。在汇编语言中,像BL、B、MOV指令属于位置无关指令,不管程序装载在哪个位置,它们都能正确地运行,它们的地址域是基于PC值的相对偏移寻址,相当于[pc+offset]。
位置有关代码:从字面意思看,该指令的执行是与内存地址有关的,和当前PC值无关。ARM汇编里面通过绝对跳转修改PC值为当前链接地址的值。

 
 
 

回复

441

帖子

3

TA的资源

纯净的硅(高级)

9
 

1.使用GCC的O0优化选项来编译内核有什么优势?
GCC编译器有多个优化等级,Linux内核默认使用的是"O2"优化等级。使用"O2"优化等级GDB单步调试内核时会出现光标乱跳无法输出有些变量的值等问题,使用"O0"优化等级不会出现这些问题。方便单步仿真调试。

2.什么是加载地址、运行地址和链接地址?
加载地址:存储代码的物理地址。处理器复位后从0x00地址开始读取的第一条指令,通常是存放代码最开始的地方。
运行地址:是指程序运行时的地址。
连接地址:在编译链接时指定的地址,是编程人员想要程序运行的地址,程序中所有标号的地址在链接后便确定了,不管程序在哪里运行都不会改变。


3.什么是位置无关的汇编指令?什么是位置有关的汇编指令?
在涉及到汇编编程有一个重要的问题,就是位置无关代码和位置有关代码。
位置无关代码:该指令执行与内存地址无关,无论运行地址和指令地址相等或不等,该指令都能正常运行。在汇编中,BL,B,MOV指令属于位置无关指令。
位置有关代码:该指令的执行是和内存地址有关的,和当前PC值无关。汇编里面通过绝对跳转修改PC值为当前链接地址的值,LDR指令属于位置有关的汇编指令。

 
 
 

回复

685

帖子

0

TA的资源

纯净的硅(高级)

10
 
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表