模块编译入门例子hello_module
如何编译第一个模块 hello.ko

如何编译第一个模块hello.ko2011-08-16 21:06 25人阅读评论(0) 收藏举报看了书后,照着书上的方法一步一步去做,却失败了,555真是的,写书的人啊,却不考虑一下细节问题新建一个目录[liu@liu-desktop hellomod]$mddir hellomod[liu@liu-desktop hellomod]$cd hellomod[liu@liu-desktop hellomod]$vi hellomod.c/****************hellomod.c*******************************/#include <linux/module.h> //所有模块都需要的头文件#include <linux/init.h> // init&exit相关宏MODULE_LICENSE("GPL");static int __init hello_init (void){printk("Hello china init/n");return 0;}static void __exit hello_exit (void){printk("Hello china exit/n");}module_init(hello_init);module_exit(hello_exit);/****************hellomod.c*******************************/1、在下载了linux 2.6的内核,解压到/usr/src/linux26目录下[root@liu-desktop linux26]# lsarch CREDITS drivers init kernel Makefile README security block crypto fs ipc lib mm REPORTING-BUGS sound COPYING Documentation include Kbuild MAINTAINERS net scripts usr ----------------------------------------------写一个Makefile文件:内容如下:obj-m := hellomod.o------------------------------------------------[liu@liu-desktop hellomod]$ make -C /usr/src/linux26/ SUBDIRS=$PWD modules make: Entering directory `/usr/src/linux26'ERROR: Kernel configuration is invalid.include/linux/autoconf.h or include/config/auto.conf are missing.Run 'make oldconfig && make prepare' on kernel src to fix it.W ARNING: Symbol version dump /usr/src/linux26/Module.symversis missing; modules will have no dependencies and modversions.CC [M] /home/liu/test/hellomod/hellomod.occ1: 错误:include/linux/autoconf.h:No such file or directory在包含自include/linux/posix_types.h:47 的文件中,从include/linux/types.h:14,从include/linux/prefetch.h:13,从include/linux/list.h:8,从include/linux/module.h:9,从/home/liu/test/hellomod/hellomod.c:1:/usr/lib/gcc/i486-linux-gnu/4.1.3/include/asm/posix_types.h:13:22: 错误:features.h:No such file or directory/usr/lib/gcc/i486-linux-gnu/4.1.3/include/asm/posix_types.h:14:35: 错误:没有包含路径可供搜索asm/posix_types.h ...............................解决方法:[liu@liu-desktop hellomod]#make oldconfig[liu@liu-desktop hellomod]#make prepare好了,在试试:[liu@liu-desktop hellomod]$ make -C /usr/src/linux26/ SUBDIRS=$PWD modules还是有错:make: Entering directory `/usr/src/linux26'W ARNING: Symbol version dump /usr/src/linux26/Module.symversis missing; modules will have no dependencies and modversions.CC [M] /home/liu/test/hellomod/hellomod.oBuilding modules, stage 2.MODPOST 1 modules/bin/sh: scripts/mod/modpost: not foundmake[1]: *** [__modpost] 错误127make: *** [modules] 错误2make: Leaving directory `/usr/src/linux26'看到了吗,提示说没有scripts/mod/modpost,那我们就编译它吧[root@liu-desktop linux26]# make scriptsHOSTCC scripts/genksyms/genksyms.oSHIPPED scripts/genksyms/lex.cSHIPPED scripts/genksyms/parse.hSHIPPED scripts/genksyms/keywords.cHOSTCC scripts/genksyms/lex.oSHIPPED scripts/genksyms/parse.cHOSTCC scripts/genksyms/parse.oHOSTLD scripts/genksyms/genksymsCC scripts/mod/empty.oHOSTCC scripts/mod/mk_elfconfigMKELF scripts/mod/elfconfig.hHOSTCC scripts/mod/file2alias.oHOSTCC scripts/mod/modpost.oHOSTCC scripts/mod/sumversion.oHOSTLD scripts/mod/modpostHOSTCC scripts/kallsymsHOSTCC scripts/conmakehashOK,好了[liu@liu-desktop hellomod]$ make -C /usr/src/linux26/ SUBDIRS=$PWD modulesmake: Entering directory `/usr/src/linux26'W ARNING: Symbol version dump /usr/src/linux26/Module.symversis missing; modules will have no dependencies and modversions.Building modules, stage 2.MODPOST 1 modulesCC /home/liu/test/hellomod/hellomod.mod.oLD [M] /home/liu/test/hellomod/hellomod.komake: Leaving directory `/usr/src/linux26'[liu@liu-desktop hellomod]$ lshellomod.c hellomod.ko hellomod.mod.c hellomod.mod.o hellomod.o Makefile Module.sy mvers[root@liu-desktop linux26]#insmod hellomod.ko[root@liu-desktop linux26]#lsmod |grep hellomodlsmod |grep hellomod[root@liu-desktop linux26]#rmmod hellomod注意:如果出现下面错误,那99%是内核版本号对不上,也就是version magic不对insmod: error inserting 'hellomod.ko': -1 Invalid module format此时,你用sudo tail /var/log/messages你在最后一行应该看到类似下面的提示:Dec 19 13:42:29 localhost kernel: hellomod: version magic '2.6.24.2 SMP mod_unload 686 4KSTACKS ' should be '2.6.27.7-134.fc10.i686 SMP mod_unload 686 4KSTACKS '那该怎么办呢?最简单的办法就是:修改源目录下的Makefie把最Makefile第1-4行的值改为当前内核一样的值VERSION = 2PA TCHLEVEL = 6SUBLEVEL = 24EXTRA VERSION = .2NAME = Err Metey! A Heury Beelge-a Ret!那怎么确定你当前内核的值是多少呢?vi /lib/modules/`uname -r`/build/Makefile现在知道了吧?。
实验二三合

