【问题标题】:How to declare global variables used by all the kernel code in kernel area?如何在内核区声明所有内核代码使用的全局变量?
【发布时间】:2013-11-08 14:23:31
【问题描述】:

我正在学习如何创建自定义系统调用并实现将 ptr 字符指针作为参数的代码 (save.c),然后将 ptr 指向的字符串复制到 sys_mybuf。实现将ptr char 指针作为参数的代码(load.c),然后将sys_mybuf 中的字符串复制到ptr 指向的缓冲区中。所以,我期待以下代码。但这似乎不起作用。我希望所有内核系统调用代码都使用 char 数组。我该怎么办?

保存.c

  1 #include <linux/kernel.h>
  2 #define STRING__SIZE 501
  3 char sys_mybuf[STRING__SIZE]; // a string of at most size 500.
  4 asmlinkage int sys_save(char* ptr)
  5 {
  6     int index = 0;

 17 
 18     ptr[index] = '\0';
 19     return index; // the number of bytes actually read.
 20 }

加载.c

  1 #include <linux/kernel.h>
  2 // extern
  3 asmlinkage int sys_load(char* ptr)

 17     ptr[index] = '\0';
 18     return index;
 19 }

~

【问题讨论】:

  • 怎么不起作用?你真的没有对变量进行外部声明吗? load.c?
  • gcc 告诉我 sys_mybuf 在 load.c 中未声明
  • this 适合我吗?

标签: c kernel system-calls


【解决方案1】:

正如我在评论中猜到的那样。问题只是您没有声明文件load.c中的变量。

如需快速解决方案,请将以下几行添加到load.c

#define STRING__SIZE 501
extern char sys_mybuf[STRING__SIZE];

这告诉编译器sys_mybuf 是在另一个翻译单元(例如源文件)中声明的全局变量。

真正应该做的就是把它放在一个头文件中,并在所有需要访问全局数据的文件中包含这个头文件。

【讨论】:

  • 与问题完全无关,但可能会给您带来一些麻烦:sys_mybuf[STRING__SIZE] = '\0';,这里STRING__SIZE 在缓冲区之外。
  • @NoWiS 没有深入研究代码,但是是的,这是一个会导致未定义行为的错误。
  • 我还有一个问题。我们可以说sys_mybuf 在内核区吗?
  • @inherithandle 是的,它在内核空间中。用户空间应用程序将无法访问它。
猜你喜欢
  • 2023-03-23
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 2021-10-18
  • 2014-01-17
  • 2019-07-26
  • 1970-01-01
相关资源
最近更新 更多