当前位置:文档之家› 深入linux内核3.5节

深入linux内核3.5节

深入linux内核3.5节
深入linux内核3.5节

物理内存的管理

3.5.1 伙伴系统的结构

系统中每个物理内存页都对应于一个struct page实例,每个内存域都关联一个struct zone的实例。

order:描述了内存分配的数量单位。order范围0~MAX_ORDER

●第0个链表包含的内存区为单页,第1为2的一次方..........

●内存区中第1页内的链表元素,可用于将内存区维持在链表中,

所以不必引入新的数据结构来管理,否则这些页不可能在同一内存区。

●主要优点之一:管理工作较少。

●备用列表:连接所有内存域和节点。

●内存分配原则:在首选的内存域或节点无法满足内存分配请求时,

首先尝试同一节点的另一个内存域,接下来再尝试另一个节点,直至满足要求。

3.5.2 避免碎片

1、依据可移动性组织页

上图表示所有的空闲内存和非空闲内存都是连续的,而下面的图不是

连续的,空闲内存最大只有一个页。

●内核的方法是反碎片。

不可移动页:在内存中有固定位置,不能移动到其他地方。

可回收页:不能直接移动,但可以删除,其内容可以从某些源重新生成。

可移动页:可以随意移动。

●内核使用反碎片技术,基于将具有相同可移动性的页分组的思●如图所示:

●数据结构:内核定义的迁移类型

●初始化基于可移动性的分组

在内存子系统初始化期间,memmap_init_zone负责处理内存域的page实例,所有页最初都标记为可移动的!

分配内存时,如果必须“盗取”不同于预定迁移类型的内存区,内核在策略上倾向于“盗取”更大的内存区。

2、虚拟可移动内存域

●虚拟内存域ZONE_MOV ABLE,必须由管理员显式激活。

●基本思想:可用的物理内存分为两个内存域,一个用于可移动分

配,一个用于不可移动分配。

●数据结构:

Kernelcore指定用于不可移动分配的内存数量;

Movablecore控制用于可移动内存分配的内存数量。

●物理内存域提取的用于ZONE_MOV ABLE的内存数量必须考虑

下面两种情况:

①用于不可移动分配的内存会平均地分布到所有内存结点。

②只使用来自最高内存域的内存。在内存较多的32位系统上,通常为ZONE_HIGHMEM,但在64位系统上,将使ZONE_NORMAL 或ZONE_DMA32。

3.5.3 初始化内存域和结点数据结构

体系结构相关代码需要在启动期间建立以下信息:

1.系统中各个内存域的页帧边界,保存在max_zone_pfn中

2.个结点页帧的分配情况,保存在全局变量early_node_map中。

从内核版本2.6.10开始提供一个通用的框架,用于将上述信息转换为伙伴系统预期的结点和内存域数据结构。在这以前,各个体系结构必须自行建立相关结构。现在,体系结构相关代码只需要建立前述的简单结构,将繁重的工作留给free_area_init_nodes即可。图给出了该过程概述和free_area_init_nodes的代码

3.5.4 分配器API

●alloc_pages(mask,order)分配2order 页并返回一个struct page的实

例,表示分配的内存块的起始页

●get_zeroed_page(mask)分配一页并返还一个page实例,页对应的

内存填充0。

●_get_free_pages(mask,order)和_get_free_page(mask)的工作方式与

上述函数相同,但返回分配内存块的虚拟地址,而不是page实例。

●get_dma_pages(gfp_mask,order)用来获得适用于DMA的页。

注意:分配失败的情况下,上述函数返回空指针或者0。

1、分配掩码

只要设置了_GPF_DMA就从_GPF_DMA内存域扫描。

内核定义的下列标志意义很明确:

2、内存分配宏

上述的函数主要是通过宏定义联系起来的,具体参考书本。

3.5.5 分配页

alloc_pages_node只执行一个简单检查,避免分配过大的内存块。主要工作委托给_alloc_pages,它是“伙伴系统的心脏”。

1、选择页

前几个标志判断页是否可分配时要考虑那些水印。通过相应的标识,内存分配过程中的努力程度也有所不同。主要包括:内存足够时实现分配比较简单;内存不足就会唤醒守护程序kswapd,通过缩减内存缓存和页面回收获得等等;如果再次失败内核也会采取相应措施,比如采取OOM killer机制。

2、移除选择的页

如果内核找到适当的内存域,并具有足够的空闲页可供支配,首先必须检查这些页是否是连续的,其次,必须按伙伴系统的方式从free_lists移除这些页,可能需要分解并重排内存区。

如果只分配一页,内核会进行优化,该页并不是从伙伴系统直接取得,而是取自per_cpu的页缓存。

如果需要分配的内存块长度小于所选择的连续页范围,那么该内存块必须按照伙伴系统的原理分裂成小的块,通过expand函数。

●分配内存的最后手段:如果遍历了所有分配阶和所有迁移类型,

仍然无法满足分配请求,内核可以尝试从MIGRATE_RESERVE 列表满足分配请求。

3.5.6 释放页(__free_pages)

●可以看到,落脚点是__free_pages()这个函数,它执行的工作的流

程图如下图所示

●可以通过一个简单的情形来模拟一下这个过程,假设现在有一个

将要释放的页,它的order为0,page_idx为10。

则先计算它的伙伴10^(1<<0) = 11,然后计算合并后的起始页偏移为10&~(1<<0) = 10,现在就得到了一个order为1的块,起始页偏移为10,它的伙伴为10^(1<<1)=8,合并后的起始页偏移为10&~(1<<1)=8,

