【发布时间】:2012-02-29 04:17:39
【问题描述】:
为特定信号指定了用户定义的处理函数。收到此信号后,将调用处理函数。处理程序函数是在用户空间还是内核空间中运行? 或者通常在用户空间或内核空间中执行任何信号的操作?
【问题讨论】:
为特定信号指定了用户定义的处理函数。收到此信号后,将调用处理函数。处理程序函数是在用户空间还是内核空间中运行? 或者通常在用户空间或内核空间中执行任何信号的操作?
【问题讨论】:
处理程序运行在用户空间,只能访问进程的虚拟地址空间。
当然,C 标准本身对“用户”和“内核”一无所知。
【讨论】:
信号处理程序必须在用户空间中运行。如果它们在内核空间中运行,它们可以访问整个机器中的任何东西(因为内核可以控制所有进程)。因此,恶意程序可以很容易地破坏其他程序的内存、窃取数据,或者更糟糕的是,只需向自己发送信号。
【讨论】:
一般来说,信号是在用户空间中执行的。然而,由于 C 语言标准实际上并没有定义用户空间和内核空间之间的分离,因此可以想象,可能有 C 语言实现不是这种情况。
但是请注意,在 Windows 和所有风格的 Unix 中,信号保证在用户空间中运行。
【讨论】:
signal() 和raise() 函数,以及信号SIGABRT、SIGFPE、SIGILL、SIGINT、SIGSEGV和SIGTERM。
内核可以向用户空间发送信号,但反之不行,要发送的数据量非常有限,信号处理程序在用户空间中运行。
解释:
为了能够从内核空间向用户空间发送信号,内核需要知道用户空间进程的pid。内核模块一收到 pid,就会查找相应的进程描述符,并向其发送信号。所有与信号相关的信息都保存在struct siginfo中。
用户空间进程向内核注册一个信号处理函数。这会将信号处理函数的地址添加到进程描述符中。每次传递特定信号时都会执行此函数。
【讨论】: