在Linux内核中,.data和.long的含义是什么?

时间:2013-06-08 03:13:03

标签: kernel

.data
  ENTRY(sys_call_table)
    .long SYMBOL_NAME(sys_ni_call)           /* 0 */
    .long SYMBOL_NAME(sys_exit)
    .long SYMBOL_NAME(sys_fork)
    ...
    .long SYMBOL_NAME(sys_vfork)             /* 190 */

我读了这个源代码。我在源代码中找不到.data.long定义。

1 个答案:

答案 0 :(得分:3)

它们是assembler directives - 汇编程序的特殊指示,指示它执行不同的操作,而不是将处理器指令插入已编译的机器代码中。

.data directive告诉汇编器将以下指令发送到可执行文件的data部分的一个子部分的末尾。通常,机器代码被发送到可执行文件的所谓text部分,而诸如全局变量之类的非可执行数据存储在所谓的data部分之一中。不同的部分在运行时具有不同的内存权限,以及其他功能。

.long指令等同于.int directive,它只是将一个文字数值插入到机器代码中。因此.long SYMBOL_NAME(sys_ni_call)会插入sys_ni_call符号位置的数值。

因此,将.data指令后跟.long指令放在一起会导致汇编程序将特定的整数值放入生成的目标代码的data部分之一。这些值将是不可执行的,它们可能是只读的或读写的,具体取决于sys_call_table部分的data子部分的权限配置。