嵌入式系统实验报告嵌入式Linux设备驱动实验学院电子与信息学院专业电子科学与技术学生姓名李泓鑫黄勇实验台号9指导教师提交日期 2015 年 4月 22日1. 了解Linux驱动程序的结构2. 初步掌握Linux驱动程序的编写方法及过程3. 掌握Linux驱动程序的加载方法。
二、实验内容1. 杂项驱动框架的编程实现;2. 具有Led控制功能的驱动编程实现;三、实验原理要写led的设备驱动,首先要了解其硬件电路的设计,才能使之正常工作。
从Tiny210的用户手册中,我们可以找到其led的设计说明。
由此,我们明确LED1~LED4分别由GPJ2_0 ~ GPJ2_3这四个io引脚来控制。
并且由Tiny210的用书手册说明,可知此GPIO输出是低电平有效。
当GPJ作为输出io口的时候,GPJ0 ~ GPJ3的输出,对应于此数据寄存器(0xE0200284)的bit0 ~ bit3. 在这四个bits上,0对应于输出低电平,会使对应的led点亮;1对应于输出高电平,会使对应的led熄灭。
杂项设备是比较简单的字符设备,主设备固定为10,次设备号由linux内核分配。
不需手动创建设备节点,注册和注销设备都比较简单。
框架中,定义了内核模块入口函数TestChar_init和出口函数TestChar_exit分别进行杂项设备的注册misc_register和注销misc_deregister。
file_operations定义了此设备的操作接口,只定义了读和写两个接口函数,分别为TestRead和TestWrite。
这两个函数中,把一个内部整型全局变量myData 和用户进行拷贝传递。
测试程序会打开TestMisc设备,然后读取该设备,再写入该设备,并进行打印显示。
1、杂项设备是比较简单的字符设备。
主设备固定为10,次设备号由linux 内核分配。
不需手动创建设备节点。
注册和注销设备都比较简单。
比较适合用于led驱动。
go module的使用例子

