获取kernel各个数据段,代码段的地址及范围

查看内核段信息方法
本文介绍了一种在Linux环境下通过 printk 函数打印内核各段(如代码段、数据段、初始化数据段等)地址范围的方法。这种方法有助于开发者更好地理解内核布局,并对调试和分析内核行为提供帮助。

有的时候需要知道代码段,数据段,字符串段,已经初始话数据段等信息

记得添加:

#include <asm/sections.h>

printk("_text  is %08x--%08x , \
         _data is %08x--%08x , \
         __bss_start  is %08x--%08x , \
         __init_begin is %08x--%08x , \
         _sinittext  is %08x--%08x   , \
         __initdata_begin  is %08x--%08x  , \
         __start_rodata  is %08x--%08x \n " , \
         _stext,_etext, \
         _sdata,_edata,\
         __bss_start,__bss_stop,\
         __init_begin,__init_end,\
         _sinittext,_einittext,\
         __initdata_begin,__initdata_end,\
         __start_rodata,__end_rodata\
              );



 

全局描述符通过段描述符中的特定标志位来区分代码段数据段。在 x86 架构的保护模式下,段描述符是分段机制的核心数据结构,定义了内存段的属性,Linux 通过全局描述符表(GDT)管理这些段描述符,每个段描述符占用 8 字节(64 位)[^2]。 具体而言,在段描述符的二进制布局中,有专门的标志位用于标识段的类型。例如,在段描述符的标志字节中,某些位的组合可以明确表示该段是代码段还是数据段。以示例代码中的段描述符定义为例,代码段描述符中的标志字节为 `0x9A`,数据段描述符中的标志字节为 `0x92`,这些标志字节中的不同位值决定了段的类型[^5]。 对于代码段,其标志位通常设置为表示该段是可执行的、具有特定的权限级别等。而数据段的标志位则设置为表示该段是用于存储数据的,可能具有读写权限等。通过这些标志位的不同设置,全局描述符能够准确地区分代码段数据段,从而实现对不同类型内存段的管理和访问控制。 ```plaintext ; Descriptor 1: kernel code segment dw 0xFFFF ; bytes 0 and 1 of segment size dw 0x0000 ; bytes 0 and 1 of segment base address db 0x00 ; byte 2 of segment base address db 0x9A ; present, DPL=0, non - system, code, non - conforming, readable, not accessed db 0xCF ; granularity=page, 32 bit code, upper nibble of size db 0x00 ; byte 3 of segment base address ; Descriptor 2: kernel data and stack segment dw 0xFFFF ; bytes 0 and 1 of segment size dw 0x0000 ; bytes 0 and 1 of segment base address db 0x00 ; byte 2 of segment base address db 0x92 ; present, DPL=0, non - system, data, expand - up, writable, not accessed db 0xCF ; granularity=page, big, upper nibble of size db 0x00 ; byte 3 of segment base address ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值