下载
第1章 Linux操作系统
1 9 9 1 年3月,Linus Benedict To r v a l d s 为他的 AT 3 8 6 计算机买了一个多任务操作系统:
M i n i x 。他使用这个操作系统来开发自己的多任务系统,并称之为 L i n u x 。1 9 9 1 年9月,他向
I n t e r n e t网上的其他一些 M i n i x 用户发电子邮件,发布了第一个系统原型,这样就揭开了 L i n u x
工程的序幕。从那时起,有许多程序员都开始支持 L i n u x。他们增加设备驱动程序,开发应用
程序,他们的目标是符合 P O S I X 标准。现在的 L i n u x 功能已经非常强大了,但是 L i n u x 更吸引
人的地方在于,它是免费的 (当然并不像免费啤酒那样,不是完全免费 )。现在人们正在把
L i n u x 移植到其他平台上。
下载
第2章 Linux内核
L i n u x的基础就是它的内核。用户可以替换某个库,或者将所有库都进行替换,但是只要
L i n u x 内核存在,它就还是 L i n u x 。内核包括设备驱动程序、内核管理、进程管理以及通信管
理。内核高手总是遵循 P O S I X 规则,该规则有时会使编程变得简单,有时会使它变得比较复
杂。如果用户的程序在一个新的 L i n u x内核版本上行为发生了变化,可能是因为实现了一个新
的P O S I X 规则。如果读者想了解更多的关于 L i n u x 内核编程的信息,可以阅读《 Linux Kernel
H a c k e r ’s Guide》。
下载
第3章 Linux libc包
L i b c:ISO 8859.1;位于< l i n u x / p a r a m . h > 中;包括Y P 函数、加密函数、一些基本的影子
过程(默认情况不包含),……在l i b c o m p t 中有一些为了保持兼容性而提供的老过程 (默认情况下
不激活);提供英文、法文,或者德文的错误信息;在 l i b c u r s e s 中有一些具有bsd 4.4lite兼容性
的屏幕处理过程;在 l i b b s d 中有一些b s d兼容的过程;在 l i b t e r m c a p 中有一些屏幕处理过程;在
l i b d b m 中有用于数据库管理的过程;在 l i b m中有数学过程;在 c r t O . o ? ? ?中有执行程序的入口,
在l i b i e e e ? ? ? 有一些字节信息(请别再笑话我了,能不能给我提供一些信息? ),在l i b g m o n 中是
用户空间的配置信息。
我希望由某位Linux libc开发人员来编写本章。现在我能说的唯一的一句话是 a . o u t可执行
格式将会变化成e l f ( 可执行并可链接)格式(出版者注:这个变化已经发生了 ),而后者又意味着
在创建共享库方面的一个变化。当前这两种格式 ( a . o u t 和e l f )都支持。
Linux libc包的绝大部分都是遵守库 G N U公共许可证的,尽管有些文件是遵守特殊的版权
规定的,例如 c r t O . o 。对商业版本来说,这就意味着一个限制 ,即禁止静态链接可执行程序。
在这里动态链接可执行程序又是一个特殊的例外。 F S F (自由软件基金会)的Richard Stallman说
过:
在我看来,我们应该明确地允许发行不带伴随库的动态链接可执行程序,只要组成该可
执行程序的对象文件按照第 5节的规定是不受限制的。… …,所以我决定现在就允许这样做。
实际上,要更新L G P L将需要等到我有时间的时候,并且需要检查一下新版本。
下载
第4章 系 统 调 用
系统调用是向操作系统 (内核)所作出的一次申请,请求操作系统做一次硬件 /系统相关的
操作,或者是作一次只有系统才能做的操作。以 Linux 1.2为例,它总共定义了1 4 0个系统调用。
有些系统调用(如close ( ))是在Linux libc中实现的。这种实现常常需要调用一个宏,而该宏最
后会调用syscall ( )。传送给syscall ( )的参数是系统调用的编号,在编号后面的参数是其他一
些必需的变元。如果通过实现一个新的 l i b c 库而更新了< s y s / s y s c a l l . h >,则真正的系统调用编
号可以在< l i n u x / u n i s t d . h >中找到。如果新的系统调用在 l i b c 中还没有代理程序,用户可以使用
syscall ( )。下面给出一个例子,可以像下面一样使用 syscall ( )来关闭一个文件(不提倡):
在i 3 8 6体系结构下,除了系统调用编号以外,系统调用只能带 5个以下的变元,这是由于
受到了硬件寄存器数目的限制。如果读者是在另一个体系结构下运行 L i n u x 的,可以检查一下
< a s m / u n i s t d . h >中的_ s y s c a l l 宏,看看硬件支持多少个变元,或者说开发人员选择支持多少个变
元。这些_ s y s c a l l 可以用于取代syscall ( ),但是并不提倡用户这么做,这是因为由这些宏扩展
而成的完整的函数有可能在库中早已存在了。
所以,只有内核高手才能去使用 _ s y s c a l l宏。为了说明这一点,下面给出一个使用 _ s y s c a l l
宏的close ( )的例子:
在_ s y s c a l l 1 宏扩展以后,得到函数 close ( )。这样,我们就有两个close ( )了,一个在l i b c
中,另一个在我们的程序中。如果系统调用失败, syscall ( )或者_ s y s c a l l 宏的返回值是- 1;
而如果系统调用成功,则返回值将是 0或者更大的数值,如果系统调用失败,我们可以查看一
下全局变量e r r n o ,看看到底发生了什么。
下面这些系统调用在B S D和Sys V中是可用的,但Linux 1.2不支持:
audit ( )、audition ( )、auditsvc ( )、fchroot ( )、getauid ( )、getdents ( )、getmsg ( )、
mincore ( )、poll ( )、putmsg ( )、setaudit ( )、setauid ( )。
下载
第5章 “瑞士军刀”:ioctl
i o c t l代表输入/输出控制,它用于通过文件描述符来操作字符设备。 i o c t l 的格式如下所示:
ioctl (unsigned int fd, unsigned int request, unsigned long arg u m e n t )
如果出错则返回值为- 1,如果请求成功则返回值将大于或者等于 0,这就像其他系统调
用一样。内核能区分特殊文件和普通文件。特殊文件一般可以在 / d e v 和/ p r o c 中找到。它们与
普通文件的区别在于,它们隐藏了驱动程序的接口,并不是一个包含着文本或二进制数据的
真正的(常规的)文件。这是U n i x 的特点,它允许用户对每一个文件都可以使用普通的读 /写操
作。但是,如果用户想要对特殊文件或者普通文件进行更多的处理,用户可以使用……对了,
就是i o c t l。用户把i o c t l用于特殊文件的机会比用于普通文件的机会要多得多,但是在普通文件
上也可以使用i o c t l 。