第一章 LINUX内核简介

1.1 Unix的历史

  • 1969年的夏天,贝尔实验室的程序员们在一台PDR-7型机上实现了Unix这个全新的操作系统。
  • 1973年,整个Unix系统用C语言进行了重写,给后来Unix系统的广泛移植铺平了道路。
  • 伯克利的第一个Unix演化版是1977年推出的1BSD系统。
  • 伯克利真正独立开发的Unix系统是于1979年推出的3BSD系统,支持虚拟内存。
  • 1994年重写了虚拟内存子系统,推出了最终官方版,即4.4BSD。

Unix内核的特点:

  • 首先,Unix很简洁,仅仅提供几百个系统调用并且有一个非常明确的设计目的。
  • 在Unix中,所有的东西都被当做文件对待。
  • Unix内核和相关的系统工具软件是用C语言编写而成的,使得其在各种硬件体系架构面前都具备令人惊异的移植能力。
  • Unix的进程创建非常迅速,并且有一个非常独特的fork系统调用。
  • Unix提供了一套非常简单但又很稳定的进程间通信元语,把目标放在一次执行保质保量地完成一个任务上。

1.2Linux简介

Linux是类Unix系统,没有直接使用Unix的源代码,但也没有抛弃Unix的设计目标并且保证了应用程序编程接口的一致性。

Linux内核也是自由(公开)软件。

1.3操作系统和内核简介

操作系统:整个系统中负责完成最基本功能和系统管理的部分。

内核(管理者或者操作系统核心):由负责响应中断的中断服务程序,负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间的内存管理程序和网络、进程间通信等系统服务程序共同组成。

内核空间:系统态和被保护起来的内存空间。

在系统中运行的应用程序通过系统调用来与内核通信。

将每个处理器在任何指定时间点上的活动必然概括为:

  • 运行于用户空间,执行用户进程
  • 运行于内核空间,处于进程上下文,代表某个特定的进程执行
  • 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断

1.4Linux内核和传统Unix内核的比较

单内核:把它从整体上作为一个单独的大过程来实现,同是也运行在一个单独的地址空间上。

微内核:功能被划分成各个独立的过程。每个过程叫做一个服务器。

Linux是一个单内核,汲取了微内核的精华:模块化设计、抢占式内核、支持内核线程以及动态装载内核模块的能力。让所有事情运行在内核态,直接调用函数,无需消息传递。

  • 支持动态加载内核模块
  • 支持对称多处理(SMP)
  • 内核可以抢占(preemptive),允许内核运行的任务有优先执行的能力
  • 不区分线程和其他的一般进程
  • 提供具有设备类的面向对象的设备模型、热插拔事件,以及用户空间的设备文件系统。

1.5Linux内核版本

版本号为2.6.30.1的内核,主版本号是2,从版本号是6,修订版本号是30,稳定版本号是1。

第二章 从内核出发

1. 获取内核源码

  • 使用Git

    git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
    git pull # 更新分支到Linux的最新分支
  • 安装内核源代码(如果使用git获取就不需要下载压缩文件。)

    tar xvjf linux-x.y.z.tar.bz2
    或者
    tar xvzf linux-x.y.z.tar.gz

注意:内核源代码一般安装在/usr/src/linux目录下,即使在安装新内核时,/usr/src/linux目录应当保证原封不动。

  • 使用补丁

    patch -p1 < ../patch-x.y.z

2. 内核源码树

3. 编译内核

3.1 配置内核

配置项的二选一和三选一:

二选一:yes 或者 no

三选一:yes 或者 no 或者 module(module意味着该配置被选定了,以模块生成。驱动程序一般都用三选一的配置项)

字符页面的命令行工具:
make config 图形界面工具:
make menuconfig 基于默认配置为体系结构创建一个配置:
make defconfig 验证和更新配置:
make oldconfig

3.2 编译内核

编译内核:
make 重定向到该文件中:
make > .. /detritus 把无用的输出信息重定向到永无返回值的黑洞中:
make > /dev/null

3.3 安装新内核

将所有已编译的模块安装到正确的主目录/lib/modules下
make modules_install

4. 内核开发的特点

  • 内核开发时既不能访问C库也不能访问标准的C头文件 (解决方法:include/linux文件夹中包含了所需的内核头文件。)
  • 内核编程时必须使用GNU C

    • 内联函数: 函数会在所调用的位置上展开。 定义时,需要使用static作为关键字,用inline限定它。 内联函数必须在使用之前就定义好,一般在头文件中定义。 内核中优先使用内联函数而不是宏。

    • 内联汇编: 通常使用asm()指令嵌入汇编代码,用volatile表示不优化

    • 分支声明: unlikely(x) - x很少出现,绝少发生,通常为假 likely(y) - y经常出现,通常为真

  • 内核编程时缺乏像用户空间那样的内存保护机制

  • 内核编程时难以执行浮点运算
  • 内核给每个进程只有一个很小的定长堆栈
  • 由于内核支持异步中断、抢占和SMP(对称多处理系统),必须时刻注意同步和并发。(常用的解决竞争的方法:自旋锁和信号量)。
  • 要考虑可移植性的重要性(诸如保持字节序,64位对其,不假定字长和页面长度等。)

