概述Linux操作系统的驱动框架及驱动加载
- 格式:doc
- 大小:42.00 KB
- 文档页数:8
本讲主要概述Linux设备驱动框架、驱动程序的配置文件及常用的加载驱动程序的方法;并且介绍Red Hat Linux安装程序是如何加载驱动的,通过了解这个过程,我们可以自己将驱动程序放到引导盘中;安装完系统后,使用kudzu自动配置硬件程序。
Linux设备驱动概述1.内核和驱动模块操作系统是通过各种驱动程序来驾驭硬件设备,它为用户屏蔽了各种各样的设备,驱动硬件是操作系统最基本的功能,并且提供统一的操作方式。
正如我们查看屏幕上的文档时,不用去管到底使用nVIDIA芯片,还是ATI芯片的显示卡,只需知道输入命令后,需要的文字就显示在屏幕上。
硬件驱动程序是操作系统最基本的组成部分,在Linux内核源程序中也占有较高的比例。
Linux内核中采用可加载的模块化设计(LKMs ,Loadable Kernel Modules),一般情况下编译的Linux内核是支持可插入式模块的,也就是将最基本的核心代码编译在内核中,其它的代码可以选择是在内核中,或者编译为内核的模块文件。
如果需要某种功能,比如需要访问一个NTFS分区,就加载相应的NTFS模块。
这种设计可以使内核文件不至于太大,但是又可以支持很多的功能,必要时动态地加载。
这是一种跟微内核设计不太一样,但却是切实可行的内核设计方案。
我们常见的驱动程序就是作为内核模块动态加载的,比如声卡驱动和网卡驱动等,而Linux最基础的驱动,如CPU、PCI总线、TCP/IP协议、APM(高级电源管理)、VFS等驱动程序则编译在内核文件中。
有时也把内核模块就叫做驱动程序,只不过驱动的内容不一定是硬件罢了,比如ext3文件系统的驱动。
理解这一点很重要。
因此,加载驱动时就是加载内核模块。
下面来看一下有关模块的命令,在加载驱动程序要用到它们:lsmod、modprob、insmod、rmmod、modinfo。
lsmod列出当前系统中加载的模块,例如:#lsmod (与cat /proc/modules得出的内容是一致的)Module Size Used by Not taintedradeon 115364 1 agpgart 56664 3 nls_iso8859-1 3516 1 (autoclean)loop 12120 3 (autoclean)smbfs 44528 2 (autoclean)parport_pc 19076 1 (autoclean)lp 9028 0 (autoclean)parport 37088 1 (autoclean) [parport_pc lp]autofs 13364 0 (autoclean) (unused)ds 8704 2yenta_socket 13760 2 pcmcia_core 57184 0 [ds yenta_socket]tg3 55112 1 sg 36940 0 (autoclean)sr_mod 18104 0 (autoclean)microcode 4724 0 (autoclean)ide-scsi 12208 0 scsi_mod 108968 3 [sg sr_mod ide-scsi]ide-cd 35680 0 cdrom 33696 0 [sr_mod ide-cd]nls_cp936 124988 1 (autoclean)nls_cp437 5148 1 (autoclean)vfat 13004 1 (autoclean)fat 38872 0 (autoclean) [vfat]keybdev 2976 0(unused)mousedev 5524 1 hid 22212 0 (unused)input 5888 0 [keybdev mousedev hid]ehci-hcd 20104 0 (unused)usb-uhci 26412 0 (unused)usbcore 79392 1 [hid ehci-hcd usb-uhci]ext3 91592 2 jbd 52336 2 [ext3]上面显示了当前系统中加载的模块,左边数第一列是模块名,第二列是该模块大小,第三列则是该模块使用的数量。
Linuxlinux硬件驱动架构linux硬件驱动(usb)模块:模块用来装载到内核中,用来实现设备驱动程序。
linux对于一个硬件的驱动,使用两种方式加载: 1. 直接加载到内核代码中,启动内核时就会驱动此硬件设备 2. 以模块方式加载,编译生成一个.o的文件,当应用程序需要时加载进内核空间运行 so (通常说的硬件驱动其实就是一个硬件驱动模块及.o文件)设备文件(设备节点):设备文件(设备节点)指定(主设备号)&& (次设备号)主设备号:对应着确定的驱动程序。
(声明设备所使用的驱动程序,设备号相当于硬件驱动程序的一个标识)次设备号:区分不同属性,不同使用方法,不同位置,不同操作设备号从/proc/drives中获取,so 先有驱动程序在内核中,才有设备节点在目录中。
SCSI(并口):通常使用的的usb存储设备,是模拟scsi硬盘而进行设计的。
Linux硬件驱动架构:.o驱动模块文件--(如果需要使用这个驱动程序,首先要加载运行它)-->insmod *.o--(驱动程序根据字符设备类型或块设备类型(鼠标属于字符设备,硬盘属于块设备))向系统注册-->注册成功之后系统返回一个主设备号---(根据主设备号创建一个放置在/dev目录下的设备文件)-->(mknod 用来创建设备文件需要用到设备号这个参数)----->我们访问硬件时,就可以对设备文件通过open,read,write等命令进行,而驱动就会接收到相应的read,write 操作而根据自己模块中的相应函数进行。
上层调用api.o 驱动drive.o与模块相关的一些东西:1. /lib/modules/2.6.**目录,下面是针对当前内核版本的模块。
Linux设备驱动程序原理及框架-内核模块入门篇内核模块介绍应用层加载模块操作过程内核如何支持可安装模块内核提供的接口及作用模块实例内核模块内核模块介绍Linux采用的是整体式的内核结构,这种结构采用的是整体式的内核结构,采用的是整体式的内核结构的内核一般不能动态的增加新的功能。
为此,的内核一般不能动态的增加新的功能。
为此,Linux提供了一种全新的机制,叫(可安装) 提供了一种全新的机制,可安装) 提供了一种全新的机制模块” )。
利用这个机制“模块”(module)。
利用这个机制,可以)。
利用这个机制,根据需要,根据需要,在不必对内核重新编译链接的条件将可安装模块动态的插入运行中的内核,下,将可安装模块动态的插入运行中的内核,成为内核的一个有机组成部分;成为内核的一个有机组成部分;或者从内核移走已经安装的模块。
正是这种机制,走已经安装的模块。
正是这种机制,使得内核的内存映像保持最小,的内存映像保持最小,但却具有很大的灵活性和可扩充性。
和可扩充性。
内核模块内核模块介绍可安装模块是可以在系统运行时动态地安装和卸载的内核软件。
严格来说,卸载的内核软件。
严格来说,这种软件的作用并不限于设备驱动,并不限于设备驱动,例如有些文件系统就是以可安装模块的形式实现的。
但是,另一方面,可安装模块的形式实现的。
但是,另一方面,它主要用来实现设备驱动程序或者与设备驱动密切相关的部分(如文件系统等)。
密切相关的部分(如文件系统等)。
课程内容内核模块介绍应用层加载模块操作过程内核如何支持可安装模块内核提供的接口及作用模块实例内核模块应用层加载模块操作过程内核引导的过程中,会识别出所有已经安装的硬件设备,内核引导的过程中,会识别出所有已经安装的硬件设备,并且创建好该系统中的硬件设备的列表树:文件系统。
且创建好该系统中的硬件设备的列表树:/sys 文件系统。
(udev 服务就是通过读取该文件系统内容来创建必要的设备文件的。
)。
linux系统结构框架
Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。
内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。
1.内核:内核是操作系统的核心,具有很多最基本功能,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
Linux 内核由如下几部分组成:内存管理、进程管理、设备驱动程序、文件系统和网络管理等。
2.Shell:shell是命令行解释器,可以为用户提供对系统的访问,也可以被用作程序或者脚本的命令行环境。
有多种shell可以选择,比如bash,zsh,ksh等。
3.文件系统:Linux系统使用一个基于文件的层级结构来组织和存储系统资源。
每个文件和目录都从根目录“/”开始,然后层层嵌套。
4.应用程序:Linux系统上可以运行各种应用程序,包括文本编辑器、浏览器、开发工具等。
应用程序为用户提供了使用系统的接口。
在更细致的层次结构上,Linux系统的内存管理分为几个主要组件,包括物理内存管理、虚拟内存管理以及内核内存管理等。
物理内存管理负责物理内存的分配和回收,虚拟内存管理则将物理内存映射到虚拟地址空间,并实现内存的共享和保护。
内核内存管理则负责内核空间的分配和释放,以及内核页面的交换等。
linux字符驱动框架(⽤户态的read,write,poll是怎么操作驱动的)前⾔这篇⽂章是通过对⼀个简单字符设备驱动的操作来解释,⽤户态的读写操作是怎么映射到具体设备的。
因为针对不同版本的linux内核,驱动的接⼝函数⼀直有变化,这贴出我测试的系统信息:root@ubuntu:~/share/dev/cdev-2# cat /etc/os-release |grep -i verVERSION="16.04.5 LTS (Xenial Xerus)"VERSION_ID="16.04"VERSION_CODENAME=xenialroot@ubuntu:~/share/dev/cdev-2#root@ubuntu:~/share/dev/cdev-2# uname -r4.15.0-33-generic字符驱动这⾥给出了⼀个不怎么标准的驱动,定义了⼀个结构体 struct dev,其中buffer成员模拟驱动的寄存器。
由wr,rd作为读写指针,len作为缓存buffer的长度。
具体步骤如下:1. 定义 init 函数,exit函数,这是在 insmod,rmmod时候调⽤的。
2. 定义驱动打开函数open,这是在⽤户态打开设备时候调⽤的。
3. 定义release函数,这是在⽤户态关闭设备时候⽤到的。
4. 定义read,write,poll函数,并挂接到 file_operations结构体中,所有⽤户态的read,write,poll都会最终调到这些函数。
chardev.c/*参考:深⼊浅出linux设备驱动开发*/#include <linux/module.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/uaccess.h>#include <linux/wait.h>#include <linux/semaphore.h>#include <linux/sched.h>#include <linux/cdev.h>#include <linux/types.h>#include <linux/kdev_t.h>#include <linux/device.h>#include <linux/poll.h>#define MAXNUM 100#define MAJOR_NUM 400 //主设备号 ,没有被使⽤struct dev{struct cdev devm; //字符设备struct semaphore sem;int flag;poll_table* table;wait_queue_head_t outq;//等待队列,实现阻塞操作char buffer[MAXNUM+1]; //字符缓冲区char *rd,*wr,*end; //读,写,尾指针}globalvar;static struct class *my_class;int major=MAJOR_NUM;static ssize_t globalvar_read(struct file *,char *,size_t ,loff_t *);static ssize_t globalvar_write(struct file *,const char *,size_t ,loff_t *);static int globalvar_open(struct inode *inode,struct file *filp);static int globalvar_release(struct inode *inode,struct file *filp);static unsigned int globalvar_poll(struct file* filp, poll_table* wait);/*结构体file_operations在头⽂件 linux/fs.h中定义,⽤来存储驱动内核模块提供的对设备进⾏各种操作的函数的指针。
Linux内核架构和工作原理详解作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
目前支持模块的动态装卸(裁剪)。
Linux内核就是基于这个策略实现的。
Linux 进程采用层次结构,每个进程都依赖于一个父进程。
内核启动init程序作为第一个进程。
该进程负责进一步的系统初始化操作。
init进程是进程树的根,所有的进程都直接或者间接起源于该进程。
virt/ ---- 提供虚拟机技术的支持。
Linux内核预备工作理解Linux内核最好预备的知识点:懂C语言懂一点操作系统的知识熟悉少量相关算法懂计算机体系结构Linux内核的特点:结合了unix操作系统的一些基础概念Linux内核的任务:1.从技术层面讲,内核是硬件与软件之间的一个中间层。
作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
2.从应用程序的层面讲,应用程序与硬件没有联系,只与内核有联系,内核是应用程序知道的层次中的最底层。
在实际工作中内核抽象了相关细节。
3.内核是一个资源管理程序。
负责将可用的共享资源(CPU时间、磁盘空间、网络连接等)分配得到各个系统进程。
4.内核就像一个库,提供了一组面向系统的命令。
系统调用对于应用程序来说,就像调用普通函数一样。
内核实现策略:1.微内核。
最基本的功能由中央内核(微内核)实现。
所有其他的功能都委托给一些独立进程,这些进程通过明确定义的通信接口与中心内核通信。
2.宏内核。
内核的所有代码,包括子系统(如内存管理、文件管理、设备驱动程序)都打包到一个文件中。
内核中的每一个函数都可以访问到内核中所有其他部分。
目前支持模块的动态装卸(裁剪)。
Linux内核就是基于这个策略实现的。
哪些地方用到了内核机制?1.进程(在cpu的虚拟内存中分配地址空间,各个进程的地址空间完全独立;同时执行的进程数最多不超过cpu数目)之间进行通信,需要使用特定的内核机制。
linux驱动面试题Linux驱动是指在Linux操作系统中,用于控制与硬件之间的交互和通信的软件模块。
在Linux的工作环境中,驱动程序起着至关重要的作用。
如果你准备参加Linux驱动的面试,以下是一些常见的Linux驱动面试题,希望可以对你有所帮助。
一、简述Linux驱动的作用和功能。
Linux驱动是一种软件模块,用来控制硬件设备与操作系统之间的通信和交互。
它负责将输入/输出请求传递给硬件设备,并处理来自硬件设备的中断和事件。
Linux驱动的功能包括设备初始化和配置、数据传输和处理以及错误处理等。
二、请简要介绍Linux驱动程序的加载过程。
当系统启动时,Linux内核首先会加载核心模块和驱动程序模块。
驱动程序模块是以目标硬件设备为基础的,它们包含了与设备通信所需的函数和数据结构。
一般情况下,系统会根据硬件设备信息自动加载对应的驱动程序模块。
加载驱动程序模块需要通过insmod或modprobe命令进行,这些命令可以在启动时自动执行。
三、请简述Linux驱动程序的实现方式。
Linux驱动程序的实现方式包括内核空间驱动和用户空间驱动。
内核空间驱动是指驱动程序运行在内核空间,直接与硬件设备进行交互。
用户空间驱动是指驱动程序运行在用户空间,通过系统调用和内核模块实现与硬件设备的通信。
内核空间驱动的优势是性能更好,但需要对内核进行编译和加载,而用户空间驱动的优势是开发更加容易,但性能会稍差。
四、请介绍Linux驱动程序中常用的数据结构和函数。
在Linux驱动程序中,常用的数据结构有file结构体、inode结构体和cdev结构体等。
file结构体用于表示一个打开的设备文件,可以通过它传递与设备相关的信息。
inode结构体用于表示一个文件的元数据信息,包括文件的权限、大小和创建时间等。
cdev结构体用于表示一个字符设备,包含了设备文件的操作函数和设备号等信息。
常用的函数包括register_chrdev、unregister_chrdev、request_irq和release_irq等。
不管是Windows还是Linux,驱动程序都扮演着重要的角色。
应用程序只能通过驱动程序才能同硬件设备或系统内核通讯。
Linux内核对不同的系统定义了标准的接口(API),应用程序就是通过这些标准的接口来操作内核和硬件。
驱动可以被编译的内核中(build-in),也可以做为内核模块(Module)存在于内核的外面,需要的时候动态插入到内核中运行。
就像你学习操作系统概念时所了解的那样,Linux内核也分为几个大的部分:进程管理、内存管理、文件系统、设备控制、网络系统等,参考图1-1。
这里就不对Linux系统内核的各个部分做过多的介绍了,在后面的学习中你就会逐渐地对这些概念有个更深入的了解。
其实Linux内核的精髓远不止这些,对于一个Linux内核的爱好者或开发者来说,最好详细的浏览内核源代码,订阅Linux内核相关的邮件列表,或是登陆Linux开发社区。
更多的信息,请登陆Linux内核官方网站:一个简单的驱动下面我们来编写第一个驱动程序,它很简单,在运行时会输出…Hello World‟消息。
// hello.c#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>static int __init hello_init(void){printk(KERN_ALERT "Hello World!\n");return 0;}static void __exit hello_exit(void){printk(KERN_ALERT "Goodbye World!\n");}module_init(hello_init);module_exit(hello_exit);MODULE_LICENSE("GPL");这就是一个简单的驱动程序,它什么也没做,仅仅是输出一些信息,不过对于我们来说这已经足够了。
linux driver中断处理实例-概述说明以及解释1.引言概述部分的内容可以如下所示:1.1 概述Linux驱动程序是操作系统内核的核心组成部分之一。
它负责与硬件设备进行交互,并提供给用户空间的应用程序访问硬件的接口。
中断处理是Linux驱动程序中非常重要的组成部分,它允许硬件设备在需要注意的情况下主动向CPU发送信号。
这些信号需要被驱动程序捕获并处理,以执行相应的操作。
中断处理的高效与否直接影响着系统的整体性能和响应能力。
本文将围绕Linux驱动程序中的中断处理展开讨论。
我们将首先介绍Linux驱动程序的基本概念,包括其作用、类型和加载方式等。
然后我们将详细探讨中断处理的基本概念,包括中断的定义、传统中断与异常中断的区别等。
接下来,我们将深入分析在Linux驱动程序中实现中断处理的关键技术和策略,包括中断处理程序的注册、上下文切换、共享中断、中断处理的顺序、中断处理线程和底半部等。
通过对Linux驱动程序中断处理实例的分析,我们将展示如何正确地设计和实现中断处理程序,以提高系统的可靠性、稳定性和性能。
同时,我们也将深入思考中断处理的重要性,并展望未来中断处理的发展方向。
在本系列文章中,我们希望为读者提供全面的Linux驱动程序中断处理知识,并为相关领域的开发者和研究者提供有价值的参考和指导。
1.2 文章结构文章结构部分的内容可以包括以下内容:文章结构部分旨在介绍本文的整体结构,让读者对文章的脉络有一个大致的了解。
本文主要围绕着Linux驱动程序中的中断处理展开,共分为引言、正文和结论三个部分。
引言部分首先对本文的背景和主题进行一个概述,介绍了本文主要讨论的内容是Linux驱动程序中的中断处理实例。
接着介绍了文章的结构,包括引言、正文和结论三个部分。
通过明确的结构,读者可以清楚地了解到本文的整体框架。
正文部分是本文的主体部分,也是最核心的部分。
在正文中,我们将逐步展开对Linux驱动程序中的中断处理的讲解。
本讲主要概述Linux设备驱动框架、驱动程序的配置文件及常用的加载驱动程序的方法;并且介绍Red Hat Linux安装程序是如何加载驱动的,通过了解这个过程,我们可以自己将驱动程序放到引导盘中;安装完系统后,使用kudzu自动配置硬件程序。
Linux设备驱动概述1.内核和驱动模块操作系统是通过各种驱动程序来驾驭硬件设备,它为用户屏蔽了各种各样的设备,驱动硬件是操作系统最基本的功能,并且提供统一的操作方式。
正如我们查看屏幕上的文档时,不用去管到底使用nVIDIA芯片,还是ATI芯片的显示卡,只需知道输入命令后,需要的文字就显示在屏幕上。
硬件驱动程序是操作系统最基本的组成部分,在Linux内核源程序中也占有较高的比例。
Linux内核中采用可加载的模块化设计(LKMs ,Loadable Kernel Modules),一般情况下编译的Linux内核是支持可插入式模块的,也就是将最基本的核心代码编译在内核中,其它的代码可以选择是在内核中,或者编译为内核的模块文件。
如果需要某种功能,比如需要访问一个NTFS分区,就加载相应的NTFS模块。
这种设计可以使内核文件不至于太大,但是又可以支持很多的功能,必要时动态地加载。
这是一种跟微内核设计不太一样,但却是切实可行的内核设计方案。
我们常见的驱动程序就是作为内核模块动态加载的,比如声卡驱动和网卡驱动等,而Linux最基础的驱动,如CPU、PCI总线、TCP/IP协议、APM(高级电源管理)、VFS等驱动程序则编译在内核文件中。
有时也把内核模块就叫做驱动程序,只不过驱动的内容不一定是硬件罢了,比如ext3文件系统的驱动。
理解这一点很重要。
因此,加载驱动时就是加载内核模块。
下面来看一下有关模块的命令,在加载驱动程序要用到它们:lsmod、modprob、insmod、rmmod、modinfo。
lsmod列出当前系统中加载的模块,例如: #lsmod (与cat /proc/modules得出的内容是一致的)Module Size Used by Not taintedradeon 115364 1 agpgart 56664 3nls_iso8859-1 3516 1 (autoclean)loop 12120 3 (autoclean)smbfs 44528 2(autoclean)parport_pc 19076 1 (autoclean)lp 9028 0 (autoclean)parport 37088 1 (autoclean) [parport_pc lp]autofs 13364 0 (autoclean) (unused)ds 8704 2yenta_socket 13760 2 pcmcia_core 57184 0 [ds yenta_socket]tg3 55112 1 sg 36940 0 (autoclean)sr_mod 18104 0 (autoclean)microcode 4724 0 (autoclean)ide-scsi 12208 0 scsi_mod 108968 3 [sg sr_mod ide-scsi]ide-cd 35680 0 cdrom 33696 0 [sr_modide-cd]nls_cp936 124988 1 (autoclean)nls_cp437 5148 1 (autoclean)vfat 13004 1 (autoclean)fat 38872 0 (autoclean) [vfat]keybdev 2976 0 (unused)mousedev 5524 1 hid 22212 0 (unused)input 5888 0 [keybdev mousedev hid]ehci-hcd 20104 0 (unused)usb-uhci 26412 0 (unused)usbcore 79392 1 [hid ehci-hcd usb-uhci]ext3 91592 2 jbd 52336 2 [ext3]上面显示了当前系统中加载的模块,左边数第一列是模块名,第二列是该模块大小,第三列则是该模块使用的数量。
如果后面为unused,则表示该模块当前没在使用。
如果后面有autoclean,则该模块可以被rmmod -a命令自动清洗。
rmmod -a命令会将目前有autoclean的模块卸载,如果这时候某个模块未被使用,则将该模块标记为autoclean。
如果在行尾的[ ]括号内有模块名称,则括号内的模块就依赖于该模块。
例如: cdrom 34144 0 [sr_mod ide-cd]其中ide-cd及sr_mod模块就依赖于cdrom模块。
系统的模块文件保存在/lib/modules/2.4.XXX/kerne目录中,根据分类分别在fs、net 等子目录中,他们的互相依存关系则保存在/lib/modules/2.4.XXX/modules.dep文件中。
需要注意,该文件不仅写入了模块的依存关系,同时内核查找模块也是在这个文件中,使用modprobe命令,可以智能插入模块,它可以根据模块间依存关系,以及/etc/modules.conf文件中的内容智能插入模块。
比如希望加载ide的光驱驱动,则可运行下面命令: # modprobe ide-cd此时会发现,cdrom模块也会自动插入。
insmod也是插入模块的命令,但是它不会自动解决依存关系,所以一般加载内核模块时使用的命令为modprobe。
rmmod可以删除模块,但是它只可以删除没有使用的模块。
Modinfo用来查看模块信息,如modinfo -d cdrom,在Red Hat Linux系统中,模块的相关命令在modutils的RPM包中。
2.设备文件当我们加载了设备驱动模块后,应该怎样访问这些设备呢?Linux是一种类Unix系统,Unix的一个基本特点是“一切皆为文件”,它抽象了设备的处理,将所有的硬件设备都像普通文件一样看待,也就是说硬件可以跟普通文件一样来打开、关闭和读写。
系统中的设备都用一个设备特殊文件代表,叫做设备文件,设备文件又分为Block(块)型设备文件、Character(字符)型设备文件和Socket(网络插件)型设备文件。
Block设备文件常常指定哪些需要以块(如512字节)的方式写入的设备,比如IDE硬盘、SCSI硬盘、光驱等。
而Character型设备文件常指定直接读写,没有缓冲区的设备,比如并口、虚拟控制台等。
Socket(网络插件)型设备文件指定的是网络设备访问的BSD socket接口。
#ls -l/dev/hda /dev/video0 /dev/logbrw-rw---- 1 root disk 3, 0 Sep 15 2003/dev/hdasrw-rw-rw- 1 root root 0 Jun 3 16:55 /dev/logcrw------- 1 root root 81, 0 Sep 15 2003 /dev/video0上面显示的是三种设备文件,注意它们最前面的字符,Block型设备为b,Character 型设备为c,Socket设备为s。
由此可以看出,设备文件都放在/dev目录下,比如硬盘就是用/dev/hd*来表示,/dev/hda表示第一个IDE接口的主设备,/dev/hda1表示第一个硬盘上的第一个分区;而/dev/hdc表示第二个IDE接口的主设备。
可以使用下面命令: #dd if=/dev/hdaof=/root/a.img bs=446 count=1把第一个硬盘上前446个字节的MBR信息导入到a.img文件中。
对于Block和Character型设备,使用主(Major)和辅(minor)设备编号来描述设备。
主设备编号来表示某种驱动程序,同一个设备驱动程序模块所控制的所有设备都有一个共同的主设备编号,而辅设备编号用于区分该控制器下不同的设备,比如,/dev/hda1(block 3/1)、/dev/hda2(block 3/2 )和/dev/hda3( block3/3 )都代表着同一块硬盘的三个分区,他们的主设备号都是3,辅设备号分别为1、2、3。
这些设备特殊文件用mknod命令来创建: # mknod harddisk b 3 0我们就在当前位置创建出一个与/dev/hda一样的、可以访问第一个IDE设备主硬盘的文件,文件名叫做harddisk。
使用下面命令可以查看设备编号: #file /dev/hda/dev/hda: block special (3/0)其中Block代表/dev/hda是系统的Block型(块型)设备文件,它的主设备编号为3,辅设备编号为0。
#ls -l /dev/hda /dev/hdb brw-rw---- 1 root disk 3, 0 Sep 15 2003 /dev/hdabrw-rw---- 1 root disk 3, 64 Sep 15 2003 /dev/hdb使用ls -l也可以看到设备编号,/dev/hdb代表第一个IDE接口的从设备(Slave)也是Block设备,编号为(3/64),还有另外一种设备文件是/dev/tty*。
使用如下命令: #echo "hello tty1" > /dev/tty1将字符串“hello tty1”输出到/dev/tty1代表的第一个虚拟控制台上,此时按“Alt + F1”可以看到该字符出现在屏幕上,这个特殊的文件就代表着我们的第一虚拟控制台。
#file /dev/tty1/dev/tty1: character special (4/1)由上可以看到,它的类型为Character型(字符型)设备文件,主设备号为4,辅设备号为1。
同样,/dev/tty2代表着第二个虚拟控制台,是Character设备,编号为(4/2)。
当将/dev/cdrom加载到/mnt/cdrom中时,只要访问/mnt/cdrom系统就会自动引入到/dev/cdrom对应的驱动程序中,访问实际的数据。
有关设备文件的编号可以看内核文档/usr/src/linux-2.*/Documentation/devices.txt文件(在Kernel的源文件解包后的Documentation目录中),其中详细叙述了各种设备文件编号的意义。
3.使用/proc目录中的文件监视驱动程序的状态通过设备文件怎样访问到相应的驱动程序呢?它们中间有一个桥梁,那就是proc文件系统,它一般会被加载到/proc目录。
访问设备文件时,操作系统通常会通过查找/proc目录下的值,确定由哪些驱动模块来完成任务。