在Linux内核中单独编译KO文件

转载地址:http://blog.youkuaiyun.com/suntao222/article/details/7457886

在当前模块目录下创建Makefile: obj-m := mxt224.o

然后再该模块目录下打开终端输入:make -C /home/kernel_path/ M=$(pwd) modules

/home/kernel_path/ 是内核所在路径

或者用该makefile:

[plain]  view plain  copy
  1. #set KERNELDIR and CROSS_COMPILE path yourself  
  2. #  
  3. ifneq   ($(KERNELRELEASE),)   
  4.  obj-m   :=   mxt224.o  
  5. else   
  6.  KERNELDIR   :=   /home/stone/stone_share/Project/t11/t11-2.3/kernel  
  7.  #KERNELDIR   :=   /home/bee/bee_share/mini6410/linux-2.6.36-android/linux-2.6.36-android  
  8.  #KERNELDIR   :=   /opt/mini6440/linux/linux-2.6.36  
  9.  PWD   :=   $(shell pwd)  
  10.  #CROSS_ARCH := ARCH=arm CROSS_COMPILE=/usr/local/arm/4.5.1/bin/arm-linux- #6410-linux-2.6.36  
  11.  CROSS_ARCH := ARCH=arm CROSS_COMPILE=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-  
  12. default:   
  13.  $(MAKE) $(CROSS_ARCH) -C  $(KERNELDIR)   M=$(PWD)   modules   
  14.   
  15. install:   
  16.  $(MAKE)  $(CROSS_ARCH) -C  $(KERNELDIR)   M=$(PWD)   modules_install   
  17. clean:   
  18.  rm   -rf   *.o   *~   core   .depend   .*.cmd   *.ko   *.mod.c   .tmp_versions *.symvers *.d *.markers *.order  
  19.   
  20. .PHONY:   modules   modules_install   clean  main  
  21. endif  
<think>我们正在处理一个关于在Linux系统中单独编译usbmon模块并生成.ko文件的问题。usbmon是Linux内核中的一个模块,用于监控USB总线上的通信。通常,我们不需要单独编译它,因为它包含在内核源码树中。但是,如果用户希望单独编译,我们可以通过以下步骤实现。 注意:单独编译内核模块需要对应内核版本的源码和编译环境。 步骤: 1. **安装必要的工具和内核文件**:确保系统安装了编译内核模块所需的工具和当前运行内核内核文件。 - 在基于Debian的系统(如Ubuntu)上,可以运行: ```bash sudo apt update sudo apt install build-essential linux-headers-$(uname -r) ``` 2. **获取内核源码**:我们需要获取与当前运行内核版本一致的内核源码。如果已经安装了`linux-headers`包,那么头文件通常位于`/usr/src/linux-headers-$(uname -r)`,但这可能不包含完整的源码。为了编译模块,我们通常需要完整的源码树。 如果用户没有内核源码,可以从发行版的仓库中获取,或者从kernel.org下载。但最简单的方法是使用发行版提供的源码包。 例如,在Ubuntu上,可以安装: ```bash sudo apt install linux-source ``` 然后解压到`/usr/src/`下。 注意:确保源码版本与当前内核版本一致(使用`uname -r`查看)。 3. **定位usbmon模块源码**:usbmon的源码位于内核源码树的`drivers/usb/mon`目录下。 4. **创建Makefile**:在模块源码目录中,需要创建一个Makefile来编译模块。由于内核模块的编译通常依赖于内核构建系统,我们可以编写一个简单的Makefile来调用内核的构建系统。 在`drivers/usb/mon`目录下(或者我们可以将`mon`目录复制到一个独立的工作目录),创建一个Makefile,内容如下: ```makefile obj-m := usbmon.o usbmon-y := mon_main.o mon_stat.o mon_text.o mon_bin.o KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules ``` 这里,`obj-m`指定了模块名称(usbmon.ko),`usbmon-y`指定了构成该模块的源文件。 注意:上述源文件列表(mon_main.o等)可能随着内核版本变化而变化,请根据实际源码文件调整。 5. **编译**:在包含Makefile和源码的目录下运行`make`命令。这将生成`usbmon.ko`文件。 6. **加载模块**:编译完成后,可以使用`insmod usbmon.ko`加载模块。但请注意,通常我们使用`modprobe usbmon`来加载,因为它会处理依赖关系。单独编译的模块可能需要手动解决依赖。 注意:由于内核模块与内核版本紧密相关,单独编译的模块必须针对当前运行的内核版本,否则可能无法加载。 另外,如果用户只是想使用usbmon,通常可以通过`modprobe usbmon`加载,而不需要单独编译。如果系统没有编译该模块,可能是因为内核配置中没有启用,此时需要重新配置内核编译整个内核或模块。 但是,如果用户确实需要单独编译usbmon模块,以上步骤提供了一个方法。 考虑到用户可能只是想使用usbmon,我们可以先建议尝试加载现有模块: ```bash sudo modprobe usbmon ``` 如果模块不存在,再考虑编译。 如果用户需要编译,请确保内核配置中启用了`CONFIG_USB_MON`(通常设置为`m`表示模块)。如果内核源码中没有配置,可能需要先配置内核(使用`make menuconfig`等),在USB support下启用USB Monitor (usbmon) support。 以上步骤仅供参考,实际编译环境可能因系统而异。 相关问题: 1. 如何检查当前内核是否支持usbmon模块? 2. 加载usbmon模块后,如何使用它来监控USB设备? 3. 在编译内核模块时遇到版本不兼容的问题该如何解决?</think>### 在 Linux单独编译 usbmon 模块为 .ko 文件 #### 步骤详解 1. **准备内核源码** 确保已安装与当前内核版本完全匹配的源码: ```bash # 查看当前内核版本 uname -r # 安装对应源码(以 Ubuntu 为例) sudo apt install linux-source-$(uname -r) # 解压源码 tar -xvf /usr/src/linux-source-*.tar.xz cd linux-source-*/ ``` 2. **配置内核编译选项** 启用 USB 监控模块: ```bash # 复制当前内核配置 cp /boot/config-$(uname -r) .config # 启用 USB_MON 模块 make menuconfig ``` 导航至: `Device Drivers → USB support → USB Monitor (usbmon) support` → 设为 **`<M>`** (编译为模块) 3. **单独编译 usbmon 模块** 使用内核构建系统指定编译目标: ```bash # 生成依赖文件 make prepare make modules_prepare # 仅编译 usbmon 模块 make M=drivers/usb/mon ``` 生成的 .ko 文件路径: `drivers/usb/mon/usbmon.ko` 4. **验证模块兼容性** 检查模块与当前内核的版本签名: ```bash modinfo drivers/usb/mon/usbmon.ko | grep vermagic # 输出应与 uname -r 完全一致 ``` 5. **加载使用模块** ```bash sudo insmod drivers/usb/mon/usbmon.ko # 验证加载 lsmod | grep usbmon ``` #### 关键注意事项 1. **内核版本匹配** 源码版本必须与运行内核严格一致,否则会导致模块加载失败(`Invalid module format`)。 2. **内核文件依赖** 若缺少开发包会报错,需安装: ```bash sudo apt install linux-headers-$(uname -r) ``` 3. **安全操作建议** - 在虚拟机中操作以避免主机崩溃风险 - 备份重要数据(内核操作可能引发系统不稳定)[^1] 4. **替代方案** 若编译失败,可直接加载内置模块(若已启用): ```bash sudo modprobe usbmon ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值