go module的使用例子
Go语言的模块(module)是Go 1.11版本引入的一个重要特性,它可以帮助开发者更好地管理项目的依赖关系和版本控制。
下面我
将为你提供一个简单的使用例子。
首先,假设你有一个名为`hello`的项目,你可以通过以下步骤
来使用Go模块:
1. 首先,创建一个新的目录作为你的项目目录,例如
`hello_project`。
2. 在命令行中进入该目录,并运行`go mod init`命令,例如
`go mod init hello_project/hello`。
这将会初始化一个新的模块,并生成一个`go.mod`文件,用来记录你项目的依赖关系。
3. 接下来,你可以创建一个`main.go`文件,内容可以是一个
简单的Hello World程序。
例如:
go.
package main.
import "fmt"
func main() {。
fmt.Println("Hello, Go Module!")。
}。
4. 保存`main.go`文件后,你可以在命令行中运行`go run .`命令来执行你的程序。
Go模块会自动帮你下载和管理依赖。
5. 如果你想引入其他的第三方包作为你项目的依赖,你可以在代码中直接import这些包,然后运行`go mod tidy`命令来自动更新你的`go.mod`和`go.sum`文件。
总之,使用Go模块可以让你更方便地管理项目的依赖关系,确保你的项目能够稳定、可靠地构建和运行。
希望这个例子能够帮助你更好地理解如何使用Go模块。
Nano之HelloWorld驱动(学习如何单独编译.ko模块)

Makefile
1 把下面3个参数改成你自己的: 2 obj-m (.o文件) 3 KERNELDIR (内核目录全路径) 4 CROSS_ARCH (架构及其编译器)
1 #set KERNELDIR and CROSS_COMPILE path yourself
2#
3 ifneq ($(KERNELRELEASE),)
1、准备下面两个文件:
1 Makefile 2 nano_hello_module.c
nano_hello_module.c
1 #include <linux/kernel.h> 2 #include <linux/module.h> 3 4 static int __init nano_hello_module_init(void) 5{ 6 printk("Hello yfw, Nano module is installed !\n"); 7 return 0; 8} 9 10 static void __exit nano_hello_module_cleanup(void) 11 { 12 printk("Good-bye yfw, Nano module was removed!\n"); 13 } 14 15 module_init(nano_hello_module_init); 16 module_exit(nano_hello_module_cleanup); 17 18 MODULE_LICENSE("GPL");
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
Nano之 HelloWorld驱动(学习如何单独编译 .ko模块)
模块化编程案例

模块化编程案例模块化编程是一种将程序划分为独立、可重用、可测试的模块的编程方法。
它能够提高代码的可维护性、可读性和可复用性,并且使开发过程更加高效。
下面是一些关于模块化编程的案例:1. 案例一:图书管理系统在一个图书馆的图书管理系统中,可以将不同功能的代码模块化,比如图书的借阅模块、归还模块、查询模块等。
每个模块都有自己的功能和接口,可以独立进行开发和测试。
这样,当需要修改或添加某个功能时,只需修改对应的模块,而不影响其他模块的功能。
2. 案例二:购物网站在一个购物网站的后台管理系统中,可以将不同功能的代码模块化,比如商品管理模块、订单管理模块、用户管理模块等。
每个模块都有自己的功能和接口,可以独立进行开发和测试。
这样,当需要修改或添加某个功能时,只需修改对应的模块,而不影响其他模块的功能。
3. 案例三:游戏开发在游戏开发中,可以将不同功能的代码模块化,比如角色控制模块、地图生成模块、碰撞检测模块等。
每个模块都有自己的功能和接口,可以独立进行开发和测试。
这样,当需要修改或添加某个功能时,只需修改对应的模块,而不影响其他模块的功能。
4. 案例四:音乐播放器在一个音乐播放器的软件中,可以将不同功能的代码模块化,比如音乐搜索模块、播放控制模块、歌词显示模块等。
每个模块都有自己的功能和接口,可以独立进行开发和测试。
这样,当需要修改或添加某个功能时,只需修改对应的模块,而不影响其他模块的功能。
5. 案例五:社交媒体平台在一个社交媒体平台的开发中,可以将不同功能的代码模块化,比如用户管理模块、信息发布模块、评论管理模块等。
每个模块都有自己的功能和接口,可以独立进行开发和测试。
这样,当需要修改或添加某个功能时,只需修改对应的模块,而不影响其他模块的功能。
6. 案例六:电子邮件客户端在一个电子邮件客户端的开发中,可以将不同功能的代码模块化,比如邮件接收模块、邮件发送模块、邮件搜索模块等。
每个模块都有自己的功能和接口,可以独立进行开发和测试。
hello内核模块编译的全过程

示包含$(PWD)下的Makefile文件。3),modules表示模块编译。4),用到了
ifneq...else...endif语句由于开始还没定义KERNELRELEASE,所以只能执行else
分支。而在执行$(MAKE)-C$(KERNELDIR)M=$(PWD)modules后,会在内
核的Makefile中定义KERNELRELEASE,当进入本Makefile时,则只会执行
module_init(),module_exit()kernel.h中的printk(),KERN_ALERTmodule.h中的
MODULE_LICENSE()
2,Makefile文件中的核心是$(MAKE) -C $(KERNELDIR) M=$(PWD) modules1),
-C $(KERNELDIR)表示在$(KERNELDIR)目录下执行make命令。2),M=$(PWD)表
staticint hello_init(void){printk(KERN_ALERT“hellomoduleinit\n”);return0;}
staticvoid hello_exit(void){printk(KERN_ALERT“hellomoduleexit\n”);}
module_init(hello_init);module_exit(hello_exit);
KERN_ALERT“1”修改为#define KERN_ALERT“0”
------------安装模块
#insmod hello.ko
终端显示hello module init
查看已安装的模块#lsmod
卸载模块
openharmony cfg语法

openharmony cfg语法CFG语法是OpenHarmony的配置文件语法,用于配置系统的各种属性和模块的编译选项。
以下是CFG语法的一些常用规则和示例:1. 基本格式:[SECTION]key = value2. 注释:使用"#"符号表示注释,如:# This is a comment3. SECTION的命名规则:使用方括号括起来的大写字母、数字或下划线组成的字符串,如:[DEVICE]4. key的命名规则:小写字母、数字或下划线组成的字符串,如:enable_feature = true5. value的类型:可以是字符串、布尔值或整数,如:module_name = "hello"enable_feature = falseversion = 16. 模块的编译选项:可以通过设置key的值来启用或禁用某个模块的编译选项,如:enable_fs_module = trueenable_network_module = false7. 条件语句:使用if和endif来定义条件语句,根据条件来决定是否执行某段配置,如:if (key == value){# do something}endif可以使用==、!=、<、<=、>、>=等比较操作符,并支持逻辑运算符和括号的使用。
8. 导入其他配置文件:可以使用import语句来导入其他配置文件,如:import "config.txt"以上是CFG语法的一些常用规则和示例,CFG语法还支持更多的高级特性,可以根据具体需要进行更详细的研究和了解。
linux模块编译步骤(详解)

