⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 +ަ

📁 linux informations
💻
📖 第 1 页 / 共 3 页
字号:
Device 
虽然SCSI支持多种类型设备如磁带机、CD-ROM等等,但最常见的SCSI设备是SCSI磁盘。SCSI设备总是SCSI命令的target。这些设备必须区别对待,例如象CD-ROM或者磁带机这种可移动设备,Linux 必须检测介质是否已经移动。不同的磁盘类型有不同的主设备号,这样Linux可以将块设备请求发送到正确的SCSI设备。 

初始化SCSI子系统
SCSI子系统的初始化非常复杂,它必须反映处SCSI总线及其设备的动态性。Linux在启动时初始化SCSI子系统。 如果它找到一个SCSI控制器(即SCSI hosts)则会扫描此SCSI总线来找出总线上的所有设备。然后初始化这些设备并通过普通文件和buffer cache块设备操作使Linux核心的其它部分能使用这些设备。初始化过程分成四个阶段: 

首先Linux将找出在系统核心连接时被连入核心的哪种类型的SCSI主机适配器或控制器有硬件需要控制。每个 核心中的SCSI host在builtin_scsi_hosts数组中有一个Scsi_Host_Template入口。而Scsi_Host_Template结构中包含执行特定SCSI host操作, 如检测连到此SCSI host的SCSI设备的例程的入口指针。这些例程在SCSI 子系统进行自我配置时使用同时它们还是支持此host类型的SCSI设备驱动的一部分。每个被检测的SCSI host, 即与真正SCSI设备连接的host将其自身的Scsi_Host_Template结构添加到活动SCSI hosts的scsi_hosts结构链表中去。每个被检测host类型的实例用一个scsi_hostlist链表中的Scsi_Host结构来表示。例如一个包含两个NCR810 PCI SCSI控制器的系统的链表中将有两个Scsi_Host入口,每个控制器对应一个。每个Scsi_Host 指向一个代表器设备驱动的Scsi_Host_Template。 






图8.4 SCSI数据结构 

现在每个SCSI host已经找到,SCSI子系统必须找出哪些SCSI设备连接哪个host的总线。SCSI设备的编号是 从0到7,对于一条SCSI总线上连接的各个设备,其设备编号或SCSI标志符是唯一的。SCSI标志符可以通过设 备上的跳线来设置。SCSI初始化代码通过在SCSI总线上发送一个TEST_UNIT_READY命令来找出每个SCSI设备。 当设备作出相应时其标志符通过一个ENQUIRY命令来读取。Linux将从中得到生产厂商的名称和设备模式以及 修订版本号。SCSI命令由一个Scsi_Cmnd结构来表示同时这些命令通过调用Scsi_Host_Template结构中的设备 驱动例程传递到此SCSI host的设备驱动中。被找到的每个SCSI设备用一个Scsi_Device结构来表示,每个指向 其父Scsi_Host结构。所有这些Scsi_Device结构被添加到scsi_device链表中。图8.4给出了这些主要数据结构 间的关系。 

一共有四种SCSI设备类型:磁盘,磁带机,CD-ROM和普通SCSI设备。每种类型的SCSI设备以不同的主块设备 类型单独登记到核心中。如果有多个类型的SCSI设备存在则它们只登记自身。每个SCSI设备类型,如SCSI磁盘 维护着其自身的设备列表。它使用这些表将核心块操作(file或者buffer cache)定向到正确的设备驱动或 SCSI host上。每种SCSI设备类型用一个Scsi_Device_Template结构来表示。此结构中包含此类型SCSI设备的 信息以及执行各种任务的例程的入口地址。换句话说,如果SCSI子系统希望连接一个SCSI磁盘设备它将调用 SCSI磁盘类型连接例程。如果有多个该种类型的SCSI设备被检测到则此Scsi_Type_Template结构将被添加到 scsi_devicelist链表中。 

SCSI子系统的最后一个阶段是为每个已登记的Scsi_Device_Template结构调用finish函数。对于SCSI磁盘类型 设备它将驱动所有SCSI磁盘并记录其磁盘布局。同时还将添加一个表示所有连接在一起的SCSI磁盘的gendisk 结构,如图8.3。 


发送块设备请求
一旦SCSI子系统初始化完成这些SCSI设备就可以使用了。每个活动的SCSI设备类型将其自身登记到核心以便 Linux正确定向块设备请求。这些请求可以是通过blk_dev的buffer cache请求也可以是通过blkdevs的文件 操作。以一个包含多个EXT2文件系统分区的SCSI磁盘驱动器为例,当安装其中一个EXT2分区时系统是怎样将 核心缓冲请求定向到正确的SCSI磁盘的呢? 

每个对SCSI磁盘分区的块读写请求将导致一个新的request结构被添加到对应此SCSI磁盘的blk_dev数组中的 current_request链表中。如果此request正在被处理则buffer cache无需作任何工作;否则它必须通知SCSI 磁盘子系统去处理它的请求队列。系统中每个SCSI磁盘用一个Scsi_Disk结构来表示。例如/dev/sdb1的主设备 号为8而从设备号为17;这样产生一个索引值1。每个Scsi_Disk结构包含一个指向表示此设备的Scsi_Device 结构。这样反过来又指向拥有它的Scsi_Host结果。这个来自buffer cache的request结构将被转换成一个描 叙SCSI命令的Scsi_Cmd结构,这个SCSI命令将发送到此SCSI设备同时被排入表示此设备的Scsi_Host结构。一 旦有适当的数据块需要读写,这些请求将被独立的SCSI设备驱动来处理。 


