第三部分 Linux内核分析与移植
Linux内核裁剪移植——内核的主要组成部分

接口。 虚拟文件系统隐藏了不同类型硬件的具体细节,为所有的硬件设备提供了一个标准的接口,
VFS提供了十多种不同类型的文件系统。
Linux内核裁剪移植——内核的主要组成部分 5
网络接口提供了对各种网络标准的存取和各种网络硬件的支持。 进程通信部分用于支持进程间各种不同的通信机制。 进程调度处于核心位置,内核的其他子系统都要依赖它,因为每个子系统都存在进程挂起或恢
Linux内核裁剪移植 ——内核的主要组成部分
Linux内核裁剪移植——内核的主要组成部分 2
内核,即操作系统。它为底层的可编程部件提供服务,为上层应用程序提供执行环境。 内核裁剪就是对这些功能进行裁剪,选取满足特定平台和需求的功能。不同的硬件平台对内核
要求也不同,因此从一个平台到另一个平台需要对内核进行重新配置和编译。 操作系统从一个平台过渡到另一个平台称为移植。 Linux是一款平台适应性且容易裁剪的操作系统,因此Linux在嵌入式系统得到了广泛的应用。
Linux内核裁剪移植——内核的主要组成部分 3
Linux内核主要的5个部分:进程调度、内存管理、虚拟文件系统、网络接口、进程通信。在系 统移植的时候,它们是内核的基本元素。
Linux内核裁剪移植——内核的主要组成部分 4
进程调度部分负责控制进程对CPU的访问。 内存管理允许多个进程安全地共享主内存区域。内存管理从逻核的主要组成部分 7
虚拟文件系统与网络接口之间的关系: ➢ 虚拟文件系统通过依赖网络接口支持网络文件系统(NFS) ➢ 也通过依赖内存管理支持RAMDISK设备。
内存管理与虚拟文件系统之间的关系: ➢ 内存管理利用虚拟文件系统支持交换 ➢ 交换进程定期地由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。 ➢ 当一个进程存取的内存映射被换出时,内存管理将会向文件系统发出请求,同时,挂起当 前正在运行的进程。
基于ARM平台Linux内核移植论文

基于ARM平台的Linux内核移植中图分类号:tp 文献标识码:a 文章编号:1007-0745(2011)10-0204-01摘要:linux是一个可移植性非常好的操作系统,它广泛支持了许多不同体系结构的计算机。
可移植性是指代码从一种体系结构移植到另外一种不同的体系结构上的方便程度。
本文介绍了基于arm 开发板的linux内核移植过程,主要包括二方面的内容:交叉编译器的安装、内核的配置与移植。
本文要求读者具备一定的linux操作系统使用经验。
关键词:移植内核 linux一、概述一个嵌入式linux系统的启动顺序可以分为四步:1、引导加载程序(bootloader)。
2、加载linux内核。
3、挂载根文件系统。
4、运行应用程序。
所以要想使linux内核在开发板上运行,就必须对以上四步的相关源代码进行移植操作,使其可运行于嵌入式平台。
本文主要介绍内核移植部分,其余部分可参考相应书箱或文档。
二、开发环境的建立2.1、安装虚拟机、fedora13操作系统及相关的开发工具(gcc、gedit等),本文的所有操作均是在这种开发环境下进行,本文的工作目录为 \work,且都是在root权限下操作。
2.2、交叉编译器(arm-linux-gcc)的安装。
交叉编译器是嵌入式linux开发的基础,后续的移植过程都要用到此编译器,在linux pc平台下,利用arm-linux-gcc编译器可编译出针对arm linux平台的可执行代码。
安装过程如下:a、网上获取arm-linux-gcc-4.3.2.tgz源代码包并保存于/work 目录中。
b、解压命令(tar xvzf arm-linux-gcc-4.3.2.tgz -c /)注意上面的命令必须是大写c且后面有个空格,这样将源代码解压至目录/usr/local/arm/4.3.2中。
c、配置编译环境路径。
输入命令(gedit /root/.bashrc)打开.bashrc文件,在最后一行加入如下内容:exportpath=/usr/local/arm/4.3.2/bin:$path保存关闭文件,用root重新登录系统,输入命令:(arm-linux-gcc –v)如果安装成功将会显示arm-linux-gcc的版本号。
实验5-3 Linux 内核移植实验

