System.map 解析

Linux内核几个重要文件之System.map System.map是编译内核时生成,它记录了文件内核中的符号列表,以及符号在内存中的虚拟地址,这里的符号可以理解成函数名和变量。System.map文件不是一成不变的,每次编译内核都会重新生成System.map文件。链接: https://notes.z-dd.online/2024/03/21/Linux%E5%86%85%E6%A0%B8%E5%87%A0%E4%B8%AA%E9%87%8D%E8%A6%81%E6%96%87%E4%BB%B6%E4%B9%8BSystem.map/ 阅读详情

第一部分:System.map的作用

有关System.map文件的信息好象很缺乏。其实它一点也不神秘,并且在整个事情当中它并不象看上去那么得重要。但是由于缺乏必要的文档说明,使其显得比较神秘。它就象耳垂,我们每个人都有,但却不知道是干什么用的。注意,我并不会是百分之一百正确的。例如,一个系统很可能没有/proc文件系统支持,但是大多数系统肯定有。这里我假定你是“随大流的”,并有一个典型配置的系统。
某些有关内核出错(oops)的阐述来自于Alessandro Rubini的“Linux设备驱动程序” 一书,我是从其中学到大部分内核编程知识的。
什么是符号(Symbols)?
    在编程中,一个符号(symbol)是一个程序的创建块:它是一个变量名或一个函数名。 正如你自己编制的程序一样,内核具有各种符号也是不应该感到惊奇的。当然,区别在 于内核是一非常复杂的代码块,并且含有许多、许多的全局符号。
内核符号表(Kernel Symbol Table)是什么东西?
    内核并不使用符号名。它是通过变量或函数的地址(指针)来使用变量或函数的,而 不是使用size_t BytesRead,内核更喜欢使用(例如)c0343f20来引用 这个变量。
而另一方面,人们并不喜欢象c0343f20这样的名字。我们跟喜欢使用象 size_t BytesRead这样的表示。通常,这并不会带来什么问题。内核主要是用C语言写成的,所以在我们编程时编译器/连接程序允许我们使用符号名,并且使 内核在运行时使用地址表示。这样大家都满意了。
    然而,存在一种情况,此时我们需要知道一个符号的地址(或者一个地址对应的 符号)。这是通过符号表来做到的,与gdb能够从一个地址给出函数名(或者给出一个 函数名的地址)的情况很相似。符号表是所有符号及其对应地址的一个列表。这里是 一个符号表例子:
   c03441a0 B dmi_broken
   c03441a4 B is_sony_vaio_laptop
   c03441c0 b dmi_ident
   c0344200 b pci_bios_present
   c0344204 b pirq_table
   c0344208 b pirq_router
   c034420c b pirq_router_dev
   c0344220 b ascii_buffer
   c0344224 b ascii_buf_bytes
    你可以看出名称为dmi_broken的变量位于内核地址c03441a0处。
什么是System.map文件?
    有两个文件是用作符号表的:
       1. /proc/kallsyms
       2. System.map
    这里,你现在可以知道System.map文件是干什么用的了。
    每当你编译一个新内核时,各种符号名的地址定会变化。
/proc/ksyms 是一个 “proc文件” 并且是在内核启动时创建的。实际上
它不是一个真实的文件;它只是内核数据的简单表示形式,呈现出象一个磁盘文件似
的。如果你不相信我,那么就试试找出/proc/ksyms的文件大小来。因此, 对于当前运行的内核来说,它总是正确的..
    然而,System.map却是文件系统上的一个真实文件。当你编译一个新内核时,你原 来的System.map中的符号信息就不正确了。随着每次内核的编译,就会产生一个新的 System.map文件,并且需要用该文件取代原来的文件。
什么是一个Oops?
    在自己编制的程序中最常见的出错情况是什么?是段出错(segfault),信号11。
Linux内核中最常见的bug是什么?也是段出错。除此,正如你想象的那样,段出
错的问题是非常复杂的,而且也是非常严重的。当内核引用了一个无效指针时,并不 称其为段出错 –
而被称为”oops”。一个oops表明内核存在一个bug,应该总是提出 报告并修正该bug。
    请注意,一个oops与一个段出错并不是一回事。你的程序并不能从段出错中恢复 过来,当出现一个oops时,并不意味着内核肯定处于不稳定的状态。Linux内核是非常 健壮的;一个oops可能仅杀死了当前进程,并使余下的内核处于一个良好的、稳定的 状态。
