1. 安装 linux
2. 写 hello world
- //hello.c
- #include <linux/kernel.h> /*Needed by all modules*/
- #include <linux/module.h> /*Needed for KERN_* */
- #include <linux/init.h> /* Needed for the macros */
- MODULE_LICENSE("GPL");
- static int year=2014;
- static int hello_init(void)
- {
- printk(KERN_WARNING "Hello kernel, it's %d!\n",year);
- return 0;
- }
- static void hello_exit(void)
- {
- printk("Bye, kernel!\n");
- }
- /* main module function*/
- module_init(hello_init);
- module_exit(hello_exit);
obj-m := hello.o 表示编译成模块, 后面写对应文件名称加. o
- Makefile
- obj-m := hello.o
- KERNELDIR ?= /lib/modules/$(shell uname -r)/build
- PWD := $(shell pwd)
- all:
- $(MAKE) -C $(KERNELDIR) M=$(PWD)
- clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
安装模块命令 insmod ./hello.ko
删除 rmmod ./hello.ko
用命令 tail /var/log/kern.log 查看日志
- root@ubuntu:~/Desktop# make
- make -C /lib/modules/4.2.0-27-generic/build M=/root/Desktop
- make[1]: Entering directory `/usr/src/linux-headers-4.2.0-27-generic'
- LD /root/Desktop/built-in.o
- CC [M] /root/Desktop/hello.o
- Building modules, stage 2.
- MODPOST 1 modules
- CC /root/Desktop/hello.mod.o
- LD [M] /root/Desktop/hello.ko
- make[1]: Leaving directory `/usr/src/linux-headers-4.2.0-27-generic'
- root@ubuntu:~/Desktop# insmod ./hello.ko
- root@ubuntu:~/Desktop# tail /var/log/kern.log
- Aug 26 05:54:38 ubuntu kernel: [ 11.882941] audit: type=1400 audit(1535288078.331:11): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/lib/lightdm/lightdm-guest-session" pid=825 comm="apparmor_parser"
- Aug 26 05:54:38 ubuntu kernel: [ 12.138198] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
- Aug 26 05:54:38 ubuntu kernel: [ 12.423300] e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
- Aug 26 05:54:38 ubuntu kernel: [ 12.436023] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
- Aug 26 05:55:05 ubuntu kernel: [ 39.322268] audit_printk_skb: 150 callbacks suppressed
- Aug 26 05:55:05 ubuntu kernel: [ 39.322272] audit: type=1400 audit(1535288105.459:62): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="/usr/lib/cups/backend/cups-pdf" pid=2171 comm="apparmor_parser"
- Aug 26 05:55:05 ubuntu kernel: [ 39.322282] audit: type=1400 audit(1535288105.459:63): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="/usr/sbin/cupsd" pid=2171 comm="apparmor_parser"
- Aug 26 05:55:05 ubuntu kernel: [ 39.322809] audit: type=1400 audit(1535288105.459:64): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="/usr/sbin/cupsd" pid=2171 comm="apparmor_parser"
- Aug 26 06:15:14 ubuntu kernel: [ 1248.118385] hello: module verification failed: signature and/or required key missing - tainting kernel
- Aug 26 06:15:14 ubuntu kernel: [ 1248.121354] Hello kernel, it's 2014!
- root@ubuntu:~/Desktop# rmmod ./hello.ko
- root@ubuntu:~/Desktop# tail /var/log/kern.log
- Aug 26 05:54:38 ubuntu kernel: [ 12.138198] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
- Aug 26 05:54:38 ubuntu kernel: [ 12.423300] e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
- Aug 26 05:54:38 ubuntu kernel: [ 12.436023] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
- Aug 26 05:55:05 ubuntu kernel: [ 39.322268] audit_printk_skb: 150 callbacks suppressed
- Aug 26 05:55:05 ubuntu kernel: [ 39.322272] audit: type=1400 audit(1535288105.459:62): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="/usr/lib/cups/backend/cups-pdf" pid=2171 comm="apparmor_parser"
- Aug 26 05:55:05 ubuntu kernel: [ 39.322282] audit: type=1400 audit(1535288105.459:63): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="/usr/sbin/cupsd" pid=2171 comm="apparmor_parser"
- Aug 26 05:55:05 ubuntu kernel: [ 39.322809] audit: type=1400 audit(1535288105.459:64): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="/usr/sbin/cupsd" pid=2171 comm="apparmor_parser"
- Aug 26 06:15:14 ubuntu kernel: [ 1248.118385] hello: module verification failed: signature and/or required key missing - tainting kernel
- Aug 26 06:15:14 ubuntu kernel: [ 1248.121354] Hello kernel, it's 2014!
- Aug 26 06:16:13 ubuntu kernel: [ 1306.921227] Bye, kernel!
- root@ubuntu:~/Desktop#
出现的问题
1. 用 ide 可能报找不到 #include <linux/kernel.h> 等头文件
确实 include 里面没有
这个没关系 因为有内核源码先查看内核版本
- root@ubuntu:~/Desktop# uname -r
- 4.2.0-27-generic
- root@ubuntu:~/Desktop#
再写 makefile 文件时用 $(shell uname -r) 就可以了
来源: http://www.bubuko.com/infodetail-2743675.html