原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang

部分内容来自:Linux Kernel Development(Third Edition),Robert Love,陈莉君等译。

1.操作系统和内核简介  

  Linux内核是自由公开软件,使用GNU的General Public License(GPL)第二版作为限制条款。大多数软件许可证决意剥夺你共享和修改软件的自由。相比之下,GNU通用公共许可证试图保证你共享和修改自由软件的自由。

  通常一个内核负责响应中断的中断服务程序、负责管理多个进程从而分享处理器时间的调度程序、负责管理进程地址空间的内存管理程序和网络、进程间通信等系统服务程序共同组成。内核独立于普通应用程序,拥有受保护的内存空间和访问硬件设备的所有权限,这种系统态和受保护的内存空间,称之为内核空间。

  应用程序通过系统调用与内核通信。当一个应用程序执行一条系统调用,称应用程序在内核空间运行,而内核运行于进程上下文。

  内核还要管理硬件设备。当硬件设备要和系统通信时,首先发出中断信号打断处理器的执行,继而打断内核的执行,内核通过中断号寻找相应的中断处理程序,并调用这个程序相应和处理中断。

  所以,处理器活动的情况:

    1.运行于用户空间,执行用户程序。

    2.运行于内核空间,处于进程上下文。

    3.运行于内核空间,处于中断上下文。

  操作系统内核分为两大阵营:单内核和微内核。

  单内核是将内核从整体上作为一个单独的大过程来实现,同时运行在一个单独的地址空间上。内核可以直接调用函数。大多数Unix为单内核单模块。

  微内核的功能被划分为多个独立的过程,所有的服务器殴打保持独立并运行在各自的地址空间上,不能像单内核模块直接调用函数,通过进程间通信(IPC)机制实现消息传递。Windows和Mac OS X基于微内核,但是却让全部的服务器进程运行在内核空间,而避免频繁的上下文切换。

  Linux是单内核,但是有模块化设计、抢占式内核、支持内核线程以及动态装载内核模块的特性。

  与Unix的一些区别:

    1.Linux支持动态加载内核模块。

    2.Linux支持对称多处理机制(SMP)。

    3.Linux内核可以抢占。

    4.Linux不区分线程和进程。

2.GNU C

  Linux使用c编写的,并不完全符合ANSI C标准,涵盖了ISO C99和GNU C标准。下面介绍内核使用的C语言拓展的部分。

  1.内联(inline)函数

    内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。因此,可以消除函数调用和返回带来的开销,但是意味着占用更多的空间。适合将对时间要求高、代码不长的函数定义为内联函数。如:

    static inline void wolf();(MS的C99支持的关键字是_inline)。

  2.内联汇编

    gcc编译器支持在c函数中嵌入汇编指令。通常使用asm()指令嵌入代码。

  3.分支声明

    对于条件选择指令,gcc内建立了一条指令用于优化,在一个条件经常出现(likely),或者该条件经常很少出现的时候(unlikely),编译器可以根据这条指令对分支选择进行优化,从而生成更好的汇编代码。内核将这条指令封装成了宏。

      #define likely(x)       __builtin_expect((x),1)//表示 x 的值为真的可能性更大;
      #define unlikely(x)     __builtin_expect((x),0)//表示 x 的值为假的可能性更大。

    用法如下:

      if (likely(prev != next)) {
           next->timestamp = now;
            ...
      } else {
            ...;
      }

  

Linux内核学习笔记-1.简介和入门的更多相关文章

  1. Linux内核学习笔记-2.进程管理

    原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  2. Linux内核学习笔记二——进程

    Linux内核学习笔记二——进程   一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...

  3. 20135316王剑桥Linux内核学习笔记

    王剑桥Linux内核学习笔记 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的 个人理 ...

  4. Linux内核学习笔记之seq_file接口创建可读写proc文件

    转自:http://blog.csdn.net/mumufan05/article/details/45803219 学习笔记与个人理解,如有错误,欢迎指正. 温馨提示:建议跟着注释中的编号顺序阅读代 ...

  5. Linux内核学习笔记

    1.vanbreaker的专栏 2.LinuxKernel Exploration 3.DroidPhone的专栏 4.Linux内核研究以及学习文档和ARM学习以及研究的开放文档   [力荐] 5. ...

  6. 20135316王剑桥Linux内核学习笔记第四周

    20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 1.内核态:在高执行级别,代码可 ...

  7. Linux内核学习笔记——内核内存管理方式

    一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页 ...

  8. 深入理解Linux内核 学习笔记(1)

    1.用户和用户组 每个用户是一个或多个用户组的一名成员,组由唯一的用户组标识符(user group ID)标识.每个文件的相关权限也恰好与一个组相对应. root为超级用户, 2.模块 为了达到微内 ...

  9. 20135316王剑桥Linux内核学习笔记第三周

    20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 三个法宝:存储程序计算机.函数调 ...

随机推荐

  1. Oracle Spatial-元数据及SDO_GEOMETRY

    一.空间表的元数据 将表的SDO_GEOMETRY列的所有对象作为一个空间层.Spatial需要对所有空间对象进行验证.创建索引和查询.此时需要为图层指定适当的元数据,该数据包含如下信息:维度.维度边 ...

  2. linux 自旋锁

    一.概述: 自旋锁是SMP架构中的一种low-level的同步机制.当线程A想要获取一把自旋锁而该锁又被其它线程锁持有时,线程A会在一个循环中自旋以检测锁是不是已经可用了.对于自选锁需要注意: 由于自 ...

  3. 权威指南之脚本化http

    使用javascript代码操作http是可行的.当用脚本设置window对象的location属性或调用表单对象的submit方法时,都会初始化http请求.这两种情况下,浏览器会加载新页面. aj ...

  4. Java调用ICTCLAS2015

    最近老板让做分词,指定使用ICTCLAS,于是到官网下载了2015,鼓捣了一晚上也没弄出来,百度了一上午还是一头雾水,,幸运的是现在已经弄好了,趁着没忘赶紧写下来. 1.首先解压并找到:2015080 ...

  5. Struts1、Struts2的线程安全问题

    Struts 1.x和Struts 2的Action是不是线程安全的? Struts 1.x在第一次请求某个Action时,会创建这个Action实例.但之后再请求该Action实例时,就用之前创建好 ...

  6. CLLocation

    http://blog.sina.com.cn/s/blog_9e8867eb01013knc.html 这家伙写的不错本人也参考了这篇博客,希望原文博主可以谅解新手的无奈举措 首相要提到的类是 CL ...

  7. Csharp多态的实现概述

    (1)什么是多态, 多态就是一个类表现出多种不同的形态, 他的核心是子类对象作为父类对象使用 (2)怎么实现多态, 在Csharp中,可以用接口, 虚方法, 抽象类实现多态,当然,不管是这三种的那一个 ...

  8. SnappyDB—Android上的NoSQL数据库简介

    参考:http://www.open-open.com/lib/view/open1420816891937.html 参考:http://android-arsenal.com/details/1/ ...

  9. python基础学习笔记6--异常

    异常 1.什么是异常?  python用异常对象来表示( exception object)异常情况.如果异常没有被处理或扑捉,程序就会所谓的回溯(TraceBack,一种错误信息)而终止执行: 2. ...

  10. karma note

    karma 简介 karma不是一个测试框架,仅仅是启动了一个httpServer karma仅仅是一个跑测试的平台(runner), 我们可以使用各种测试框架, 如: Jasmine Mocha Q ...