一个oops并非是内核死循环(panic)。在内核调用了panic()函数后,内核就不能
继续运行了;此时系统就处于停顿状态并且必须重启。如果系统中关键部分遭到破坏
那么一个oops也可能会导致内核进入死循环(panic)。例如,设备驱动程序中 出现的oops就几乎不会导致系统进行死循环。
    当出现一个oops时,系统就会显示出用于调试问题的相关信息,比如所有CPU寄存器 中的内容以及页描述符表的位置等,尤其会象下面那样打印出EIP(指令指针)的内容:
   EIP: 0010:[]
   Call Trace: []
       
一个Oops与System.map文件有什么关系呢?
    我想你也会认为EIP和Call Trace所给出的信息并不多,但是重要 的是,对于内核开发人员来说这些信息也是不够的。由于一个符号并没有固定的地址, c010b860可以指向任何地方。
为了帮助我们使用oops含糊的输出,Linux使用了一个称为klogd(内核日志后台程序)的
后台程序,klogd会截取内核oops并且使用syslogd将其记录下来,并将某些象c010b860
的信息转换成我们可以识别和使用的信息。换句话说,klogd是一个内核消息记录器(logger),
它可以进行名字-地址之间的解析。一旦klogd开始转换内核消息,它就使用手头的记录器,
将整个系统的消息记录下来,通常是使用syslogd记录器。
    为了进行名字-地址解析,klogd就要用到System.map文件。我想你现在 知道一个oops与System.map的关系了。
    深入说明: 其实klogd会执行两类地址解析活动。
        * 静态转换,将使用System.map文件。
        * 动态转换,该方式用于可加载模块,不使用System.map,因此与本讨论没有关系,但我仍然对其加以简单说明。
        Klogd动态转换
假设你加载了一个产生oops的内核模块。于是就会产生一个oops消息,klogd就会截获它,并发现该oops发生在d00cf810处。由于该地址
属于动态加载模块,因此在System.map文件中没有对应条目。klogd将会在其中寻找并会毫无所获,于是断定是一个可加载模块产生了oops。此时klogd就会向内核查询该可加载模块输出的符号。即使该模块的编制者没有输出其符号,klogd也起码会知道是哪个模块产生了oops,这总比对一个
oops一无所知要好。
    还有其它的软件会使用System.map,我将在后面作一说明。
System.map应该位于什么地方?
    System.map应该位于使用它的软件能够寻找到的地方,也就是说,klogd会在什么地方寻找它。在系统启动时,如果没有以一个参数的形式为klogd给出System.map的位置,则klogd将会在三个地方搜寻System.map。依次为:
       1. /boot/System.map
       2. /System.map
       3. /usr/src/linux/System.map
System.map
同样也含有版本信息,并且klogd能够智能化地搜索正确的map文件。例如,假设你正在运行内核2.4.18并且相应的map文件位于
/boot/System.map。现在你在目录/usr/src/linux中编译一个新内核2.5.1。在编译期间,文件
/usr/src/linux/System.map就会被创建。当你启动该新内核时,klogd将首先查询
/boot/System.map,确认它不是启动内核正确的map文件,就会查询 /usr/src/linux/System.map,
确定该文件是启动内核正确的map文件并开始读取其中的符号信息。
    几个注意点:
* 在2.5.x系列内核的某个版本,Linux内核会开始untar成linux-version,而非只是linux (请举手表决–有多少人一直等待着这样做?)。我不知道klogd是否已经修改为在/usr/src/linux-version/System.map中搜索。
TODO:查看klogd源代码。
        * 在线手册上对此也没有完整描述,请看:
   # strace -f /sbin/klogd | grep ‘System.map’
   31208 open(“/boot/System.map-2.4.18”, O_RDONLY|O_LARGEFILE) = 2
               
          显然,不仅klogd在三个搜索目录中寻找正确版本的map文件,klogd也同样知道寻找名字为 “System.map” 后加”-内核版本”,象 System.map-2.4.18. 这是klogd未公开的特性。