实验 5-3 Linux-2.6.28移植实验【实验目的】熟悉Linux-2.6.28移植过程。
【实验步骤】第一步:从/pub/linux/kernel/v2.6下载linux-2.6.28.tar.bz2压缩文件(或光盘中提供);【图5-3-1】第二步:将linux-2.6.28.tar.bz2压缩文件复制到Linux工作目录;第三步:在Linux下利用tar jxvf linux-2.6.28.tar.bz2命令解压linux-2.6.28.tar.bz2压缩文件。
第四步:进入解压后的linux-2.6.28目录下,利用vi编辑工具修改linux-2.6.28目录下的顶层Makefile文件。
第五步:修改linux-2.6.28目录下的顶层Makefile文件,设置编译linux操作系统的CPU体系架构变量ARCH 和所使用的交叉编译工具链变量CROSS_COMPILE(注:实验使用arm-linux交叉编译工具链 4.2.1版本,可从/pub/snapgear/tools/arm-linux/下载arm-linux-tools-20070808.tar.gz压缩文件,解压到/OPT目录下)。
改为ARCH ?= armCROSS_COMPILE ?=/opt/usr/local/bin/arm-linux-【图5-3-2】第六步:将linux-2.6.28目录下的arch/arm/configs/mainstone_defconfig文件复制为xsbase270_defconfig文件。
第七步:在linux-2.6.28/arch/arm/mach-pxa目录下增加一个xsbase270.c文件(实际上从该目录下的mainstone.c复制而来.也可以直接复制实验代码中的文件),然后根据实际平台进行修改。
第八步:修改linux-2.6.28\arch\arm\mach-pxa目录下的Makefile文件,增加编译xsbase270.c 的编译选项,即:obj-$(CONFIG_MACH_XSBASE270) += xsbase270.o。
Linux2.6内核移植系列教程

Linux2.6内核移植系列教程第一:Linux 2.6内核在S3C2440平台上移植此教程适合2.6.38之前的版本,其中2.6.35之前使用同一yaffs补丁包,2.6.36--2.6.28 yaffs文件系统有所改变,2.6.39之后的暂时不支持,源码下载请到:/1.解压linux-2.6.34.tar.bz2源码包#tar jxvf linux-2.6.34.tar.bz22.修改linux-2.6.34/Makefile文件,在makefile中找到以下两条信息并做修改ARCH ? =armCROSS_COMPILE?=/usr/local/arm/4.3.2/bin/arm-linux-注意:交叉编译器的环境变量也需要改为4.3.2#export PATH=/usr/local/arm/4.3.2/bin/:$PATH其中ARCH变量用来决定:配置、编译时读取Linux源码arch目录下哪个体系结构的文件PATH 用来决定交叉编译器版本3.修改机器类型ID号Linux源码中支持多种平台的配置信息,内核会根据bootloader传进来的mach-types决定那份平台的代码起作用,本人手里的板子是仿照三星公司官方给出的demo板改版而来,所以采用arch/arm/mach-s3c2440/mach-smdk2440.c此配置文件,打开此文件,翻到最后,有以下信息:MACHINE_START(S3C2440, "SMDK2440")/* Maintainer: Ben Dooks <ben@> */.phys_io= S3C2410_PA_UART,.io_pg_offst= (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,.boot_params= S3C2410_SDRAM_PA + 0x100,.init_irq= s3c24xx_init_irq,.map_io= smdk2440_map_io,.init_machine= smdk2440_machine_init,.timer= &s3c24xx_timer,MACHINE_ENDMACHINE_START(S3C2440, "SMDK2440")决定了此板子的mach-types,可以在以下文件中找到S3C2440对应的具体数字,"arch/arm/tools/mach-types"文件查找S3C2440,362,这里刚好与我们的bootloader相同,所以不用做修改,直接保存退出即可,如果不同则根据bootloader的内容修改此文件,或根据此文件修改boorloader的内容(在vivi中可通过param show查看,u-boot在Y:\test\u-boot_src\u-boot_edu-2010.06\board\samsung\unsp2440\unsp2440.c文件:gd->bd->bi_arch_number = MACH_TYPE_S3C2440;中决定)。
嵌入式Linux内核的编译与移植

