Linux第一二章笔记

第一章 Linux内核简介

1. Unix内核的特点

  • 简洁:仅提供系统调用并有一个非常明确的设计目的
  • 抽象:几乎所有东西都被当做文件
  • 可移植性:使用C语言编写,使得其在各种硬件体系架构面前都具备令人惊异的移植能力
  • 进程:创建迅速,一次执行保质保量地完成一个任务;独特的fork系统调用
  • 清晰的层次化结构:策略和机制分离的理念,简单的进程间通信元语把单一目的的程序方便地组合在一起

2. 关于Linux内核简介

  • Linux是基于Unix的类Unix系统,设计思想相似,比如它也实现了Unix的API。但是Linux没有直接使用Unix的源代码,但它没有抛弃Unix的设计目标并且保证了应用程序编程接口的一致。
  • Linux内核是自由公开软件。
  • Linux系统的基础是内核、C库、工具集和系统的基本工具。

3. 操作系统和内核简介

  • 操作系统是整个系统中负责完成最基本功能和系统管理的部分。包括内核、设备驱动程序、启动引导程序、命令行Shell或者其他种类的用户界面、基本的文件管理工具和系统工具。
  • 内核是操作系统的核心。通常一个内核由负责响应中断的中断服务程序、负责管理多个进程从而分享处理器时间的调度程序、负责管理进程地址空间的内存管理程序和网络、进程之间通信等系统服务程序共同组成。
  • 系统态:拥有受保护的内存空间和访问硬件设备的所有权限。(内核空间即这种系统态和被保护起来的内存空间)
  • 用户态:执行普通用户程序时,系统以用户态进入用户空间执行。(应用程序在用户空间执行,只能看到允许它们使用的部分系统资源,并只使用某些特定的系统功能,不能直接访问系统硬件,也不能访问其他的内核划给别人的内存范围)
  • 系统中运行的应用程序通过系统调用来与内核通信。(应用程序通过系统调用界面陷入内核,是应用程序完成工作的基本行为方式)
  • 中断机制:一个异步的中断信号打断处理器的执行,继而打断内核的执行。中断通常对应一个中断号,内核通过中断号查找相应的中断服务程序,并调用这个程序响应和处理中断。
  • 每个处理器在任何指定时间点上的活动必然是以下三者之一:
    • 运行于用户空间,执行用户进程
    • 运行于内核空间,处于进程上下文,代表某个特定的进程执行
    • 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断

4. Linux内核和传统Unix内核的比较

  • 单内核

    • 整个内核都在一个大内核地址空间上运行。
    • 优点:简单、高效。所有内核都在一个大的地址空间上,所以内核各个功能之间的调用和调用函数类似,几乎没有性能开销。
    • 缺点:一个功能的崩溃会导致整个内核无法使用。
    • 微内核 
      • 内核按功能被划分成各个独立的过程。每个过程独立的运行在自己的地址空间上。
      • 优点:安全。内核的各种服务独立运行,一种服务挂了不会影响其他服务。
      • 缺点:内核各个服务之间的调用涉及进程间的通信,比较复杂且效率低。
      • Linux内核设计
        • ·  基于单内核
        • 具备微内核的一些特征:模块化设计、抢占式内核、支持内核线程、动态装载内核模块。
        • 规避微内核设计上的性能缺陷:让所有事情运行在内核态,直接调用函数,无需消息传递。
        • Linux内核特征
        • - 支持动态加载内核模块

- 支持对称多处理(SMP)

- 内核可以抢占(preemptive),允许内核运行的任务有优先执行的能力

- 不区分线程和进程

5. Linux内核版本

Linux内核有两种:稳定的(具有工业级的强度,可以广泛应用和部署)、处于开发中的。

Linux命名机制(可用于区分稳定的和处于开发中的内核):

如果版本号是偶数,则内核是稳定版;如果是奇数,内核就是开发版。

第二章 从内核出发

一、获取内核源码

1. Git

git实际上是一种开源的分布式版本控制工具。 Linux作为一个开源的内核,其源代码也可以用git下载和管理

- 获取最新提交到版本树的一个副本

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

- 下载代码后,更新自己的分支到最新分支

- $ git pull

2.安装内核源代码

