linux设备号详解

linux设备号详解
linux设备号详解

转载】设备文件简介

linux 中的设备有2种类型:字符设备(无缓冲且只能顺序存取)、块设备(有缓冲且可以随机存取)。每个字符设备和块设备都必须有主、次设备号,主设备号相同的设备是同类设备(使用同一个驱动程序)。这些设备中,有些设备是对实际存在的物理硬件的抽象,而有些设备则是内核自身提供的功能(不依赖于特定的物理硬件,又称为"虚拟设备")。每个设备在 /dev 目录下都有一个对应的文件(节点)。可以通过 cat /proc/devices 命令查看当前已经加载的设备驱动程序的主设备号。内核能够识别的所有设备都记录在原码树下的

documentation/devices.txt 文件中。在 /dev 目录下除了字符设备和块设备节点之外还通常还会存在:fifo管道、socket、软/硬连接、目录。这些东西没有主/次设备号。

$ ls -l /dev/rfd0 /dev/fd0

brw-r----- 9 root operator 2, 0 nov 12 13:32 /dev/fd0

crw-r----- 9 root operator 9, 0 nov 12 13:32 /dev/rfd0

可以看到原来显示文件大小的地方,现在改为显示两个用逗号分隔的数字。这是系统用来表示设备的两个重要的序号,第一个为主设备号(major number),用来表示设备使用的硬件驱动程序在系统中的序号;第二个为从设备号(minor number)。

linux内核所能识别的所有设备都记录在

https://www.360docs.net/doc/cc18617735.html,/docs/device-list/

而内核原码树中的 documentation/devices.txt 可能不是最新版本。

了解这些设备的最基本要求就是对每个设备文件的含义了如指掌,下面就医列表的形式列出常见的设备文件以及相应的含义(比较偏僻的就省略了):

码:----------------------------------------------------------------------

主设备号设备类型

次设备号=文件名简要说明

----------------------------------------------------------------------

0 未命名设备(例如:挂载的非设备)

0 = 未空设备号保留

1 char 内存设备

1 = /dev/mem 直接存取物理内存

2 = /dev/kmem 存取经过内核虚拟之后的内存

3 = /dev/null 空设备。任何写入都将被直接丢弃,任何读取都将得到eof。

4 = /dev/port 存取

i/o 端口

5 = /dev/zero 零字节源,只能读取到无限多的零字节。

7 = /dev/full 满设备。

任何写入都将失败,并把errno设为enospc以表示没有剩余空间。

8 = /dev/random 随机数发生器。完全由用户的输入来产生随机数。

如果用户停止所有动作,则停止产生新的随机数。

9 = /dev/urandom 更快,但是不够安全的随机数发生器。尽可能由用户的输入来产生随机数,

如果用户停止所有动作,则把已经产生的随机数做为种子来产生新的随机数。

10 = /dev/aio 异步 i/o 通知接口

11 = /dev/kmsg 任何对该文件的写入都将作为 printk 的输出

1 block ram disk

0 = /dev/ram0 第1个ram disk (initrd只能使用ram0)

1 = /dev/ram1 第2个ram disk

...

200 = /dev/ram200 第200个 ram disk 4 char tty(终端)设备

0 = /dev/tty0 当前虚拟控制台

1 = /dev/tty1 第1个虚拟控制台

...

63 = /dev/tty63 第63个虚拟控制台

4 block 如果根文件系统以是以只读方式挂载的,那么就不可能创建真正的设备节点,

此时就使用该设备作为动态分配的主(major)设备的别名

0 = /dev/root

5 char 其他 tty 设备

0 = /dev/tty 当前 tty 设备

1 = /dev/console 系统控制台

2 = /dev/ptmx 所有

pty master 的复用器

7 char 虚拟控制台捕捉设备(这些设备既允许读也允许写)

0 = /dev/vcs 当前虚拟控制台(vc)的文本内容

1 = /dev/vcs1 tty1 的文本内容

...

63 = /dev/vcs63 tty63 的文本内容

128 = /dev/vcsa 当前虚拟控制台(vc)的文本/属性内容

129 = /dev/vcsa1 tty1 的文本/属性内容

...

191 = /dev/vcsa63 tty63 的文本/属性内容

代码: 7 block 回环设备(用一个普通的磁盘文件来模拟一个块设备)

对回环设备的绑定由 mount(8) 或 losetup(8) 处理

0 = /dev/loop0 第1个回环设备

1 = /dev/loop1 第2个回环设备

...

8 block scsi 磁盘(0-15)

0 = /dev/sda 第1个scsi 磁盘(整个磁盘)

16 = /dev/sdb 第2个scsi 磁盘(整个磁盘)

32 = /dev/sdc 第3个scsi 磁盘(整个磁盘)

...

240 = /dev/sdp 第16个scsi 磁盘(整个磁盘)

分区表示方法如下(以第3个 scsi 磁盘为例)

33 = /dev/sdc1 第1个分区

34 = /dev/sdc2 第2个分区

...

47 = /dev/sdc15 第15个分区

对于linux/i386来说,分区1-4是主分区,5-15是逻辑分区。

9 block metadisk(raid)设备

0 = /dev/md0 第1组metadisk

1 = /dev/md1 第2组metadisk

...

metadisk 驱动用于将同一个文件系统分割到多个物理磁盘上。

10 char 非串口鼠标,各种杂项设备和特性

1 = /dev/psaux ps/2鼠标

131 = /dev/temperature 机器内部温度

134 = /dev/apm_bios apm(高级电源管理) bios

135 = /dev/rtc 实时时钟(real time clock)

144 = /dev/nvram 非易失配置 ram

162 = /dev/smbus 系统管理总线(system management bus)

164 = /dev/ipmo intel的智能平台管理(intelligent platform management)接口

173 = /dev/ipmikcs 智能平台管理(intelligent platform management)接口

175 = /dev/agpgart agp图形地址重映

射表(graphics address remapping table)

182 = /dev/perfctr 性能监视计数器

183 = /dev/hwrng 通用硬件随机数发生器

184 = /dev/cpu/microcode cpu微代码更新接口

186 = /dev/atomicps 进程状态数据的原子快照

188 = /dev/smbusbios smbus(系统管理总线) bios

200 = /dev/net/tun tap/tun 网络设备(tap/tun以软件的方式实现了网络设备)

tap模拟了

以太网帧(第二层),tun模拟了ip包(第三层)。

202 = /dev/emd/ctl 增强型 metadisk raid (emd) 控制器

220 = /dev/mptctl message passing technology (mpt) control

223 = /dev/input/uinput 用户层输入设备驱动支持

227 = /dev/mcelog x86_64 machine check exception driver

228 = /dev/hpet hpet driver

229 = /dev/fuse fuse(用户空间的虚拟文件系统)

231 = /dev/snapshot 系统内存快照

232 = /dev/kvm 基于内核的虚构机(基于amd svm和intel vt硬件虚拟技术)

11 block scsi cd-rom 设备

0 = /dev/scd0 第1个scsi cd-rom

1 = /dev/scd1 第2个

scsi cd-rom

...

代码:

13 char 核心输入设备

