我最近学习了如何编写简单的字符驱动程序,在玩弄代码时我注意到我收到了很多针对我的C99代码的以下GCC警告:warning:ISOC90forbidsmixeddeclarationsandcode我假设这是因为主Linux内核Makefile设置为使用非C99标准进行编译。我四处搜索,在stackoverflow上找到了这个答案:HowtousemakeandcompileasC99?所以我很自然地在我的Makefile中尝试了以下内容:ccflags-y:=-std=gnu99不幸的是,这并没有消除GCC警告。我检查了make的详细输出,并验证了GCC确实在最后附加了-std=gn
我读到Linux不支持线程或轻量级进程的概念,它认为内核线程与任何其他进程一样。然而,这个原则并没有很准确地反射(reflect)在代码中。我们看到保存进程状态信息的task_struct(如果错误请纠正我)以及附加到进程内核堆栈底部的thread_info。现在的问题是,当linux应该像任何其他进程一样解释线程时,为什么代码通过thread_info支持独立线程的概念?请让我知道我在这里遗漏了什么——我是linux内核开发的新手。 最佳答案 Linux中的线程被视为恰好共享某些资源的进程。每个线程都有自己的thread_info
我读到Linux不支持线程或轻量级进程的概念,它认为内核线程与任何其他进程一样。然而,这个原则并没有很准确地反射(reflect)在代码中。我们看到保存进程状态信息的task_struct(如果错误请纠正我)以及附加到进程内核堆栈底部的thread_info。现在的问题是,当linux应该像任何其他进程一样解释线程时,为什么代码通过thread_info支持独立线程的概念?请让我知道我在这里遗漏了什么——我是linux内核开发的新手。 最佳答案 Linux中的线程被视为恰好共享某些资源的进程。每个线程都有自己的thread_info
我在linux-2.6.26(linux-2.6.26/include/asm-alpha/atomic.h)中找到了这个,但不知道为什么在这里+0。#defineatomic_read(v)((v)->counter+0)#defineatomic64_read(v)((v)->counter+0) 最佳答案 如果未使用+0,它将是一个您可能会意外分配给它的左值,即if(atomic_read(v)=42){...}会“工作”...而不是+0你可以只使用一元+,即(+(v)->counter)但是+0在一般情况下比+有一个好的优势
我在linux-2.6.26(linux-2.6.26/include/asm-alpha/atomic.h)中找到了这个,但不知道为什么在这里+0。#defineatomic_read(v)((v)->counter+0)#defineatomic64_read(v)((v)->counter+0) 最佳答案 如果未使用+0,它将是一个您可能会意外分配给它的左值,即if(atomic_read(v)=42){...}会“工作”...而不是+0你可以只使用一元+,即(+(v)->counter)但是+0在一般情况下比+有一个好的优势
是否有任何实用程序显示我加载的模块的位置。 最佳答案 如果你想知道内核虚拟地址空间中模块的基本内存地址,可以在/proc/modules的最后一个字段中找到它;搜索有问题的模块:$grep'^ext3'/proc/modulesext31255131-Live0xf88ce000如果你想知道它加载的文件路径,原始路径实际上并没有存储在任何地方,但你可以让modprobe再次搜索模块并使用显示路径>modprobe-l:$/sbin/modprobe-lext3/lib/modules/2.6.18-194.el5PAE/kernel
是否有任何实用程序显示我加载的模块的位置。 最佳答案 如果你想知道内核虚拟地址空间中模块的基本内存地址,可以在/proc/modules的最后一个字段中找到它;搜索有问题的模块:$grep'^ext3'/proc/modulesext31255131-Live0xf88ce000如果你想知道它加载的文件路径,原始路径实际上并没有存储在任何地方,但你可以让modprobe再次搜索模块并使用显示路径>modprobe-l:$/sbin/modprobe-lext3/lib/modules/2.6.18-194.el5PAE/kernel
在从头开始编译Linux时,我发现编译时出现了编译代码。例如CC文件名、LD文件名、CC[M]文件名。这些代码是什么意思? 最佳答案 不同的标记说明如下[CC]-将C文件编译成指定的目标文件。目标文件包含该.c文件的体系结构汇编程序代码。因为它也可能引用其范围之外的部分。例如在另一个.c文件中调用另一个函数。函数调用在目标文件中保持打开状态,稍后由链接器包含。因此[LD]是将编译对象链接在一起的过程,并连接编译器未打开的函数调用。然而,许多部分被链接在一起作为内核的核心部分,而有些部分被排除在外。因此你会看到[CC(M)]用于编译为
在从头开始编译Linux时,我发现编译时出现了编译代码。例如CC文件名、LD文件名、CC[M]文件名。这些代码是什么意思? 最佳答案 不同的标记说明如下[CC]-将C文件编译成指定的目标文件。目标文件包含该.c文件的体系结构汇编程序代码。因为它也可能引用其范围之外的部分。例如在另一个.c文件中调用另一个函数。函数调用在目标文件中保持打开状态,稍后由链接器包含。因此[LD]是将编译对象链接在一起的过程,并连接编译器未打开的函数调用。然而,许多部分被链接在一起作为内核的核心部分,而有些部分被排除在外。因此你会看到[CC(M)]用于编译为
我的问题有点奇怪,但我会尽力解释。看看linux内核的语言,我得到了C和汇编,即使我读到一篇文章说[quote]Unix的第二次迭代完全用C编写[/quote]我认为这是误导,但当我说内核有汇编代码时,我得到了2个开头的问题内核中有哪些汇编文件,它们的用途是什么?汇编是依赖于架构的,所以linux如何安装在多个CPU架构上如果linux内核真的完全用C编写,那么它如何获得编译所需的GCC?我做了一个完整的find/-name*.s并在/usr/src/linux-headers-`uname-r/中的某处获得了一个汇编文件(asm-offset.s)不知何故,我认为这对GCC的工作没有