有一些驱动程序将使用System.map来解析符号(因为它们与内核头连接而非glibc库等),如果没有System.map文件,它们将不能正确地
工作。这与一个模块由于内核版本不匹配而没有得到加载是两码事。模块加载是与内核版本有关,而与即使是同一版本内核其符号表也会变化的编译后内核无关。
还有谁使用了System.map?
    不要认为System.map文件仅对内核oops有用。尽管内核本身实际上不使用System.map,其它程序,象klogd,lsof,
   satan# strace lsof 2>&1 1> /dev/null | grep System
   readlink(“/proc/22711/fd/4”, “/boot/System.map-2.4.18”, 4095) = 23
       
    ps,
   satan# strace ps 2>&1 1> /dev/null | grep System
   open(“/boot/System.map-2.4.18”, O_RDONLY|O_NONBLOCK|O_NOCTTY) = 6
       
    以及其它许多软件,象dosemu,需要有一个正确的System.map文件。
如果我没有一个好的System.map,会发生什么问题?
    假设你在同一台机器上有多个内核。则每个内核都需要一个独立的 System.map文件!如果所启动的内核没有对应的System.map文件,那么你将定期地看到这样一条信息:
        System.map does not match actual kernel (System.map与实际内核不匹配)
    不是一个致命错误,但是每当你执行ps ax时都会恼人地出现。有些软件,比如dosemu,可能不会正常工作。最后,当出现一个内核oops时,klogd或ksymoops的输出可能会不可靠。
我如何对上述情况进行补救?
    方法是将你所有的System.map文件放在目录/boot下,并使用内核版本号重新对它们进行命名。假设你有以下多个内核:
        * /boot/vmlinuz-2.2.14
        * /boot/vmlinuz-2.2.13
    那么,只需对应各内核版本对map文件进行改名,并放在/boot下,如:
  
/boot/System.map-2.2.14
   /boot/System.map-2.2.13
如果你有同一个内核的两个拷贝怎么办?例如:
        * /boot/vmlinuz-2.2.14
        * /boot/vmlinuz-2.2.14.nosound
    最佳解决方案将是所有软件能够查找下列文件:
   /boot/System.map-2.2.14
   /boot/System.map-2.2.14.nosound
但是说实在的,我并不知道这是否是最佳情况。我曾经见到搜寻”System.map-kernelversion”,但是对于搜索”System.map
-kernelversion.othertext”的情况呢?
我不太清楚。此时我所能做的就是利用这样一个事实:/usr/src/linux是标准map文件的搜索路径,所以你的map文件将放在:
        * /boot/System.map-2.2.14
        * /usr/src/linux/System.map (对于nosound版本)
    你也可以使用符号连接:
   System.map-2.2.14
   System.map-2.2.14.sound
   System.map -> System.map-2.2.14.sound

【转:http://edu.codepub.com/2011/0323/30291.php】

第二部分:System.map的格式

本文参考 binutils文档。

system.map内容格式为:线性地址 类型 符号

具体内容如下:
00100000 A phys_startup_32
c0100000 T startup_32
c0100000 A _text                             注:表示内核代码第一个字节的地址
c01000c6 t checkCPUtype
c0100147 t is486
c010014e t is386
c0100199 t L6
c010019b t check_x87
c01001c2 t setup_idt
c01001df t rp_sidt
c01001ec t ignore_int
c0100220 t rest_init
c0100220 T stext
c0100220 T _stext
c0100252 t do_pre_smp_initcalls
c0100257 t run_init_process
c0100283 t init
c01003a8 t try_name
c0100529 T name_to_dev_t
c0100790 t calibrate_delay_direct

…

c02f95d7 T register_kretprobe
c02f96cd T unregister_kretprobe
c02f9760 t .text.lock.kprobes
c02f97b0 T __kprobes_text_end
c02f9abe t iret_exc
c02fa1af A _etext                              注:内核代码结束的位置,之后为内核初始化的数据
c02fa1b0 A __start___ex_table
c02facc0 A __stop___ex_table
c02fb000 r __func__.12
c02fb000 A __start_rodata
c02fb00c r __func__.13
c02fb020 r __func__.2
c02fb02c r __func__.3
c02fb040 R linux_banner
c02fb0bb r __func__.0
c02fb0c7 r __func__.1
c02fb0e0 r __func__.0
c02fb0ec r __func__.1
c02fb100 r border
c02fb160 r cplens

…

