linux设备学习学习(一)
2010年08月23日
地球人都知道LDD这书经典,但一直没时间看(貌似是借口)现在开始啃,希望自己能坚持下去。God bless me!
要看到内核的打印信息,可以先执行下面的语句:echo 8 >/proc/sys/kernel/printk
这里,有blog不错,可以学习下http://blog.chinaunix.net/u1/34474/showart_404278. html
由于驱动程序可能同时被不同的程序并发访问,解决并发的一些方法:1.可以在设备上实现独立于硬件功能的内存映射。
2. 为用户提供独立的函数库,运用同步原语。
3.设备文件和普通文件之间的唯一区别在于:对普通文件的访问可以前后移动访问访问位置,但对大多数字符设备文件的访问只能顺序访问。
4.许多网络连接是面向流的,但网络设备却围绕数据包的传输和接受而设计。网络驱动程序不需要知道各个连接的相关信息,他只要处理数据包即可。由于不是面向流的设备,因此将网络接口映射到文件系统中的节点比较困难,linux访问网络接口的方法仍然是给他们一个唯一的名字(eth0),但这个名字在文件系统中不存在对应的节点。内核和网络设备的通信,不同于字符和块设备,内核调用一套和数据包传输相关的函数,而不是read,write.
5.关于hello模块Makefile的写法:
obj-m += hello.o
KDIR = /lib/modules/$(shell uname -r)/build
PWD = $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean
如果是多个原文件编译出一个模块,则不能出现.c 文件。
obj-m += test.o
test.o := file1.o file2.o file3.o
KDIR = /lib/modules/$(shell uname -r)/build
PWD = $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) m=$(PWD) clean
其中KDIR为内核存放的路径,PWD当前路径,uname -r为取得当前使用的内核配置。
6.现代的unix系统基本提供两种保护方式:一种是特权级划分,0到6个级别,ROOT的特权级最高。另一种是分页保护机制,系统除了在启动完成设备初始化时运行在实模式下外,启动起来会开启MMU然后运行在保护模式下。
7.执行系统调用的内核代码运行在进程上下文中,它代表调用进行执行操作,因此可以访问进程地址空间里的所有数据,而处理硬件中断的内核代码和进程是异步的,与任何一个特定进程无关。
8.modprobe和insmod的区别,它会考虑要装载的模块是否引用了一些当前内核不存在的符号。如果有这类引用modprobe会在当前模块的收索路径中查找定义了这些符号的其他模块,如果找到这些依赖模块会同时将这些模块加载到内核中。如果这种情况下用insmod,则会失败。
9.大多数模块都必须包括的头文件:
#include
#include
#include
10.如果在发生某个特定类型的错误以后无法继续装载模块,则要将出错之前的任何注册工作撤销掉。
模块注册代码示例:
#include
#include
#include
struct something *item1;
struct somethingelse *item2;
int stuff_ok;
void my_cleanup()
{
if(item1)
release_thing(item1);
if(item2){
release_thing(item2);
if(stuff_ok)
unregister_stuff;
}
static int __init my_init(void)
{
int err;
item1 = allocate_thing(arguments);
item2 = allocate_thing(arguments2);
if(!item1 || !item2)
goto fail;
err = register_stuff(item1,item2);
if(!err){
stuff_ok = 1;
}else{
goto fail; } return 0; fail: my_cleanup(); return err; } 11.include 该文件包含驱动驱动程序中使用的大部分内核API的定义,包括睡眠函数以及各种变量的声明。
struct task_struct *current;
current->pid
current->comm
获得当前进程的id和命令名
MAJOR(dev_t dev);
MINOR(dev_t dev);
MKDEV(int major,int minor);
发表评论
-
exp/imp 与 expdp/impdp 对比 及使用中的一些优化事项
2012-01-20 09:07 682exp/imp 与 expdp/impdp 对比 及使用中的一 ... -
MMS-MTK-Obigo03c
2012-01-20 09:06 873MMS-MTK-Obigo03c 2011年02月2 ... -
DB2数据库常见问题汇总)
2012-01-20 09:06 1222DB2数据库常见问题汇总) ... -
IP组播技术介绍及实现例子
2012-01-20 09:06 517IP组播技术介绍及实现 ... -
"043d0df76"指令引用的"0x00000013"内存,该内存不能为"read"
2012-01-19 14:10 650"043d0df76"指令引 ... -
0x000001b8指令引用的0x000001b8内存该内存不能为read
2012-01-19 14:10 7210x000001b8指令引用的0x0000 ... -
引用的“0x00000000”内存,该内存不能为“read”或“written
2012-01-19 14:10 926引用的“0x00000000”内存,该内存不能为“read”或 ... -
各种文件后缀名与打开方式大全a-d
2012-01-19 14:10 831各种文件后缀名与打开方式大全a-d 2012年01月11日 ... -
右键菜单显示隐错文件和扩展名时报错
2012-01-19 14:10 641右键菜单显示隐错文件和扩展名时报错 2012年01月11日 ... -
Java IO 编程
2012-01-17 04:01 775Java IO 编程 2010年10月30日 Java ... -
第一节 计算机硬件组成
2012-01-17 04:01 683第一节 计算机硬件组成 ... -
2001-6-1
2012-01-17 04:01 6212001-6-1 2011年09月17日 1.假设某台式 ... -
第二十二章输入/输出
2012-01-17 04:00 454第二十二章输入/输出 2011年04月03日 输入/ ... -
Linux集群的安装与并行计算
2012-01-16 02:49 457Linux集群的安装与并行 ... -
HTTPS和HTTP的区别
2012-01-16 02:49 547HTTPS和HTTP的区别 2011年1 ... -
慢慢研究
2012-01-16 02:49 490慢慢研究 2011年12月24日 ... -
夜魅-----【索爱刷机必备。刷机控】
2012-01-16 02:49 445夜魅-----【索爱刷机必备。刷机控】 2011年12月31 ...
相关推荐
Linux 设备驱动程序学习(0) -设备驱动介绍& Hello, world!模块 模块结构介绍 字符设备驱动程序 调试技术 并发和竞态 高级字符驱动程序操作 阻塞型 I/O 和休眠
Linux设备驱动程序学习(12)-Linux设备模型(底层原理简介) - Linux设备驱动程序
Linux设备驱动程序学习(14)-Linux设备模型(各环节的整合) - Linux设备驱动程序
Linux设备驱动程序学习(1)-字符设备驱动程序 ·Linux设备驱动程序学习(0)-Hello, world!模块 ·Linux设备驱动程序学习(2)-调试技术 ·Linux设备驱动程序学习(3)-并发和竞态 ·Linux设备驱动程序学习(4)-...
《linux设备驱动程序》(第三版)的学习笔记,对于学习设备驱动的朋友十分有用
Linux设备驱动程序学习(11)-中断处理 - Linux设备驱动程序
Linux设备驱动程序学习(8)-分配内存 - Linux设备驱动程序
Linux设备驱动程序学习(1)-字符设备驱动程序 - Linux设备驱动程序
·Linux设备驱动程序学习(16)-USB 驱动程序(一) ·Linux设备驱动程序学习(17)-USB 驱动程序(二) ·Linux设备驱动程序学习(18)-USB 驱动程序(三) ·Linux设备驱动程序学习(19)-USB 驱动程序(四)
Linux设备驱动程序学习(0)-Hello, world!模块 - Linux设备驱动程序
比较系统地讲解了设备树的引入过程,并给出了内核代码的分析。
Linux设备驱动程序学习(13)-Linux设备模型(总线、设备、驱动程序和类) - Linux设备驱动程序
Linux设备驱动程序学习教程-170页-pdf版,很不错的教程
【批量下载】108-Linux设备驱动程序学习-170页,多本书籍
Linux C编程一站式学习 这本书最初是为北京亚嵌教育研究中心的嵌入式Linux系统工程师就业班课程量身定做的教材之一。该课程是为期四个月的全日制职业培训,要求学员毕业时具备非常Solid的C编程能力,能熟练地使用...
学习 linux 设备驱动编程 的经典 教材!
Linux设备驱动程序学习(15)-Linux设备模型(热插拔、mdev 与 firmware) - Linux设备驱动程序
主要通过介绍字符设备scull(Simple Character Utility for Loading Localities,区域装载的简单字符工具)的驱动程序编写,来学习Linux设备驱动的基本知识。scull可以为真正的设备驱动程序提供样板。
《linux设备驱动》23章学习笔记
Linux设备驱动程序学习总结: *字符设备驱动程序 *调试技术 *并发和竞态 *Linux中的循环缓冲区 *内核的数据类型 *分配内存 *与硬件通信 *时间、延迟及延缓操作 *中断处理 *Linux设备模型