PDF电子书 | Linux系统编程(第2版)

这本书是关于Linux上的系统编程。“系统编程”是指编写系统软件,其代码在底层运行,直接跟内核和核心系统库对话。换句话说,本书的主题是Linux系统调用和底层函数说明,如C库定义的函数。
本书假定读者熟悉C编程和Linux编程环境——不要求很精通,但至少比较熟悉。如果你不习惯于UNIX文本编辑器——Emacs和vim(后者成为最广泛使用的编辑器,而且评价很高),那么至少应该熟悉一个。你还应该对如何使用gcc、gdb、make等工具很熟悉。已经有很多书籍介绍了关于Linux编程的工具和实践,本书最后的附录B给出一些有用的资源。
精彩书摘
  调用系统调用
位于用户空间的应用程序无法直接访问内核空间。从安全和可靠性角度考虑,也需要禁止用户空间的应用程序直接执行内核代码或操纵内核数据。但从另外一个角度看,内核也必须提供这样一种机制,当用户空间的应用希望执行系统调用时,可以通过该机制通知内核。有了这种机制,应用程序就可以“深入”内核,执行内核允许的代码。这种机制在不同的体系结构上又各不相同。举个例子,在i386微处理器上,用户空间的应用需要执行参数值为0x80的软件中断指令int。该指令会把当前运行环境从用户空间切换成内核空间,即内核的保护区域,内核在该区域执行中断处理函数——中断0x80的处理函数是什么呢?只能是系统调用处理函数!
应用程序通过寄存器告诉内核调用哪个系统调用以及传递什么参数。系统调用以数值表示,从0开始。举个例子,在i386微处理器体系结构上,要请求系统调用5(即open()),用户空间在发送int指令前,需要把5写到寄存器eax中。
参数传递也以类似的方式处理。还是以i386为例,为每个可能的参数指定一个寄存器——寄存器ebx、ecx、edx、esi和edi顺序存储前5个参数。对于极少数参数超过5个的系统调用,则使用单个寄存器指向保存所有参数的用户空间缓存。当然,大部分系统调用只包含几个参数。
虽然基本思想是一致的,但不同体系结构处理系统调用的方式不同。作为一名系统程序员,通常不需要了解内核是如何处理系统调用的。系统调用已经集成到各种体系结构的标准调用规范中,并通过编译器和C库自动处理。


欢迎投稿 职场/创业方向. 邮箱wangfzcom(AT)163.com:王夫子社区 » PDF电子书 | Linux系统编程(第2版)