压缩形式为bzip2:$ tar xvjf linux-x.y.z.tar.bz2

压缩形式为zip:$ tar xvzf linux-x.y.z.tar.gz

关于参数:

-x 解开.tar格式的文件

-v 显示详细信息

-j 使用bzip2程序

-z 使用gzip程序

-f 使用归档文件

3. 使用补丁

从内部源码树开始,运行$ patch -p1 < ../patch-x,y,z

二、内核源码结构

三、编译内核

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

四、内核开发特点

1. 无libc库/标准头文件

原因:(速度与大小)保证内核高效和简练。

内核源代码文件不能包含外部头文件。

基本头文件:内核源代码顶级目录下的include中

体系结构相关头文件:内核源代码树的arch/<architecture>/include/asm目录下

printk()函数:把格式化好的字符串拷贝到内核日志缓冲区上,syslog程序可以通过读取该缓冲区来获取内核信息。

2. 必须使用GNU C

什么是GNU?GNU是一种操作系统,GNU提供的C编译器就是我们之前使用的gcc。

(1)内联函数

static inline void wolf(unsigned long tail_size);

- static:关键字

- inline:用于限定关键字

内联函数:编译时在它被调用的地方展开。

优点:减少了函数调用的开销,性能较好。

缺点:频繁的使用内联函数也会使代码变长,从而在运行时占用更多的内存。

定义内联函数特点:时间要求高,本身长度较短的函数。

使用之前就要定义好内联函数,一般在头文件中定义。

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

(2)内联汇编

unsigned int low, high;

asm volatile("rdtsc" : "=a" (low), "=d" (high));

/* low 和 high 分别包含64位时间戳的低32位和高32位 */

- asm:嵌入汇编代码

- volatile:不优化

汇编语言用于偏近底层或对执行时间严格要求的地方。

(3)分支声明

/* 如果error在绝大多数情况下为0(假) */

if (unlikely(error)) {

/* ... */

}

/* 如果success在绝大多数情况下不为0(真) */

if (likely(success)) {

/* ... */

}

对于条件选择语句,在一个条件经常/很少出现时,编译器可通过gcc内建的一条指令对条件分支选择进行优化。

内核把这条指令封装成了宏。

3. 没有内存保护机制

内核自己非法访问内存的风险

内核中的内存都不分页:每用掉一个字节,物理内存都减少一个

4. 难以执行浮点运算

使用浮点数时,需要人工保存和恢复浮点寄存器及其他一些繁琐的操作。

不建议使用

5. 每个进程只有一个很小的定长堆栈

内核栈的大小是编译内核时决定的,对于不用的体系结构,内核栈的大小不一样,但都是固定的。(不像用户空间的栈可以动态增长)

6. 必须时刻注意同步和并发

原因:

Linux是抢占多任务操作系统

内核支持对称多处理器系统(SMP)

中断异步到来

内核可以抢占

常用解决方法:自旋锁和信号量

7. 考虑可移植性的重要性

需要保持的特点:大部分C语言代码与体系结构无关。

时间: 2024-08-28 10:51:46

Linux第一二章笔记的相关文章

《Linux内核设计与实现》第一二章笔记

第一章 linux内核简介 每个处理器在任何时间点上的活动必然概括为下列三者: 运行于用户空间,执行用户进程 运行于内核空间,处于进程上下文,代表某个特定的进程执行 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断 Linux内核与传统的Unix系统之间的差异: linux内核可以抢占 linux内核并不区分线程和其他一般进程 linux提供具有设备类的面向对象的设备模型.热插拔事件,以及用户空间的设备文件系统 linx忽略了一些被认为设计得很拙劣的unix特性,及难以实现的过

Linux第一周学习笔记(2)

Linux第一周学习笔记(2) 1.3认识Linux (1).什么是Linux Linux是一个操作系统,比如说微软的winodws.苹果电脑的masOS.早于Linux发行的unix: 我们平时使用的PPT.浏览网站.玩游戏这些都是需要操作系统的层面上来完成的: 也包括了我们现在手机使用的系统有三个版本一个是Andriod和苹果的Los以及微软的windows,Los其实也就是Unix系统而Andriod是Linux系统: 我们生活当中常用的一些网站.游戏.QQ.微信这些应用都是在Linux操

