1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Linux 内核模块ko在内核源码外部编译的方法

Linux 内核模块ko在内核源码外部编译的方法

时间:2018-05-15 10:25:53

相关推荐

Linux 内核模块ko在内核源码外部编译的方法

前言

默认Linux 内核驱动,可以模块编译为*.ko文件,不编译进内核

默认开发Linux 内核驱动,驱动一般放在Linux 内核源码中,如drivers目录

本篇尝试在 Linux kernel 源码外部编译 Linux 内核驱动模块

开发环境

Win10 64 位 + VMware Workstation Pro 16

虚拟机 安装 ubuntu 20.04

内核驱动运行于:ARM 平台 qemu vexpress-a9

hello 内核驱动

#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>static int __init hello_init(void){printk(KERN_INFO "%s : enter\n", __func__);return 0;}static void __exit hello_exit(void){printk(KERN_INFO "%s : enter\n", __func__);}module_init(hello_init);module_exit(hello_exit);MODULE_AUTHOR("zhangsz");MODULE_DESCRIPTION("hello");MODULE_LICENSE("GPL");

Makefile 文件

因为要运行在 ARM vexpress-a9 平台 的qemu 中,所以Linux 驱动编译需要使用交叉编译

obj-m :=hello.oKERN_DIR := /home/rtt/linux/kernel/linux-6.1.3CUR_DIR := $(shell pwd)all:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KERN_DIR) M=$(CUR_DIR) modulesclean:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KERN_DIR) M=$(CUR_DIR) clean

注意虽然在 Linux kernel 源码外部编译,依旧需要存在Linux kernel 的源码,make -C 可以制定 Linux kernel 源码目录

我当前的Linux kernel 目录为:KERN_DIR := /home/rtt/linux/kernel/linux-6.1.3

make 编译

rtt@ubuntu:/mnt/hgfs/tools/linux/codes/hello$ lshello.c Makefilertt@ubuntu:/mnt/hgfs/tools/linux/codes/hello$ makemake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C /home/rtt/linux/kernel/linux-6.1.3 M=/mnt/hgfs/tools/linux/codes/hello modulesmake[1]: Entering directory '/home/rtt/linux/kernel/linux-6.1.3'CC [M] /mnt/hgfs/tools/linux/codes/hello/hello.omake[2]: Warning: File '/mnt/hgfs/tools/linux/codes/hello/modules.order' has modification time 0.58 s in the futureMODPOST /mnt/hgfs/tools/linux/codes/hello/Module.symversmake[2]: warning: Clock skew detected. Your build may be incomplete.make[2]: Warning: File '/mnt/hgfs/tools/linux/codes/hello/hello.o' has modification time 0.56 s in the futureCC [M] /mnt/hgfs/tools/linux/codes/hello/hello.mod.oLD [M] /mnt/hgfs/tools/linux/codes/hello/hello.komake[2]: warning: Clock skew detected. Your build may be incomplete.make[1]: Leaving directory '/home/rtt/linux/kernel/linux-6.1.3'rtt@ubuntu:/mnt/hgfs/tools/linux/codes/hello$ lshello.c hello.ko hello.mod hello.mod.c hello.mod.o hello.o Makefile modules.order Module.symvers

运行

编译的产物:hello.ko,由于使用的交叉编译工具编译的,所以在 ubuntu 上直接sudo insmod hello.ko是无法工作的

需要把hello.ko拷贝到 qemu 的 根文件系统中,然后运行 qemu

启动 qemu,主要这里的/dev/sdb2为 存放 qemu 根文件系统的分区

sudo qemu-system-arm -M vexpress-a9 -m 512M -dtb vexpress-v2p-ca9.dtb -kernel zImage -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd /dev/sdb2