如此推导下去,我们可以通过下图和下表更清晰地分析这个过程

3.5.7 内核中不连续页的分配

3.5.8 内核映射

内核提供了其它函数用于将ZONE_HIGHMEM页帧显式映射到内核空间,这些函数与vmalloc机制无关。

1.持久内核映射

图中vitual address space里面的每一个格子的空间大小为4kB,及一个页的大小,该空间及虚拟空间。pkmap_count所指代的数组的每个单位大小是4B,及int类型,该数组主要是为了对vitual address space 中的虚拟地址被映射多少次的计数。

2.临时内核映射原理

上文描述的持久映射因为不能用于中断处理程序,所以系统还需要一种原子执行的函数来完成任务,逻辑上称为kmap_atomic,他的主要优点是执行速度快,但是不能用于进入睡眠的代码。

但在描述临时映射之前,阐明固定映射是必要的,毕竟它是基于固定映射的。固定映射在3.4节中有所提及。

在内核虚拟内存的划分中,最后一段FIXMAPS即为固定映射所处的虚拟地址段。

虚拟地址的计算过程:

idx= type + KM_TYPE * smp_processor_id();

vaddr= __fix_to_virt(FIX_KMAP_BEGIN + idx);

FIX_KMAP_BEGIN来自固定映射的枚举类型

从上面的计算公式我们知道每一个临时内核映射对于不同的cpu是分开的。如下图:

关于Linux 内核中五个主要子系统的介绍

关于Linux 内核中五个主要子系统的介绍 发布时间:2008.01.02 06:23来源:赛迪网作者:sixth 1.进程调度(SCHED):控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。 2.内存管理(MM)允许多个进程安全的共享主内存区域。Linux的内存管理支持虚拟内存,即在计算机中运行的程序,其代码,数据,堆栈的总量可以超过实际内存的大小,操作系统只是把当前使用的程序块保留在内存中,其余的程序块则保留在磁盘中。必要时,操作系统负责在磁盘和内存间交换程序块。内存管理从逻辑上分为硬件无关部分和硬件有关部分。硬件无关部分提供了进程的映射和逻辑内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。 3.虚拟文件系统(VirtualFileSystem,VFS)隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。 4.网络接口(NET)提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。 5.进程间通讯(IPC) 支持进程间各种通信机制。处于中心位置的进程调度,所有其它的子系统都依赖它,因为每个子系统都需要挂起或恢复进程。一般情况下,当一个进程等待硬件操作完成时,它被挂起;当操作真正完成时,进程被恢复执行。例如,当一个进程通过网络发送一条消息时,网络接口需要挂起发送进程,直到硬件成功地完成消息的发送,当消息被成功的发送出去以后,网络接口给进程返回一个代码,表示操作的成功或失败。其他子系统以相似的理由依赖于进程调度。

如何安装Linux内核源代码

如何获取Linux内核源代码 下载Linux内核当然要去官方网站了,网站提供了两种文件下载,一种是完整的Linux 内核,另一种是内核增量补丁,它们都是tar归档压缩包。除非你有特别的原因需要使用旧版本的Linux内核,否则你应该总是升级到最新版本。 使用Git 由Linus领头的内核开发队伍从几年前就开始使用Git版本控制系统管理Linux内核了(参考阅读:什么是Git?),而Git项目本身也是由Linus创建的,它和传统的CVS不一样,Git是分布式的,因此它的用法和工作流程很多开发人员可能会感到很陌生,但我强烈建议使用Git下载和管理Linux内核源代码。 你可以使用下面的Git命令获取Linus内核代码树的最新“推送”版本: $ git clone git://https://www.doczj.com/doc/b7936935.html,/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 然后使用下面的命令将你的代码树与Linus的代码树最新状态同步: $ git pull 安装内核源代码 内核包有GNU zip(gzip)和bzip2格式。Bzip2是默认和首选格式,因为它的压缩比通常比gzip更好,bzip2格式的Linux内核包一般采用linux-x.y.z.tar.bz2形式的文件名,这里的x.y.z是内核源代码的具体版本号,下载到源代码包后,解压和抽取就很简单了,如果你下载的是bzip2包,运行: $ tar xvjf linux-x.y.z.tar.bz2 如果你下载的是gzip包,则运行: $ tar xvzf linux-x.y.z.tar.gz 无论执行上面哪一个命令,最后都会将源代码解压和抽取到linux-x.y.z目录下,如果你使用Git下载和管理内核源代码,你不需要下载tar包,只需要运行git clone命令,它就会自动下载和解压。 内核源代码通常都会安装到/usr/src/linux下,但在开发的时候最好不要使用这个源代码树,因为针对你的C库编译的内核版本通常也链接到这里的。 应用补丁

史上最全linux内核配置详解

