
你现在的错误提示没有显示完全,那个 ???????? 应该是中文输出。但是你的机器没显示出来。
------------
还是“ ???? ”???
你怎么编译的?开 X 图形,用支持中文的终端编译。
要么试试 export LANG=POSIX 再编译试试。
另外,你去你的内核代码目录看看有没有 version.h 这个文件,我记得改过一次位置。
或者你的编译命令行语法有问题。
我用前面的代码尝试编译了一下(我的内核是 i686 + 2.6.25 )
没有提示 version.h 的错误(当然有别的错误……版本差的太大,架构也不一样)
命令行: gcc gcc -DMODULE -O2 -g -Wall -I /usr/src/linux/include c.c
-------------------
#include 不是这么改的……
而且这个提示不是你的代码引用的 version.h ,而是你的代码引用的 header 文件的再引用。
而且这个提示根本就不是找不到你的 /usr/include/linux/version.h 文件而是你的交叉编译环境自带的 version.h !(/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/../../../arm-linux/sys-include/linux/module.h,也就是/usr/local/arm/2.95.3/lib/arm-linux/sys-include/linux/module.h)
你现在已经把编译环境搞混乱了。除非你现在用的是一台 arm CPU 的机器不然你这个编译肯定有错!
----------------------
看样子你的系统根本就没有编译 arm 代码的环境。
请你确定你到底想要干什么。想怎么干。有没有准备基础环境。
如果你刚开始学,请先补习相关的编译知识。
----------------------
你的编译环境有问题,建议干净安装一个新的系统。之后重新搭建一个编译环境。
编写驱动是一个事情,编译驱动是另一个事情。
建议你先看看编译的一些文章。
http://dirac.org/linux/writing/lkmpg/2.6/chinese/lkmpg_chs/#AEN148
这个链接是最简单的一个内核模块外加编译的说明,你看看吧。
你可以先在本机针对本机编译一下试试。
arm 是嵌入式设备的 CPU 架构,他与桌面的 x86 架构不兼容,你如果为这个架构编写驱动程序,必须使用 arm 编译架构进行编译。
交叉编译需要一套完整的环境,至少有 arm-linux-gcc 编译器,这个 gcc 可以编译出来 arm 可以运行的代码。一个配套的 make 编译控制环境,有的时候本机自带的 make 就能用。一个 libc 基础库。一般为 glibc ,但也有用 uclibc 的。一个 binutils 工具,还有一个已经为 arm 设置后且预编译的 kernel 。
假如通过“Free”查看内存几乎耗尽,但通过 top/ps 命令却看不出来用户态应用程序占用太多的内存空间, 那么内核模块可能发生了内存泄露
SLAB 是Linux内核中按照对象大小进行分配的内存分配器。
通过SLAB的信息来查看内核模块占用的内存空间:
方法1. 查看meminfo文件
方法2. 查看slabinfo文件
一般查看slabinfo文件就足以,如果发现slabinfo中占用内存过大,那基本可以断定,内核模块出现了内存泄露了
还有个命令 slabinfo 也是可以看,其实也是去读 /proc/slabinfo 后可视化出来
Linux内核的Kmemleak实现内存泄露检测
看看下面这个函数是哪里导致的内存泄漏呢?
一眼可能不容易看出上面的有什么问题,有kmalloc,有kfree 成对出现的。
问题正好出在 pr_debug 这个函数中的参数传递, 熟悉函数调用传参的人应该会知道编译器一般对参数的处理采用堆栈的方式,是一个先进后出的过程,这样参数的执行一般是逆序的(由于编译器实现的不同,这个过程不是确定的),这样kfree会在kmalloc之前运行,导致每次运行都会泄漏一点内存。
Resolving Memory Leaks In Linux Kernel
Slab Allocator
Proc Info
Using Crash Debugger
浅谈Linux网络故障的解决办法
Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络 *** 作系统。我告诉大家,Linux网络故障排除应当遵循先硬件后软件的方法。因为硬件如果出现物理损坏那么如何设定网络都不能解决故障。解决问题的方法可以从自身Linux计算机的网卡查起,然后到服务器、集线器、路由器等硬件。如果确定硬件没有问题了,再来考虑软件的设定。
1、检查网卡工作状况
(1)使用cat /proc/modules查看网卡的模块是否已被加载,驱动硬件是 *** 作系统最基本的功能, *** 作系统通过各种驱动程序来驾驭硬件设备,和Windows系统不同Linux内核目前采用可加载的模块化设计(LKMs Loadable Kernel Modules),就是将最基本的核心代码编译在内核中,而我们常见的驱动程序就是作为内核模块动态加载的,比如网卡驱动。Windows系统中我们一般“控制面板”的“设备管理器”查看硬件列表,在Linux中可以在命令行下输入:cat /proc/modules 即可显示Linux系统检测到的所有硬件设备。运行cat /proc/modules需要超级用户的权限,你可以使用su命令实现。
我Linux计算机中两块网卡模块:NE2000和8139已经加载。如果没有检测到硬件,用硬件检测程序Kuduz检测网卡,它和Windows中添加新硬件差不多。kudzu程序是通过查看/usr/share/hwdata/目录下的文件识别各种硬件设备的。如果核心支持该硬件,并且有该驱动程序就可自动装载。首先说明的是Linux下对网卡的支持往往是只对芯片的,所以对某些不是很著名的网卡,往往需要知道它的芯片型号以配置Linux.比如我的Top link网卡,就不存在Linux的驱动,但是因为它是NE2000兼容,所以把它当NE2000就可以在Linux下用了.所以当你有一块网卡不能用,在找Linux的驱动程序之前一定搞清楚这个网卡用的什么芯片,跟谁兼容,比如3c509,ne2000,etherexpress等等.这样的型号一般都在网卡上最大的一快芯片上印着,抄下来就是了。对于ISA接口的NE2000卡,先要作的一件事情,是将网卡设定为Jumpless模式.很多现在的网卡缺省都是PnP模式,这在Windows下的确能减少很多麻烦,但是Linux不支持,所以Linux下必须是Jumpless模式.一般所有网卡都有带的驱动盘和DOS下可执行的一个设定程序,用该程序将网卡设为 Jumpless。对于PCI网卡,可以使用如下命令来查看:less/proc/pci。在显示的列表中找到“Ethernet Controller”,记下厂商和型号。然后使用modprobe尝试加载正确的模块,比如modprobe 3c509。如果出现错误,说明该模块不存在。这时候你应该找到正确的模块并且重新编译。如果显示说该设备不存在,那也是因为没有正确的模块。找到正确的模块,并且编译,问题一般即可解决。
(2)使用Ifconfig-a命令检查网卡接口
如果已经检测到网卡,网卡硬件就没有问题,接下来检查网卡的软件设定。使用ifconfig -a命令:
第二块网卡没有分配IP地址,我们现在可以添加IP地址。以Redhat Linux 9.0为例。以root权限运行命令:neat出现图形化配置界面,然后添加IP地址后保存设置,从新启动网络和网络服务或计算机.
(4)编译网卡
如果Linux内核没有检测到网卡通常要重新安装网卡的驱动程序,网卡驱动程序安装方法步骤如下:
a、 编译并安装模块
b、 修改/etc/conf.module 文件
c、 修改/etc/sysconfig/network文件
d、 修改/etc/sysconfig/network-scripts/ifcfg-eth0 文件
e、 给网卡添加IP地址:打开网卡IP地址配置文件/etc/sysconfig/network-script/ifcfg-eh0.
e、然后用命令启动网络服务。
说明网卡问题:使用ifconfig来进行配置。如果运行ifconfig,将会给出所有已经安装了的网卡。如果没有显示可用的网卡,那么很有可能是以下原因之一:1. 网卡没有被Linux检测到2. 没有与之相应的内核模块3. 该模块没有被加载4. Linux系统不支持你的网卡。就现在来说,出现问题4的可能性很小,一般来说都是问题2和3,也可能是1。
Linux下无线网卡的安装:
目前经过认证的PCMCIA网卡有两大类。使用基于朗讯(Lucent)芯片组的PCIMCIA无线网卡和使用基于intersil PRISM2-based cards 芯片组的PCMCIA的无线网卡见表-1。不过由于基于intersil PRISM2-based cards 芯片组的PCMCIA的无线网卡价格比较便宜(相当于朗讯(Lucent)芯片组的PCIMCIA无线网卡的三分之一),所以国内的PCMCIA的无线网卡以后者居多。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)