Chinaunix首页 | 论坛 | 博客
  • 博客访问: 885476
  • 博文数量: 66
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 2071
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-04 15:22
个人简介

从事IT相关工作近10年,获得《网络规划师》《信息系统项目管理师》《系统分析师》、Cisco等认证,对网络和操作系统有较深理解,对认证计费系统和虚拟化技术有深入研究。

文章分类

全部博文(66)

文章存档

2019年(4)

2018年(1)

2015年(2)

2014年(16)

2013年(43)

分类: LINUX

2014-02-09 21:21:57

1、设备驱编译的驱动可以编译进内核,也可以作为内核模块,通过/etc/modprobe.conf进行配置【实际文件并不存在】,存在的是 /etc/modprobe.d/ 这个目录,目录下有些文件的样子。具体的情况是 Redhat 在这个目录下的确有对应的配置文件,比如 dist.conf 以及 dist-alsa.conf以及dist-oss.conf文件,同时也有 blacklist.conf 等文件;但是在ubuntu下仅有blacklist的配置文件。

  1. # 下面是CentOS中 /etc/probe.d/ 目录下的文件

  2.   
  3. -rw-r--r--. 1 root root 52 Jan 2 20:19 anaconda.conf
  4. -rw-r--r--. 1 root root 884 Jan 2 20:19 blacklist.conf
  5. -rw-r--r--. 1 root root 382 Jan 2 20:19 dist-alsa.conf
  6. -rw-r--r--. 1 root root 5596 Jan 8 14:02 dist.conf
  7. -rw-r--r--. 1 root root 473 Jun 22 2012 dist-oss.conf
  8. -rw-r--r--. 1 root root 30 Oct 10 2009 openfwwf.conf
  9. -rw-r--r--. 1 root root 139 Jan 2 20:19 vmware-tools.conf
  10. # 下面是Ubuntu 12.04 中的 /etc/probe.d/ 目录下的文件

  11.   
  12. -rw-r--r-- 1 root root 325 Mar 19 2011 blacklist-ath_pci.conf
  13. -rw-r--r-- 1 root root 1603 Mar 19 2011 blacklist.conf
  14. -rw-r--r-- 1 root root 210 Mar 19 2011 blacklist-firewire.conf
  15. -rw-r--r-- 1 root root 661 Nov 21 2011 blacklist-framebuffer.conf
  16. -rw-r--r-- 1 root root 583 Mar 19 2011 blacklist-rare-network.conf
  17. -rw-r--r-- 1 root root 1077 Mar 19 2011 blacklist-watchdog.conf


2、Linux内核信息存储在一个叫 dmesg 的动态缓冲区内,缓冲区的内容可以使用 dmesg 命令进行查看。

3、Linux的内核主要是提供对机器硬件的访问,对基本硬件比如CPU和内存,其他的设备比如网卡,磁盘,USB设备等,Linux通过使用设备驱动程序(device driver)这些内核组件进行管理。内核的两种实施方式,和第一条中讲到的一样。

4、静态内核映像(Static Kernel Image):通常位于 /boot/目录下,名称为 vmlinuz-version,version 为内核的编号,这文件是引导系统时装载的文件,比如我的系统下的文件 /boot/vmlinuz-3.2.0-29-generic 。

在位于存储设备的文件系统可用之前,引导程序需要的一些设备驱动(IDE驱动,控制台驱动),一般这些驱动都在核心内核映像中。因为设备驱动作为内核映像的一部分装载,所以唯一的可以赋予参数的机会就是在引导时(boottime)赋值,大部分Linux引导程序如GRUB和LILO,允许用户在引导时通过内核命令行(Kernel Command Line)赋予内核参数。

文件 /proc/cmdline 中记录了用来引导内核当前实例的命令行:

  1. #CentOS 的命令行:
  2. ro root=UUID=64c07dcd-3fda-451e-b88c-e88d0b83e93c rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
  3. #Ubuntu 的命令行:
  4. BOOT_IMAGE=/vmlinuz-3.2.0-29-generic root=/dev/mapper/ubuntuServer-root ro

内核模块: 补充的设备驱动程序(系统引导开始阶段用不到的驱动)【网络驱动,声卡驱动】,通常以内核模块的形式实施,内核模块作为文件存储在文件系统当中,通常位于 /lib/modules/versions 下面;Linux驱动是按需装载的,当内核首次访问某个设备的时候,从文件系统中装载这个设备的驱动程序,如果设备不存在或未使用时是不会加载对应驱动的。

lsmod 命令可以产生当前装载的内核模块的列表:
也可以使用 cat /proc/modules 列出更加详细的一些信息
[root@localhost modprobe.d]# lsmod
Module                     Size           Used by
fuse                          66891               2 
vmhgfs                    58493                0 
vsock                       45126                0 
ipt_REJECT               2351                 2 
iptable_filter            2793                  1 
ip_tables                  17831                1  iptable_filter
ip6t_REJECT             4628                  2 
nf_conntrack_ipv6   8748                 2 


装载驱动时,内核“按需”装载模块,根据 /etc/modprobe.conf【Centos实际上是 /etc/modprob.d/中的列表】【Ubuntu实际上已经到 /lib/modules/versions/modules.alias】中的模块参数进行对应的配置,文件的内容:

alias pci:v00008086d00003422sv*sd*bc*sc*i* mce_xeon75xx
alias devname:cpu/microcode microcode
alias char-major-10-184 microcode
alias salsa20 salsa20_generic
alias stdrng ansi_cprng
alias ghash ghash_generic
alias net-pf-38 af_alg

因此,Linux中的设备驱动可以通过静态或者模块形式实施,静态驱动在引导时通过内核命令配置,模块设备驱动程序通过/etc/modprobe.conf 文件在装载时配置【实际路径CentOS和Ubuntu并不相同】

5、硬件信息
探测硬件的第一个迹象就是系统引导时内核发出的一系列的消息,很快就会在屏幕上一闪而过,这些信息存储在 dmesg 缓冲区,而且是一个环缓冲区,满了以后开始从旧的进行覆盖,缓冲区的当前内容可以通过 dmesg 命令送到标准输出,如果运行一段时间可能最开始的信息就会被覆盖,因此最初的缓冲区的快照保存在文件 /var/log/dmesg 中,每次引导时就会被覆盖,反映最近一次启动的信息。

6、/proc文件系统
/proc 文件系统是Linux内核实现的虚拟文件系统,固定挂载到/proc 目录之下,

Ubuntu x64 12.04
root@ubuntuServer:/lib/modules/3.2.0-29-generic# mount
/dev/mapper/ubuntuServer-root on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
/dev/sda1 on /boot type ext2 (rw)
Linux version 2.6.32-279.el6.x86_64 (mockbuild@c6b9.bsys.dev.centos.org) (gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) ) #1 SMP Fri Jun 22 12:19:21 UTC 2012
[root@localhost sysconfig]# mount
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
vmware-vmblock on /var/run/vmblock-fuse type fuse.vmware-vmblock (rw,nosuid,nodev,default_permissions,allow_other)

所有文件不会存在于任何物理介质中,读取文件时内核会返回动态产生的响应,也可以通过写入/proc的文件以改变内核的一些参数,机器关闭时,内核不存在,这些文件也就完全不存在。

7、处理器机内存及硬盘支持
处理器:对称多处理技术(SMP,Symmetric Multiprocessing),Linux能够支持到32个CPU(早起数据),也支持一个进程的多个线程在多个CPU上同时执行,可以通过 cat /proc/cupinfo 获取对应的信息

processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 58
model name : Intel(R) Core(TM) i7-3610QM CPU @ 2.30GHz
stepping : 9
microcode : 0x10
cpu MHz : 2294.839
cache size : 6144 KB

内存:x86系列CPU是32位构架,支持4GB内存;内核支持1GB的内存,编译“高内存”支持额外的内存,可以让机器访问更多的内存(但是不能同时访问),另外就是利用Intel的PAE(Physical Address Extension)物理地址扩展技术,可以使32位系统访问高达64GB的内存【非同时访问】,kernel-PAE的rpm软件可以让Linux支持PAE特性,对应的内存信息: cat /proc/meminfo

MemTotal:          1015944 kB
MemFree:           398668 kB
Buffers:               44156 kB
Cached:              393924 kB
SwapCached:            0 kB

硬盘:内核负责自动探测硬盘的存在,硬盘一般使用IDE或者SCSI总线协议:

IDE磁盘和/proc/ide 设备:
IDE总线协议允许计算机有多个IDE控制器,每个IDE控制器最多管理两个磁盘,分别称作: master 和 slave 驱动器,而IDE控制器则称作:Primary和Secondary控制器【第三个的话 teritary】,这样的话能够连接4个IDE驱动器,命名序列 hda hdb hdc hdd hde 。

ls /proc/ide/ 可以看到探测到的ide设备的数量,/proc/ide 本身只是一个目录,下面才是具体的设备内容;

其实SCSI设备的也是类似的情况,只是判定没有IDE那么容易,通常使用 sda sdb 这样的命名方式【IDE的是hd,SCSI的是sd】,Linux只能将第一个探测到的称作 sda 然后依次类推。

# 这个文件时 /proc/scsi/scsi 文件中的内容
Attached devices:
Host: scsi1 Channel: 00 Id: 00 Lun: 00
  Vendor: NECVMWar Model: VMware IDE CDR10 Rev: 1.00
  Type:   CD-ROM                           ANSI  SCSI revision: 05
Host: scsi2 Channel: 00 Id: 00 Lun: 00
  Vendor: VMware,  Model: VMware Virtual S Rev: 1.0
  Type:   Direct-Access                    ANSI  SCSI revision: 02