对于每一个配置选项,用户可以回答"y"、"m"或"n"。其中"y"表示将相应特性的支持或设备驱动程序编译进内核;"m"表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;"n"表示内核不提供相应特性或驱动程序的支持。只有<>才能选择M 1. General setup(通用选项) [*]Prompt for development and/or incomplete code/drivers,设置界面中显示还在开发或者还没有完成的代码与驱动,最好选上,许多设备都需要它才能配置。 [ ]Cross-compiler tool prefix,交叉编译工具前缀,如果你要使用交叉编译工具的话输入相关前缀。默认不使用。嵌入式linux更不需要。 [ ]Local version - append to kernel release,自定义版本,也就是uname -r可以看到的版本,可以自行修改,没多大意义。 [ ]Automatically append version information to the version string,自动生成版本信息。这个选项会自动探测你的内核并且生成相应的版本,使之不会和原先的重复。这需要Perl的支持。由于在编译的命令make-kpkg 中我们会加入- –append-to-version 选项来生成自定义版本,所以这里选N。 Kernel compression mode (LZMA),选择压缩方式。 [ ]Support for paging of anonymous memory (swap),交换分区支持,也就是虚拟内存支持,嵌入式不需要。 [*]System V IPC,为进程提供通信机制,这将使系统中各进程间有交换信息与保持同步的能力。有些程序只有在选Y的情况下才能运行,所以不用考虑,这里一定要选。 [*]POSIX Message Queues,这是POSIX的消息队列,它同样是一种IPC(进程间通讯)。建议你最好将它选上。 [*]BSD Process Accounting,允许进程访问内核,将账户信息写入文件中,主要包括进程的创建时间/创建者/内存占用等信息。可以选上,无所谓。 [*]BSD Process Accounting version 3 file format,选用的话统计信息将会以新的格式(V3)写入,注意这个格式和以前的v0/v1/v2 格式不兼容,选不选无所谓。 [ ]Export task/process statistics through netlink (EXPERIMENTAL),通过通用的网络输出工作/进程的相应数据,和BSD不同的是,这些数据在进程运行的时候就可以通过相关命令访问。和BSD类似,数据将在进程结束时送入用户空间。如果不清楚,选N(实验阶段功能,下同)。 [ ]Auditing support,审计功能,某些内核模块需要它(SELINUX),如果不知道,不用选。 [ ]RCU Subsystem,一个高性能的锁机制RCU 子系统,不懂不了解,按默认就行。 [ ]Kernel .config support,将.config配置信息保存在内核中,选上它及它的子项使得其它用户能从/proc/ config.gz中得到内核的配置,选上,重新配置内核时可以利用已有配置Enable access to .config through /proc/config.gz,上一项的子项,可以通过/proc/ config.gz访问.config配置,上一个选的话,建议选上。 (16)Kernel log buffer size (16 => 64KB, 17 => 128KB) ,内核日志缓存的大小,使用默认值即可。12 => 4 KB,13 => 8 KB,14 => 16 KB单处理器,15 => 32 KB多处理器,16 => 64 KB,17 => 128 KB。 [ ]Control Group support(有子项),使用默认即可,不清楚可以不选。 Example debug cgroup subsystem,cgroup子系统调试例子 Namespace cgroup subsystem,cgroup子系统命名空间 Device controller for cgroups,cgroups设备控制器

简析linux内核的内核执行流程图

简析linux核的执行流程 ----从bootsect.s到main.c(核版本0.11)Linux启动的第一阶段(从开机到main.c) 3个任务: A、启动BIOS,准备实模式下的中断向量表和中断服务程序。 B、从启动盘加载操作系统程序到存。 C、为执行32的main函数做过渡准备。 存变化如下: ①、0xFE000到0xFFFFF是BIOS启动块,其中上电后第一条指令在0xFFFF0。 ②、而后0x00000到0x003FF总共1KB存放中断向量表,而接下去的地址到0x004FF共256B存放BIOS数据,从0x0E05B 开始的约8KB的存中存放中断服务程序。 ③、利用BIOS中断0x19h把硬盘的第一扇区bootsect.s的代码加载到存中,即0x07c00处,后转到该处执行。 ④、将bootsect.s的代码复制到0x90000处。 ⑤、利用中断0x13h将setup.s程序加载到存0x90200处。 ⑥、再将剩余的约240个扇区的容加载到0x10000~0x2EFFF 处。 ⑦、开始转到setup.s处执行,第一件事就利用BIOS提供的中断服务程序从设备上获取核运行的所需系统数据并存在0x90000的地址处,这时将原来bootsect.s的代码覆盖得只剩2Byte的空间。

