簡體   English   中英

put_user()linux內核

[英]put_user() linux kernel

put_user(message[i], buf+i); 如何從用戶空間訪問消息?

我真的不明白從哪里訪問字符串消息以及我可以用它做什么?

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);

在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;
    }

當進程調用ptrace(2)並要求執行PTRACE_PEEKUSR ,內核需要將信息( ret )返回給用戶。 內核使用datap指針指向用戶提供的緩沖區,以了解在進程中寫入tmp值的位置。

幾乎所有調用put_user()都將由userland進程啟動。 向用戶空間發送信號是一個明顯的區別,內核啟動發送信號,但內核有代碼(參見arch/x86/kernel/signal.c函數__setup_frame() )來查找堆棧幀並寫入需要處理一個信號。

所以,經過冗長的討論:你將通過你給內核寫入的任何緩沖區來訪問你的進程中的數據 - 它可能是一個特定於驅動程序的ioctl(2)的緩沖區,它可能是一個緩沖區對於您創建的新系統調用的參數,您有很多選擇。

put_user (x, ptr) 這里x是要復制到用戶空間的值,而ptr是用戶空間中的目標地址。

因此在用戶應用程序中,消息可以通過buf+i訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM