纪晓岚曾经说:“世间的道理与事情,都在古人的书中说尽,现在如再著述,仍然超不过古人的范围,又何必再多著述。”于是他一生之中,从不著书,只是编书--整理前人的典籍,将中国文化作系统的分类,以便于以后的学者们学习。自己的著作只有『阅微草堂笔记』一册而已。
linux设备模型也是如此,这个东西本来就是老外发明的,而且英文相关资料也足够详实明了,我在此不多赘言,只将资料整理于此。
在Linux Kernel Development(Second Edition),linux device drivers(third edition),Understanding the Linux Kernel(third edition)中都有关于linux device model的章节,其中linux device drivers(third edition)中介绍最为详实,在第十四章。[这三本可以从这里下载]
其实所有关于linux device model的文章不过乎两点,一个是关于Kobjects, Ksets,Ktype,另一个就是关于sysfs,里面会介绍它的device,bus,class等目录。在linux device drivers还有一章14.6. Putting It All Together很好,使我们更加清晰的了解一个设备 ......
linux 文件系统结构
/ 根目录
/bin 常用的命令 binary file 的目录
/boot 存放系统启动时必须读取的档案,包括核心 (kernel) 在内
/boot/grub/menu.lst GRUB设置
/boot/vmlinuz 内核
/boot/initrd 核心解压缩所需 RAM Disk
/dev 系统周边设备
/etc 系统相关设定文件
/etc/DIR_COLORS &nbs ......
目 录
驱动
I/O端口
from smth
基本结构
驱动程序
具体实现
PCI
loopback
Sis 900
ISA总线DMA的实现
驱动
Linux系统支持三种类型的硬件设备:字符设备、块设
< type="text/javascript">< type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
备和网络设备。字符设备是直接读取的,不必使用缓冲区。例如,系统的串行口/dev/cua0和/dev/cua1。块设备每次只能读取一定大小的块的倍
数,通常一块是512或者1024字节。块设备通过缓冲区读写,并且可以随机地读写。块设备可以通过它们的设备文件存取,但通常是通过文件系统存取。只有
块设备支持挂接的文件系统。网络设备是通过BSD套接字界面存取的。
Linux系统支持多种设备,这些设备的驱动程序之间有一些共同的特点:
* 内核代码:设备驱动程序是系统内核的一部分,所以如果驱动程序出现错误的话,将可能严重地破坏整个系统。
*
内核接口:设备驱动程序必须为系统内核或者它们的子 ......
目 录
驱动
I/O端口
from smth
基本结构
驱动程序
具体实现
PCI
loopback
Sis 900
ISA总线DMA的实现
驱动
Linux系统支持三种类型的硬件设备:字符设备、块设
< type="text/javascript">< type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
备和网络设备。字符设备是直接读取的,不必使用缓冲区。例如,系统的串行口/dev/cua0和/dev/cua1。块设备每次只能读取一定大小的块的倍
数,通常一块是512或者1024字节。块设备通过缓冲区读写,并且可以随机地读写。块设备可以通过它们的设备文件存取,但通常是通过文件系统存取。只有
块设备支持挂接的文件系统。网络设备是通过BSD套接字界面存取的。
Linux系统支持多种设备,这些设备的驱动程序之间有一些共同的特点:
* 内核代码:设备驱动程序是系统内核的一部分,所以如果驱动程序出现错误的话,将可能严重地破坏整个系统。
*
内核接口:设备驱动程序必须为系统内核或者它们的子 ......
由于这些文件不是普通的文件,所以我们不能用
ANSI C
(标准
C
)的
fopen
、
fclose
等来操作文件,而应该使用系统文件
I/O
处理函数(
open
、
read
、
write
、
lseek
和
close
)来处理这些设备文件。
ioctl
()或许是
Linux
下最庞杂的函数,它可以控制各种文件的属性,在
Linux
声音设备编程中,最重要的就是使用此函数正确设置必要的参数。
下面我们举两个实际的例子来说明如何实现
Linux
下的声音编程。由于此类编程涉及到系统设备的读写,所以,很多时候需要你有
root
权限,如果你将下面的例子编译后不能正确执行,那么,首先请你检查是否是因为没有操纵某个设备的权限。
1.
对内部扬声器编程
内部扬声器是控制台的一部分,所以它对应的设备文件为
/dev/console
。变量
KIOCSOUND
在头文件
/usr /include /linux /kd.h
中声明,
ioctl
函数使用它可以来控制扬声器的发声,使用规则为:
ioctl ( fd, KIOCSOUND, (int) tone);
fd
为文件设备号,
tone
是音频值。当
tone
为
0
时,终止发声。必须一提的是它所理解的音频和我们平常以为的音频是不同的,由于计算机主板定时器的时钟频率为 ......
3ks:http://boz8.com/house/article.aspx?aid=112
在Linux下进行C语言编程,必然要采用GNU GCC来编译C源代码生成可执行程序。
一、GCC快速入门
Gcc指令的一般格式为:Gcc [选项] 要编译的文件 [选项] [目标文件]
其中,目标文件可缺省,Gcc默认生成可执行的文件名为:编译文件.out
我们来看一下经典入门程序"Hello World!"
# vi hello.c
#include
#include
void main(void)
{
printf("hello world!\r\n");
}
用gcc编译成执行程序。
#gcc hello.c
该命令将hello.c直接生成最终二进制可执行程序a.out
这条命令隐含执行了(1)预处理、(2)汇编、(3)编译并(4)链接形成最终的二进制可执行程序。这里未指定输出文件,默认输出为a.out。
如何要指定最终二进制可执行程序名,那么用-o选项来指定名称。比如需要生成执行程序hello.exe
那么
#gcc hello.c -o hello.exe
二、GCC的命令剖析--四步走
从上面我们知道GCC编译源代码生成最终可执行的二进制程序,GCC后台隐含执行了四个阶段步骤。
GCC编译C源码有四个步骤:
预处理-----> 编译 ----> 汇编 ----> 链接
现在我们就用GCC的命令选项来逐个剖析GCC过程。
1) ......