c03e1b08 D ip_statistics
c03e1b10 D tcp_statistics
c03e1b18 D udp_statistics
c03e1b20 D icmp_statistics
c03e1b28 D net_statistics
c03e1b30 d fn_hash_kmem
c03e1b34 d fn_alias_kmem
c03e1b38 d xfrm_dst_cache
c03e1b3c d secpath_cachep
c03e1b40 A _edata                       注:内核初始化数据结束,之后为未初始化数据
c03e2000 D init_thread_union
c03e4000 A __init_begin
c03e4000 t no_halt
c03e4000 T _sinittext
c03e400d t mca_pentium
c03e401d t no_387
c03e4033 t check_fpu
…

c043a058 b pfkey_table
c043a05c b pfkey_table_lock
c043a05c b pfkey_table_users
c043a060 b pfkey_socks_nr
c043a064 b acqseq.4
c043a068 b acqseq_lock.5
c043a068 A __bss_stop
c043a068 A _end                         注:内核未初始化数据结束
c043b000 A pg0
ffffe400 A __kernel_vsyscall
ffffe410 A SYSENTER_RETURN
ffffe420 A __kernel_sigreturn
ffffe440 A __kernel_rt_sigreturn

符号类型.

小写字母表示局部; 大写字母表示全局(外部).
A
The symbol’s value is absolute, and will not be changed by further linking.

B
The symbol is in the uninitialized data section (known as BSS).

C
The symbol is common. Common symbols are uninitialized data. When linking, multiple common symbols may appear with the same name. If the symbol is defined anywhere, the common symbols are treated as undefined references. For more details on common symbols, see the discussion of -warn-common in Linker options.

D
The symbol is in the initialized data section.

G
The symbol is in an initialized data section for small objects. Some object file formats permit more efficient access to small data objects, such as a global int variable as opposed to a large global array.

I
The symbol is an indirect reference to another symbol. This is a GNU extension to the a.out object file format which is rarely used.

N
The symbol is a debugging symbol.

R
The symbol is in a read only data section.

S
The symbol is in an uninitialized data section for small objects.

T
The symbol is in the text (code) section.

U
The symbol is undefined.

V
The symbol is a weak object. When a weak defined symbol is linked with a normal defined symbol, the normal defined symbol is used with no error. When a weak undefined symbol is linked and the symbol is not defined, the value of the weak symbol becomes zero with no error.

W
The symbol is a weak symbol that has not been specifically tagged as a weak object symbol. When a weak defined symbol is linked with a normal defined symbol, the normal defined symbol is used with no error. When a weak undefined symbol is linked and the symbol is not defined, the value of the weak symbol becomes zero with no error.

-
The symbol is a stabs symbol in an a.out object file. In this case, the next values printed are the stabs other field, the stabs desc field, and the stab type. Stabs symbols are used to hold debugging information. For more information, see Stabs.

?
The symbol type is unknown, or object file format specific.
 

# info binutils查看更详细的信息

【转:http://blog.youkuaiyun.com/gates84/archive/2006/11/27/1416514.aspx】

 

看了一下Linux下的/boot/System.map,发现里边定义的东西还是比较有意思的
仔细的看了一下,写一些东西:)

部分摘录:
    00000000 A agp_frontend_cleanup
    c0127350 t kmem_slab_destroy
    c0127430 T kmem_cache_create
    c02a0ea0 R ide_pio_timings
    c02aee28 r usb_bandwidth_option
    c02c68bf ? __kstrtab_get_zeroed_page
    c02c68cf ? __kstrtab___free_pages
    c02cfe00 d real_mode_gdt_entries
    c02d028c D kstack_depth_to_print
    c03218c0 B irq_err_count
    c03218c4 b root_irq_dir

    其中每项有三部分组成:
    第三部分是项目的名称
    第一部分是项目在内核中的偏移量;
    第二部分是项目的类型  各种类型的特征代码的意义
        A:表示全局函数或变量
            比如其中的agp_frontend_cleanup在原码中的定义为:
            extern void agp_frontend_cleanup(void);
        B:表示 静态/全局/原子 变量|数组
            比如上面的irq_err_count在原码中的定义分别为:
            extern atomic_t irq_err_count;            //include\asm-i386\Hw_irq.h
            atomic_t irq_err_count;                //arch\i386\kernel\Irq.c
            static volatile unsigned long irq_err_count;    //arch\i386\kernel\Irq.c
        b:表示静态结构体
            比如上面例子中的root_irq_dir,在原码中的定义是:
            static struct proc_dir_entry * root_irq_dir;    //arch\i386\kernel\Irq.c
        D:表示已经定义过初值的变量
            比如上面例子中的kstack_depth_to_print,在原码中的定义是:
            int kstack_depth_to_print = 24;            //arch\i386\kernel、Traps.c
        d:表示已经定义了初值的变量/数组
        R:表示定义的常量[全局]数组
            比如上面例子中的ide_pio_timings,在原码中的定义是:
            extern const ide_pio_timings_t ide_pio_timings[6]; //drivers\ide、Ide_modes.h
            又比如:c02a53f8 R sense_data_texts在原码中的定义
            const struct {
                unsigned long asc_ascq;
                const char * const text;
                } sense_data_texts[] = {....}
        r:表示静态常量定义
            比如上面例子中的usb_bandwidth_option,在原码中的定义是:
            static const int usb_bandwidth_option = …    // drivers\usb\Usb.c
        T:表示全局函数/函数指针
            比如上面例子中的kmem_cache_create,在原码中的定义是:
            extern kmem_cache_t *kmem_cache_create(…)    // include\linux\Slab.h
        t:表示静态函数或定义了初值的静态变量/数组
            比如上面例子中的usb_bandwidth_option在原码中的定义是:
            static const int usb_bandwidth_option = 1    // drivers\usb\Usb.c
        ?:在原码中没有找到,你知道吗?告诉我吧:)



         每次编译内核时符号的地址均不同,因而编译内核的同时都会生成一个相应的System.map文件。在System.map文件中,地址与符号之间的字母代表符号的类型。这里的类型定义与nm中类型的定义是一样的。下面我们便罗列出这些类型。

A

绝对

B或b

未初始化的数据段(BSS)

D或d

初始化的数据段

G或g

小对象的初始化数据段(全局的)

i

DLL相关的段

N

调试用符号

p

堆栈的展开段(stack unwind section)

R或r

只读数据段

S或s

小对象的未初始化数据段

T或t

代码段

U

未定义

V或v

弱对象(weak object)

W或w

没有标签的弱对象(weak object)

-

a.out目标文件中的桩符号(stabs symbol)

?

未知符号

 



System.map符号表解析 System.map是内核符号表文件,是由“nm vmlinux”命令产生的,位于源码根目录。 所谓“符号”就是函数名,全局变量名等东东,这个表就记录的这些“符号”在内核中的运行地址。(这个地址是Effective Address,虚地址) 下面是文件的一个片段: 阅读详情

相关推荐

基于UCD3138的数字控制硬开关全桥DC-DC电源设计实战解析

在开关电源设计中,数字控制技术正逐步取代传统模拟方案,以其卓越的灵活性、可编程性和强大的数据处理能力,成为应对复杂动态响应与智能化需求的关键。其核心原理在于通过高精度模数转换器(ADC)实时采样电压、电流信号,经由数字信号处理器(如ARM内核)运行PID等控制算法,动态调整数字脉宽调制(DPWM)输出,从而实现对功率级的精确控制。这种技术价值体现在能够轻松实现高级算法(如输入电压前馈、非线性补偿)、灵活配置保护参数,并通过PMBus等接口实现智能化监控与管理。其典型应用场景包括通信基站、服务器电源以及工业设

1311

Linux 中的 System.map简介

对于计算机而言是没有符号这个概念的,只有0 和 1,但是我们比较容易理解的是函数名、变量名这样的符号。在Linux 内核中用 System.map 来记录Linux 内核中的符号信息,称为内核的符号表,该文件会在每次内核编译的时候,都会产生一个新的对应的 System.map 文件。在内核运行出错时,通过 System.map 中的符号表解析,就可以查到一个地址值对应的变量名、函数名。

私房菜 3634

STLink驱动故障全解析:从卡顿到重装的终极修复指南

本文全面解析STLink驱动故障的常见现象及解决方案,包括驱动卸载、重装、Keil环境配置等关键步骤。针对设备管理器黄色感叹号、Keil识别异常等问题,提供从软件到硬件的终极修复指南,帮助开发者高效解决STLink连接问题。

sss66的博客 734

System.map文件详解

