【问题标题】:linux-kernel {{ adding sys-calls : testing from user space : data/printk issue }}linux-kernel {{ 添加系统调用:从用户空间测试:数据/printk 问题}}
【发布时间】:2013-03-09 20:26:55
【问题描述】:

好的,所以我已经成功地向内核空间添加了一些系统调用。目前我已经将他们的主要意图注释掉了,我想确保数据成功地从用户空间传递到内核空间并按预期进行。我目前遇到一个问题,将用户空间中的变量声明为 unsigned long,当它通过 printk 打印时,值不一样。我已经查看了有关该主题的其他问题,这些问题似乎相关并且没有帮助,我认为人们只是使用 printk 错误。我之前用内核空间测试过这个,只打印一个字符串,一切都很好,所以我添加了从用户空间传递的数据并遇到了这个问题,所以......

用户空间:

#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <linux/kernel.h>
#include <sys/syscall.h>

#define __NR_createQueue 350

long createQueue_syscall(unsigned long id){
     return syscall(__NR_createQueue);
}

int main(int argc, char *argv[]){
     unsigned long qid = 47;  // ID for a queue

     createQueue_syscall(qid);
     return 0;
}

内核空间:

#include linux/kernel.h  

asmlinkage long createQueue(unsigned long id){

  printk("  The queue ID is: %lu \n", id);

  return 0;
}

所有编译都很好,没有警告或错误。但是当我运行:dmesg | tail -20 时,我得到一个像 1334886164 这样的值,而不是我期待的 47。 (是的,我完成了所有makemake module_install installreboot 等所需的操作)。就好像它正在抓取垃圾/过度运行内存或其他东西。但我不知所措。有什么想法/想法吗?

Many Thanks!

【问题讨论】:

  • 一个在用户空间一个在内核空间,所以我的意思是没关系? “ id ”只是一些无符号长的占位符......
  • 因为我正在测试传递给内核空间的数据是否被正确处理,所以我正在打印到内核日志以确保它是正确的值。我不想引起内核恐慌等。有注释,一个在内核空间,另一个在用户空间。
  • 内核空间系统调用中也应该有一个 return 0 但这与问题无关....
  • qid 是一个模拟用户/程序输入的值,它被传递给一个系统调用,该系统调用将无符号 long 作为参数。
  • 我没有传递 ID,ID 在系统调用定义的签名中。这是我实现的自定义系统调用。它需要一个无符号长作为一个参数。上面是系统调用的调用,下面是系统调用的定义。

标签: linux-kernel printk


【解决方案1】:

你需要把函数改成:

long createQueue_syscall(unsigned long id){

    return syscall(__NR_createQueue, id); /* note the additional parameter */

}

我猜 id 没有通过,因此被分配了一些随机整数。

【讨论】:

    猜你喜欢
    • 2017-12-10
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多