32 =

/dev/input/mouse0 第1个鼠标

33 =

/dev/input/mouse1 第2个鼠标

...

62 = /dev/input/mouse30 第31个鼠标

63 = /dev/input/mice 所有鼠标的统一

64 =

/dev/input/event0 第1个事件队列

65 =

/dev/input/event1 第2个事件队列

...

95 =

/dev/input/event1 第32个事件队列

21 char 通用 scsi 设备(通常是scsi光驱)

0 = /dev/sg0 第1个通用 scsi 设备

1 = /dev/sg1 第2个通用 scsi 设备

...

29 char 通用帧缓冲(frame buffer)设备

0 = /dev/fb0 第1个帧缓冲设备

1 = /dev/fb1 第2个帧缓冲设备

...

31 = /dev/fb31 第32个帧缓冲设备

30 char ibcs-2 兼容设备

0 = /dev/socksys 套接字访问接口

1 = /dev/spx svr3 本地 x 接口

32 = /dev/inet/ip 网络访问接口

33 = /dev/inet/icmp

34 = /dev/inet/ggp

35 = /dev/inet/ipip

36 = /dev/inet/tcp

37 = /dev/inet/egp

38 = /dev/inet/pup

39 = /dev/inet/udp

40 = /dev/inet/idp

41 = /dev/inet/rawip

此外,ibcs-2 还需要下面的连接必须存在

/dev/ip -> /dev/inet/ip

/dev/icmp -> /dev/inet/icmp

/dev/ggp -> /dev/inet/ggp

/dev/ipip -> /dev/inet/ipip

/dev/tcp -> /dev/inet/tcp

/dev/egp -> /dev/inet/egp

/dev/pup -> /dev/inet/pup

/dev/udp -> /dev/inet/udp

/dev/idp -> /dev/inet/idp

/dev/rawip -> /dev/inet/rawip

/dev/inet/arp -> /dev/inet/udp

/dev/inet/rip -> /dev/inet/udp

/dev/nfsd -> /dev/socksys

/dev/x0r -> /dev/null

代码: 36 char netlink 支持

0 = /dev/route 路由, 设备更新, kernel to user

3 = /dev/fwmonitor firewall packet 复制

59 char sf 防火墙模块

0 = /dev/firewall 与 sf 内核模块通信

65 block scsi 磁盘(16-31)

0 = /dev/sdq 第17个scsi 磁盘(整个磁盘)

16 = /dev/sdr 第18个scsi 磁盘(整个磁盘)

32 = /dev/sds 第19个scsi 磁盘(整个磁盘)

...

240 = /dev/sdaf 第32个scsi 磁盘(整个磁盘)

66 block scsi 磁盘(32-47)

0 = /dev/sdag 第33个 scsi 磁盘(整个磁盘)

16 = /dev/sdah 第34个scsi 磁盘(整个磁盘)

32 = /dev/sdai 第35个scsi 磁盘(整个磁盘)

...

240 = /dev/sdav 第48个scsi 磁盘(整个磁盘)

89 char i2c 总线接口

0 = /dev/i2c-0 第1个 i2c 适配器

1 = /dev/i2c-1 第2个 i2c 适配器

...

98 block 用户模式下的虚拟块设备(分区处理方式与 scsi 磁盘相同)

0 = /dev/ubda 第1个用户模式块设备

16 = /dev/udbb 第2个用户模式块设备

...

103 block 审计(audit)设备

0 = /dev/audit 审计(audit)设备

128-135 char unix98 pty master

这些设备不应当存在设备节点,而应当通过

/dev/ptmx 接口访问。

136-143 char unix98 pty slave

这些设备节点是自动生成的(伴有适当的权限和模式),不能手动创建。

方法是通过使用适当的 mount 选项(通常是:

mode=0620,gid=)

将 devpts 文件系统挂载到 /dev/pts 目录即可。

0 = /dev/pts/0 第1个 unix98 pty slave

1 = /dev/pts/1 第2个 unix98 pty slave

...

代码:153 block enhanced metadisk raid (emd) 存储单元(分区处理方式与 scsi 磁盘相同)

0 = /dev/emd/0 第1个存储单元

1 = /dev/emd/0p1 第1个存储单元的第1个分区

2 = /dev/emd/0p2 第1个存储单元的第2个分区

...

15 = /dev/emd/0p15 第1个存储单元的第15个分区

16 = /dev/emd/1 第2个存储单元

32 = /dev/emd/2 第3个存储单元

...

240 = /dev/emd/15 第16个存储单元

180 char usb 字符设备

96 = /dev/usb/hiddev0 第1个usb人机界面设备(鼠标/键盘/游戏杆/手写版等人操作计算机的设备)

...

111 = /dev/usb/hiddev15 第16个usb

人机界面设备

180 block usb 块设备(u盘之类)

0 = /dev/uba 第1个usb 块设备

8 = /dev/ubb 第2个usb 块设备

16 = /dev/ubc 第3个usb 块设备

...

192 char 内核 profiling 接口

0 = /dev/profile profiling 控制设备

1 = /dev/profile0 cpu 0 的

profiling 设备

2 = /dev/profile1 cpu 1 的

profiling 设备

...

193 char 内核事件跟踪接口

0 = /dev/trace 跟踪控制设备

1 = /dev/trace0 cpu 0 的跟踪设备

2 = /dev/trace1 cpu 1 的跟踪设备

...

195 char nvidia 图形设备(比如显卡)

0 = /dev/nvidia0 第1个 nvidia 卡

1 = /dev/nvidia1 第2个 nvidia 卡

...

255 =

/dev/nvidiactl nvidia 卡控制设备

202 char 特定于cpu模式的寄存器(model-specific register,msr)

0 =

/dev/cpu/0/msr cpu 0 的 msrs

1 =

/dev/cpu/1/msr cpu 1 的 msrs

...

203 char cpu cpuid 信息

0 =

/dev/cpu/0/cpuid cpu 0 的 cpuid

1 =

/dev/cpu/1/cpuid cpu 1 的 cpuid

...

码:================================================================== =

这部分详细说明一些应该或可能存在于 /dev 目录之外的文件。

链接最好使用与这里完全相同的格式(绝对路径或相对路径)。

究竟是使用硬链接(hard)还是软连接(symbolic)取决于不同的设备。

必须的链接

必须在所有的系统上都存在这些连接:

链接目标链接类

型简要说明

/dev/fd /proc/self/fd symbolic 文件描述府

/dev/stdin fd/0 symbolic

标准输入文件描述府

/dev/stdout fd/1 symbolic

标准输出文件描述符

/dev/stderr fd/2 symbolic

标准错误文件描述符

/dev/nfsd socksys symbolic 仅为 ibcs-2 所必须

/dev/x0r null symbolic

仅为 ibcs-2 所必须

[注意] /dev/x0r 是 --

推荐的链接

推荐在所有的系统上都存在这些连接:

链接目标链接类

型简要说明

/dev/core /proc/kcore symbolic 为了向后兼容

/dev/ramdisk ram0 symbolic 为了向后兼容

/dev/ftape qft0 symbolic

为了向后兼容

/dev/bttv0 video0 symbolic 为了向后兼容

/dev/radio radio0 symbolic 为了向后兼容

/dev/i2o* /dev/i2o/* symbolic 为了向后兼容

/dev/scd? sr? hard

代替 scsi cd-rom 的名字

本地定义的链接

下面的链接很可能需要根据机器的实际硬件配置创建其中的一部分甚至全部。这些链接仅仅是为了迎合习惯用法,它们既非必须也非推荐。

链接目标链接类

型简要说明

/dev/mouse mouse port symbolic 当前鼠标

/dev/tape tape device symbolic 当前磁带

/dev/cdrom cd-rom device symbolic 当前cd-rom

/dev/cdwriter cd-writer symbolic 当前cd-writer

/dev/scanner scanner symbolic 当前扫描仪

/dev/modem modem port symbolic 当前调制解调器

/dev/root root device symbolic 当前根文件系统所在设备

/dev/swap swap device symbolic 当前swap所在设备

/dev/modem 不应当用于能够同时支持呼入和呼出的modem,因为往往会导致锁文件问题。

如果存在 /dev/modem ,那么它应当指向一个恰当的主 tty 设备。

对于scsi设备,

/dev/tape 和 /dev/cdrom 应该分别指向"cooked"设备 /dev/st* 和

/dev/sr* ;

而 /dev/cdwriter 和 /dev/scanner 应当分别指向恰当的 /dev/sg* 。

/dev/mouse 可以指向一个主串行 tty 设备、一个硬件鼠标、

或者一个对应鼠标驱动程序的套接字(例如 /dev/gpmdata)。

套接字和管道

持久套接字和命名管道可以存在于 /dev 中。常见的有:

/dev/printer socket lpd 本地套接字/dev/log socket syslog 本地套接字/dev/gpmdata socket gpm 鼠标多路复用器(multiplexer)

/dev/gpmctl socket (lfs-livecd中出现)

/dev/initctl fifo pipe init 监听它并从中获取信息(用户与 init 进程交互的通道)

挂载点

以下名称被保留用于挂载特殊的文件系统。

这些特殊的文件系统只提供内核界面而不提供标准的设备节点。

/dev/pts devpts pty slave 文件系统/dev/shm tmpfs 提供对 posix 共享内

《实用操作系统》实验报告五linux设备管理

《实用操作系统》实验报告 实验报告: 5 实验项目名称:设备管理 班级:学号:姓名: 地点:时间:2013 年11 月13 日 一、实验内容 1、添加硬盘,创建二个主分区、一个扩展分区,二个逻辑分区 注意:ide、scsi 提示:分区、格式化、挂载(fdisk,mkfs,mount) 2、查看常见的设备文件有哪些?(ls /dev ) 常见的设备文件:/dev/hd* IDE接口的硬盘(IDE接口的设备) /dev/sd* SCSI/USB设备/dev/cua* 串口设备/dev/lp* 并口设备/dev/tty* 终端设备/dev/consol 控制台设备/dev/eth* 以太网设备/dev/cdrom IDE光驱/dev/fd* 软驱/dev/audio 音频设备/dev/scd SCSI的光驱/dev/ppp PPP设备/dev/isdn* ISDN设备 3、挂载光盘,查看光盘内容创建挂载点要求:以本人姓名缩写为目录mkdir / 目录/设备挂载mount 空格源设备空格挂载点 4、显示管理System-config-display 5、声卡管理System-config-soundcard 6、打印机管理System-config-printer 7、网卡管理System-config-network 二、实验步骤及结果 1.添加硬盘,创建分区; 在启动虚拟机前,在工具栏中点击“虚拟机”,找到“设置”选项,在左面的硬件中找到硬盘,进行硬盘设备添加,这里有IDE和SCSI两种硬盘类型可供选择添加。完成硬盘添加后即可启动虚拟机进入linux系统。在这我添加了容量相同的硬盘设备类型各一;

Linux设备驱动程序举例

Linux设备驱动程序设计实例2007-03-03 23:09 Linux系统中,设备驱动程序是操作系统内核的重要组成部分,在与硬件设备之间 建立了标准的抽象接口。通过这个接口,用户可以像处理普通文件一样,对硬件设 备进行打开(open)、关闭(close)、读写(read/write)等操作。通过分析和设计设 备驱动程序,可以深入理解Linux系统和进行系统开发。本文通过一个简单的例子 来说明设备驱动程序的设计。 1、程序清单 //MyDev.c 2000年2月7日编写 #ifndef __KERNEL__ #define __KERNEL__//按内核模块编译 #endif #ifndef MODULE #define MODULE//设备驱动程序模块编译 #endif #define DEVICE_NAME "MyDev" #define OPENSPK 1 #define CLOSESPK 2 //必要的头文件 #include //同kernel.h,最基本的内核模块头文件 #include //同module.h,最基本的内核模块头文件 #include //这里包含了进行正确性检查的宏 #include //文件系统所必需的头文件 #include //这里包含了内核空间与用户空间进行数据交换时的函数宏 #include //I/O访问 int my_major=0; //主设备号 static int Device_Open=0; static char Message[]="This is from device driver"; char *Message_Ptr; int my_open(struct inode *inode, struct file *file) {//每当应用程序用open打开设备时,此函数被调用 printk ("\ndevice_open(%p,%p)\n", inode, file); if (Device_Open) return -EBUSY;//同时只能由一个应用程序打开 Device_Open++; MOD_INC_USE_COUNT;//设备打开期间禁止卸载 return 0; } static void my_release(struct inode *inode, struct file *file)

Linux命令大全(设备管理)

设备管理-setleds 名称:setleds 使用权限:一般使用者 使用方式: setleds [-v] [-L] [-D] [-F] [{+|-}num] [{+|-}caps] [{+|-}scroll]说明: 用来设定键盘上方三个LED 的状态。在Linux 中,每一个虚拟主控台都有独立的设定。 参数: -F 预设的选项,设定虚拟主控台的状态。 -D 除了改变虚拟主控台的状态外,还改变预设的状态。 -L 不改变虚拟主控台的状态,但直接改变LED 显示的状态。这会使得LDE 显示和目前虚拟主控台的状态不符合。我们可以在稍后用-L 且不含其它选项的setleds 命令回复正常状态。 -num +num 将数字键打开或关闭。 -caps +caps 把大小写键打开或关闭。 -scroll +scroll 把选项键打开或关闭。 范例: 将数字键打开,其馀二个灯关闭。 # setleds +num -caps -scroll 设备管理-loadkeys 名称: loadkeys 使用权限: 所有使用者

使用方式: loadkeys [ -d --default ] [ -h --help ] [ -q --quiet ] [ -v --verbose [ -v --verbose ]...] [ -m --mktable ] [ -c --clearcompose ] [ -s --clearstrings ] [ filename... ] 使用说明: 这个命令可以根据一个键盘定义表改变linux 键盘驱动程序转译键盘输入过程。详细的说明请参考dumpkeys。 选项: -v --verbose 印出详细的资料,你可以重复以增加详细度。 -q --quiet 不要显示任何讯息。 -c --clearcompose 清除所有composite 定义。 -s --clearstrings 将定串定义表清除。 相关命令: dumpkeys 设备管理-rdev 名称:rdev 使用权限:所有使用者 使用方式:使用这个指令的基本方式是:rdev [-rsvh ] [-o offset ] [ image [value [ offset ] ] ] 但是随著使用者想要设定的参数的不同,底下的方式也是一样: rdev [ -o offset ] [ image [ root_device [ offset ] ] ] swapdev [ -o offset ] [ image [ swap_device [ offset ] ] ] ramsize [ -o offset ] [ image [ size [ offset ] ] ] videomode [ -o offset ] [ image [ mode [ offset ] ] ] rootflags [ -o offset ] [ image [ flags [ offset ] ] ]

Netbackup设备管理之Linux篇

Netbackup设备管理之Linux篇 在备份软件的使用过程中,关于磁盘、磁带的治理一样会花费储备治理员专门大比例的时刻和精力。因此,关于设备的治理的方便程度,是衡量一个备份软件好坏的重要的标准。Netbackup作为业界最为知名的备份软件之一,能够为用户提供最为方便的设备治理操作。 现在,随着Redhat和SuSE以及oracle Linux的日益成熟,越来越多的用户选择使用Linux平台来部署其商用环境。这就要求储备设备治理员能够在各种Linux平台的操作和使用各种硬件设备。然而,尽管Netbackup在不同的操作系统上提供了统一的治理界面,然而由于操作系统的差异,使得系统治理员不得不自己配置新购置的磁盘阵列和磁带库,使得其能够被Netback up识不和有效利用。本文介绍的重点在Linux上面的设备治理,使得Netbac kup能够能够正确的识不AIX操作系统上的磁盘阵列、机械手和磁带库等设备。具体的Netbackup中如何使用差不多识不的设备的内容,在各个操作系统是没有差异的,它们将会在后面的文章中予以介绍。 一,检查Netbackup软件的兼容性列表 用户在配置设备时,第一需要注意的情况是检查该软件的兼容性列表,检查该软件是否支持用户当前正在使用的操作系统版本和磁盘、磁带等设备。一样来讲,使用主流的操作系统和应用广泛的设备,都可不能有什么咨询题。然而如果用户使用的是比较专门的应用环境,那么就需要提早检查一下兼容性列表了,以免在使用过程中显现错误,一样来讲这种错误都不容易诊断出来。 二,确认驱动程序差不多安装: # lsmod |grep st 确认已在内核中安装或装入了 sg (机械手)设备驱动程序。此驱动程序承诺向 SCSI 磁带机发出PASSTHRU 命令和操纵机械手设备。

实验九Linux设备管理实验

实验九Linux设备管理实验 一、实验目的: 掌握linux系统重定向、管道操作和设备管理的法。 二、预备知识 1.标准的输入输出和重定向 执行一个shell命令行时通常会自动打开三个标准文件,即标准输入文件(stdin,通常对应终端的键盘);标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。 用户在输入输出数据时存在以下问题: ●从终端输入数据时,用户输入的数据只能用一次,如果下次再想用这些 数据时就得重新输入。而且在终端上输入时,项输入有误修改起来不是 很便。 ●输出到屏幕上的信息只能看不能动,无法对此输出作更多处理,如将作 为另一命令的输入进行进一步的处理等。 为了解决上述问题,Linux系统为输入输出的传送引入了另外两种机制,即输入输出重定向。输入重定向是指把命令(或可执行程序)的标准输入重定向到指定的文件中。也就是说,输入可以不来自键盘,而来自一个指定的文件。因此,输入重定向主要用于改变一个命令的输入源,告别是改变那些需要大量输入的输入源。输出重定向是批把命令(或可执行程序)的标准输出或标准错误输出重定

向到指定文件中。这样,命令的输出就不显示在屏幕上,而是写入到指定文件中。2.管道 将一个程序或命令的输出作为另一个程序或命令的输入可有两种法,一种是通过一个临时文件将两个命令或程序联系在一起;另一种是Linux所提供的管道功能,这种法比前一种法更好。管道可以把一系列命令连接起来,这就意味着第一个命令的输出会将为第二个命令的输入通过管道传给第二个命令,而第二个命令的输出又作为第三个命令的输入,以此类推。显示在屏幕上的是管道行中最后一个命令的输出(如果命令行中示使用输出重定向)。用户还可以通过使用管道符“|”来建立一个管道行。 3.文件备份和压缩 参见第二章相关的ppt。 三、实验容和实验步骤(实验情况请截图和说明) 1.基本实验 (1)标准输入输出文件使用 通过wc命令统计指定文件包含的行数、单词数和字符数。 实验步骤一:在命令提示符输入ls,显示当前目录下的文件。 [m112013@tan ~]$ ls ch4 ch5 lab1 lab2 lab3 lab4 lab5 lab6 lab7 lab8 lab9 subdir [m112013@tan ~]$ cd lab9 [m112013@tan lab9]$ ls test.c

linux设备驱动中常用函数

Linux2.6设备驱动常用的接口函数(一) ----字符设备 刚开始,学习linux驱动,觉得linux驱动很难,有字符设备,块设备,网络设备,针对每一种设备其接口函数,驱动的架构都不一样。这么多函数,要每一个的熟悉,那可多难啦!可后来发现linux驱动有很多规律可循,驱动的基本框架都差不多,再就是一些通用的模块。 基本的架构里包括:加载,卸载,常用的读写,打开,关闭,这是那种那基本的咯。利用这些基本的功能,当然无法实现一个系统。比方说:当多个执行单元对资源进行访问时,会引发竞态;当执行单元获取不到资源时,它是阻塞还是非阻塞?当突然间来了中断,该怎么办?还有内存管理,异步通知。而linux 针对这些问题提供了一系列的接口函数和模板框架。这样,在实际驱动设计中,根据具体的要求,选择不同的模块来实现其功能需求。 觉得能熟练理解,运用这些函数,是写号linux设备驱动的第一步。因为是设备驱动,是与最底层的设备打交道,就必须要熟悉底层设备的一些特性,例如字符设备,块设备等。系统提供的接口函数,功能模块就像是工具,能够根据不同的底层设备的的一些特性,选择不同的工具,方能在linux驱动中游刃有余。 最后就是调试,这可是最头疼的事。在调试过程中,总会遇到这样,那样的问题。怎样能更快,更好的发现并解决这些问题,就是一个人的道行咯!我个人觉得: 发现问题比解决问题更难! 时好时坏的东西,最纠结! 看得见的错误比看不见的错误好解决! 一:Fops结构体中函数: ①ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); 用来从设备中获取数据. 在这个位置的一个空指针导致 read 系统调用以-EINVAL("Invalid argument") 失败. 一个非负返回值代表了成功读取的字节数( 返回值是一个 "signed size" 类型, 常常是目标平台本地的整数类型). ②ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); 发送数据给设备. 如果 NULL, -EINVAL 返回给调用 write 系统调用的程序. 如果非负, 返回值代表成功写的字节数 ③loff_t (*llseek) (struct file *, loff_t, int); llseek 方法用作改变文件中的当前读/写位置, 并且新位置作为(正的)返回值. loff_t 参数是一个"long offset", 并且就算在 32位平台上也至少 64 位宽. 错误由一个负返回值指示. 如果这个函数指针是 NULL, seek 调用会以潜在地无法预知的方式修改 file 结构中的位置计数器( 在"file 结构" 一节中描述). ④int (*open) (struct inode *, struct file *);

linux设备管理命令

linux设备管理命令 1.1 stty [语法]: stty [-a] [-g] [选项] [说明]: 本命令设置终端,无参数时报告终端设置,本命令功能十分强大,应谨慎使用,下面仅介绍部分常用功能 ?-a 显示当前终端所有设置 ?-g 以能作为 stty 命令参数的方式显示终端设置以下是终端常用设置,在设置前加-表示清除设置: o1.控制方式,ispeed 0 110 300 600 1200 1800 2400 4800 9600 19200 38400,本命令设置终端输入波特率,若为0则使用缺省波 特率。例如 stty ispeed 9600 ospeed 0 110 300 600 1200 1800 2400 4800 9600 19200 38400本命令设置终端输出波特率,参看 ispeed。 o2.输入方式 ?ingbrk(-ignbrk) 忽略(不忽略)中断(BREAK) ?brkint(-brkint) 设置(清除)信号INTR为中断信号 ?inlcr(-inlcr) 将换行转换(不转换)成回车 ?icrnl( -icrnl) 将回车转换(不转换)成换行 ?igncr(-ignrc) 忽略(不忽略)回车 ?iuclc( -iuclc) 将大写字母转换(不转换)成小写字母o3.输出方式 ?olcut(-olcut) 将小写字母转换(不转换)为大写字母 ?onlcr(-onlcr) 输出时将换行符转换(不转换)为回车换行 ?ocrnl(-ocrnl) 输出时将回车符转换(不转换)为换行符o4.本地方式 ?echo (-echo) 设置(清除)回显 ?stwrap(-stwrap) 截断(不截断)大于79个字符的行 ?echoctl(-echoctr) 将控制键回显为^ 1.2 tty [语法]: tty [说明]: 显示出终端的设备名 [例子]: tty 1.3 lp [语法]: lp 文件... [说明]: 将文件送打印机打印 [例子]: lp myfile将文件myfile 送打印机输出 1.4 lpstat [语法]: lpstat [选项] [打印任务号] [说明]: 显示打印机状态,选项的意义如下:

Linux设备驱动程序简介

第一章Linux设备驱动程序简介 Linux Kernel 系统架构图 一、驱动程序的特点 ?是应用和硬件设备之间的一个软件层。 ?这个软件层一般在内核中实现 ?设备驱动程序的作用在于提供机制,而不是提供策略,编写访问硬件的内核代码时不要给用户强加任何策略 o机制:驱动程序能实现什么功能。 o策略:用户如何使用这些功能。 二、设备驱动分类和内核模块 ?设备驱动类型。Linux 系统将设备驱动分成三种类型 o字符设备 o块设备 o网络设备 ?内核模块:内核模块是内核提供的一种可以动态加载功能单元来扩展内核功能的机制,类似于软件中的插件机制。这种功能单元叫内核模块。 ?通常为每个驱动创建一个不同的模块,而不在一个模块中实现多个设备驱动,从而实现良好的伸缩性和扩展性。 三、字符设备 ?字符设备是个能够象字节流<比如文件)一样访问的设备,由字符设备驱动程序来实现这种特性。通过/dev下的字符设备文件来访问。字符设备驱动程序通常至少需要实现 open、close、read 和 write 等系统调用 所对应的对该硬件进行操作的功能函数。 ?应用程序调用system call<系统调用),例如:read、write,将会导致操作系统执行上层功能组件的代码,这些代码会处理内核的一些内部 事务,为操作硬件做好准备,然后就会调用驱动程序中实现的对硬件进 行物理操作的函数,从而完成对硬件的驱动,然后返回操作系统上层功 能组件的代码,做好内核内部的善后事务,最后返回应用程序。 ?由于应用程序必须使用/dev目录下的设备文件<参见open调用的第1个参数),所以该设备文件必须事先创建。谁创建设备文件呢? ?大多数字符设备是个只能顺序访问的数据通道,不能前后移动访问指针,这点和文件不同。比如串口驱动,只能顺序的读写设备。然而,也 存在和数据区或者文件特性类似的字符设备,访问它们时可前后移动访

Linux统一设备管理平台platform之设备注册流程V2版-李枝果

Linux lizhiguo0532@https://www.360docs.net/doc/cc18617735.html, --------------------------------------------------------------------------------------------------------------------- https://www.360docs.net/doc/cc18617735.html,/sz_farsight ---------------------------------------------------------------------------------------------------------------------- linux-2.6.14 1. linux2.6 platform_device platform_driver Linux Platform_device Platform_driver platform driver device driver ( driver_register ) platform platform device 2.s3c2410 3. a. :include\linux\ioport.h struct resource { const char *name; /* */ unsigned long start, end; /* cpu * start cpu * end */ unsigned long flags; /* */ /* */ /* */ struct resource *parent, *sibling, *child; /* */ }; /* * ,

linux设备驱动

Linux设备驱动 操作系统的目的之一就是将系统硬件设备细节从用户视线中隐藏起来。例如虚拟文件系统对各种类型已安装的文件系统提供了统一的视图而屏蔽了具体底层细节。本章将描叙Linux核心对系统中物理设备的管理。 CPU并不是系统中唯一的智能设备,每个物理设备都拥有自己的控制器。键盘、鼠标和串行口由一个高级I/O芯片统一管理,IDE控制器控制IDE硬盘而SCSI控制器控制SCSI硬盘等等。每个硬件控制器都有各自的控制和状态寄存器(CSR)并且各不相同。例如Adaptec 2940 SCSI控制器的CSR与NCR 810 SCSI控制器完全不一样。这些CSR被用来启动和停止,初始化设备及对设备进行诊断。在Linux中管理硬件设备控制器的代码并没有放置在每个应用程序中而是由内核统一管理。这些处理和管理硬件控制器的软件就是设备驱动。Linux 核心设备驱动是一组运行在特权级上的内存驻留底层硬件处理共享库。正是它们负责管理各个设备。 设备驱动的一个基本特征是设备处理的抽象概念。所有硬件设备都被看成普通文件;可以通过和操纵普通文件相同的标准系统调用来打开、关闭、读取和写入设备。系统中每个设备都用一种特殊的设备相关文件来表示(device special file),例如系统中第一个IDE硬盘被表示成/dev/hda。块(磁盘)设备和字符设备的设备相关文件可以通过mknod命令来创建,并使用主从设备号来描叙此设备。网络设备也用设备相关文件来表示,但Linux寻找和初始化网络设备时才建立这种文件。由同一个设备驱动控制的所有设备具有相同的主设备号。从设备号则被用来区分具有相同主设备号且由相同设备驱动控制的不同设备。例如主IDE硬盘的每个分区的从设备号都不相同。如/dev/hda2表示主IDE 硬盘的主设备号为3而从设备号为2。Linux通过使用主从设备号将包含在系统调用中的(如将一个文件系统mount到一个块设备)设备相关文件映射到设备的设备驱动以及大量系统表格中,如字符设备表,chrdevs。 Linux支持三类硬件设备:字符、块及网络设备。字符设备指那些无需缓冲直接读写的设备,如系统的串口设备/dev/cua0和/dev/cua1。块设备则仅能以块为单位读写,典型的块大小为512或1024字节。块设备的存取是通过

设备管理--Linux设备驱动程序安装

集美大学计算机工程学院实验报告 课程名称:操作系统班级:xxx实验成绩: 指导教师:姓名:xxx ( 学号:xxxx上机实践日期:xxx 实验项目名称: 设备管理——Linux设备驱动程序安装 实验项目编号:组号:上机实践时间: 2 学时~ 一、目的(本次实验所涉及并要求掌握的知识点) 1.认识Linux的设备的种类和设备工作方式; 2.理解设备驱动程序的工作原理; 3.掌握设备驱动程序的编写规范,能编写并安装简单的设备驱动程序。 二、实验内容与设计思想(设计思路、主要数据结构、主要代码结构、主要代码段分析、电路图) 实验内容: ¥ 在Linux系统中,编写一个简单的字符型设备驱动程序模块,设备具有独占特性,可执行读和写操作,相关系统调用为open, close, read, write,open和close分别相当于请求和释放设备,read和write内容保存在设备模块内的缓冲区中。设备模块可动态注册和卸载,并建立与之对应的特殊文件/dev/mydev。 实验设计: 1.按照要求编写设备驱动模块,同时编写一个测试程序 2.分别对其编译,注意编译时的项 3.设备模块加载 4.创建特殊文件 5.分析执行结果 6.设备模块卸载 < 三、实验使用环境(本次实验所使用的平台和相关软件) Linux 四、实验步骤和调试过程(实验步骤、测试数据设计、测试结果分析) LINUX_VERSION_CODE is * the code (as per KERNEL_VERSION) of this version. */ #if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,0) < #include /* for put_user */ #endif #define SUCCESS 0 #define DEVICE_NAME "kueng_char_dev"

Linux设备驱动程序说明介绍

Linux设备驱动程序简介 Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统,但它dos或window环境下的驱动程序有很大的区别。在Linux环境下设计驱动程序,思想简洁,操作方便,功能也很强大,但是支持函数少,只能依赖kernel 中的函数,有些常用的操作要自己来编写,而且调试也不方便。本人这几周来为实验室自行研制的一块多媒体卡编制了驱动程序,获得了一些经验,愿与Linux fans共享,有不当之处,请予指正。 以下的一些文字主要来源于khg,johnsonm的Write linux device driver,Brennan's Guide to Inline Assembly,The Linux A-Z,还有清华BBS上的有关device driver的一些资料. 这些资料有的已经过时,有的还有一些错误,我依据自己的试验结果进行了修正. 一、Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口.设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作.设备驱动程序是内核的一部分,它完成以下的功能: 1.对设备初始化和释放. 2.把数据从内核传送到硬件和从硬件读取数据. 3.读取应用程序传送给设备文件的数据和回送应用程序请求的数据. 4.检测和处理设备出现的错误. 在Linux操作系统下有两类主要的设备文件类型,一种是字符设备,另一种是块设备.字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作.块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待. 已经提到,用户进程是通过设备文件来与实际的硬件打交道.每个设备文件都都有其文件属性(c/b),表示是字符设备还蔤强樯璞?另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分他们.设备文件的的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序. 最后必须提到的是,在用户进程调用驱动程序时,系统进入核心态,这时不再是抢先式调度.也就是说,系统必须在你的驱动程序的子函数返回后才能进行其他的工作.如果你的驱动程序陷入死循环,不幸的是你只有重新启动机器了,然后就是漫长的fsck. 读/写时,它首先察看缓冲区的内容,如果缓冲区的数据 如何编写Linux操作系统下的设备驱动程序 二、实例剖析 我们来写一个最简单的字符设备驱动程序。虽然它什么也不做,但是通过它可以了解Linux的设备驱动程序的工作原理.把下面的C代码输入机器,你就会获得一个真正的设备驱动程序.不过我的kernel是2.0.34,在低版本的kernel上可能会出现问题,我还没测试过. [code]#define __NO_VERSION__

第一章(linux设备驱动程序).doc

第1章Linux内核简介 世界各地都有人在钻研Linux内核,大多是在写设备驱动程序。尽管每个驱动程序都不一样,而且你还要知道自己设备的特殊性,但是这些设备驱动程序的许多原则和基本技术技巧都是一样的。通过本书,可以学会写自己的设备驱动程序,并且可以钻研内核的相关部分。本书涉及到的是设备无关编程技巧,不会将例子跟特殊设备绑定在一起。 本章没有实际编写代码。但我要介绍一些关于Linux内核的背景概念,这样到我们稍后开始介绍实际编程时,就很顺利了。 当你学习编写驱动程序的时候,你也会发现很多关于Linux内核的知识,这对理解你机器怎么工作很有帮助,并且还可以知道为什么你的机器没有希望的那么快,或者为什么不按照你象要它做的那样做。我们会逐渐介绍一些新概念,先从简单的驱动程序开始,每介绍一些新概念都会看到相关例子代码,这些代码都不需要特殊硬件。 驱动程序作者的作用 作为一个程序员,你可以选择自己的驱动程序,在编程所需时间和结果的灵活性之间做个可以接受的权衡。尽管说驱动程序的灵活性看起来有那么点怪,我喜欢这个词是因为它强调了设备驱动程序提供的是机制,而不是策略。 机制和策略之间的差别是Unix设计背后最好的点子之一。实际编程中遇到的大多数问题都可以被划分成两个部分:“需要作什么”(机制)和“这个程序怎么用”(策略)。如果这两个主题是由程序不同部分来承担的,或者是由不同的程序组合一起承担的,那么这个软件包就很容易开发,也很适合特殊需求。 举个例子,Unix的图形显示管理在X服务器和窗口管理器之间划了一道线,X服务器了解硬件并给用户程序提供唯一的接口,而窗口管理器实现特殊的策略并不需要知道硬件的任何信息。人们可以在不同硬件上使用同样的窗口管理器,并且不同用户在同一台工作站上可以使用不同的设置。另一个例子是TCP/IP的网络分层结构:操作系统提供抽象的套接字操作,是设备无关的,不同服务器主管这个服务。另外,ftpd服务器提供文件传输机制,而用户可以使用任何客户端程序;命令行的客户端和图形化界面的客户端都存在,并且谁都可以为传输文件写一个新的用户界面。 只要涉及到驱动程序,就会运用这样的功能划分。软盘驱动程序是设备无关的——这不仅表现在磁盘是一个连续读写的字节数组上。如何使用设备是应用程序要做的事:tar要连续地写数据,而mkfs则为要安装的设备做准备工作,mcopy依赖于设备上存在的特殊数据结构。在写驱动程序时,程序员应该特别留心这样的基本问题:我们要写内核代码访问硬件,但由于不同用户有不同需要,我们不能强迫用户采用什么样的特定策略。设备驱动程序应该仅仅处理硬件,将如何使用硬件的问题留给应用程序。如果在提供获得硬件能力的同时没有增加限制,我们就说驱动程序是灵活的。不过,有时必须要作一些策略决策。 可以从不同侧面来看你的驱动程序:它是位于应用层和实际设备之间的软件。驱动程序的程序员可以选择这个设备应该怎样实现:不同的驱动程序可以提供不同的能力,甚至相同的设备也可以提供不同能力。实际驱动程序设计应该是在众多需求之间的一个平衡。例如,不同程序可以同时使用同一个设备,而驱动程序的开发者可以完全自由地决定如何处理同步机制。你可以实现到设备上的内存映射,而完成独立于硬件的具体能力,或者你可以提供给用

《LINUX设备驱动程序》阅读笔记全十八章

《LINUX设备驱动程序》阅读笔记 目录 第1章:设备驱动程序简介 (1) 第2章:构造和运行模块 (1) 第3章:字符设备驱动程序 (1) 第4章:调试技术 (2) 第5章:并发和竞态 (2) 第6章:高级字符驱动程序操作 (3) 第7章:时间、延迟及延缓操作 (3) 第8章:分配内存 (3) 第9章:与硬件通信 (4) 第10章:中断处理 (4) 第11章:内核的数据类型 (4) 第12章:PCI 驱动程序 (5) 第13章:USB 驱动程序 (5) 第14章:Linux 设备模型 (5) 第15章:内存映射和 DMA (5) 第16章:块设备驱动程序 (6) 第17章:网络驱动程序 (6) 第18章:TTY 驱动程序 (6) 第1章:设备驱动程序简介 1、“通常,设备驱动程序就是这个进入Linux内核世界的大门”,“设备驱动程序在Linux 内核中扮演着特殊的角色,它们是一个个独立的黑盒子,使某个特定硬件响应一个定义良好的内部编程接口,这些接口完全隐藏了设备的工作细节。用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序”。 2、Linux系统将设备分成三种基本类型:字符设备、块设备和网络设备。 第2章:构造和运行模块 1、“内核黑客通常拥有一个‘牺牲用的’系统,用于测试新的代码”。 2、模块在被使用之前需要注册,而退出时要仔细撤销初始化函数所做的一切。驱动模块只能调用由内核导出的那些函数。 3、公共内核符号表中包含了所有的全局内核项(即函数和变量)的地址。当模块被装入内核后,它所导出的任何符号都会变成内核符号表的一部分。 第3章:字符设备驱动程序 第一节-主设备号和次设备号。对字符设备的访问都是通过文件系统内的设备名称进行的。通常而言,主设备号标识设备对应的驱动程序,而次设备号用于正确确定设备文件所指的设备。对应的数据结构为dev_t 类型。分配设备号使用函数alloc_chrdev_region() ,释放就使用unregister_chrdev_region() 函数。 第二节-一些重要的数据结构。大部分基本的驱动程序的操作都要涉及到三个重要的内

LINUX设备驱动读书笔记新版

嵌入式Linux设备驱动开发读书笔记 经过第十二章的学习,我大致了解了linux设备驱动开发的意义所在,在linux 系统中设备被抽象化,系统通过调用标准的驱动接口来实现各种硬件的操作,同时,系统上层对于硬件设备的调用无需关心具体的硬件细节,系统调用设备使用文件的方式进行操作,通过这样的屏蔽,系统以标准和统一的方式去完成硬件的操作,对于硬件设备更新速度越来越快的今天,硬件的更新,只需要去更改驱动就能够实现设备的升级,而不需要去改变上层的应用软件,同时也利于上层和软件和硬件之间开发的分工和合作。 设备驱动最终被添加到内核里,与系统成为一个整体,ARM处理器的指令集与我们通常使用的PC机的X86指令集不同,ARM 的RISC指令集也可以说是一个精简版本的X86指令集,虽然没有X86指令集那么强大的功能,但是同样可以支持LINUX系统的运算,因此基于ARM的LINUX系统需要使用支持ARM指令集的编译器来进行编译,也就是ARM-GCC,在宿主机,也就是X86指令集下使用ARM-GCC编译出来的LINUX系统能够在ARM硬件系统上运行。 设备驱动程序是内核的一部分,因此驱动的稳定对系统的稳定非常重要,设备驱动程序必须为内核提供一个标准的接口,并且为了防止系统过于臃肿,对于某些系统设备驱动要求能够实时的进行加载,对于设备的更新也更加的方便,以安装的方式进行加载。 以下列举我对几种设备驱动编写的理解 1字符设备: 一般应用程序都有一个main入口点,而设备驱动却没有main函数,其实模块在调用insmod命令时会进入设备驱动的module_init函数,在该函数中注册设备,在调用rmmod函数时驱动被卸载,此时入口点为module_exit函数,他们的关系如图 设备被加载之后,系统便能够在内核中调用驱动,在LINUX内核中,dev_t 类型用来保存主设备号和次设备号,dev_t四个字节,其中12bit用于表示主设备号,其余20bit表示次设备号,使用系统函数给设备分配一个设备号,

Linux设备驱动程序的概念、作用以及模块

Linux设备驱动程序的概念、作用以及模块 我们首先对linux系统整个框架要有个了解。Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G。 Linux 内核将这4G字节的空间分为两部分,分别是用户空间(0~3G)和内核空间(3G~4G)。其中,用户空间存放的是应用程序,而内核空间存放的是内核,设备驱动和硬件。 为什么需要存在设备驱动呢?我们知道,内核是操作系统基本的部分,而操作系统是不能够直接控制硬件的,这样我们就需要设备驱动作为操作系统和硬件设备间的粘合剂,相当于一个中间人吧,负责上下两边的沟通。驱动负责将操作系统的请求传输,转化为特定物理设备控制器能够理解的命令。 这样我们就知道,驱动需要完成两大功能: 1、为linux内核提供调用接口。 2、控制硬件。因为寄存器是控制硬件的操作,所以驱动程序控制硬件,也就是要通过读写硬件寄存器达到控制硬件的目的。 内核是为应用程序服务的,其本质其实是函数的集合,内核要实现的功能我们可以分为两部门:基本功能和扩展功能。其中,基本功能包括进程管理,线程管理等等,而扩展功能,可以根据用户的需求自行添加。 下面我们就来探讨一下怎样向内核添加一项功能呢? 1、我们首先想到,肯定需要写一个功能函数,假如我们命名为fun.c,那么函数写好后,必须要和linux源码一起编译,生成zImage内核镜像文件。 2、重新编译内核。 这样就得到了新的内核,这种添加的方式我们称为静态添加。大家发现,每次修改一次fun.c,都要重新编译一次内核,灰常的麻烦,所以引进了内核模块机制,只需要加载或卸载模块,就可以动态的增加或者删除内核的功能,不用每次都重新编译,是不是很方便?那么接下来我们会想到,这个模块怎么就能和内核连接在一起呢?其实很简单,fun.c文件除了要实现功能呢,还需要包含和内核的接口,内核也提供了模块的接口,只要这两个接口一致,模块就可以融入内核,成为内核的一部分。Linux驱动程序都是以模块的形式存在的,所以我们称之为驱动模块。 所以我们总结出添加模块的步骤是: 1、写功能函数fun.c。 怎么样编写模块的源码文件,我们以一个Hello模块实例分析。 #include #include //①模块的头文件,在对应内核下 的include目录中{ … //②功能函数hello.c(同普通} 的.c文件) Static int __int hellomudule_init(void) //③模块初始化函数 { Printk(“Hello world!\n”); Return 0; }

Linux设备驱动模型介绍

文库资料 ?2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd. 第1章 Linux 设备驱动模型介绍 设备驱动模型,对系统的所有设备和驱动进行了抽象,形成了复杂的设备树型结构,采用面向对象的方法,抽象出了device 设备、driver 驱动、bus 总线和class 类等概念,所有已经注册的设备和驱动都挂在总线上,总线来完成设备和驱动之间的匹配。总线、设备、驱动以及类之间的关系错综复杂,在Linux 内核中通过kobject 、kset 和subsys 来进行管理,驱动编写可以忽略这些管理机制的具体实现。 设备驱动模型的内部结构还在不停的发生改变,如device 、driver 、bus 等数据结构在不同版本都有差异,但是基于设备驱动模型编程的结构基本还是统一的。 Linux 设备驱动模型是Linux 驱动编程的高级内容,这一节只对device 、driver 等这些基本概念作介绍,便于阅读和理解内核中的代码。实际上,具体驱动也不会孤立的使用这些概念,这些概念都融合在更高层的驱动子系统中。对于大多数读者可以忽略这一节内容。 1.1.1 设备 在Linux 设备驱动模型中,底层用device 结构来描述所管理的设备。device 结构在文件中定义,如程序清单1.1所示。 程序清单1.1 device 数据结构定义 struct device { struct device *parent; /* 父设备 */ struct device_private *p; /* 设备的私有数据 */ struct kobject kobj; /* 设备的kobject 对象 */ const char *init_name; /*设备的初始名字 */ struct device_type *type; /* 设备类型 */ struct mutex mutex; /*同步驱动的互斥信号量 */ struct bus_type *bus; /*设备所在的总线类型 */ struct device_driver *driver; /*管理该设备的驱动程序 */ void *platform_data; /*平台相关的数据 */ struct dev_pm_info power; /* 电源管理 */ #ifdef CONFIG_NUMA int numa_node; /*设备接近的非一致性存储结构 */ #endif u64 *dma_mask; /* DMA 掩码 */ u64 coherent_dma_mask; /*设备一致性的DMA 掩码 */ struct device_dma_parameters *dma_parms; /* DMA 参数 */ struct list_head dma_pools; /* DMA 缓冲池 */ struct dma_coherent_mem *dma_mem; /* DMA 一致性内存 */ /*体系结构相关的附加项*/ struct dev_archdata archdata; /* 体系结构相关的数据 */ #ifdef CONFIG_OF struct device_node *of_node;

NBU60网络备份大全之Linux设备管理(参考Word)

NBU6.0网络备份大全之Linux设备管理 在备份软件的使用过程中,对于磁盘、磁带的管理一般会花费存储管理员很大比例的时间和精力。因此,对于设备的管理的方便程度,是衡量一个备份软件好坏的重要的标准。 现在,随着Redhat和SuSE以及oracle Linux的日益成熟,越来越多的用户选择使用Linux平台来部署其商用环境。这就要求存储设备管理员能够在各种Linux平台的操作和使用各种硬件设备。 虽然Netbackup在不同的操作系统上提供了统一的管理界面,但是由于操作系统的差异,使得系统管理员不得不自己配置新购置的磁盘阵列和磁带库,使得其能够被Netbackup识别和有效利用。本文介绍的重点在Linux上面的设备管理,使得Netbackup可以能够正确的识别AIX操作系统上的磁盘阵列、机械手和磁带库等设备。具体的Netbackup中如何使用已经识别的设备的内容,在各个操作系统是没有差异的,它们将会在后面的文章中予以介绍。 一,检查Netbackup软件的兼容性列表 用户在配置设备时,第一需要注意的事情是检查该软件的兼容性列表,检查该软件是否支持用户当前正在使用的操作系统版本和磁盘、磁带等设备。一般来说,使用主流的操作系统和应用广泛的设备,都不会有什么问题。但是如果用户使用的是比较特殊的应用环境,那么就需要提前检查一下兼容性列表了,以免在使用过程中出现错误,一般来说这种错误都不容易诊断出来。 二,确认驱动程序已经安装 1,确认已在内核中安装或装入了 st (磁带)设备驱动程序。此驱动程序允许使用 SCSI 磁带机:# lsmod |grep st 2,确认已在内核中安装或装入了 sg (机械手)设备驱动程序。此驱动程序允许向 SCSI 磁带机发出PASSTHRU 命令和控制机械手设备。# lsmod |grep sg 3,如果st磁带驱动程序或者sg机械手驱动程序不存在,那么需要手动加载它们: /sbin/modprobe st /sbin/modprobe sg (注意)自动加载的驱动程序可能在操作系统重新启动后无法自动加载,导致Netbackup无法识别并使用之前配置好的设备。这个问题可能会给Netbackup的使用者带来困惑。所以最好利用某种办法(很多不一一累述),保证系统启动能够自动加载st和sg程序到内核中。 三,配置机械手: 在Linux操作系统中,主要是区别2.4内核还是2.6内核的操作系统,分别有不同的配置方法。 针对2.4内核的操作系统,Netbackup在安装时后自动运行/usr/openv/volmgr/bin/make_scsi_dev命令,该命令在/dev/sg目录下自动创建设备文件,文件格式为hHOSTcCHANNELtTARGETlLUN,其中:HOST 是主机总线适配器;CHANNEL 是通道;TARGET 是目标 ID;LUN 是逻辑单元号。例如h10c0t1l0就是一个合法的设备文件名称。 在2.6内核的操作系统中,操作系统使用/dev目录下的sgN设备文件,N是0到255之间的任意整数。四,配置磁带驱动器 在2.4内核的操作系统中,/usr/openv/volmgr/bin/make_scsi_dev命令将会在/dev/st 目录中创建设备文件。该目录中的无倒带设备文件的名称具有以下格式:nhHOSTcCHANNELtTARGETlLUN,其中:n 是“关闭时无倒带”设备文件;HOST 是主机总线适配器;CHANNEL 是通道;TARGET 是目标 ID;LUN 是逻辑单元号。例如nh10c0t2l0就是一个合法的磁带驱动器的名称。 在2.6内核的系统中,NetBackup 仅使用 /dev/nstX 文件,其中 X 一个介于 0到 127 之间的十进制数。五,验证机械手和磁带库的配置 在Linux系统中,/proc/scsi/scsi 文件显示了 SCSI 驱动程序识别的所有设备。要确定操作系统能否看到设备,可从终端窗口运行以下命令来查看该文件: # cat /proc/scsi/scsi

相关文档
最新文档