我对Linux内核代码中使用的语法有疑问.我对它的作用有直觉,但我想更正式地了解它.我正在使用内核v3.5.4
在文件/include/linux/sched.h中定义了以下内容
struct task_struct {
volatile long state;
//some more data members
};
Run Code Online (Sandbox Code Playgroud)
并在文件/include/linux/init_task.h文件中定义以下内容:
#define INIT_TASK(tsk) {
.state = 0, \
//some more initializations
}
Run Code Online (Sandbox Code Playgroud)
我对两件事感到困惑:
a)我觉得它用于初始化,但是任何人都可以为这种类型的结构初始化提出一些好的读数.
b)我不明白以下初始化是如何工作的.就像这个#define和相应的task_struct结构是如何相关的.
[编辑]我也注意到以下事项:c)是否\在必要的每一行的末尾.
d)内核doe的许多部分都包含在内#ifdef #endif.如果要初始化包含在其中的数据成员,#ifdef #endif我们可以使用这种形式的初始化.我的意思是我们可以像这样使用#ifdef #endif内部INIT_TASK()
#define INIT_TASK(tsk) {
.state = 0, \
//some more initializations
#ifdef CX
.tickets = 5, \
#endif
}
Run Code Online (Sandbox Code Playgroud) 在下面的代码片段中,我试图printf()在代码中尝试打印出input[i]计算结果,以便我可以看到它正常工作.
但这并不像我希望的那样有效,因为引号printf()与内核的字符串格式相混淆,导致整个程序无法编译.我已经尝试使用转义字符\",它允许我输入内核的字符串但是在编译时给出了预期的表达式和缺少的字符错误.
有谁知道如何解决这个问题?这是检查内核代码结果的最佳方法吗?
const char *KernelSource = "\n"
"__kernel void relax( \n"
" __global double* input, \n"
" __global double* output, \n"
" __global int N) \n"
"{ \n"
" int i = get_global_id(0); \n"
" if(i > 0 && i < N-1){ \n"
" input[i] = 0.25*input[i-1]+0.5*input[i]+0.25*input[i+1]; \n"
" printf("input[%d] %f \n", i, input[i] )\n"
" } \n"
"} \n"
"\n";
Run Code Online (Sandbox Code Playgroud) 我已经包含了主机程序的主要部分,我怀疑这里不正确:
我的指针还不是很好,并且认为我可能错误地分配了一些变量.
这是内核程序,它应该让我知道我的程序正在尝试做什么:
const char *KernelSource = "\n"
"__kernel void sumElements( \n"
" __global float* input, \n"
" __global float output, \n"
" __global int N) \n"
"{ \n"
" int i = get_global_id(0); \n"
" if(i < N) \n"
" output += input[i]; \n"
"} \n"
"\n";
Run Code Online (Sandbox Code Playgroud)
也许这会导致错误,因为我从未尝试过SIMT写入一个变量,如上所述.有可能做这样的事吗?我需要得到数组中所有元素的总和.
在很多标准的开源代码中,我在不同的地方看到使用不同的指针类型,如:
uint32 fooHash (uint8 *str, uint32 len)
Run Code Online (Sandbox Code Playgroud)
我没有得到以下内容: - 为什么要将int声明为uint32,uint8?所有这些都将在用户空间本身运行,那么为什么不留下自己呢?以后便携性不是一个问题吗?
我目前正在做一个关于操作系统的课程.
我知道内核是操作系统的核心部分,它充当用户应用程序和计算机(如CPU)的数据处理元件之间的桥梁.
为什么我们需要驱动程序(例如触摸板驱动程序),内核是否控制所有计算机硬件?
我想知道如何仅在C中打印整数值为0.
而我在内核空间,想在内核模块中打印一些值.
就像if a是32位整数那样
int a = 14
然后输出将是这样的
value of a = 0x0000000e
在十六进制中.
提前致谢.
我设法做objcopy来查看和提取.rodata段内容作为不可变完整性检查的引用,但是,我意识到内核驱动程序无法读取文件.从这个意义上说,我们如何编写驱动程序来确定它在运行时的自身完整性?
一些示例代码来制作一些插图会很好.
我运行这个命令:
sudo dkms autoinstall -k 3.11.6-1-ARCH
Run Code Online (Sandbox Code Playgroud)
并有错误:
Error! echo
Your kernel headers for kernel 3.11.6-1-ARCH cannot be found at
/usr/lib/modules/3.11.6-1-ARCH/build or /usr/lib/modules/3.11.6-1-ARCH/source.
Error! echo
Your kernel headers for kernel 3.11.6-1-ARCH cannot be found at
/usr/lib/modules/3.11.6-1-ARCH/build or /usr/lib/modules/3.11.6-1-ARCH/source.
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
有趣的是,我在网上找不到任何简单的例子.你能分享一个简单的例子吗?我试图通过分析一个例子来理解以下内容.
? Typically,
? a number associated with each system call
? Number used as an index to a table: System Call table
? Table keeps addresses of system calls (routines)
? System call runs and returns
? Caller does not know system call implementation
? Just knows interface
Run Code Online (Sandbox Code Playgroud)