课本学习笔记1:第一、二章 20135115臧文君

第一章 Linux内核简介

注:作者:臧文君,原创作品转载请注明出处。

一、Unix的历史

1、1969年,Dennis Ritchie和Ken Thompson,Unix。

2、Unix产生于贝尔试验室的一个失败的多用户操作系统Multics。

第一个被广泛使用的Unix版本是第6版,称为V6。

3、进一步开发:

加州大学伯克利分校:BSD(Berkeley Software Distributions)。

4、Unix系统强大的根本原因:策略和机制分离的设计理念,确保了Unix系统具备清晰的层次化结构。

(1)Unix很简洁:Unix仅仅提供几百个系统调用并且有一个非常明确的设计目的。

(2)在Unix中,所有的东西都被当做文件对待。

(3)Unix的内核和相关的系统工具软件是用C语言编写的,使得Unix在各种硬件体系架构面前都具备令人惊讶的移植能力,并且使广大的开发人员很容易接受。

(4)Unix的进程创建非常迅速,并且有一个非常独特的fork()系统调用。

(5)Unix提供了一套非常简单但又很稳定的进程间通信元语,快速简洁的进程创建过程使Unix的程序把目标放在一次执行保质保量地完成一个任务上,而简单稳定的进程间通信机制又可以保证这些单一目的的简单程序可以方便地组合在一起,去解决现实中变得越来越复杂的任务。

5、Unix已经发展成为一个支持抢占式多任务、多线程、虚拟内存、换页、动态链接和TCP/IP网络的现代化操作系统。

二、Linux简介

1、Linux的产生:1991,Linus Torvalds。

2、Linux是类Unix系统。

3、Linux系统的基础是内核、C库、工具集和系统的基本工具。

4、一般情况下,Linux这个词汇主要指内核。

三、操作系统和内核简介

1、操作系统:是指在整个系统中负责完成最基本功能和系统管理的那些部分。包括内核、设备驱动程序、启动引导程序、命令行Shell或者其他种类的用户界面、基本的文件管理工具和系统工具。

2、用户界面是操作系统的外在表象,内核才是操作系统的内在核心。

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

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

应用程序通常调用库函数,再由库函数通过系统调用界面,让内核代其完成各种不同任务。

5、当一个应用程序执行一条系统调用,我们说内核正在代其执行,应用程序被称为通过系统调用在内核空间运行,而内核被称为运行于进程上下文中。

6、应用程序完成其工作的基本行为方式:应用程序通过系统调用界面陷入内核。

7、内核还要负责管理系统的硬件设备。

8、中断通常对应着一个中断号,内核通过这个中断号查找相应的中断服务程序,并调用这个程序响应和处理中断。

许多操作系统的中断服务程序,包括Linux的,都不在进程上下文中执行,它们在一个与所有进程都无关的、专门的中断上下文中运行。

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

(1)运行于用户空间,执行用户进程。

(2)运行于内核空间,处于进程上下文,代表某个特定的进程执行。

(3)运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断。

例:当CPU空闲时,内核就运行一个空进程,处于进程上下文,但运行于内核空间。

四、Linux内核和传统Unix内核的比较

1、Unix内核都是一个不可分割的静态可执行库。

Unix内核通常需要硬件系统提供页机制(MMU)以管理内存。

2、单内核和微内核设计之比较:

操作系统内核可分为:单内核和微内核。

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

通常以单个静态二进制文件的形式存放于磁盘中。

内核之间的通信是微不足道的,内核可以直接调用函数。

具有简单和性能高的特点,大多数Unix系统都设计为单模块。

例:Linux(模块化设计、抢占式内核、支持内核线程以及动态装载内核模块)。

(2)微内核:并不作为一个单独的大过程来实现。

微内核的功能被划分为多个独立的过程,每个过程叫做一个服务器。

通过消息传递处理微内核通信:系统采用了进程间通信(IPC)机制。

服务器的各自独立有效地避免了一个服务器的失效祸及另一个,模块化的系统允许一个服务器为了另一个服务器而换出。

所有实际应用的基于微内核的系统都让大部分或全部服务器位于内核。

例:Windows NT内核。

3、Linux内核和传统的Unix系统之间的差异

五、Linux内核版本

