奔跑吧 Linux内核

合集下载

linux内核升级图文攻略

linux内核升级图文攻略

linux内核升级图文攻略一、Linux内核概览Linux是一个一体化内核(monolithic kernel)系统。

设备驱动程序可以完全访问硬件。

Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系统运行期间可直接装载或卸载。

1. linux内核linux 操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。

一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。

计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。

但是没有软件来操作和控制它,自身是不能工作的。

完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。

Linux内核的主要模块(或组件)分以下几个部分:. 进程管理(process management) . 定时器(timer). 中断管理(interrupt management). 内存管理(memory management). 模块管理(module management). 虚拟文件系统接口(VFS layer). 文件系统(file system). 设备驱动程序(device driver). 进程间通信(inter-process communication). 网络管理(network management. 系统启动(system init)等操作系统功能的实现。

2. linux内核版本号Linux内核使用三种不同的版本编号方式。

. 第一种方式用于1.0版本之前(包括1.0)。

第一个版本是0.01,紧接着是0.02、0.03、0.10、0.11、0.12、0.95、0.96、0.97、0.98、0.99和之后的1.0。

. 第二种方式用于1.0之后到2.6,数字由三部分“A.B.C”,A代表主版本号,B代表次主版本号,C代表较小的末版本号。

Linux kernel内核升级全过程,教你一次成功

Linux kernel内核升级全过程,教你一次成功

序言由于开发环境需要在linux-2.6内核上进行,于是准备对我的虚拟机上的Linux系统升级。

没想到这一弄就花了两天时间(反复装系统,辛苦啊~~),总算把Linux系统从2.4.20-8内核成功升级到了2.6.18内核。

网上虽然有很多介绍Linux内核升级的文章,不过要么过时,下载链接失效;要么表达不清,不知所云;更可气的是很多文章在转载过程中命令行都有错误。

刚开始我就是在这些“攻略”的指点下来升级的,以致于浪费了很多时间。

现在,费尽周折,升级成功,心情很爽,趁性也来写个“升级攻略”吧!于是特意又在虚拟机上重新安装一个Linux系统,再来一次完美的升级,边升级边记录这些步骤,写成一篇Linux内核升级记实录(可不是回忆录啊!),和大家一起分享~~!一、准备工作首先说明,下面带#号的行都是要输入的命令行,且本文提到的所有命令行都在终端里输入。

启动Linux系统,并用根用户登录,进入终端模式下。

1、查看Linux内核版本# uname -a如果屏幕显示的是2.6.x,说明你的已经是2.6的内核,也用不着看下文了,该干什么干什么去吧!~~~如果显示的是2.4.x,那恭喜你,闯关通过,赶快进行下一步。

2、下载2.6内核源码下载地址:/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz23、下载内核升级工具(1)下载module-init-tools-3.2.tar.bz2/pub/linux/utils/kernel/module-init-tools/module-init-tools-3.2.tar.bz2(2)下载mkinitrd-4.1.18-2.i386.rpm/fedora/linux/3/i386/RPMS.core/mkinitrd-4.1.18-2.i386.rpm(3)下载lvm2-2.00.25-1.01.i386.rpm/fedora/linux/3/i386/RPMS.core/lvm2-2.00.25-1.01.i386.rpm(4)下载device-mapper-1.00.19-2.i386.rpm/fedora/linux/3/i386/RPMS.core/device-mapper-1.00.19-2.i386.rpm(2.6.18内核和这4个升级工具我都有备份,如果以上下载地址失效,请到/guestbook留下你的邮箱,我给你发过去)好啦,2.6内核和4个升级工具都下载完了(少一个也不行,如果没有下载齐全,请不要尝试下面的步骤,升级是不会成功的),下面回到Linux系统中开始配置工作吧。

Linux kernel内核升级全过程,教你一次成功

Linux kernel内核升级全过程,教你一次成功

序言由于开发环境需要在linux-2.6内核上进行,于是准备对我的虚拟机上的Linux系统升级。

没想到这一弄就花了两天时间(反复装系统,辛苦啊~~),总算把Linux系统从2.4.20-8内核成功升级到了2.6.18内核。

网上虽然有很多介绍Linux内核升级的文章,不过要么过时,下载链接失效;要么表达不清,不知所云;更可气的是很多文章在转载过程中命令行都有错误。

刚开始我就是在这些“攻略”的指点下来升级的,以致于浪费了很多时间。

现在,费尽周折,升级成功,心情很爽,趁性也来写个“升级攻略”吧!于是特意又在虚拟机上重新安装一个Linux系统,再来一次完美的升级,边升级边记录这些步骤,写成一篇Linux内核升级记实录(可不是回忆录啊!),和大家一起分享~~!一、准备工作首先说明,下面带#号的行都是要输入的命令行,且本文提到的所有命令行都在终端里输入。

启动Linux系统,并用根用户登录,进入终端模式下。

1、查看Linux内核版本# uname -a如果屏幕显示的是2.6.x,说明你的已经是2.6的内核,也用不着看下文了,该干什么干什么去吧!~~~如果显示的是2.4.x,那恭喜你,闯关通过,赶快进行下一步。

2、下载2.6内核源码下载地址:/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz23、下载内核升级工具(1)下载module-init-tools-3.2.tar.bz2/pub/linux/utils/kernel/module-init-tools/module-init-tools-3.2.tar.bz2(2)下载mkinitrd-4.1.18-2.i386.rpm/fedora/linux/3/i386/RPMS.core/mkinitrd-4.1.18-2.i386.rpm(3)下载lvm2-2.00.25-1.01.i386.rpm/fedora/linux/3/i386/RPMS.core/lvm2-2.00.25-1.01.i386.rpm(4)下载device-mapper-1.00.19-2.i386.rpm/fedora/linux/3/i386/RPMS.core/device-mapper-1.00.19-2.i386.rpm(2.6.18内核和这4个升级工具我都有备份,如果以上下载地址失效,请到/guestbook留下你的邮箱,我给你发过去)好啦,2.6内核和4个升级工具都下载完了(少一个也不行,如果没有下载齐全,请不要尝试下面的步骤,升级是不会成功的),下面回到Linux系统中开始配置工作吧。

一文详解Linux内核的栈回溯与妙用

一文详解Linux内核的栈回溯与妙用

一文详解Linux内核的栈回溯与妙用1 前言说起linux内核的栈回溯功能,我想这对每个Linux内核或驱动开发人员来说,太常见了。

如下演示的是linux内核崩溃的一个栈回溯打印,有了这个崩溃打印我们能很快定位到在内核哪个函数崩溃,大概在函数什么位置,大大简化了问题排查过程。

网上或多或少都能找到栈回溯的一些文章,但是讲的都并不完整,没有将内核栈回溯的功能用于实际的内核、应用程序调试,这是本篇文章的核心:尽可能引导读者将栈回溯的功能用于实际项目调试,栈回溯的功能很强大。

本文详细讲解了基于mips、arm架构linux内核栈回溯原理,通过不少例子,尽可能全面给读者展示各种栈回溯的原理,期望读者理解透彻栈回溯。

在这个基础上,讲解笔者近几年项目开发过程中使用linux内核栈回溯功能的几处重点应用。

1 当内核某处陷入死循环,有时运行sysrq的内核线程栈回溯功能可以排查,但并不适用所用情况,笔者实际项目遇到过。

最后是在系统定时钟中断函数,对死循环线程栈回溯20多级终于找到死循环的函数。

2 当应用程序段错误,内核捕捉到崩溃,对崩溃的应用空间进程/线程栈回溯,像内核栈回溯一样,打印应用段错误进程/线程的层层函数调用关系。

虽然运用core文件分析或者gdb也很简便排查应用崩溃问题,但是对于不容易复现、测试部偶先的、客户现场偶先的,这二者就很难发挥作用。

还有就是如果崩溃发生在C库中,CPU的pc和lr(arm架构)寄存器指向的函数指令在C库的用户空间,很难找到应用的代码哪里调用了C库的函数。

arm架构网上能找到应用层栈回溯的例子,但是编译较麻烦,代码并不容易理解,况且mips能在应用层实现吗?还是在内核实现应用程序栈回溯比较方便。

3 应用程序发生double free,运用内核的栈回溯功能,找到应用代码哪里发生了double free。

double free是C库层发现并截获该事件,然后向当前进程/线程发送SIGABRT进程终止信号,后续就是内核强制清理该进程/线程。

Linux内核漏洞调试环境搭建

Linux内核漏洞调试环境搭建

Linux内核漏洞调试环境搭建一.前言之前没怎么用过Linux,但是那天看到exploit-db上有不少Linux内核漏洞的POC。

当时想如果可以请自动手调试一下这些漏洞,肯定会学到一些Linux下特定漏洞的利用技巧。

(比如怎么利用空指针引用漏洞来进行本地提权)。

所以就GOOGLE了很多关于Linux内核调试的文章,虽然一步一步老老实实照前人的指点的做,但是还是问题连着问题。

反反复复的尝试,才历尽千心万苦搭建起了这个内核漏洞调试环境。

在此过程中得到了广大网友的帮助,特别是wzt85和塞(他的ID为塞)这两位前辈的指点。

既然取之于“网”,那我觉得应该把这个过程用文字描述出来放到网络上,与同道中人分享。

本文的第二部分将简单介绍目前Linux下内核调试的几种常用调试技术路线,由于我对Linux的了解确实不多,所以这一部分写的肯定会很不专业,但目的在于抛砖引玉——更专业的文章烦请自行GOOGLE。

本文的第三部分会详细介绍该调试环境的搭建过程,关键点会有截图说明。

本文的第四部分是一点补充性的文字。

二.Linux下内核调试技术路线1.QEMU+GDBQEMU是一款开源的虚拟机软件,它自身带有gdb stub可用于和Host 主机上的GDB通信来对Guest主机的Linux内核进行源码(C代码)级调试。

为实现源码级调试,那必须要有调试信息以及符号表,所以首先从上下载一份Linux内核源代码进行编译。

编译成功后会得到bzImage文件和vmlinux文件。

其中vmlinux就是要供Host主机上的GDB进行调试的带有调试信息,符号表的内核文件。

使用这种方法试验环境的搭建比较简单,而且最吸引人的地方在于它能够实现源码级的调试。

但是遗憾的是,这种方法调试不了漏洞。

因为当Guest主机上的内核发生内存访问异常的时候,Host主机中的GDB根本得不到异常事件,这样一来也就无法获知是那条指令引发的异常,以及被访问的内存地址是什么。

Linux内核架构和工作原理详解

Linux内核架构和工作原理详解

Linux内核架构和工作原理详解作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。

目前支持模块的动态装卸(裁剪)。

Linux内核就是基于这个策略实现的。

Linux 进程采用层次结构,每个进程都依赖于一个父进程。

内核启动init程序作为第一个进程。

该进程负责进一步的系统初始化操作。

init进程是进程树的根,所有的进程都直接或者间接起源于该进程。

virt/ ---- 提供虚拟机技术的支持。

Linux内核预备工作理解Linux内核最好预备的知识点:懂C语言懂一点操作系统的知识熟悉少量相关算法懂计算机体系结构Linux内核的特点:结合了unix操作系统的一些基础概念Linux内核的任务:1.从技术层面讲,内核是硬件与软件之间的一个中间层。

作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。

2.从应用程序的层面讲,应用程序与硬件没有联系,只与内核有联系,内核是应用程序知道的层次中的最底层。

在实际工作中内核抽象了相关细节。

3.内核是一个资源管理程序。

负责将可用的共享资源(CPU时间、磁盘空间、网络连接等)分配得到各个系统进程。

4.内核就像一个库,提供了一组面向系统的命令。

系统调用对于应用程序来说,就像调用普通函数一样。

内核实现策略:1.微内核。

最基本的功能由中央内核(微内核)实现。

所有其他的功能都委托给一些独立进程,这些进程通过明确定义的通信接口与中心内核通信。

2.宏内核。

内核的所有代码,包括子系统(如内存管理、文件管理、设备驱动程序)都打包到一个文件中。

内核中的每一个函数都可以访问到内核中所有其他部分。

目前支持模块的动态装卸(裁剪)。

Linux内核就是基于这个策略实现的。

哪些地方用到了内核机制?1.进程(在cpu的虚拟内存中分配地址空间,各个进程的地址空间完全独立;同时执行的进程数最多不超过cpu数目)之间进行通信,需要使用特定的内核机制。

Linux内核分析 SMP启动

Linux内核分析 SMP启动

SMP简介
与单处理器结构相比,SMP结构的实现 的特殊问题 处理器间的同步与互斥 高速缓存与内存之间内容的一致性问题 对中断的处理
SMP的启动
SMP的启动 概述 SMP启动的过程 (1) 启动流程 (2) 相关函数介绍
SMP的启动
概述 SMP结构中的CPU都是平等的,没有主次 之分,这是基于系统中有多个进程的前提 下 在同一时间,一个进程只能由一个CPU执 行 系统启动对于SMP结构来说是一个特例, 因为在这个阶段里系统中只有一个CPU
Thanks ~
SMP的启动
相关函数介绍 smp_init( )>smp_boot_cpus( ) 我们回到smp_boot_cpus( )继续往下讲。 完成所有do_boot_cpu( )后,首先显示整 个系统的运算能力,然后对外部APIC进行 初始化,最后通过zap_low_mappings( )清 除页面映射目录中的低区。
CPU 内存 CPU CPU
SMP简介
并行计算机分类 根据指令流和数据流的不同,通常把计算机系统分为: 单指令流单数据流(SISD) 单指令流多数据流(SIMD) 多指令流单数据流(MISD) 多指令流多数据流(MIMD) 并行计算机系统绝大部分为MIMD系统(5类),包括 并行向量机(PVP,Parallel Vector Processor); 对称多处理机(SMP , Symmetric Multi Processor); 大规模并行处理机(MPP,Massively Parallel Processor); 机群(Cluster); 分布式共享存储多处理机(DSM,Distributed Shared Memory)
SMP的启动
CPU有APIC对SMP结构来说是必要条件, 所以还要对BP进行是否有APIC的检查以及 其初始化。setup_local_APIC( )等。 开始逐个启动各个AP。 phys_cpu_present_map是个全局的CPU 位图,根据此位图用一个循环依次对各个 AP调用do_boot_cpu( )。

2.7.2插入VMA_奔跑吧 Linux内核_[共5页]

2.7.2插入VMA_奔跑吧 Linux内核_[共5页]

第2章 内存管理 124 } } return vma; }2.7.2 插入VMAinsert_vm_struct()是内核提供的插入VMA 的核心API 函数。

0 int insert _vm _struct(struct mm _struct *mm, struct vm _area _struct *vma) 1 { 2 struct vm _area _struct *prev; 3 struct rb _node **rb _link , *rb _parent; 4 5 if (!vma->vm _file) { 6 BUG _ON(vma->anon _vma); 7 vma->vm _pgoff = vma->vm _start >> PAGE _SHIFT; 8 } 9 if (find _vma _links (mm, vma->vm _start, vma->vm _end, 10 &prev, &rb _link, &rb _parent)) 11 return -ENOMEM; 12 if ((vma->vm _flags & VM _ACCOUNT) && 13 security _vm _enough _memory _mm(mm, vma _pages(vma))) 14 return -ENOMEM; 15 16 vma _link (mm, vma, prev, rb _link, rb _parent); 17 return 0; 18}insert_vm_struct()函数向VMA 链表和红黑树插入一个新的VMA 。

参数mm 是进程的内存描述符,vma 是要插入的线性区VMA 。

第5~8行代码,如果vma 不是文件映射,设置vm_pgoff 成员。

第9行代码,find_vma_links()查找要插入的位置。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档