linux内核设计与实现一书阅读整理 之第一二章整合

第一章:Linux内核简介 一.Unix和linux Unix是一个强大.健壮和稳定的操作系统. 1.Unix内核特点 十分简洁:仅提供几百个系统调用并且有明确的目的: 在Unix中,大部分东西都被(或者正致力于)被当做文件对待: Unix内核即相关系统工具软件都是用C语言编写的,这使得系统有着强大的可移植性: Unix进程创建非常迅速,目标在于一次执行保质保量地完成一个任务 2.Linux与Unix异同 Linux是基于Unix的类系统,比如它也实现了Unix的API: 但它不同于Unix,没

Linux第一周学习笔记(7)

1.9使用putty远程连接Linux (1).使用putty远程连接Linux的准备工作: 1.准备putty远程连接软件 下载站地址: 官网:http://www.putty.org/ 阿铭老师各类软件包下载地址:http://r.amninglinux.com 2.安装putty软件 第一步:双击运行putty-0.70-installer.msi文件 第二步:进入putty安装流程 安装putty点击下一步 选择安装路径(默认) 默认设置,点击下一步 安装完成 (2).配置putty密码

Linux第一周学习笔记(9)

1.13单用户模式 (1)案列分析: 在实际运维工作或者是学习当中,会遇到很多的问题.其中就会遇到忘记root用户的密码,因为在实际的工作当中从做系统是不现实的.我们可以进入单用户模式进行密码的更改.在CentOS 7当中已经没有单用户模式,而是进入emergency模式下进行更改密码 更改密码在CentOS系统里面有两种模式可更改:1.单用户模式:2.救援模式 系统从启命令:1.reboot :2.init 6 :3.shutdown -r now 系统关机命令:init 0 poweroff

Linux第一周学习笔记(10)

1.15克隆虚拟机 (1)因为以后做实验需要两台机器互联,由于在虚拟机里面做系统较慢所以使用克隆的方式就比较简便,也就是说把原来做好的系统原封不动的进行一个拷贝. (2)克隆虚拟机 第一步:克隆之前先把虚拟机关闭 第二步:开始克隆虚拟机 点击daizhihong-Linux选项卡后选择管理然后点击克隆 进入克隆向导,点击下一步 克隆源,选择虚拟机中的当前状态,然后点击下一步 克隆类型选择"创建链接克隆"(这种方式比较节约磁盘空间) 输入新的虚拟机名称及其存储路径 克隆虚拟机成功 创建成

Linux第一周学习笔记(12)

2.3:ls命令 ls –l命令:列出文件详细信息 ls –i命令:  查看inode号 ls –lh命令:查看文件大小 ls –la命令:查看所有文件以及隐藏的文件 ls –lt命令:按时间的顺序排序 ls –ld命令:只列目录本身(d不加把目录下面的文件及目录列出来) which ll命令:查看别名 ll是ls –l的一个别名 2.4:文件类型 使用ls -l命令查看文件后,在左侧的第一列第一位表示设备类型 d:表示目录 -:表示普通文件(包含文本文档及带色标记的二进制文档) c: 表示字符

Linux第一周学习笔记(14)

2.6,相对和绝对路径 (1).路径:就是某一个文件存放的地方,只要键入这个文件的路径系统就只能直接找到这文件所在位置,所以找一个文件需要输入这个文件的路径. (2).绝对路径:从根开始的路径全部都是绝对路径(也就是说,绝对路径就是从根目录开始,然后一个紧接着又一个的文件分支,直到到达目标目录或者文件.什么叫做根目录:简而言之也就是文件系统的第一个目录就叫做根目录,根目录包含了文件和子目录.子目录里包含了更多的文件和子目录). 例如我们要找到网卡的配置文件"ifcfg-ens33"如下

Linux第一周学习笔记(18)

2.11.CP命令 cp(copy简写)命令:用来将一个或多个源文件或者目录复制到指定的目的文件或目录. cp –r:复制目录 -i:安全选项 ------------------------------------------------------------------------------------------- cp命令:拷贝/etc/passwd/文件到/tmp/目录下从命名成01.txt [[email protected] ~]# cp /etc/passwd /tmp/01