Chinaunix首页 | 论坛 | 博客
  • 博客访问: 693392
  • 博文数量: 192
  • 博客积分: 1875
  • 博客等级: 上尉
  • 技术积分: 2177
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-23 23:21
个人简介

有时候,就是想窥视一下不知道的东东,因为好奇!

文章分类

全部博文(192)

文章存档

2024年(8)

2023年(3)

2020年(1)

2019年(1)

2018年(1)

2017年(2)

2016年(69)

2015年(53)

2014年(14)

2013年(1)

2012年(5)

2011年(25)

2010年(9)

分类: LINUX

2016-11-21 22:51:04

内核资料收集

Linux操作系统为用户在用户态的进程与硬件进程交互提供了一组接口.
在应用层和硬件之间设置一个额外层具有很多优点:
    a. 这使得编程更加容易,把用户从学习硬件设备的低级编程特性中解放出来.
    b. 极大提高系统安全性. 内核在试图满足请求前在接口级检查请求的正解性.
    c. 这些接口使程序更有可移植性. 内核提供的接口相同,任一内核之上就可以正确地编译和执行程序.

    unix系统通过向内核发出系统调用(system call)实现了用户态进程和硬件设备之间的大部分接口.

一. POSIX API 和系统调用
    应用编程接口API与系统调用之不同: 
    a. 前者只是一个函数定义,说明了如何获得一个给定的服务;后者是通过软中断向内核发出一个明确的请求.
    b. Unix系统给程序员提供了很多API的库函数. lib的标准C库所定义的一些API引用了封装例程(wrapper routine)(其唯一目的就是发布
        系统调用).通常情况下,每个系统调用对应一个封装例程, 而封装例程定义了应用程序使用的API. 反之不然.
    c. 一个API不必要对应在一个特定的系统调用. API可直接提供用户态的服务; 一个单独的API函数可能调用几个系统调用; 几个API函数
        可能调用封装了不同功能的同一个系统调用.例libc库函数实现了malloc()/calloc()/free()等POSIX API, 这几个函数分配和释放所请求
        的内存,并都利用brk()系统调用扩大或缩小进程的堆(heap).
    d. POSIX标准针对API而不针对系统调用.判断一个系统调用是否与POSIX兼容要看它是否提供了一组合适的应用接口, 而不管对应的函数
        是如何实现的. 事实上,一些非Unix系统被认为是与POSIX兼容的, 因为它们在用户态的库函数中提供了传统Unix能提供的所有服务.

    e. 从编程者看, API和系统调用之间差别是没有关系的: 唯一相关的事情是函数名/函数类型及返回代码的含义. 然而, 从内核设计者的观
        点看, 这种差别确实有关系, 因为系统调用属于内核, 而用户态的库函数不属于内核.

    f.  大部分封装例程返回一个整数,其值的含义信赖于相应的系统调用.返回值-1通常表示内核不能满足进程的请求.系统调用处理程序的失败可
        能是由无效参数引起的,也可能是因为缺乏可用资源,或硬件出了问题等等.在lic库中定义的error变量包含特定的出错码.
        每个出错码都定义为一个常量宏(产生一个相应的正整数值). POSIX标准指定了很多出错码的宏名. 在/usr/include目录下的文件中定义了这些宏.

阅读(1273) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~