计算技术与 自动化 ・
嵌入式 L u i x内核 的编译与移植 n
孙 昌霞, 郭玉峰
( 南农业大学信息与管理科学学 院, 河南 河
摘
郑州 4 0 0 ) 5 0 2
要: 嵌入式 系统是一 个高起点 的技 术领域 , 而嵌入式 Ln x以 多方 面的优势 已成 为嵌 入式 系统领域研 究的一 个热点. iu 本文 首
# xot P T ¥ A H: sl a am 29 .bn epr A H: P T / ro l r /. 3 i,其 中: s u /c / 5/ /r u/
3 aex ng 基 于图形 窗 口模 式 的配 置界面 , wno ) k c f: m oi Xi w d
卜 ae o of : d i cn g配置 文件 , 只要求用 i 并且 户设定前次没有设定过的选项。 在这 4 方法 中, k e uof 种 mae m n eni g使用最为广泛 , 这里本文 也选择使用 m k n cn g的配置方 法.选择相应 的配置 时 , a emeuo f i 有三种选择 , 它们 分别代表 的含义如下:
使用 的功 能直接编译到 内核中, 比如网卡 、 光驱等。 3 . 2内核的配置 内核的配置过程其 实就是内核裁 剪的过程 , 嵌人式 Ln x内 iu 核要针对具体 的嵌入式设 备平 台软硬件需要, 裁减掉一些不必
要的功能后 , 这样可 以更 好 的节省 系统资源 , 提高 系统运行
“ ” 将该功能编译 进内核 Y一
lcl n , oa n为交叉编译 器的安装 目录。 /
“ " 不将该功能编译进 内核 N-
3 内核 编译
建立交 叉开发环 境之后,就可 以编译嵌 入式 L 的 内核 i 了。通常编译 嵌入式 Ln 内核都是通过不 同的 mae iu k 命令来实 现 的,它 的执行 配置 文件就 是通 常所说 的 Ma l,而不 同的 kf i M kf。 。 l 又通过互相 的依赖关系构成一个 统一的整体 去完成建 i 立依存关系 、 建立 内核等功能。
嵌入式linux系统分析及snmpd移植

基于Linux/Net-Snmp构建DMS系统图1显示了典型的DMS系统结构图,其中中央电脑与DMS控制器之间的通信必须是基于NTCIP的。
同时,我们也可以在现场直接通过串口来控制控制器。
图1:典型的DMS系统框架在应用层,NTCIP建议使用SNMP协议来管理网络内的不同终端。
SNMP的工作模式是基于管理工作站/代理模式的。
运行网络管理程序的主机成为管理工作站,就是NTCIP网络内的中央电脑(管理中心);运行代理程序的网络设备就是我们的代理,也就是我们这里的DMS控制器。
SNMP的数据以一种标准化的层次结构进行布置。
这种强制的组织方式使数据空间既保持了通用性又保持了可扩展性。
命名的层次结构由MIB(管理信息库)组成,它是描述通过SNMP可访问的数据的结构化文本文件。
MIB包含了对特定数据变量的说明,数据变量用被称作对象标识符(OID)的名字来引用。
但是MIB只是一个给管理数据命名的约定。
SNMP名字空间和设备实际状态之间的映射关系必须由代理端代码支持才有用(包括代理的扩展开发和代理的应用程序开发)。
一、Net-Snmp在网络设备上我们使用的是基于Linux的net-snmp。
net-snmp除了提供用于响应管理站的代理程序snmpd外,还提供了一些命令行工具和一个可用于开发支持SNMP的应用程序的库组成。
在linux下通过命令行可以很方便的调用这些工具,在我们进行代理端的扩展开发时,可以使用它们来进行测试。
而开发下位机应用程序时,使用的就是该库提供的API。
下面的工作主要是在PC-Linux上完成的,在后续的工作中会逐渐的把它移植到嵌入式的开发板上。
安装完Net-Snmp后,我们需要修改代理的配置文件snmpd.conf,图2是修改前和修改后的对比。
首先ip地址的修改是指明snmpd支持的主机(即可以访问本代理的主机);把MyROGroup改成MyRWGroup,这样代理就支持了管理站对自己的写(set)操作。
Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解