Linux内核模块编程Linux 内核模块编程是一个很重要的知识点。
尤其是编写底层驱动程序时,一定会涉及到它。
内核模块编程也是 Tiger哥学习 Linux 时第一节课所接触的知识。
由此可以看出它的 important, 也可以看出其实它很 easy 。
一前言:1. 什么是内核模块1> 内核模块是具有独立功能的程序。
它可以被单独编译,但是不能单独运行,它的运行必须被链接到内核作为内核的一部分在内核空间中运行。
2> 模块编程和内核版本密切相连,因为不同的内核版本中某些函数的函数名会有变化。
因此模块编程也可以说是内核编程。
3> 特点:模块本身不被编译进内核映像,从而控制了内核的大小;模块一旦被加载,就和内核中的其他部分完全一样。
2 . 用户层编程和内核模块编程的区别应用程序内核模块程序使用函数libc库内核函数运行空间用户空间内核空间运行权限普通用户超级用户入口函数main()module_init出口函数exit()module_exit编译gcc makefile链接gcc insmod运行直接运行insmod调试gdb kdbug、kdb、kgdb二 . 说了这么多,那么怎么编写一个内核模块的程序呢?1. 我们先来看两个最简单的函数实例,也是几乎所有程序员在学习一门新语言时都会编写的程序:输出 hello world!现在我们分别用模块编程输出 hello world! ,和在用户层编程输出 hello wrold !。
通过这两个程序我们来分析下如何来编写一个内核模块程序。
用户层编程: hello.c#include<stdio.h>int main(void){printf("hello world/n");}内核编程 : module.c#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>MODULE_LICENSE("Dual BSD/GPL");static int hello_init(void){printk(KERN_ALERT "hello,I am edsionte/n");return 0;}static void hello_exit(void){printk(KERN_ALERT "goodbye,kernel/n");}module_init(hello_init);module_exit(hello_exit);// 可选MODULE_AUTHOR("Tiger-John");MODULE_DESCRIPTION("This is a simple example!/n"); MODULE_ALIAS("A simplest example");Tiger-John说明:1.> 相信只要是学过 C 语言的同学对第一个程序都是没有问题的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux 2.6内核的编译步骤及模块动态加载-操作系统中国网络
然后查看该目录下有哪些文件生成:
debian:/home/david # ls -l 总计 28 drwxr-xr-x 2 david david 4096 2007-02-07 17:49 Desktop -rw-r--r-- 1 david david 462 2007-07-20 13:42 hello.c -rw-r--r-- 1 root root 2432 2007-07-20 13:55 hello.ko -rw-r--r-- 1 root root 607 2007-07-20 13:55 hello.mod.c -rw-r--r-- 1 root root 1968 2007-07-20 13:55 hello.mod.o -rw-r--r-- 1 root root 1140 2007-07-20 13:55 hello.o -rw-r--r-- 1 david david 267 2007-07-20 13:48 Makefile -rw-r--r-- 1 root root 0 2007-07-05 14:11 Module.symvers
/linux/1601.html(第 3/8 页)200及模块动态加载-操作系统中国网络
//hello.c #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_ALERT "Hello, world\n"); return 0; } static void hello_exit(void) { printk(KERN_ALERT"Goodbye, cruel world\n"); } module_init(hello_init); module_exit(hello_exit);
●
.
专题 虚拟技术 Linux 防火墙 VPN 备份恢复 Vista
资源 新闻中心 认证培训 在线实验 软件下载 好书推荐
●
.
产品 服务器 网络设备 报价
●
.
ITPro俱乐部 论坛 《ITPro Magazine》杂志 博客
●
.
电子书
IBM Ctrix HP EMC TestInside |Firefox最安全的浏览器 | 订阅技术杂志 | ITPro俱乐部技术活动 |虚拟化技术专区 | 大量电子书技术手册 | 加入ITPro俱乐部
本文是基于2.6的内核,也建议各位可以先看一下《Linux内核设计与实现(第二版)》作为一个基础知识的 铺垫。当然,从实践角度来看,只要按着以下的步骤去做也应该可以实现成功编译内核及加载模块。 个人用的Linux版本为:Debian GNU/Linux,内核版本为:2.6.20-1-686. 第一步,下载Linux内核的源代码,即构建LDD3(Linux Device Drivers 3rd)上面所说的内核树。 如过安装的Linux系统中已经自带了源代码的话,应该在/usr/src目录下。如果该目录为空的话,则需要 自己手动下载源代码。下载代码的方法和链接很多,也可以在CU上通过/search/? key=&q=kernel&frmid=53去下载。不过,下载的内核版本最好和所运行的Linux系统的内核版本一致。当然,也 可以比Linux系统内核的版本低,但高的话应该不行(个人尚未实践)。
Linux 2.6内核的编译步骤及模块动态加载-操作系统中国网络
Ctrix,HP,EMC,CIW,Oracle,Comptia,IBM,
衡
●
热点: Certification Exams Questions;Bootcamp
Braindumps-TestInside
·RedHat Linux下防火墙配置入门必
最新专题:
HACMP for AIX 4.3.3 技术专题 命令大全
FreeBSD使用大全
Apache应用专题
Linux
专题 | 分类 | 投稿 | 搜索
操作系统首页 | 新闻动态 | Linux | freebsd | unix | Solaris | IBM AIX 操作系统首页 >> Linux >> Linux安全 >>
学
●
·Linux系统常用的三款网络安全工具 ·Linux操作系统中RPM命令参数的使
●
用详解
●
·介绍Linux操作系统下关于声卡配置的
方法
●
·Linux十大高级安全管理技巧
●
»导航列表
Debian下可以很方便的通过Debian源下载: 首先查找一下可下载的内核源代码: # apt-cache search linux-source 其中显示的有:linux-source-2.6.20,没有和我的内核版本完全匹配,不过也没关系,直接下载就可以 了: # apt-get install linux-source-2.6.20 下载完成后,安装在/usr/src下,文件名为:linux-source-2.6.20.tar.bz2,是一个压缩包,解压缩既可 以得到整个内核的源代码: # tar jxvf linux-source-2.6.20.tar.bz2 解压后生成一个新的目录/usr/src/linux——source-2.6.20,所有的源代码都在该目录下。 注:该目录会因内核版本的不同而不同,各位动手实践的朋友只需知道自己的源代码所在的具体位置即 可。 第二步:配置及编译内核。 进入/usr/src/linux——source-2.6.20目录下,可以看到Makefile文件,它包含了整个内核树编译信 息。该文件最上面四行是关于内核版本的信息。对于整个Makefile可以不用做修改,采用默认的就可以了。
Makefile文件的内容为:
obj-m := hello.o KERNELDIR := /lib/modules/2.6.20/build PWD := $(shell pwd) modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules modules_install: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install clean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
/linux/1601.html(第 2/8 页)2008-4-2 12:21:55
●
网管技术:网络知识 | 网络管理 | 网络 协议 | 传输介质 | 备份恢复 | 协议分析 | 安全:安全公告 | 病毒木马 | 安全知识 | 安全技术 | 防火墙 | VPN
精彩文章
●
活动资讯
今日头条
Linux 2.6内核的编译步骤及模块动态加载
●
·Ubuntu Server版系统的用户安全优
2007-07-24 20:24:02 作者: 来源:收集 浏览次数:183 文字大小:【大】【中】【小】 简介:本文是基于2.6的内核,也建议各位可以先看一下《Linux内核设计与实现(第二版)》作为一个基础 知识的铺垫。当然,从实践角度来看,只要按着以下的步骤去做也应该可以实现成功编译内核及加载模块。 个人用的 ... 关键字: Linux 内核 Linux 2.6内核 内核编译
化方法
●
·Apache Web服务的安全配置 ·linux下用iptable实现防火墙 ·Linux后门系列--由浅入深sk13完全
●
●
分析
●
·Linux下双网卡绑定技术实现负载均
/linux/1601.html(第 1/8 页)2008-4-2 12:21:55
其中,hello.c和Makefile文件应该位于同一个目录下,可以放在/home下,我的两个文件都位于/home/ david/. 第四步:编译和装载模块 在文件所处的目录下,执行: debian:/home/david # make
/linux/1601.html(第 4/8 页)2008-4-2 12:21:55
/linux/1601.html(第 5/8 页)2008-4-2 12:21:55
Linux 2.6内核的编译步骤及模块动态加载-操作系统中国网络
这里有两个问题,其一就是printk()输出的问题.LDD3上也说,在加载和卸载模块的时候都会有信息输出在 屏幕上,如果在Windows下通过终端仿真器(我们常用的虚拟机算是一种),则在屏幕上看不到任何输出.我同时 在虚拟机和和物理机都运行了该模块,均未看到有"Hello, world"(加载模块时printk的输出)或"Goodby, cruel world"(卸载模块时printk的输出). 这个不知道是我操作系统发行版的原因还是系统配置的问题,请了解 这个问题的朋友指点一下. 其二,书上讲到如果屏幕上看不到信息,可能输出在某个日志文件里面了,并说可能在/var/log/messages 文件中.并且看到网上很多网友也说是输出到这个文件里面.我不知道有没有发现输出在其他日志文件里的,不过 我的这个信息输出在/var/log/syslog里面.在加载和卸载完该模块后, 执行命令: debian:/home/david # cat /var/log/syslog | grep world 可以看到有两行内容.当然,也可以不用grep world, 应该会出现在最后两行. Jul 20 14:15:29 localhost kernel: Hello, world Jul 20 14:15:34 localhost kernel: Goodbye, cruel world 这就是printk应该输出的信息. 这里有另外一个方法,可以实现printk的信息输出在屏幕上,即更改printk输出的优先级.例子中的优先级 为:KERN_ALERT,优先级为<1>,如果将优先级改为KERN_EMERG即<0>,则可以看到屏幕的输出信息. 修改的方法只是修改一下hello.c中两句printk()的内容,修改后的hello.c如下: