Chinaunix首页 | 论坛 | 博客
  • 博客访问: 180360
  • 博文数量: 32
  • 博客积分: 499
  • 博客等级: 下士
  • 技术积分: 347
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-22 14:47
文章存档

2012年(10)

2011年(19)

2010年(3)

分类: LINUX

2011-01-09 22:32:18

1.只有超级用户才有权加载和卸载模块。(p23)
2.编写一个模块并没有想象那么难,,真正的困难在于理解设备并最大化其性能。(p23)
3.能够卸载模块可能是模块化驱动程序编程当中读者最为喜欢的一个特色,因为测试新驱动,不需要没次经过冗长的关机/重启过程。(p24)
4.应用程序可以调用它并未定义的函数,因为连接过程能够解析外部引用从而使用适当的函数库。模块仅仅被链接到内核,因此它能调用的函数仅仅是由内核到处的那些函数,而不存在任何可链接的函数库。(p24)
5.缺乏对浮点数的支持。(p24)
6.模块运行在所谓的内核空间,应用程序运行在所谓的用户空间。(P25)
7.内核的并发:同意时刻,可能会有许多事情正在发生。Linux内核代码必须是可重入的,必须能够同时运行在多个上下文。要编写能够处理并发问题而同时避免竞态的代码,需要一些技巧和细致的思考。如果在编写代码时我们不注意并发问题,将可能导致出现很难调试的灾难性错误。
8.当前进程
举例说明:在上一篇helloworld的static int hello_init(void)中加一句:
  1. printk(KERN_INFO "The process is \"%s\" (pid %i)\n",current->comm,current->pid);
注意:头文件加一句include
这里\"代表“,current->comm指所执行程序文件基本名,current->pid则是进程号。
保存编译安装模块后,dmesg | tail -2后会发现输出为
  1. [ 2334.195149] Hello, world !
  2. [ 2334.195160] The process is "insmod" (pid 3063)
(P27)
9.内核具有非常小的栈,可能和一个4096字节大小的页那样小。因此,声明大的自动变量不是好注意,如果需要大的结构,应该在调用的时候动态分配该结构。(P27)
10.具有两个下划线前缀(_ _)的函数名称通常是接口的底层组建,谨慎使用。(P28)
11.如果读者尚未准备内核树或者尚未配置并构造内核,则应该首先完成这些工作,否则,无法构造可装载的模块。(这一步在前面的文章中有写道构造步骤)(P28)
12.如果我们要构造的模块为helo.ko,源文件为hello.c,Makefile可以只写一行:
  1. obj-m :=hello.o
如果源文件为hello1.c和hello2.c,Makefile可以这样:
  1. obj-m :=hello.o
  2. module-objs := hello1.o hello2.o
(P29)
13.Makefile的经典模式(具体原因就不多说了,书上都写着)
  1. ifneq ($(KERNELRELEASE),)
  2.     obj-m :=hello.o
  3. else
  4.     KERNELDIR ?=/lib/modules/$(shell uname -r)/build
  5.     PWD := $(shell pwd)
  6. default:
  7.     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
  8. endif
这里,KERNELRELEASE,如果定义了,说明是从内核构造系统调用的,于是利用内建语句obj-m :=hello.o,否则,直接从命令行调用,调用内核构造系统。
这里也说明了构造模块由路径不同的两种方法。(P29)











阅读(2041) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~