第1章Linux操作系统
1 991年3月,Linus Benedict To r v a l d s为他的AT 386计算机买了一个多任务操作系统:M i n i x。他使用这个操作系统来开发自己的多任务系统,并称之为L i n u x。1 991年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 40个系统调用。有些系统调用(如clo
se ( ))是在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 386体系结构下,除了系统调用编号以外,系统调用只能带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 ( ),但是并不提倡用户这么做,这是因为由这些宏扩展而成的完整的函数有可能在库中早已存在了。
linux系统免费下载所以,只有内核高手才能去使用_ s y s c a l l宏。为了说明这一点,下面给出一个使用_ s y s c a l l 宏的close ( )的例子:
在_ s y s c a l l1宏扩展以后,得到函数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。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论