1、Linux内核有两种:稳定的和处于开发中的。

2、版本命名规则:

从版本号可以反映出该内核是一个稳定版本还是一个处于开发中的版本:该数字如果是偶数---稳定版,奇数---开发板。

第二章 从内核出发

一、获取内核源码

1、使用git

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

当下载代码后,你可以更新你的分支到Linux的最新分支:git pull

2、安装内核源代码

如果内核压缩形式是bzip2,则运行:

tar xvjf linux-x.y.z.tar.bz2

如果内核压缩形式是GNU的zip,则运行:

tar xvzf linux-x.y.z.tar.gz

解压后的源代码位于linux-x.y.z.目录下。

内核源码一般安装在/usr/src/linux目录下。

3、使用补丁

要应用增量补丁,从你的内部源码树开始,只需运行:

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

二、内核源码树

1、内核源码树的根目录描述

三、编译内核

1、配置内核

(1)配置项:二选一(yes/no),三选一(yes/no/module)。

(2)驱动程序一般都是三选一的配置项。

(3)配置选项也可以是字符串或整数。

(4)简化内核配置:

A.字符界面下的命令行工具:make config,该工具会逐一遍历所有配置项。

B.利用基于ncurse库编制的图形界面工具:make menuconfig。

C.基于gtk+的图形工具:make gconfig。

D.基于默认的配置:make defconfig。

这些配置项会被存放在内核代码树根目录下的.config文件中。

(5)验证和更新配置:make oldconfig。

(6)配置选项CONFIG_IKCONFIG_PROC把完整的压缩过的内核配置文件存放在/proc/config.gz下,当你编译一个新内核的时候,可以方便地克隆当前的配置。

(7)如果你目前的内核已经启用了此选项,可以从/proc下复制出配置文件并且使用它来编译一个新内核:

zcar /proc/config.gz > .config

make oldconfig

(8)内核配置好后,使用make命令来编译它。

2、减少编译的垃圾信息

make > .. /detritus:尽量少的看到垃圾信息,不错过错误报告与警告信息,使用此命令对输出进行重定向。

make > /dev/null:把无用的输出信息重定向到永无返回值的黑洞/dev/null。

3、衍生多个编译作业

make -jn

n代表要衍生出的作业数

4、安装新内核

以root身份,运行make modules_install,就可以把所有已编译的模块安装到正确的主目录/lib/modules下。

四、内核开发的特点

相对于用户空间内应用程序的开发的差异:

1、无libc库或无标准头文件

(1)基本的头文件位于内核源代码树顶级目录下的include目录中。

(2)体系结构相关的头文件集位于内核源代码树的arch/<architecture>/include/asm目录下。

(3)printk()允许通过指定一个标志来设置优先级。

2、GNU C

(1)内联函数:对时间要求比较高,而本身长度又比较短的函数。

(2)定义内联函数时:使用static作为关键字,用inline限定它。

例:static inline void wolf(unsigned long tail_size)

在内核中,为了类型安全和易读性,优先使用内联函数而不是复杂的宏。

(3)内联汇编:使用asm()指令嵌入汇编代码。

(4)分支声明:一个条件经常出现,或者该条件很少出现的时候,可以使用likely()和unlikely()。

3、没有内存保护机制

内核中发生的内存错误会导致oops。

内核中的内存都不分页。

4、不要轻易在内核中使用浮点数

5、容积小而固定的栈

内核栈的大小是两页,32位机的内核栈是8KB,64位机的内核栈是16KB。

6、同步和并发

7、可移植性的重要性

总结:

第一、二两章主要介绍了Linux的发展以及Linux内核的获取、编译、安装方法。了解Linux的发展历史帮助我初步认识了Linux,也明白了Linux与Unix的异同。Linux中包含了Unix的印记,但也具有自身的特点。对于Linux内核知识的学习,也让我清楚了Linux系统的安装过程。

时间: 2024-10-19 12:44:31

课本学习笔记1:第一、二章 20135115臧文君的相关文章

课本学习笔记5:第七章 20135115臧文君

第七章 链接 注:作者:臧文君,原创作品转载请注明出处. 一.概述 1.链接(linking):是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载或被拷贝到存储器并执行. 2.链接可以执行于编译时.加载时和运行时. 3.链接器(linker):分离编译. 链接通常是由链接器执行. 二.编译器驱动程序 1.大多数编译系统提供编译驱动程序(compiler driver),它代表用户在需要时调用语言预处理器.编译器.汇编器和链接器. 例:ASCII码源文件-->可执行目标文

课本学习笔记4:第三章 20135115臧文君

第三章 进程管理 注:作者:臧文君,原创作品转载请注明出处. 一.进程 1.进程管理是所有操作系统的心脏所在. 2.进程:是处于执行期的程序以及相关的资源的总称,实际上,进程就是正在执行的程序代码的实时结果. 3.执行线程:简称线程thread,是在进程中活动的对象. 4.内核调度的对象是线程,而不是进程. 5.对Linux而言,线程是一种特殊的进程. 6.进程提供两种虚拟机制:虚拟处理器和虚拟内存. 同一个进程中的线程之间可以共享虚拟内存,但每个都拥有各自的虚拟处理器. 7.Linux系统中,

Linux内核分析期末总结 20135115臧文君

Linux内核分析期末总结 注:作者:臧文君,原创作品转载请注明出处,<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.计算机是如何工作的 1.参考链接:http://www.cnblogs.com/CatherineZang/p/5218570.html 2.编译语句:gcc -S -o main.s main.c -m32 3.“三个法宝” (1)存储程序计算机工作模型,计算机系统最最基础性的逻辑结构:

20135115臧文君---实验4

北京电子科技学院(BESTI) 实     验    报     告 课程:Java    班级:1351班      姓名:臧文君    学号:20135115 成绩:             指导教师:娄嘉鹏       实验日期:2015.6.9 实验密级:无       预习程度:           实验时间:15:30-18:00 仪器组次:         必修/选修:选修     实验序号:四 实验名称:  服务器与客户端间传送信息加解密 实验目的与要求: 1.没有Linux基础

20135115臧文君---实验1

北京电子科技学院(BESTI) 实     验    报     告 课程:Java        班级:1351班     姓名:臧文君    学号:20135115 成绩:             指导教师:娄嘉鹏      实验日期:2015.4.17 实验密级:无       预习程度:             实验时间:15:30-18:00 仪器组次:         必修/选修:选修             实验序号:一 实验名称:   Java开发环境的熟悉 实验目的与要求: 1

20135115臧文君---实验3

北京电子科技学院(BESTI) 实     验    报     告 课程:Java    班级:1351班      姓名:臧文君    学号:20135115 成绩:             指导教师:娄嘉鹏       实验日期:2015.6.4 实验密级:无       预习程度:           实验时间:15:30-18:00 仪器组次:         必修/选修:选修     实验序号:二 实验名称:  敏捷开发与XP实践 实验目的与要求: 1.没有Linux基础的同学建议先

作业6:进程的描述和进程的创建 20135115臧文君

进程的描述和进程的创建 注:作者:臧文君,原创作品转载请注明出处,<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程的描述 操作系统的三大功能:进程管理,内存管理和文件系统. 1.进程描述符task_struct数据结构 (1)进程控制块PCB---task_struct (2)进程描述符提供了内核所需了解的进程信息. task_struct中包含:进程状态,进程打开的文件,进程优先级信息. tty_st

作业1:计算机是如何工作的?20135115臧文君

计算机是如何工作的? 注:作者:臧文君,原创作品转载请注明出处,<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.存储程序计算机工作模型 1.冯诺依曼体系结构:指存储程序计算机 (1)硬件的角度:分为CPU+内存+总线 CPU中的一个寄存器---IP:Instruction Pointer,指向内存的CS:Code Segment 16位的CPU上叫IP,32位叫EIP,64位叫IIP CPU通过IP从内存中

作业3:构造一个简单的Linux系统MenuOS 20135115臧文君

构造一个简单的Linux系统MenuOS 注:作者:臧文君,原创作品转载请注明出处,<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内核源代码介绍 1.根目录 arch/x86目录下的代码是我们重点关注的,arch中包括支持不同CPU的源代码. init目录下包含内核启动相关的代码,如main.c(start_kernel函数相当于普通C程序的main函数,是Linux内核初始化的起点). ipc