8、PCI设备
所有的PCI设备都共享一个配置协议,因此PCI设备可以通过硬件的 生产厂家+设备ID 进行自我识别,设备信息可以通过 lspci 命令进行列出
5 (Red Hat 4.4.6-4) (GCC) ) #1 SMP Fri Jun 22 12:19:21 UTC 2012
[root@localhost proc]# lspci
00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 01)
00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 01)
00:07.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 08)
00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)
00:07.7 System peripheral: VMware Virtual Machine Communication Interface (rev 10)
00:0f.0 VGA compatible controller: VMware SVGA II Adapter
lspci命令不会列出 IDE、ISA以及USB设备,只列出总线控制器

硬件资源:x86框架提供硬件和Linux内核交流的通用机制,添加新设备时必须小心共享一些资源:

中断请求(IRQ,Interrupt Request Line)和 /proc/interrupts 
每个设备都有与内核消息交互的方法,引起内核的注意,很多设备使用IRQ来实现这个目的,在x86框架中有 15条IRQ可用,多个设备可以共享一个IRQ中断号。

x64 多核心的中断数量也比较多,也就是SMP机器上,硬件中断请求是向独立CPU发出的,每个CPU中断请求分别列出:
           CPU0       CPU1       CPU2       CPU3       
  0:        164          0          0          0   IO-APIC-edge      timer
  1:        352          0          0          0   IO-APIC-edge      i8042
  3:          1          0          0          0   IO-APIC-edge    
  4:          1          0          0          0   IO-APIC-edge    
  7:          0          0          0          0   IO-APIC-edge      parport0
  8:          1          0          0          0   IO-APIC-edge      rtc0
  9:          0          0          0          0   IO-APIC-fasteoi   acpi
 12:       1489          0          0          0   IO-APIC-edge      i8042
 14:          0          0          0          0   IO-APIC-edge      ata_piix
 15:      24487          0          0          0   IO-APIC-edge      ata_piix
 16:       1679          0          0          0   IO-APIC-fasteoi   Ensoniq AudioPCI
 17:       9241          0        834          0   IO-APIC-fasteoi   ehci_hcd:usb1, ioc0
 18:         80          0          0          0   IO-APIC-fasteoi   uhci_hcd:usb2
 19:        106      48580          0          0   IO-APIC-fasteoi   eth3, eth2
NMI:          0          0          0          0   Non-maskable interrupts
LOC:     109176     116042      78946      78212   Local timer interrupts
SPU:          0          0          0          0   Spurious interrupts
PMI:          0          0          0          0   Performance monitoring interrupts
IWI:          0          0          0          0   IRQ work interrupts
RES:      20205      33161      16398      20326   Rescheduling interrupts
CAL:        716        167       3786        185   Function call interrupts
TLB:        372        790        366        836   TLB shootdowns
TRM:          0          0          0          0   Thermal event interrupts
THR:          0          0          0          0   Threshold APIC interrupts
MCE:          0          0          0          0   Machine check exceptions
MCP:         24         24         24         24   Machine check polls
注意其中NMI(Non Maskable interrupt),不可掩盖的中断,这个发生的次数很大程度上说明底层硬件出错的情况。

I/O端口和 /proc/ioports : 
x86提供了单独的16位地址空间,这个地址为 I/O 端口,proc文件系统中的 ioports 显示不同设备驱动要求的端口,使用16进制显示:

[root@localhost proc]# cat ioports 
0000-0cf7 : PCI Bus 0000:00
  0000-001f : dma1
  0020-0021 : pic1
  0040-0043 : timer0
  0050-0053 : timer1
  0060-0060 : keyboard
  0064-0064 : keyboard
  0070-0071 : rtc0
  0080-008f : dma page reg
  00a0-00a1 : pic2
  00c0-00df : dma2
  00f0-00ff : fpu

设备内存缓存区和 /proc/iomem
比较先进的设备都有自己的内存,这些内存一旦映射到系统内存地址空间,可以利用他们方便的传递数据,比如显卡就是典型的自己提供内存缓冲区的设备:
[root@localhost proc]# cat iomem 
00000000-0000ffff : reserved
00010000-0009f3ff : System RAM #机器的主内存会被当做一个其他设备,并与底层物理地址空间映射
0009f400-0009ffff : reserved
000a0000-000bffff : PCI Bus 0000:00
000c0000-000c7fff : Video ROM
000ca000-000cbfff : reserved
  000ca000-000cafff : Adapter ROM
  000cb000-000cbfff : Adapter ROM
000cc000-000cffff : PCI Bus 0000:00
物理空间不需要连续使用,多说带有缓存的设备都会被映射到高位空间。

配置PCI设备
添加新的设备时,一般使用两个步骤来配置内核;
设备驱动作为内核模块的话一定会被加载,配置硬件能够使硬件不会再资源上产生冲突; 默认驱动管理程序(Redhat是kudzu)自动去找产品的 生产商+产品ID 在 /lib/modules/kernel-version/modules.pcimap ,如果找到了则去建立别名 alias,建立别名的位置要根据不同的系统来决定(centos会建立在 /etc/modprob.d/下,而ubuntu视乎更倾向于建立在 /lib/mo
阅读(5978) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~