rtt@ubuntu:~/linux/qemu$ lsboot_qemu.sh create_rootfs.sh make_boot.sh rootfs_0112 vexpress-v2p-ca9.dtb zImagertt@ubuntu:~/linux/qemu$ sudo qemu-system-arm -M vexpress-a9 -m 512M -dtb vexpress-v2p-ca9.dtb -kernel zImage -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd /dev/sdb2[sudo] password for rtt:WARNING: Image format was not specified for '/dev/sdb2' and probing guessed raw.Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.Specify the 'raw' format explicitly to remove the restrictions.Booting Linux on physical CPU 0x0Linux version 6.1.3 (rtt@ubuntu) (arm-linux-gnueabihf-gcc (GCC) 13.0.0 1001 (experimental) [master revision 5299155bb80e90df822e1eebc9f9a0c8e4505a46], GNU ld (Linaro_Binutils-.10) 2.39.50.1001) #1 SMP Wed Jan 11 17:26:26 PST CPU: ARMv7 Processor [410fc090] revision 0 (ARMv7), cr=10c5387dCPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cacheOF: fdt: Machine model: V2P-CA9Memory policy: Data cache writebackReserved memory: created DMA memory pool at 0x4c000000, size 8 MiBOF: reserved mem: initialized node vram@4c000000, compatible id shared-dma-poolcma: Reserved 16 MiB at 0x7f000000Zone ranges:Normal [mem 0x0000000060000000-0x000000007fffffff]Movable zone start for each nodeEarly memory node rangesnode 0: [mem 0x0000000060000000-0x000000007fffffff]Initmem setup node 0 [mem 0x0000000060000000-0x000000007fffffff]CPU: All CPU(s) started in SVC mode.percpu: Embedded 15 pages/cpu s30612 r8192 d22636 u61440Built 1 zonelists, mobility grouping on. Total pages: 130048Kernel command line: root=/dev/mmcblk0 rw console=ttyAMA0printk: log_buf_len individual max cpu contribution: 4096 bytesprintk: log_buf_len total cpu_extra contributions: 12288 bytesprintk: log_buf_len min size: 16384 bytesprintk: log_buf_len: 32768 bytesprintk: early log buf free: 14896(90%)Dentry cache hash table entries: 65536 (order: 6, 262144 bytes, linear)Inode-cache hash table entries: 32768 (order: 5, 131072 bytes, linear)mem auto-init: stack:all(zero), heap alloc:off, heap free:offMemory: 489776K/524288K available (8192K kernel code, 643K rwdata, 1860K rodata, 1024K init, 180K bss, 18128K reserved, 16384K cma-reserved)SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1trace event string verifier disabledrcu: Hierarchical RCU implementation.rcu: RCU event tracing is enabled.rcu: RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=4.rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16GIC CPU mask not found - kernel will fail to boot.GIC CPU mask not found - kernel will fail to boot.L2C: platform modifies aux control register: 0x0000 -> 0x02420000L2C: DT/platform modifies aux control register: 0x0000 -> 0x02420000L2C-310 enabling early BRESP for Cortex-A9L2C-310 full line of zeros enabled for Cortex-A9L2C-310 dynamic clock gating disabled, standby mode disabledL2C-310 cache controller enabled, 8 ways, 128 kBL2C-310: CACHE_ID 0x410000c8, AUX_CTRL 0x46420001rcu: srcu_init: Setting srcu_struct sizes based on contention.sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 89478484971nsclocksource: arm,sp804: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 1911260446275 nssmp_twd: clock not found -2Console: colour dummy device 80x30Calibrating local timer... 96.14MHz.Calibrating delay loop... 875.72 BogoMIPS (lpj=4378624)pid_max: default: 32768 minimum: 301Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)CPU: Testing write buffer coherency: okCPU0: Spectre v2: using BPIALL workaroundCPU0: thread -1, cpu 0, socket 0, mpidr 80000000Setting up static identity map for 0x60100000 - 0x60100060rcu: Hierarchical SRCU implementation.rcu: Max phase no-delay instances is 1000.smp: Bringing up secondary CPUs ...smp: Brought up 1 node, 1 CPUSMP: Total of 1 processors activated (875.72 BogoMIPS).CPU: All CPU(s) started in SVC mode.devtmpfs: initializedVFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 0clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 nsfutex hash table entries: 1024 (order: 4, 65536 bytes, linear)NET: Registered PF_NETLINK/PF_ROUTE protocol familyDMA: preallocated 256 KiB pool for atomic coherent allocationscpuidle: using governor ladderhw-breakpoint: debug architecture 0x4 unsupported.Serial: AMBA PL011 UART driverSCSI subsystem initializedusbcore: registered new interface driver usbfsusbcore: registered new interface driver hubusbcore: registered new device driver usbi2c 0-0039: Fixing up cyclic dependency with 1001f000.clcdi2c 0-0039: Fixing up cyclic dependency with 10020000.clcdpps_core: LinuxPPS API ver. 1 registeredpps_core: Software ver. 5.3.6 - Copyright - Rodolfo Giometti <giometti@linux.it>PTP clock support registeredAdvanced Linux Sound Architecture Driver Initialized.clocksource: Switched to clocksource arm,sp804NET: Registered PF_INET protocol familyIP idents hash table entries: 8192 (order: 4, 65536 bytes, linear)tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 4096 bytes, linear)Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)TCP established hash table entries: 4096 (order: 2, 16384 bytes, linear)TCP bind hash table entries: 4096 (order: 4, 65536 bytes, linear)TCP: Hash tables configured (established 4096 bind 4096)UDP hash table entries: 256 (order: 1, 8192 bytes, linear)UDP-Lite hash table entries: 256 (order: 1, 8192 bytes, linear)NET: Registered PF_UNIX/PF_LOCAL protocol familyRPC: Registered named UNIX socket transport module.RPC: Registered udp transport module.RPC: Registered tcp transport module.RPC: Registered tcp NFSv4.1 backchannel transport module.hw perfevents: enabled with armv7_cortex_a9 PMU driver, 5 counters availableworkingset: timestamp_bits=30 max_order=17 bucket_order=0squashfs: version 4.0 (/01/31) Phillip Lougherjffs2: version 2.2. (NAND) © 2001- Red Hat, Inc.9p: Installing v9fs 9p2000 file system supportio scheduler mq-deadline registeredio scheduler kyber registeredOF: graph: no port node found in /bus@40000000/motherboard-bus@40000000/iofpga@7,00000000/i2c@16000/dvi-transmitter@60sii902x 0-0060: supply iovcc not found, using dummy regulatorsii902x 0-0060: supply cvcc12 not found, using dummy regulatorphysmap-flash 40000000.flash: physmap platform flash device: [mem 0x40000000-0x43ffffff]40000000.flash: Found 2 x16 devices at 0x0 in 32-bit bank. Manufacturer ID 0x000000 Chip ID 0x000000Intel/Sharp Extended Query Table at 0x0031Using buffer write methodphysmap-flash 40000000.flash: physmap platform flash device: [mem 0x44000000-0x47ffffff]40000000.flash: Found 2 x16 devices at 0x0 in 32-bit bank. Manufacturer ID 0x000000 Chip ID 0x000000Intel/Sharp Extended Query Table at 0x0031Using buffer write methodConcatenating MTD devices:(0): "40000000.flash"(1): "40000000.flash"into device "40000000.flash"physmap-flash 48000000.psram: physmap platform flash device: [mem 0x48000000-0x49ffffff]smsc911x 4e000000.ethernet eth0: MAC Address: 52:54:00:12:34:56isp1760 4f000000.usb: isp1760 bus width: 32, oc: digitalisp1760 4f000000.usb: NXP ISP1760 USB Host Controllerisp1760 4f000000.usb: new USB bus registered, assigned bus number 1isp1760 4f000000.usb: Scratch test failed. 0x00000000isp1760 4f000000.usb: can't setup: -19isp1760 4f000000.usb: USB bus 1 deregisteredusbcore: registered new interface driver usb-storagertc-pl031 10017000.rtc: registered as rtc0rtc-pl031 10017000.rtc: setting system clock to -02-09T06:31:31 UTC (1675924291)mmci-pl18x 10005000.mmci: Got CD GPIOmmci-pl18x 10005000.mmci: Got WP GPIOmmci-pl18x 10005000.mmci: mmc0: PL181 manf 41 rev0 at 0x10005000 irq 35,36 (pio)ledtrig-cpu: registered to indicate activity on CPUsusbcore: registered new interface driver usbhidusbhid: USB HID core driveraaci-pl041 10004000.aaci: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 37aaci-pl041 10004000.aaci: FIFO 512 entriesNET: Registered PF_PACKET protocol family9pnet: Installing 9P2000 supportRegistering SWP/SWPB emulation handler10009000.uart: ttyAMA0 at MMIO 0x10009000 (irq = 38, base_baud = 0) is a PL011 rev1input: AT Raw Set 2 keyboard as /devices/platform/bus@40000000/bus@40000000:motherboard-bus@40000000/bus@40000000:motherboard-bus@40000000:iofpga@7,00000000/10006000.kmi/serio0/input/input0mmc0: new SDHC card at address 4567mmcblk0: mmc0:4567 QEMU! 20.0 GiBprintk: console [ttyAMA0] enabled1000a000.uart: ttyAMA1 at MMIO 0x1000a000 (irq = 39, base_baud = 0) is a PL011 rev11000b000.uart: ttyAMA2 at MMIO 0x1000b000 (irq = 40, base_baud = 0) is a PL011 rev11000c000.uart: ttyAMA3 at MMIO 0x1000c000 (irq = 41, base_baud = 0) is a PL011 rev1drm-clcd-pl111 1001f000.clcd: assigned reserved memory node vram@4c000000drm-clcd-pl111 1001f000.clcd: using device-specific reserved memorydrm-clcd-pl111 1001f000.clcd: core tile graphics presentdrm-clcd-pl111 1001f000.clcd: this device will be deactivateddrm-clcd-pl111 1001f000.clcd: Versatile Express init failed - -19drm-clcd-pl111 10020000.clcd: DVI muxed to daughterboard 1 (core tile) CLCDdrm-clcd-pl111 10020000.clcd: initializing Versatile Express PL111drm-clcd-pl111 10020000.clcd: DVI muxed to daughterboard 1 (core tile) CLCDdrm-clcd-pl111 10020000.clcd: initializing Versatile Express PL111ALSA device list:#0: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 37input: ImExPS/2 Generic Explorer Mouse as /devices/platform/bus@40000000/bus@40000000:motherboard-bus@40000000/bus@40000000:motherboard-bus@40000000:iofpga@7,00000000/10007000.kmi/serio1/input/input2drm-clcd-pl111 10020000.clcd: DVI muxed to daughterboard 1 (core tile) CLCDdrm-clcd-pl111 10020000.clcd: initializing Versatile Express PL111EXT4-fs (mmcblk0): recovery completeEXT4-fs (mmcblk0): mounted filesystem with ordered data mode. Quota mode: disabled.VFS: Mounted root (ext4 filesystem) on device 179:0.Freeing unused kernel image (initmem) memory: 1024KRun /sbin/init as init processrandom: crng init donePlease press Enter to activate this console.~ # drm-clcd-pl111 10020000.clcd: DVI muxed to daughterboard 1 (core tile) CLCDdrm-clcd-pl111 10020000.clcd: initializing Versatile Express PL111amba 1000f000.wdt: deferred probe pendingamba 10020000.clcd: deferred probe pendingamba 100e0000.memory-controller: deferred probe pendingamba 100e1000.memory-controller: deferred probe pendingamba 100e5000.watchdog: deferred probe pendingi2c 0-0039: deferred probe pending~ # insmod /home/hello.kohello: loading out-of-tree module taints kernel.hello_init : enter~ # rmmod /home/hello.kormmod: remove '/home/hello': No such file or directory~ # rmmod hello.kohello_exit : enter~ # insmod /home/hello.kohello_init : enter~ # lsmodhello 16384 0 - Live 0x7f000000 (O)~ # rmmod hello.kohello_exit : enter~ #

通过验证,hello.ko可以在 qemu 平台上运行

小结

如果Linux 驱动模块比较小,依赖不多,可以在Linux 内核源码外部编写与编译

使用qemu,开发验证测试一些硬件无关的内核驱动模块,很方便

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。