什么是System.map文件? System.map文件记录了所有符号的运行地址,这里的符号可以理解成函数名和变量。通过查看System.map文件可以帮助我们理解内核编译。System.map文件不是一层不变的,每次编译内核都会重新生成System.map文件。 System.map文件的作用 对计算机而言是没有符号这个概念的,只有0和1;但是我们比较容易理解的是函数名这样的符号,System.map文件就是计算机和人类在理解程序中的桥梁。当程序报错的时候,计算机会在堆栈信息里保存出错的内存地址,但

weixin_42031299的博客 5331

RK3576平台Buildroot嵌入式Linux镜像构建实战

嵌入式Linux镜像构建是连接硬件能力与软件功能的核心技术环节,其本质是基于目标SoC架构的交叉编译、内核定制与根文件系统集成过程。原理上依赖工具链适配、设备树绑定、分区镜像生成等关键步骤,技术价值在于实现轻量、确定、可复现的系统交付。典型应用场景涵盖ARM64开发板(如RK3576)、工业边缘网关及国产化信创终端。本文以TaishanPi-3为载体,深入解析Buildroot在RK3576平台上的配置裁剪、并行编译优化、genimage分区合成及update.img烧录准备,覆盖从环境选型(Ubuntu

weixin_36047538的博客 138

Skynet 框架面试题

本文整理了游戏服务端开发面试中 Skynet 框架的高频考点,涵盖底层架构、消息派发、协程调度、网络 I/O、harbor 跨机通信、内存管理、socket 处理、阻塞操作、错误处理等核心内容。全面覆盖 Skynet 框架的原理、使用和实战问题,追求深入准确,拒绝八股文。

小赖的博客 381

System.map文件的作用

有关System.map文件的信息好象很缺乏。其实它一点也不神秘,并且在整个事情当中它并不象看上去那么得重要。但是由于缺乏必要的文档说明,使其显得比较神秘。它就象耳垂,我们每个人都有,但却不知道是干什么用的。本网页就是用来说明这个问题的。 注意,我并不会是百分之一百正确的。例如,一个系统很可能没有/proc文件系统支持,但是大多数系统肯定有。这里我假定你是“随大流的”,并有...

weixin_34023982的博客 539

吃透 AM32 无人机电调:从源码架构到工作原理的全方位解析(附实践指南)(中)

介绍了三相电机控制中的SVPWM算法实现及保护机制设计。SVPWM部分详细解析了电压矢量扇区判断、占空比计算和过调制保护,通过限制占空比范围(0-100%)防止电机失控,并提供了完整的代码实现。保护模块则重点分析了过流、过压/欠压、过温三种保护机制,采用分级处理策略(硬保护停机/软保护降功率)确保系统安全。此外,文章还介绍了参数管理模块在STM32 Flash中的存储方案,包括参数定义、数据结构和读写操作,为电机控制系统提供了完整的解决方案。

bother3000的博客 1388

system.map文件

system.map文件记录了所有符号(函数名和变量)的运行地址,帮助我们理解内核编译。每次编译内核都会生成新的system.map文件。

wzx_numberone的博客 2422

如何使用JMeter进行大模型的压力测试?

使用JMeter进行大模型的压力测试,核心是通过模拟高并发请求,测试大模型在极限负载下的性能表现(如响应时间、吞吐量、错误率、资源瓶颈等)。通过以上步骤,可系统性评估大模型在高压下的性能极限,为优化模型(如量化、蒸馏)、扩容硬件(增加GPU)或调整接口限流策略提供数据依据。)、请求方式(POST)、认证方式(API Key放在Header)、请求参数(作用:避免瞬间高压压垮系统,更精准找到瓶颈点。等)、响应格式(同步/流式)。需获取:API地址(如。通过CSV文件引入不同。

alankuo的专栏 787

YF-S401水流量传感器在STM32上的精准计量实现

本文详细介绍了YF-S401水流量传感器与STM32微控制器的集成应用,实现精准水流计量。通过外部中断和外部时钟两种脉冲计数方案,结合硬件配置、软件滤波和校准技巧,确保高精度流量测量。适用于智能家居和工业自动化中的水控系统,提升系统稳定性和测量准确性。

rainy的博客 896

System.map解析

第一部分:System.map的作用 有关System.map文件的信息好象很缺乏。其实它一点也不神秘,并且在整个事情当中它并不象看上去那么得重要。但是由于缺乏必要的文档说明,使其显得比较神秘。它就象耳垂,我们每个人都有,但却不知道是干什么用的。注意,我并不会是百分之一百正确的。例如,一个系统很可能没有/proc文件系统支持,但是大多数系统肯定有。这里我假定你是“随大流的”,并有一个典型配置的系

wxie的Linux人生 2万+

【博文汇总】I2C总线学习

将这一周学习I2C总线的文章汇总一下。 基础知识学习 触发器的建立时间和保持时间 如何学习总线技术 TTL电平和CMOS电平 深入理解 关于I2C和SPI总线协议 I2C总线深入浅出 I2C总线信号时序总结 对I2C总线协议的一些理解 对I2C总线的时钟同步和总线仲裁的深入理解 I2C总线学习终结,开始SPI总线的学习 深入理解IIC总线时序

ce123的技术博客 6213

System.map文件的作用解析

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34080951的博客 506

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

system-map文件解析

System.map这个文件其实就是一个符号表,其主要的作用就是内核在出现问题时,方便研发人员来排查问题。 同时可以根据这个文件结合出错的PC指针的值来判断出问题的地方是内核里面的驱动还是动态加载的驱动。如果PC指针的值在System.map里面的地址范围内,就说明是内核里面的驱动出问题了。如果不在就说明是动态加载的驱动出问题了。 System.map文件里面,总共只有三列,每一列所表示的意思如下: 第一列:地址 第二列:符号类型 第三列:对应的符号(也就是函数名) 注:一个地址对应一个符号,一个符..

a3121772305的博客 1037

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

system.map文件解析

system.map文件可以帮助我们理解内核编译,它记录了所有代码的运行地址 内容格式为:线性地址 类型 符号 具体内容如下: 00100000 A phys_startup_32 c0100000 T startup_32 c0100000 A _te

科学边界 1816

Linux System.map解析

在Linux中,System.map文件是内核符号名称及其对应内存地址的映射表。它在内核构建过程中创建,并位于内核源代码树的根目录中(通常是/linux/System.map)。System.map文件由内核的崩溃转储分析工具和一些性能分析工具使用,以将内核地址映射到它们对应的符号名称。System.map文件是一个纯文本文件,对于每个符号,它包含三列信息:符号的虚拟地址、符号类型(函数、数据等)和符号名称。虚拟地址是符号所在内核内存中的位置。符号类型指示符号是函数、变量还是某种其他类型的数据。

weixin_39247141的博客 1502

转:System.map 解析

第一部分:System.map的作用 有关System.map文件的信息好象很缺乏。其实它一点也不神秘,并且在整个事情当中它并不象看上去那么得重要。但是由于缺乏必要的文档说明,使其显得比较神秘。它就象耳垂,我们每个人都有,但却不知道是干什么用的。注意,我并不会是百分之一百正确的。例如,一个系统很可能没有/proc文件系统支持,但是大多数系统肯定有。这里我假定你是“随大流的”,并有一个典型配置的系...

yijungu的专栏 386

Linux系统中System.map的解析

首先贴上一小段结果: #sudo cat /boot/System.map-4.2.0-23-generic |grep init_taskffffffff810b3290 T init_task_runnable_average ffffffff8113dc80 T ftrace_graph_init_task ffffffff8117a8a0 T perf_event_init_task f

DRLVROS的博客 1469

ctf-wiki 内核调试指南:System.map 符号表解析与 stripped vmlinux 符号恢复实战

本文是 ctf-wiki 中「Linux 内核调试分析环境搭建」章节([environment/readme.md](https://link.gitcode.com/i/1d7bdd3d44469581198f6e2acbe407c5))的组成部分。当 CTF 题目只给出被 stripped(剥离符号)的 `vmlinux` 时,`System.map` 是恢复函数名、变量名与内存地址映射的关键

gitblog_00003的博客 234

OpenCore Legacy Patcher 旧机型 macOS 升级指南

给 2015 年的 MacBook Air 装上 macOS Sonoma,苹果给出的回答是一行提示:这台电脑太旧,无法安装。OpenCore Legacy Patcher(OCLP)就是为这类被拒绝的机型做的 macOS 升级补丁工具,它移除新系统的硬件门槛,让旧 Mac 装上新系统重新成为可能。 ## 它到底做了什么 它能让你的设备(2008 年至 2017 年的 Intel Mac,Po

gitblog_00022的博客 533
上一篇: 如何理解设备树中address-cells和size-cells
下一篇: AM335X移植linux内核
不是很大锅
博客等级 码龄10年 34粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值