⑧、关中断并将系统代码复制到0x00000处,将原来放在这里的中断向量表与BIOS数据区覆盖掉,地址围是 0x00000~0x1EFFF。同时制作两表与两寄存器。 ⑨开地址线A20,寻址空间达到4GB,后对8259重新编程,改变中断号。 ⑩、转到head.s(大小是25K+184B)执行,执行该程序完后是这样的: 0x00000~0x04FFF:页目录与4个页表,每一项是4KB,共20KB;0x05000~0x05400:共1KB的空间是软盘缓冲区; 0x05401~0x054b8:共184B没用; 0x054b9~0x05cb8:共2KB的空间存中断描述符表; 0x05cb9~0x064b8:共2KB的空间存全局描述符表; 之后就是main函数的代码了! 第二阶段、从main.c函数到系统准备完毕阶段。 第一步:创建进程0,并让进程0具备在32位保护模式下载主机中的运算能力。流程是: 复制根设备和硬盘参数表(main.c中的102、110、111行) 物理存规划格局(main.c的112行~126行,其中有 rd_init函数定义在kernel/ramdisk.c中,此函数用于虚拟盘初始化;而mem_init函数是用于存管理结构初始化,定义在mem/memory.c中,该函数页面使用

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内核源码 下载地址:https://www.doczj.com/doc/b7936935.html,/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2 3、下载内核升级工具 (1)下载module-init-tools-3.2.tar.bz2 https://www.doczj.com/doc/b7936935.html,/pub/linux/utils/kernel/module-init-tools/module-init-tools-3.2.tar.bz2 (2)下载mkinitrd-4.1.18-2.i386.rpm https://www.doczj.com/doc/b7936935.html,/fedora/linux/3/i386/RPMS.core/mkinitrd-4.1.18-2.i386.rpm (3)下载lvm2-2.00.25-1.01.i386.rpm https://www.doczj.com/doc/b7936935.html,/fedora/linux/3/i386/RPMS.core/lvm2-2.00.25-1.01.i386.rpm (4)下载device-mapper-1.00.19-2.i386.rpm https://www.doczj.com/doc/b7936935.html,/fedora/linux/3/i386/RPMS.core/device-mapper-1.00.19-2.i386.rpm (2.6.18内核和这4个升级工具我都有备份,如果以上下载地址失效,请到https://www.doczj.com/doc/b7936935.html,/guestbook留下你的邮箱,我给你发过去)

Linux内核十个版本性能对比

【IT168 评论】从2008年1月底至今,Linux Kernel系统内核已经先后升级了十次,版本号也从2.6.24上升到2.6.33,并且下个版本2.6.34也已进入开发阶段。今天我们就看看过去两年内这十个版本在性能上有何差异。 测试平台是一套工作站系统,硬件配置包括AMD Opteron 2384 2.7GHz四核心处理器(“上海”)、泰安Thunder n3600B S2927主板(NVIDIA nForce 3600PRO 芯片组)、4GB DDR2 ECC Reg内存、希捷ST3300622AS 300GB硬盘、ATI FirePro V8700显卡,软件上采用Ubuntu 8.04.4 LTS 64位操作系统,组件有GNOME 2.22.3、https://www.doczj.com/doc/b7936935.html, Server 1.4.0.90、GCC 4.2.4、EXT3。 Linux Kernel 2.6.24-2.6.33的每个版本都从Ubuntu PPA源上获取,而且均为64位版本。除了替换内核之外,系统其他设置均保持默认。 Apache Benchmark(静态网页服务):2.6.33成绩大幅提升,但事实最早的2.6.24版反而才是好的,之后八个版本都差得很多,最新版终于基本正常了。

PostgreSQL pgbench(每秒钟TPC-B交易数):2.6.30的成绩比上个版本骤然提升了多达770%,但之后2.6.32迅速下滑,最新的2.6.33却又完全不如2.6.30之前的六个版本了。

7-Zip Compression(文件压缩速度):不同版本有所波动,最新的2.6.33成了赢家,这才是我们最希望看到的。 LZMA Compression(256MB文件压缩):十个版本几乎没什么区别。

Linux内核编码风格(编程代码风格推荐)

这是翻译版本,英文原版是linux源码Documentation文件夹下的CodingStyle 一个良好风格的程序看起来直观、美观,便于阅读,还能有助于对程序的理解,特别在代码量比较大情况下更显现编码素质的重要性。相反没有良好的风格的代码读起来难看、晦涩,甚至有时候一个括号没对齐就能造成对程序的曲解或者不理解。我曾经就遇见过这样的情况,花费了很多不必要的时间在程序的上下文对照上,还debug了半天没理解的程序。后来直接用indent -kr -i8给他转换格式来看了。特此转过来一个关于代码风格的帖子分享一下~ Linux内核编码风格 这是一份简短的,描述linux内核首选编码风格的文档。编码风格是很个人化的东西,而且我也不愿意把我的观点强加给任何人,不过这里所讲述的是我必须要维护的代码所遵守的风格,并且我也希望绝大多数其他代码也能遵守这个风格。所以请至少考虑一下本文所述的观点。 首先,我建议你打印一份GNU的编码规范,然后不要读它。烧掉它,这是一个很高调的具有象征意义的姿态。 Anyway, here goes: 第一章:缩进 制表符是8个字符,所以缩进也是8个字符。有些异端运动试图将缩进变为4(乃至2)个字符深,这跟尝试着将圆周率PI的值定义为3没什么两样。 理由:缩进的全部意义就在于清楚的定义一个控制块起止于何处。尤其是当你盯着你的屏幕连续看了20小时之后,你将会发现大一点的缩进将会使你更容易分辨缩进。 现在,有些人会抱怨8个字符的缩进会使代码向右边移动的太远,在80个字符的终端屏幕上就很难读这样的代码。这个问题的答案是,如果你需要3级以上的缩进,不管缩进深度如何你的代码已经有问题了,应该修正你的程序。 简而言之,8个字符的缩进可以让代码更容易阅读,还有一个好处是当你的函数嵌套太深的时候可以向你提出告警。请留意这个警告。 在switch语句中消除多级缩进的首选的方式是让“switch”和从属于它的“case”标签对 齐于同一列,而不要“两次缩进”“case”标签。比如: switch (suffix) { case 'G': case 'g': mem <<= 30;

Linux的版本与内核

Linux的版本与内核 Linux有两种版本,一个是核心(kernel)版,一个是发行(distribution)版。核心版的序号由三部分数字构成,其形式为:major.minor.patchlevel,其中,majoro为主版本号,minor为次版本号,二者共同构成了当前核心版本号。patchlevel表示对当前版本的修订次数。例如,2.2.11表示对核心作用2.2 版本的第11次修订。根据约定,次版本号为奇数时,表示该版本加入新内容,但不一定稳定,相当于测试版;次版本号为偶数时,表示这是一个可以使用的稳定版本。鉴于Linux内核开发工作的连续性,内核的稳定版本与在此基础上进一步开发的不稳定版本总是同时存在的。建议采用稳定的核心版本。 Linux的内核具有两种不同的版本号,实验版本和产品化版本。要确定LINUX版本的类型,只要查看一下版本号:每一个版本号由三位数字组成,第二位数字说明版本类型。如果第二位数字是偶数则说明这种版本是产品化版本,如果是奇数说明是实验版本。如2.6.20是产品化版本,2.6.16是实验版本。LINUX的两种版本是相互关联的。实验版本最初是产品化产品的拷贝,然后产品化版本只修改错误,实验版本继续增加新功能,到实验版本测试证明稳定后拷贝成新的产品化版本,不断循环,这样一方面可以方便广大软件人员加入到LINUX的开发和测试工作中来,另一方面又可以让一些用户使用上稳定的LINUX版本。真是做到开发和实用两不误。现在LINUX的内核的最新版本是2.6.20。 Linux内核 Linux是最受欢迎的自由电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。Linux最早是由芬兰黑客 Linus Torvalds为尝试在英特尔x86架构上提供自由免费的类Unix操作系统而开发的。该计划开始于1991年,这里有一份Linus Torvalds 当时在Usenet新闻组comp.os.minix所登载的贴子,这份著名的贴子标志着Linux计划的正式开始。在计划的早期有一些Minix 黑客提供了协助,而今天全球无数程序员正在为该计划无偿提供帮助。技术上说Linux是一个内核。“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核不是一套完整的操作系统。一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux架构。今天Linux是一个一体化内核(monolithic kernel)系统。设备驱动程序可以完全访问硬件。Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系统运行期间可直接装载或卸载。Linux不是微内核(microkernel)架构的事实曾经引起了Linus Torvalds与Andy Tanenbaum之间一场著名的争论。 Linux内核简史 操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统,在Linux 的术语中被称为“内核”,也可以称为“核心”。Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。

Linux内核版本号及源代码目录树结构

Linux 内核版本号及源代码目录树结构 一、linux内核版本号的命名机制 Linux内核版本有两种:稳定版和开发版。稳定的内核具有工业级的强度,可以广泛地应用和部署。新的稳定内核相对于较旧的只是修正一些bug或加入一些新的驱动程序。而开发版内核由于要试验各种解决方案,所以变化很快。这两种版本是相互关联,相互循环的。 Linux内核的命名机制: num.num.num 其中第一个数字是主版本号,第二个数字是次版本号,第三个数字是修订版本号。如果次版本号是偶数,那么该内核就是稳定版的;若是奇数,则是开发版的。头两个数字合在一齐可以描述内核系列。如稳定版的2.6.0,它是2.6版内核系列。最新的内核源代码可以在https://www.doczj.com/doc/b7936935.html,以tar包或者增量补丁的形式下载.。 Linux还有各种发行版本,除了最熟悉的Redhat,Debian,Bluepoint,红旗,还有 Slackware,Mandarke,Turbo。 二、linux源代码目录树结构 Linux用来支持各种体系结构的源代码包含大约4500个C语言程序,存放在270个左右的子目录下,总共大约包含200万行代码,大概占用58MB磁盘空间。 在阅读源码之前,还应知道Linux内核源码的整体分布情况。现代的操作系统一般由进程管理、内存管理、文件系统、驱动程序和网络等组成。Linux内核源码的各个目录大致与此相对应,其组成如下: arch目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录。PC机一般都基于此目录。 include目录包括编译核心所需要的大部分头文件,例如与平台无关的头文件在include/linux子目录下。

Linux内核与驱动开发实验教材

内核与驱动开发实验教材 中程在线 实验一嵌入式开发环境的建立 实验目的 掌握嵌入式开发环境的构建,熟悉课程实验的开发板 掌握安装交叉编译工具的安装方法 掌握的烧写方法 掌握的编译方法 实验内容 安装交叉编译工具 编译 烧写 生成映像 基础知识 交叉编译工具 嵌入式系统的开发中,开发环境被称为主机。因为嵌入式目标系统的资源局限性,不可能完成构建系统的任务,所以需要主机使用交叉编译工具来构建目标系统。 实验使用交叉编译器,与桌面系统采用的编译器是不同,因为实验开发板采用的是处理器。 编译器将使用下列工具 , 与通常在平台上使用的工具不同,交叉编译工具编译处理的执行文件只能够在平台上运行。 嵌入式系统构建 一个嵌入式系统从软件的角度看通常可以分为四个层次: .引导加载程序()。引导加载程序是系统加电后运行的第一段软件代码。 . 内核。特定于嵌入式板子的定制内核以及内核的启动参数。 . 文件系统。包括根文件系统和建立于内存设备之上文件系统。通常用来作为。 .用户应用程序。特定于用户的应用程序。

主要的功能有: 初始化硬件,初始化, , , , 。 启动,这是最重要的功能,保存内核映像到中,并跳转到内核起始地址。 映像下载,下载内核映像和文件系统到,下载只能通过以太网进行。如命令完成文件下载。 内存控制,如命令可以烧写。 机中的引导加载程序由(其本质就是一段固件程序)和位于硬盘中的(比如,和等)一起组成。在完成硬件检测和资源分配后,将硬盘中的读到系统的中,然后将控制权交给。的主要运行任务就是将内核映象从硬盘上读到中,然后跳转到内核的入口点去运行,也即开始启动操作系统。 而在嵌入式系统中,通常并没有像那样的固件程序(注,有的嵌入式也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由来完成。在实验开发板(基于3C)的嵌入式系统中,系统在上电或复位时都从地址处开始执行,而在这个地址处安排的通常就是系统的程序。 简单地说,就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。 通常,是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的几乎是不可能的。尽管如此,我们仍然可以对归纳出一些通用的概念来,以指导用户特定的设计与实现。 内核是所有系统的中心软件组件。整个系统的能力完全受内核本身能力的限制。 由于内核支持多个架构,由于架构的差异性,每种架构都有不同的团队在维护,所以必须根据架构来选择供应内核的网站。见下表: 架构最合适的内核网站下载方式 等 内核源代码目录树结构说明如下: :包含和硬件体系结构相关的代码,每种平台占一个相应的目录。和位相关的代码存放在目录下,其中比较重要的包括(内核核心部分)、(内存管理)、(浮点单元仿真)、(硬件相关工具函数)、(引导程序)、(总线)和(相关状态)。 :常用加密和散列算法(如、等),还有一些压缩和校验算法。 :关于内核各部分的通用解释和注释。 :设备驱动程序,每个不同的驱动占用一个子目录。 :各种支持的文件系统,如、、等。 :头文件。其中,和系统相关的头文件被放置在子目录下。 :内核初始化代码(注意不是系统引导代码)。 :进程间通信的代码。 :内核的最核心部分,包括进程调度、定时器等,和平台相关的一部分代码放在*目录下。:库文件代码。 :内存管理代码,和平台相关的一部分代码放在*目录下。 :网络相关代码,实现了各种常见的网络协议。

Linux内核中的Kconfig用法与说明

Linux内核中的Kconfig文件 本节不对内核的Kconfig文件进行深入展开,更多Kconfig语法和说明请阅读 。 内核源码树每个目录下都还包含一个Kconfig文件,用于描述所在目录源代码相关的内核配置菜单,各个目录的Kconfig文件构成了一个分布式的内核配置数据库。通过make menuconfig(make xconfig或者make gconfig)命令配置内核的时候,从Kconfig文件读取菜单,配置完毕保存到文件名为.config的内核配置文件中,供Makefile文件在编译内核时使用。 1.1.1 Kconfig基本语法 如程序清单0.1所示代码摘自文件,是一个比较典型的Kconfig 文件片段,包含了Kconfig的基本语法。 程序清单0.1drivers/char/Kconfig片段 menu "Character devices" source "drivers/tty/Kconfig" config DEVKMEM bool "/dev/kmem virtual device support" default y help Say Y here if you want to support the /dev/kmem device. The /dev/kmem device is rarely used, but can be used for certain kind of kernel debugging operations. When in doubt, say "N". …… endmenu 1.子菜单 通过menu和endmenu来定义一个子菜单,程序清单0.1所示代码定义了一个“Character devices”子菜单,子菜单在界面中用“--->”表示,如图0.1所示。 图0.1menu定义的子菜单 子菜单的菜单项则由config来定义,随后的“bool”、“default”、“help”等都是该菜单 项的属性:

linux操作系统( 课后习题答案)复习进程

l i n u x操作系统(课后习题答案)

精品文档 收集于网络,如有侵权请联系管理员删除 1.简述linux 的内核版本号的构成。 答:由3个部分数字构成,其形式如下 Major.minor.patchlevel major :表示主版本号,通常在一段时间内比较稳定。minor :表示次版本号,如果是偶数,代表这个内核版本是正式版本,可以公开发行;而如果是奇数,则代表这个内核版本是测试版本,还不太稳定仅供测试。patchlevel :表示修改号,这个数字越大,则表明修改的次数越多,版本相对更完善。 2.如何理解linux 发行版本含义?它由哪些基本软件构成? 答:linux 的基础是其内核,但光有内核是无法满足用户需要的,必须构成发行套件,即发行版。 系统引导管理程序(Boot Manager 、用户界面、X-Window 系统、系统管理、Internet 服务、文件和打印服务、应用程序、工具和库程序 3.linux 的运用领域主要有哪些?答: Intranet 、服务器、嵌入式系统、集群计算机等方面 4.Linux 主要特点。 答:多用户、多任务、多平台、漂亮的用户界面 、硬件支持、强大的通信和联网功能 、应用程序支持 4.X Window 由哪3个部分组成?分别有何功能? 答:Server (服务器)、Client (客服端)、通信通道 Server :控制实际显示器和输入设备的程序。Client :Client 是使用系统窗口功能的一些应用程序。通信通道:负责Server 与Client 之间的信息传输。 5.什么是桌面环境?linux 下的桌面环境主要有哪两种? 答:为用户管理系统、配置系统、运行应用程序等提供统一的操作平台。Linux 最常用的桌面环境:KDE 和GNOME 。 6.在GNOME 桌面环境下如何获取帮助信息? 答:(1)GNOME 桌面环境提供帮助浏览器程序help ,单击【主菜单】——【帮助】命令即可启动,单击文字链接可查看相关的联机帮助信息。(2)如果已安装文档光盘,则可单击【主菜单】——【文档】命令,选择查看已安装的文档。(3)当运行运用程序时,单击该程序的【帮助】——【目录】或者【目录内容】也可查看该程序的帮助信息。(4)默认情况下linux 所安装的每一个应用程序都会在/usr/share/doc 目录下放置该程序的帮助信息文件。因此,用户可直接浏览次目录中相关程序的帮助信息。 7.如何从GNOME 桌面环境切换到KDE 桌面环境?答:在GNOME 中启动运行命令,然后输入命令switchdesk ,打开switchdesk 桌面切换工具,然后选择KDE 命令,设置完成后需要重新启动系统才生效。 8.I/O 设备怎样分类?从资源的角度来看,I/O 设备可分为哪几类设备? 答:按设备的所属关系两类:系统设备 、用户设备 。按设备的信息交换的单位两类:字符设备 、块设备。 按设备的共享属性可分为三类:独占设备 、共享设备 、虚拟设备 。 9.设备管理的目标和功能是什么? 答: 选择和分配I/O 设备以便进行数据传输操作。控制I/O 设备和CPU (或内存)之间交换数据。为用户提供一个友好的透明接口,把用户和设备硬件特性分开,使得用户在编制应用程序时不必涉及 具体设备,由系统按用户的要求来对设备的工作进行控制。提高设备和设备之间、CPU 和设备之间以及进程和进程之间的并行操作程度,以使操作系统获得最佳效率。 功能:提供和进程管理系统的接口、进行设备分配 、实现设备和设备、设备和CPU 等之间的并行操作 、进行缓冲管理 、设备控制与驱动 10.什么是DMA 方式?简述采用DMA 方式进行数据传输的过程。 答:DMA 方式是:在外部设备和内存之间开辟直接的数据交换通路。(1)外设可通过DMA 控制器向CPU 发出DMA 请求: (2)CPU 响应DMA 请求,系统转变为DMA 工作方式,并把总线控制权交给DMA 控制器; (3)由DMA 控制器发送存储器地址,并决定传送数据块的长度; (4)执行DMA 传送; (5)DMA 操作结束,并把总线控制权交还CPU 。 11.什么叫通道技术?通道的作用是什么? 答:通道是独立于中央处理器的,专门负责数据I/O 传输工作的理单元。通道对外部设备实行统一管理,它代替CPU 对I/O 操作进行控制,从而使CPU 和外部设备可以并行工作。所以通道又称为I/O 处理机。 12.什么是缓冲?为什么要引入缓冲?答:缓冲技术是用在外部设备与其他硬件部件之间的一种数据暂存技术,它利用存储器件在外部设备中设置了数据的一个存储区域,称为缓冲区。引入缓冲区的主要原因:(1)缓和CPU 与I/O 设备间速度不匹配的矛盾。(2)减少对CPU 的中断频率,放宽对CPU 中断响应时间的限制。(3)提高CPU 和I/O 设备之间的并行性。 13.linux 中用户可分为哪几种类型,有何特点?答:分为下面两种类型:1、用户帐号:所谓的“用户”可以是实际的人员。每个用户帐号都包含一个惟一的识别码(User ID,UID )以及组群识别码(Group ID,GID )。 2、组群帐号:所谓的“组群”是一种逻辑性的单位,主要集合特定的用户,并授予所有组群成员文件相同的权限,如读取、写入、或运行 14.linux 用哪些属性信息来说明一个用户账号? 答:登录名、口令、用户标识号、组标识号、用户名、用户主目录、命令解释程序。 15.创建一个用户账号需要哪些步骤? 答:比如,需要创建一个用户账号user02,主目录为/home/user02,登录时使用bash 作为其shell 程序。可以使用以下命令:# useradd -d /home/user02 -s /bin/bash user02 要添加新用户,点击「添加用户」按钮。一个如右图所示的窗口就会出现。在适当的字段内键入新用户的用户名和全称。在「口令」和「确认口令」字段内键入口令。口令必须至少有六个字符。 16.linux 用哪些属性信息来说明一个用户组?答:组名、口令、组标识号、用户列表。 17.linux 用户账号管理上有哪些常用的命令? 答:显示自身的用户名—whoami 、显示当前所有用户登录信息—w 、显示当前所有用户登录信息—who 、查找并显示用户信息—

Linux内核的配置与编译

Computer Knowledge and Technology 电脑知识 与技术第5卷第3期(2009年1月)Linux 内核的配置与编译 胡庆烈 (佛山职业技术学院电子信息工程系,广东佛山528000) 摘要:Linux 是一种实用性很强的现代操作系统,它开放源代码,并允许用户升级其内核。在Redhat 7.2环境中,详细分析了Linux 2.4.18版本的内核配置、编译及新内核切换等操作过程。 关键词:Linux ;内核;配置;编译 中图分类号:TP316文献标识码:A 文章编号:1009-3044(2009)03-0730-02 Configuration and Compiling of Linux Kernel HU Qing-lie (Department of Electonics &Information,Foshan Polytechnic College,Foshan 528000,China) Abstract:Linux is a very practical modern operating system,which opens source coding and allows the user to upgrade its kernel.In the environment of Redhat 7.2,the paper analysis the Linux 2.4.18version of kernel configuration,compiling and new kernel process switch -ing,and so on. Key words:Linux;kernel;configuration;compile 1引言 Linux 是一个自由的多任务操作系统,它以开放源码、对硬件的配置要求低并兼具现代操作系统的优点而得到了迅猛的发展。操作系统的内核是操作系统的核心,它有很多基本的功能,如虚拟内存、多任务、共享库、需求加载、共享的写时拷贝(copy-on-write)、可执行程序和TCP/IP 网络功能等。 用户编译配置Linux 的内核,主要有以下三个原因:1)从现有内核中去除一些不需要的功能,使自定制的内核运行速度更快、更稳定,且具有更少的代码;2)使系统拥有更多的内存,内核部分将不会被交换到虚拟内存中;3)为了提高速度,将某种功能编译到内核中。 2Linux 内核升级的准备 2.1安装一个Linux 操作系统 在编译一个新的Linux 内核之前,首先应在微机中安装一个Linux 操作系统,以便利用该Linux 环境进行新内核的配置和安装。这里是以Redhat 7.2为例,在安装Redhat 7.2的过程中,有两个问题需要注意: 1)硬盘的分区:由于每个硬盘只能拥有4个主分区(Primary Partition ),故用户需要扩展分区,则至少需要腾出一个主分区来划分逻辑分区。在安装Linux 操作系统时,至少需要两个分区,其中本机分区(Linux Native )是供Linux 存放系统文件,而置换分区(Linux Swap )是用作虚拟内存的存取空间。此外,为了和Windows 系统进行文件的复制转换,还应创建一个FAT32类型的分区。 2)安装LILO 启动程序:LILO 是Linux 的核心加载程序,它提供了从DOS 环境启动Linux 的功能,并支持多重启动菜单,让用户选择启动哪一个分区的操作系统。 2.2获取新的Linux 内核源代码 安装了Linux 操作系统后,接下来的工作是寻找新内核的源代码。目前,在Internet 上提供Linux 源代码的站点有很多,如https://www.doczj.com/doc/b7936935.html, 就是Linux 内核版本发布的官方网站,用户可以从该站点上获得最新版本的Linux 内核源代码,这里是以linux- 2.4.18版本为例。 2.3对新的Linux 内核源代码包进行解压 由于大部分开放性操作系统的程序都是以压缩文件(tgz 、zip 、gz 与bz2)的形式进行发布,所以从网络上取得这些压缩文件后,都先要解压缩之后才能安装使用。具体过程如下: 1)执行“GNOME Terminal ”,把X Windows System 图形用户界面切换至文件操作模式; 2)执行“#cp /root/linux-2.4.18.tar.gz /usr/src ”,把从网络下载的压缩包复制至/usr/src 处; 3)执行“#tar -zxvf linux-2.4.18.tar.gz ”,对压缩包进行解压,解压文件存放在/usr/src/linux-2.4.18目录中。 2.4清除不正确文件及其它从属文件 为了确保源代码目录中没有不正确的文件和其它从属文件,一般需要运行mrproper 命令进行清理,具体操作如下: #cd /usr/src/linux-2.4.18 #make mrproper 如果是使用刚下载的完整的源程序包进行编译,则可以省略mrproper 操作。但若已反复多次使用这些源程序来进行内核编译的,则应要先运行一下这个命令。 收稿日期:2008-12-11 作者简介:胡庆烈(1969-),男,揭阳惠来人,电子助理工程师,主要从事电子技术的教研工作。 ISSN 1009-3044Computer Knowledge and Technology 电脑知识与技术Vol.5,No.3,January 2009,pp.730-731,735E-mail:kfyj@https://www.doczj.com/doc/b7936935.html, https://www.doczj.com/doc/b7936935.html, Tel:+86-551-56909635690964