printk(KERN_WARNING fmt, ##arg) printk(KERN_DEBUG fmt, ##arg)
/* Module Init & Exit function */ static int __init myModule_init(void) {
/* Module init code */ PRINTK("myModule_init\n"); return 0;
图形
工具
前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍 了模块的一种编译方式——在一个独立的文件夹通过makefile配合内核源码路径完成
那么如何将驱动直接编译进内核呢? 在我们实际内核的移植配置过程中经常听说的内核裁剪又是怎么麽回事呢? 我们在进行linux内核配置的时候经常会执行make menuconfig这个命令,然后屏幕上会出现以下 界面:
首页 业界 移动 云计算 研发 论坛 博客 下载 更多
process的专栏
您还未登录!| 登录 | 注册 | 帮助
个人资料
dianhuiren
访问:71424次 积分:1219分 排名:第8764名 原创:37篇 转载:127篇 译文:0篇 评论:3条
目录视图
摘要视图
订阅
《这些年,我们读过的技术经典图书》主题有奖征文 经理
这些配置工具都是使用脚本语言,如 Tcl/TK、Perl 编写的(也包含一些用 C 编写的代码)。本文
/dianhuiren/article/details/6917132
1/5
2012年04月 (6) 2012年03月 (15) 2012年02月 (16)
并不是对配置系统本身进行分析,而是介绍如何使用配置系统。所以,除非是配置系统的维护者,一般 的内核开发者无须了解它们的原理,只需要知道如何编写 Makefile 和配置文件就可以。
Linux内核分析及编程

其中基于sparc64平台的Linux用户空间可以运行32位代码,用户空间指针是32位宽的,但内核空间是64位的。
内核中的地址是unsigned long类型,指针大小和long类型相同。
内核提供下列数据类型。
所有类型在头文件<asm/types.h>中声明,这个文件又被头文件<Linux/types.h>所包含。
下面是include/asm/types.h文件。
#ifndef _I386_TYPES_H#define _I386_TYPES_H#ifndef __ASSEMBLY__typedef unsigned short umode_t;// 下面__xx类型不会损害POSIX 名字空间,在头文件使用它们,可以输出给用户空间typedef __signed__ char __s8;typedef unsigned char __u8;typedef __signed__ short __s16;typedef unsigned short __u16;typedef __signed__ int __s32;typedef unsigned int __u32;#if defined(__GNUC__) && !defined(__STRICT_ANSI__)typedef __signed__ long long __s64;typedef unsigned long long __u64;#endif#endif /* __ASSEMBLY__ *///下面的类型只用在内核中,否则会产生名字空间崩溃#ifdef __KERNEL__#define BITS_PER_LONG 32#ifndef __ASSEMBLY__#include <Linux/config.h>typedef signed char s8;typedef unsigned char u8;typedef signed short s16;typedef unsigned short u16;typedef signed int s32;typedef unsigned int u32;typedef signed long long s64;typedef unsigned long long u64;/* DMA addresses come in generic and 64-bit flavours. */ #ifdef CONFIG_HIGHMEM64Gtypedef u64 dma_addr_t;#elsetypedef u32 dma_addr_t;#endiftypedef u64 dma64_addr_t;#ifdef CONFIG_LBDtypedef u64 sector_t;#define HAVE_SECTOR_T#endiftypedef unsigned short kmem_bufctl_t;#endif /* __ASSEMBLY__ */#endif /* __KERNEL__ */#endif下面是Linux/types.h的部分定义。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
应用程序、内核、硬件的关系
内核版本
• 命名规则 <主版本号>.<从版本号>.<修正版本号> • 稳定版-偶数从版本号 开发版-奇数从版本号 • 如何查看运行中的内核版本 cat /proc/version 或者 uname -r •
内核开发的特点
• • • • • • 没有C库 必须使用GNU C 没有内存保护机制 浮点数很难使用 只有很小的定长堆栈 由于支持中断、抢占、SMP,必须时刻注 意同步和并发 • 要考虑可移植
内核代码构造(2)
• 子目录中通常包含源代码、Makefile 文件和配置文件(Kconfig) • drivers和arch是两个较大的子目录, 内核移植通常在这两个目录下进行修 改 • 内核编译后在顶层目录下生成的两个 主要文件: -System.map(内核符号地址映射) -vmlinux(真正的内核,ELF格式)
内核下载、配置和编译(4)
• 编译内核 make 或者 make zImage
课后练习
• 下载最新的内核源码,并试着进行配置和 编译,熟悉配置系统的使用和编译过程
Q&A
第三章 Linux内核代码结构和Build系统
内核编码风格
• Documentation/CodingStyle • 变量、函数名等采用小写加下划线,如 int min_value, max_value; void send_data(void); • 宏定义采用大写 #define PI 3.1415926 • 复合语句块的大括号一般在行尾,如 if () { ... } for ( i = 0; i < BUFSIZE; i++) { ... } • ...
嵌入式Linux开发过程(2)
嵌入式Linux交叉开发模式
Q&A
第二章 Linux内核
Linux内核简介
• • • • • 什么是内核 应用程序、内核、硬件的关系 内核版本 内核开发的特点 内核配置和编译
什么是内核
• 一个操作系统包括内核、驱动程序、启动 程序、用户界面、各种工具等 • 内核是核心,负责管理硬件设备、分配系 统资源等,同时为系统的其他部分提供服 务,包含中断处理程序、进程调度程序、 内存管理程序、进程通信系统、网络系统 等 • 应用程序通过系统调用和内核通信,调用 内核提供的服务 • 内核运行的内存空间和应用程序的内存空 间是相互独立的
处理器基础
• CISC和RISC架构 • 单机处理器 • 集成化处理器(SOC)
– PowerPC PPC PowerPC(PPC) – MIPS – ARM
交叉开发环境
• 在主机系统(host)上编译并构建将在嵌 入式系统(target)上运行的应用 • 主机系统包含: -交叉编译器和库 -目标系统软件包 -主机工具(编辑器、调试器、实用程序等) -为目标板提供的服务
第一章 嵌入式Linux简介
嵌入式Linux简介
• • • • 平台构成 系统框架 开发过程 开发模式
嵌入式Linux平台构成
• • • • 硬件平台 引导装入程序(Bootloader) 内核、设备驱动程序 文件系统
嵌入式Linux系统框架
嵌入式Linux开发过程(1)
• 硬件平台开发 -芯片设计和选择 -电路原理图设计 -PCB绘制 -PCB制板、调试 • 软件开发 -建立交叉开发环境 -系统软件开发 -Bootloader移植 -内核移植 -设备驱动开发 -文件系统制作和部署 -应用程序开发
GNU C对ANSI C的扩展
• • case范围 ,如 switch (ch) { case '0' ... '9': ... } 结构成员初始化可以是任意顺序,如 struct file_operations ext2_file_operations = { ... .read = generic_file_read; .write = generic_file_write; .open = generic_file_open; ... }; __FUNCTION__, __LINE__预定义宏 printk("%s:%d\n", __FUNCTION__, __LINE__); inline关键字 goto的使用, 如 if (register_a() != 0) goto err; if (register_b) != 0) goto err1; if (register_c() != 0) goto err2; ... err2: unregister_b(); err1: unregister_a(); err: return ret; ...
嵌入式系统简介
• • • • • • • • 具备处理器 针对某类应用或目的 简单的人机接口 资源受限 功耗限制 软件内置 软硬件集成发布 通常独立工作,无需人工干预
为什么使用Linux
开源、免费 成熟、高性能、稳定 支持新型硬件平台、架构 支持大量的应用和网络协议 适应性强(小型设备->大型的交换机、路由 器) • 大量的开发者,资源丰富(文档、补丁等) • 大量软硬件厂商的支持 • • • • •
内核下载、配置和编译(1)
• 下载并解压内核 cd /usr/src tar jxvf linux-2.6.x.tar.bz2 • 配置内核 make config(字符界面)
内核下载、配置和编译(2)
make menuconfig(ncurses库图形界面)
内核下载、配置和编译(3)
make xconfig(gconfig)(图形界面)
内核构建过程的输出
make ARCH=arm CROSS_COMPILE=arm-linux- zImage CHK include/linux/version.h HOSTCC scripts/basic/fixdep . . <hundreds of lines of output omitted here> . LD vmlinux SYSMAP System.map SYSMAP .tmp_System.map OBJCOPY arch/arm/boot/Image Kernel: arch/arm/boot/Image is ready AS arch/arm/boot/compressed/head.o GZIP arch/arm/boot/compressed/piggy.gz AS arch/arm/boot/compressed/piggy.o CC arch/arm/boot/compressed/misc.o AS arch/arm/boot/compressed/head-xscale.o AS arch/arm/boot/compressed/big-endian.o LD arch/arm/boot/compressed/vmlinux OBJCOPY arch/arm/boot/zImage Kernel: arch/arm/boot/zImage is ready Building modules, stage 2. ...
vmlinux映像文件的组成(1)
vmlinux映像文件的组成(2)
• • • • • • • • • • • • • • • • • • • • arch/arm/kernel/head.o - 体系结构相关的启动代码 init _task.o - 初始内核线程 init/built-in.o -内核初始化代码 usr/built-in.o - 初始内存盘映像(initramfs) arch/arm/kernel/built-in.o - 体系结构相关的内核代码 arch/arm/mm/built-in.o - 体系结构相关的内存管理代码 arch/arm/common/built-in.o - 体系结构相关的公共代码 arch/arm/mach-ixp4xx/built-in.o - 平台相关初始化代码 arch/arm/nwfpe/built-in.o - 体系结构相关的浮点数仿真代码 kernel/built-in.o - 通用内核代码 mm/built-in.o - 通用内存管理代码 ipc/built-in.o - 进程通信系统 security/built-in.o - 安全系统 lib/lib.a - 公共函数库 arch/arm/lib/lib.a - 体系结构相关的函数库 lib/built-in.o - 内核辅助函数库 drivers/built-in.o - 内置驱动程序 sound/built-in.o - 声音子系统 net/built-in.o - 网络子系统 .tmp_kallsyms2.o - 内核符号表
Байду номын сангаас• • •
•
内核代码阅读工具(1)
• Source Insight(Windows平台)
内核代码阅读工具(2)
• LXR(基于WEB网页) • VIM+ctags+cscope(Linux平台)
内核代码构造(1)
• 顶层目录结构 -arch -crypt -Documentation -drivers -fs -include -init -ipc -kernel -lib -mm -net -scripts -security -sound -usr
典型的交叉开发设置
引导装入程序(Bootloader)
• CPU上电后执行的第一个系统程序 • 默认地址加载 • 初始化关键硬件组件(CPU、SDRAM、串 口等) • 定位、加载并将控制权移交给操作系统 (内核) • 其他功能(调试辅助、下载更新系统映像 等) • 汇编+C代码 • 流行的通用引导装入程序U-Boot
vmlinux-真正的内核
• vmlinux的链接过程 arm-linux-ld -EB -p --no-undefined -X -o vmlinux \ -T arch/arm/kernel/vmlinux.lds \ arch/arm/kernel/head.o \ arch/arm/kernel/init_task.o \ init/built-in.o \ --start-group \ usr/built-in.o \ arch/arm/kernel/built-in.o \ arch/arm/mm/built-in.o \ arch/arm/common/built-in.o \ arch/arm/mach-ixp4xx/built-in.o \ arch/arm/nwfpe/built-in.o \ kernel/built-in.o \ mm/built-in.o \ fs/built-in.o \ ipc/built-in.o \ security/built-in.o \ crypto/built-in.o \ lib/lib.a \ arch/arm/lib/lib.a \ lib/built-in.o \ arch/arm/lib/built-in.o \ drivers/built-in.o \ sound/built-in.o \ net/built-in.o \ --end-group \ .tmp_kallsyms2.o • 在嵌入式Linux平台上真正启动的是压缩的内核(zImage),解压缩是在启动过程中完成的