linux第一次读书笔记的更多相关文章

  1. Linux内核读书笔记第二周

    什么是系统调用 简单来说,系统调用就是用户程序和硬件设备之间的桥梁.用户程序在需要的时候,通过系统调用来使用硬件设备. 系统调用的存在,有以下重要的意义: 1)用户程序通过系统调用来使用硬件,而不用关 ...

  2. Linux 第一次学习笔记

    一.Linux 为何物 Linux 就是一个操作系统,就像你多少已经了解的 Windows(xp,7,8)和 Max OS ,至于操作系统是什么,就不用过多解释了,如果你学习过前面的入门课程,应该会有 ...

  3. Linux内核读书笔记第六周

    主要内容: 什么是调度 调度实现原理 Linux上调度实现的方法 调度相关的系统调用 什么是调度 现在的操作系统都是多任务的,为了能让更多的任务能同时在系统上更好的运行,需要一个管理程序来管理计算机上 ...

  4. Linux内核读书笔记第五周链接

    1.临界区(critical regions)就是访问和操作共享数据的代码段.多个执行线程并发访问同一个资源通常是不安全的,为了避免在临界区中并发访问,编程者必须保证这些代码 原子地执行.也就是说,代 ...

  5. Linux内核读书笔记第四周

    进程管理 1.进程描述符及任务结构 进程存放在叫做任务队列(task list)的双向循环链表中.链表中的每一项包含一个具体进程的所有信息,类型为task_struct,称为进程描述符(process ...

  6. Linux内核读书笔记第三周 调试

    内核调试的难点在于它不能像用户态程序调试那样打断点,随时暂停查看各个变量的状态. 也不能像用户态程序那样崩溃后迅速的重启,恢复初始状态. 用户态程序和内核交互,用户态程序的各种状态,错误等可以由内核来 ...

  7. 《深入理解Linux内核》 读书笔记

    深入理解Linux内核 读书笔记 一.概论 操作系统基本概念 多用户系统 允许多个用户登录系统,不同用户之间的有私有的空间 用户和组 每个用于属于一个组,组的权限和其他人的权限,和拥有者的权限不一样. ...

  8. 《Linux内核设计与实现》读书笔记(十二)- 内存管理【转】

    转自:http://www.cnblogs.com/wang_yb/archive/2013/05/23/3095907.html 内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己 ...

  9. 《Linux内核设计与实现》读书笔记(十一)- 定时器和时间管理【转】

    转自:http://www.cnblogs.com/wang_yb/archive/2013/05/10/3070373.html 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务 ...

随机推荐

  1. nginx服务器开启缓存、反向代理

    一.反向代理配置 1.反向代理服务器配置如下 反向代理就是需要这一行proxy_pass来完成.当我们要访问后端web服务器的时候,我们只需要访问代理服务器就可以了,此时代理服务器就充当后端web服务 ...

  2. Unity琐碎(1) 编辑器参数修改

    今天在写编辑器面板的时候,突然发现如果面板参数变化的时候,不能实时修改表现效果(参数没有生效). public int monsterCount ; void Awake() { monsterCou ...

  3. while else 结构体(自测)

    while else : while循环被break打断,则不执行与while并列的else程序. count = 0 while count <= 5: count = count + 1 i ...

  4. Beta阶段总结博客(麻瓜制造者)

    Beta冲刺过程中各个成员的贡献百分比: 成员 贡献值 邓弘立 15% 符天愉 14% 江郑 14% 刘双玉 14% 肖小强 13% 李佳铭 11% 汪志彬 11% 伍杰麟 8% 项目的发布说明 本版 ...

  5. 780. Reaching Points

    idea: 1.从后向前找 2.while (tx > ty) tx -= ty; 替为 % 操作 3.经过循环后,必定只有两种情况才true sx == tx && sy &l ...

  6. vue实例生命周期详解

    每个 Vue 实例在被创建之前都要经过一系列的初始化过程. 例如,实例需要配置数据观测(data observer).编译模版.挂载实例到 DOM ,然后在数据变化时更新 DOM . 在这个过程中,实 ...

  7. ActivityThread

    /** * This manages the execution of the main thread in an * application process, scheduling and exec ...

  8. LCA转换成RMQ

    LCA(Lowest Common Ancestor 最近公共祖先)定义如下:在一棵树中两个节点的LCA为这两个节点所有的公共祖先中深度最大的节点. 比如这棵树 结点5和6的LCA是2,12和7的LC ...

  9. Excel各种条件求和的公式汇总

    经常和Execl打交道的人肯定觉得求和公式是大家时常用到的.Excel里有哪几路求和公式呢?他们的使用方式又是怎样?我为大家汇总一下. 使用SUMIF()公式的单条件求和: 如要统计C列中的数据,要求 ...

  10. typeof与instanceof的区别是什么?

    在javascript中,判断一个变量的类型可以用typeof (1) 数字类型.typeof返回的值是number.比如说:typeof(1),返回值是number (2) 字符串类型,typeof ...