Linux内核启动流程分析(一)

很久以前分析的,一直在电脑的一个角落,今天发现贴出来和大家分享下。由于是word直接粘过来的有点乱,敬请谅解! S3C2410 Linux 2.6.35.7启动分析(第一阶段) arm linux 内核生成过程 1. 依据arch/arm/kernel/vmlinux.lds 生成linux内核源码根目录下的vmlinux,这个vmlinux属于未压缩, 带调试信息、符号表的最初的内核,大小约23MB; 命令:arm-linux-gnu-ld -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o init/built-in.o --start-group arch/arm/mach-s3c2410/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o drivers/built-in.o net/built-in.o --end-group .tmp_kallsyms2.o 2. 将上面的vmlinux去除调试信息、注释、符号表等内容,生成arch/arm/boot/Image,这是不带多余信息的linux内核,Image的大小约 3.2MB; 命令:arm-linux-gnu-objcopy -O binary -S vmlinux arch/arm/boot/Image 3.将 arch/arm/boot/Image 用gzip -9 压缩生成arch/arm/boot/compressed/piggy.gz大小约 1.5MB;命令:gzip -f -9 < arch/arm/boot/compressed/../Image > arch/arm/boot/compressed/piggy.gz 4. 编译arch/arm/boot/compressed/piggy.S 生成arch/arm/boot/compressed/piggy.o大小约1.5MB,这里实 际上是将piggy.gz通过piggy.S编译进piggy.o文件中。而piggy.S文件仅有6行,只是包含了文件piggy.gz; 命令:arm-linux-gnu-gcc -o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/piggy.S 5. 依据arch/arm/boot/compressed/vmlinux.lds 将arch/arm/boot/compressed/目录下的文件head.o 、piggy.o 、misc.o链接生成arch/arm/boot/compressed/vmlinux,这个vmlinux是经过压缩且含有自解压代码的内核, 大小约1.5MB; 命 令:arm-linux-gnu-ld zreladdr=0x30008000 params_phys=0x30000100 -T arch/arm/boot/compressed/vmlinux.lds a rch/arm/boot/compressed/head.o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/misc.o -o arch/arm /boot/compressed/vmlinux

相关主题
文本预览
相关文档 最新文档