put_user()linux内核

Paw*_*wan 4 linux kernel linux-kernel

在做了put_user(message[i], buf+i); 如何从用户空间访问消息?

我真的不明白从哪里访问字符串消息以及我可以用它做什么?

sar*_*old 7

put_user() 只应在进行系统调用的进程的上下文中调用.

考虑一个应用程序调用ptrace(2)(请参阅kernel/ptrace.c).

内核将调用特定于体系结构的ptrace帮助程序:

SYSCALL_DEFINE4(ptrace, long, request, long, pid, unsigned long, addr,
            unsigned long, data) 
{
    /* arch-independent code */
    /* ... */
    ret = arch_ptrace(child, request, addr, data);
Run Code Online (Sandbox Code Playgroud)

在x86平台上,arch_ptrace()定义arch/x86/kernel/ptrace.c如下:

long arch_ptrace(struct task_struct *child, long request,
             unsigned long addr, unsigned long data)
{
    int ret;
    unsigned long __user *datap = (unsigned long __user *)data;

    switch (request) {
    /* read the word at location addr in the USER area. */
    case PTRACE_PEEKUSR: {
            unsigned long tmp;

            ret = -EIO;
            if ((addr & (sizeof(data) - 1)) || addr >= sizeof(struct user))
                    break;

            tmp = 0;  /* Default return condition */
            if (addr < sizeof(struct user_regs_struct))
                    tmp = getreg(child, addr);
            else if (addr >= offsetof(struct user, u_debugreg[0]) &&
                     addr <= offsetof(struct user, u_debugreg[7])) {
                    addr -= offsetof(struct user, u_debugreg[0]);
                    tmp = ptrace_get_debugreg(child, addr / sizeof(data));
            }
            ret = put_user(tmp, datap);
            break;
    }
Run Code Online (Sandbox Code Playgroud)

当进程调用ptrace(2)并要求执行a时PTRACE_PEEKUSR,内核需要将information(ret)返回给用户.内核使用datap指向用户提供的缓冲区的指针来知道在进程中写入值的位置tmp.

几乎所有的呼叫put_user()都将由用户进程启动.向用户空间发送信号是一个明显的区别,内核启动发送信号,但内核有代码(参见arch/x86/kernel/signal.c函数__setup_frame())来查找堆栈帧并写入处理信号的需要.

所以,经过冗长的讨论:你将通过你给内核写入的任何缓冲区来访问你的进程中的数据- 它可能是一个特定于驱动程序的缓冲区ioctl(2),它可能是一个新的缓冲区参数系统调用你创建,你有很多选择.


Zel*_*luX 5

put_user (x, ptr). 这里x是复制到用户空间的值,ptr而是用户空间中的目标地址。

因此,在用户应用程序中,可以通过buf+i.