8.6  网络设备
网络设备,即Linux的网络子系统,是一个发送与接收数据包的实体。它一般是一个象以太网卡的物理设备。 有些网络设备如loopback设备仅仅是一个用来向自身发送数据的软件。每个网络设备都用一个device结构来 表示。网络设备驱动在核心启动初始化网络时将这些受控设备登记到Linux中。device数据结构中包含有有关 设备的信息以及用来支持各种网络协议的函数地址指针。这些函数主要用来使用网络设备传输数据。设备使用 标准网络支持机制来将接收到的数据传递到适当的协议层。所有传输与接收到的网络数据用一个sk_buff结构 来表示,这些灵活的数据结构使得网络协议头可以更容易的添加与删除。网络协议层如何使用网络设备以及 如何使用sk_buff来交换数据将在网络一章中详细描叙。本章只讨论device数据结构及如何发现与初始化网络。 

device数据结构包含以下有关网络设备的信息: 


Name 
与使用mknod命令创建的块设备特殊文件与字符设备特殊文件不同,网络设备特殊文件仅在于系统 网络设备发现与初始化时建立。它们使用标准的命名方法,每个名字代表一种类型的设备。多个 相同类型设备将从0开始记数。这样以太网设备被命名为/dev/eth0,/dev/eth1,/dev/eth2 等等。 一些常见的网络设备如下: 
/dev/ethN  以太网设备  
/dev/slN  SLIP设备  
/dev/pppN  PPP 设备  
/dev/lo  Loopback 设备  


  
Bus Information 
这些信息被设备驱动用来控制设备。irq号表示设备使用的中断号。base address指任何设备在I/O 内存中的控制与状态寄存器地址。DMA通道指此网络设备使用的DMA通道号。所有这些信息在设备初 始化时设置。 
  
  
  
Interface Flags 
它们描叙了网络设备的属性与功能: 
IFF_UP  接口已经建立并运行  
IFF_BROADCAST  设备中的广播地址有效  
IFF_DEBUG  设备调试被使能  
IFF_LOOPBACK  这是一个loopback设备  
IFF_POINTTOPOINT  这是点到点连接(SLIP和PPP)  
IFF_NOTRAILERS  无网络追踪者  
IFF_RUNNING  资源已被分配  
IFF_NOARP  不支持ARP协议  
IFF_PROMISC  设备处于混乱的接收模式,无论包地址怎样它都将接收  
    
IFF_ALLMULTI  接收所有的IP多播帧  
IFF_MULTICAST  可以接收IP多播帧  


  
Protocol Information 
每个设备描叙它可以被网络协议层如何使用: 
mtu 
指不包括任何链路层头在内的,网络可传送的最大包大小。这个值被协议层用来选择适当 大小的包进行发送。 
Family 
这个family域表示设备支持的协议族。所有Linux网络设备的族是AF_INET,互联网地址族。 
Type 
这个硬件接口类型描叙网络设备连接的介质类型。Linux网络设备可以支持多种不同类型的 介质。包括以太网、X.25,令牌环,Slip,PPP和Apple Localtalk。 
Addresses 
结构中包含大量网络设备相关的地址,包括IP地址。 
Packet Queue 
指网络设备上等待传输的sk_buff包队列。 
Support Functions 
每个设备支持一组标准的例程,它们被协议层作为设备链路层的接口而调用。如传输建立和帧传输 例程以及添加标准帧头以及收集统计数据的例程。这些统计数据可以使用ifconfig命令来观察。 

8.6.1  初始化网络设备
网络设备驱动可以象其它Linux设备驱动一样建立到Linux核心中来。每个潜在的网络设备由一个被dev_base 链表指针指向的网络设备链表内部的device结构表示。当网络层需要某个特定工作执行时。它将调用大量网 络服务例程中的一个,这些例程的地址被保存在device结构内部。初始化时每个device结构仅包含一个初始 化或者检测例程的地址。 

对于网络设备驱动有两个问题需要解决。首先是不是每个连接到核心中的网络设备驱动都有设备要控制。其 次虽然底层的设备驱动迥然不同,但系统中的以太网设备总是命名为/dev/eth0和/dev/eth1。混淆网络设备 这个问题很容易解决。当每个网络设备的初始化例程被调用时,将得到一个指示是否存在当前控制器实例的 状态信息。如果驱动找不到任何设备,它那个由dev_base指向的device链表将被删除。如果驱动找到了设备 则它将用设备相关信息以及网络设备驱动中支撑函数的地址指针来填充此device数据结构。 

第二个问题,即为以太网设备动态分配标准名称/dev/ethN设备特殊文件的工作的解决方法十分巧妙。在设备 链表中有8个标准入口;从eth0到eth7。它们使用相同的初始化例程,此初始化过程将依次尝试这些被建立到 核心中的以太网设备驱动直到找到一个设备。当驱动找到其以太网设备时它将填充对应的ethN设备结构。同时 此网络设备驱动初始化其控制的物理硬件并找出使用的IRQ号以及DMA通道等信息。如果驱动找到了此网络设备 的多个实例它将建立多个/dev/ethN device数据结构。一旦所有8个标准/dev/ethN被分配完毕则不会在检测 其它的以太网设备。 




--------------------------------------------------------------------------------
File translated from TEX by TTH, version 1.0.
--------------------------------------------------------------------------------
 
Top of Chapter, Table of Contents, Show Frames, No Frames
?1996-1999 David A Rusling copyright notice. 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -