嵌入式Linux系统安全性探析

嵌入式Linux系统安全性探析
嵌入式Linux系统安全性探析

嵌入式Linux系统安全性探析

摘要:阐述了嵌入式Linux内核系统存在的安全性问题,重点分析了增强安全性若干种方法及原理,根据嵌入式产品受尺寸和成本约束的特点,给出了增加安全模块、设置软件防火墙和嵌入式系统特有的方法来增强系统的安全性。

关键词:嵌入式;Linux系统;LSM;系统安全;防火墙

0引言

社会发展日新月异,物联网离百姓生活越来越近,目前很多运行在局域网甚至Internet上的产品如雨后春笋般涌向市场,比如:智能家居、安卓手机等。这些产品在方便用户的同时也出现一些安全问题,系统置于网络上相当于暴露给所有人,故对嵌入式产品安全性研究刻不容缓。嵌入式产品由于尺寸、成本的约束注定不可能从硬件部分提供更多的安全措施,故提升安全性重点应考虑Linux内核。

1嵌入式Linux系统存在的安全问题

开源的Linux内核无论在功能上或性能上都有很多优点,但Linux 内核属于开源项目,缺少提供商的安全保证,所以需要使用者最大限度地提升系统的安全性。根据实际情况裁剪Linux内核,并采取适当的安全措施可提升系统的安全性。掌握Linux核心技术、配合先进的安全模型、增强其安全性进而研发安全的操作系统非常有必要。Linux 的安全性问题从机制角度可以有以下几点:

(1) Linux系统访问控制。Linux系统主流发行版本的访问控制属

基于32位ARM920T内核的微处理器的嵌入式Linux系统构建详解

基于32位ARM920T内核的微处理器的嵌入式Linux系统构建详解目前,在嵌入式系统中基于ARM微核的嵌入式处理器已经成为市场主流。随着ARM技术的广泛应用,建立面向ARM构架的嵌入式操作系统成为当前研究的热点问题。 已经涌现出许多嵌入式操作系统,如VxWork,windows-CE,PalmOS,Linux等。在众多的嵌入式操作系统中,Linux以其开源代码及免费使用倍受开发人员的喜爱。本文选用的微处理器S3C2410是基于32位ARM920T内核的微处理器,基于此处理器构造一Linux 嵌入式操作系统,将其移植到基于32位的ARM920T内核的系统中,在此基础上进行应用程序开发。 l、开发环境介绍 1.1、基于S3C2410ARM920T的硬件平台 该系统的硬件平台为深圳旋极公司提供,硬件的核心部件为三星$3C2410ARM920T芯片,外围还包括:64MNANDFLASH和RAM外围存储芯片;串口、网口和USB外围接口;CSTNLCD和触摸屏外围显示设备;UDAl34lTS的外围音频设备。S3C2410处理器和外围设备共同构成了基于ARM920T的开发板。 1.2、嵌入式Limlx软件系统 该嵌入式Linux的软件系统包括以下4个部分:引导加载程序vivi;Linux2.6.14内核;YAFFS2文件系统以及用户程序。他们的可执行映像依次存放在系统存储设备上. 与通常的嵌入式系统布局有所不同,本系统在引导加载程序和内核映像之间还增加了一个启动参数区,在这个区里存放着系统启动参数。引导加载程序通过调用这些参数来决定启动模式、启动等待时间等,这些启动参数的增加加强了系统的灵活性。本系统采用64MNANDFLASH的存储设备。 2、嵌入式Linux系统设计与实现 2.1、引导加载程序vivi

物联网时代嵌入式系统的安全性设计

物联网时代嵌入式系统的安全性设计 本文从网络收集而来,上传到平台为了帮到更多的人,如果您需要使用本文档,请点击下载按钮下载本文档(有偿下载),另外祝您生活愉快,工作顺利,万事如意! 1电子系统的智能化与集群化 我们从电子系统的时代变革中,可以明显看出电子系统的智能化、集群化趋势。传统电子系统,是孤立的泛性产品系统(没有归一化内核);智能电子系统,是归一化微控制器内核基础上智能产品系统,并从单个产品走向集群(分布式集群、总线集群、局域网集群);物联网电子时代的嵌入式系统,是普遍具有互联网接入功能的智能电子系统,有紧耦合与松耦合接入两种状态。松耦合的智能电子系统是一个独立的产品系统,通常在网下使用,需要时接入,如手机、桌面电脑、智能家电等;紧耦合的智能电子系统与互联网构成一个物联网应用系统,如市政交通管理系统、小区物业安全管理的实时监视电子系统。目前,传统电子系统基本被淘汰,智能电子系统与物联网电子系统会长期并存。 与3个电子时代相对应的开发环境变迁,是产品开发的平台化与可靠性设计内容的变迁。 传统电子时代是电子工程师单打独斗的时代,电

子产品的功能性设计、低功耗设计、可靠性设计完全依靠电子工程师的聪明才智,由电子工程师独立完成。 智能电子时代,产品硬件体系设计是电子工程师在微控制器、大规模集成电路的功能模块基础上的配置设计;产品的软件体系设计是集成开发环境、操作系统、计算机工程方法基础上的应用程序设计。微控制器、集成电路、集成开发环境、操作系统、计算机工程方法等,构成了形形色色的知识平台。这些平台不只是简单的知识集成,而是具有人工智能、可以代替人类个体脑力劳动的知识力量平台。例如,原先设计一个数据采集系统时,电子工程师必须了解模拟信号到数字信号的转换设计的知识与技术,如今,有了A/D 转换芯片,便可省去电子工程师的这部分脑力劳动。又如,没有实时多任务操作系统时,电子工程师设计嵌入式程序时,必须认真考虑多任务系统程序的实时协调与管理,有了实时多任务操作系统,所有这些任务的协调与管理都由操作系统依靠协议自动实现。因此,智能电子时代的电子产品系统设计,进入到人工智能的平台化开发时代。 与智力替代的平台开发模式相对应的是可靠性设计内容的变迁。传统电子系统的可靠性完全依靠电子工程师的精心设计。智能电子时代,电子系统的可靠

探究linux内核,超详细解析子系统

探究linux内核,超详细解析子系统 Perface 前面已经写过一篇《嵌入式linux内核的五个子系统》,概括性比较强,也比较简略,现在对其进行补充说明。 仅留此笔记,待日后查看及补充!Linux内核的子系统 内核是操作系统的核心。Linux内核提供很多基本功能,如虚拟内存、多任务、共享库、需求加载、共享写时拷贝(Copy-On-Write)以及网络功能等。增加各种不同功能导致内核代码不断增加。 Linux内核把不同功能分成不同的子系统的方法,通过一种整体的结构把各种功能集合在一起,提高了工作效率。同时还提供动态加载模块的方式,为动态修改内核功能提供了灵活性。系统调用接口用户程序通过软件中断后,调用系统内核提供的功能,这个在用户空间和内核提供的服务之间的接口称为系统调用。系统调用是Linux内核提供的,用户空间无法直接使用系统调用。在用户进程使用系统调用必须跨越应用程序和内核的界限。Linux内核向用户提供了统一的系统调用接口,但是在不同处理器上系统调用的方法

各不相同。Linux内核提供了大量的系统调用,现在从系统 调用的基本原理出发探究Linux系统调用的方法。这是在一个用户进程中通过GNU C库进行的系统调用示意图,系 统调用通过同一个入口点传入内核。以i386体系结构为例,约定使用EAX寄存器标记系统调用。 当加载了系统C库调用的索引和参数时,就会调用0x80软件中断,它将执行system_call函数,这个函数按照EAX 寄存器内容的标示处理所有的系统调用。经过几个单元测试,会使用EAX寄存器的内容的索引查system_call_table表得到系统调用的入口,然后执行系统调用。从系统调用返回后,最终执行system_exit,并调用resume_userspace函数返回用户空间。 linux内核系统调用的核心是系统多路分解表。最终通过EAX寄存器的系统调用标识和索引值从对应的系统调用表 中查出对应系统调用的入口地址,然后执行系统调用。 linux系统调用并不单层的调用关系,有的系统调用会由

嵌入式Linux内核移植详解(顶嵌)

内核移植阶段 内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的,所以内核通常提供一种硬件抽象的方法来完成这些操作。硬件抽象隐藏了复杂性,为应用软件和硬件提供了一套简洁,统一的接口,使程序设计更为简单。 内核和用户界面共同为用户提供了操作计算机的方便方式。也就是我们在windows下看到的操作系统了。由于内核的源码提供了非常广泛的硬件支持,通用性很好,所以移植起来就方便了许多,我们需要做的就是针对我们要移植的对象,对内核源码进行相应的配置,如果出现内核源码中不支持的硬件这时就需要我们自己添加相应的驱动程序了。 一.移植准备 1. 目标板 我们还是选用之前bootloader移植选用的开发板参数请参考上文的地址: https://www.360docs.net/doc/1816783265.html,/thread-80832-5-1.html。bootloader移植准备。 2. 内核源码 这里我们选用比较新的内核源码版本linux-2.6.25.8,他的下载地址是 ftp://https://www.360docs.net/doc/1816783265.html,/pub/linux/kernel/v2.6/linux-2.6.25.8.tar.bz2。 3. 烧写工具 我们选用网口进行烧写这就需要内核在才裁剪的时候要对网卡进行支持 4. 知识储备 要进行内核裁剪不可缺少的是要对内核源码的目录结构有一定的了解这里进 行简单介绍。 (1)arch/: arch子目录包括了所有和体系结构相关的核心代码。它的每一个子 目录都代表一种支持的体系结构,例如i386就是关于intel cpu及与之相兼容体 系结构的子目录。PC机一般都基于此目录。 (2)block/:部分块设备驱动程序。 (3)crypto:常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验 算法。 (4) documentation/:文档目录,没有内核代码,只是一套有用的文档。 (5) drivers/:放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目 录:如,/block 下为块设备驱动程序,比如ide(ide.c)。 (6)fs/:所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持 一个文件系统, 例如fat和ext2。

嵌入式软件安全设计理念

嵌入式软件安全设计理念 嵌入式软件应用场合、硬件平台及操作系统的多样性,使嵌入式软件在各种不同条件下可能出现未知、不可预测的状况,即其潜在风险往往比通用PC机的软件要高。由于嵌入式软件应用场合特殊,往往在无人值守的情况下运行,高可靠性和安全性自然成为嵌入式系统的重要指标。在设计初期排查各种可能的风险,投入较低并可获得高回报。最终的产品质量也可以得到很好的控制。下面借鉴安全管理学思想,列举一些生活实例说明嵌入式软件设计的安全 嵌入式软件应用场合、硬件平台及操作系统的多样性,使嵌入式软件在各种不同条件下可能出现未知、不可预测的状况,即其潜在风险往往比通用PC机的软件要高。由于嵌入式软件应用场合特殊,往往在无人值守的情况下运行,高可靠性和安全性自然成为嵌入式系统的重要指标。 在设计初期排查各种可能的风险,投入较低并可获得高回报。最终的产品质量也可以得到很好的控制。下面借鉴安全管理学思想,列举一些生活实例说明嵌入式软件设计的安全理念。 1 围墙问题 学校修筑围墙,有一个问题——到底需要的高度是多少?过低,很容易翻越围墙进出,起不到围墙的屏障作用;过高,翻越的人滑落容易伤亡,这也不是修筑围墙的初衷。程序设计中的程序运行异常好比非法进出校园。一方面需要防止程序异常,这就类似修了围墙。但另一方面也需要注意围墙高度:围墙过高,轻易不出问题,但一出就是大问题。比如数据通信传输程序,加入CRC冗余校验。如果数据传输出现校验错误,CRC冗余校验可能恢复错误的数据。但是如果在设计测试初期就使用CRC校验,并且程序中没有警告信息,就有可能将错误延续到产品发布阶段。产品到现场出问题那就严重了。还有一个例子,看门狗程序是为了程序异常时自动重启恢复系统。如果在程序测试期间就使用看门狗,同样会屏蔽测试期间的程序跑飞、死机等问题,是不利于发现程序缺陷的。 2 修裤脚问题 给孩子买了条裤子,试穿后发现裤子长了些,于是很精确地测量出需要截去10cm。问题出现了,妈妈动手改好了之后,奶奶也给改短了10 cm,接下来的情景可想而知。这就是沟通问题,某成员在对某对象实施某行为的时候没有留下任何标记,使得其他成员未得到准确信息,带来下一步行为的失误。 程序设计中同样也有类似问题。比如某进程对一个临界资源进行访问,并且没有任何标记,如果另一进程也访问该资源就会造成资源访问的冲突。通过信号量互斥保护就可以解决这一问题。另一个例子是在内存申请和释放方面。比如函数funA()调用funB(),在funA()或funB()中动态申请一段内存空间,并且将指向该内存的指针传给另一函数,在funA()或funB()中都可以释放内存。但是一定注意,需要沟通在哪个函数里进行,尤其当这两个函数分别由两个人完成的时候。不能出现两个函数都释放该内存或都不释放该内存的情况。

linux内核IMQ源码实现分析

本文档的Copyleft归wwwlkk所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性,严禁用于任何商业用途。 E-mail: wwwlkk@https://www.360docs.net/doc/1816783265.html, 来源: https://www.360docs.net/doc/1816783265.html,/?business&aid=6&un=wwwlkk#7 linux2.6.35内核IMQ源码实现分析 (1)数据包截留并重新注入协议栈技术 (1) (2)及时处理数据包技术 (2) (3)IMQ设备数据包重新注入协议栈流程 (4) (4)IMQ截留数据包流程 (4) (5)IMQ在软中断中及时将数据包重新注入协议栈 (7) (6)结束语 (9) 前言:IMQ用于入口流量整形和全局的流量控制,IMQ的配置是很简单的,但很少人分析过IMQ的内核实现,网络上也没有IMQ的源码分析文档,为了搞清楚IMQ的性能,稳定性,以及借鉴IMQ的技术,本文分析了IMQ的内核实现机制。 首先揭示IMQ的核心技术: 1.如何从协议栈中截留数据包,并能把数据包重新注入协议栈。 2.如何做到及时的将数据包重新注入协议栈。 实际上linux的标准内核已经解决了以上2个技术难点,第1个技术可以在NF_QUEUE机制中看到,第二个技术可以在发包软中断中看到。下面先介绍这2个技术。 (1)数据包截留并重新注入协议栈技术

(2)及时处理数据包技术 QoS有个技术难点:将数据包入队,然后发送队列中合适的数据包,那么如何做到队列中的数

激活状态的队列是否能保证队列中的数据包被及时的发送吗?接下来看一下,激活状态的队列的 证了数据包会被及时的发送。 这是linux内核发送软中断的机制,IMQ就是利用了这个机制,不同点在于:正常的发送队列是将数据包发送给网卡驱动,而IMQ队列是将数据包发送给okfn函数。

Linux内核结构详解教程

Linux内核结构详解教程 ─────Linux内核教程 linux内核就像人的心脏,灵魂,指挥中心。 内核是一个操作系统的核心,它负责管理系统的进程,内存,设备驱动程序,文件和网络系统,决定着系统的性能和稳定性。内核以独占的方式执行最底层任务,保证系统正常运行。协调多个并发进程,管理进程使用的内存,使它们相互之间不产生冲突,满足进程访问磁盘的请求等等. 严格说Linux并不能称做一个完整的操作系统.我们安装时通常所说的Linux,是有很多集合组成的.应称为GNU/Linux. 一个Linux内核很少1.2M左右,一张软盘就能放下. 内容基础,语言简短简洁 红联Linux论坛是致力于Linux技术讨论的站点,目前网站收录的文章及教程基本能满足不同水平的朋友学习。 红联Linux门户: https://www.360docs.net/doc/1816783265.html, 红联Linux论坛: https://www.360docs.net/doc/1816783265.html,/bbs 红联Linux 论坛大全,所有致力点都体现在这 https://www.360docs.net/doc/1816783265.html,/bbs/rf/linux/07.htm

目录 Linux内核结构详解 Linux内核主要五个子系统详解 各个子系统之间的依赖关系 系统数据结构 Linux的具体结构 Linux内核源代码 Linux 内核源代码的结构 从何处开始阅读源代码 海量Linux技术文章

Linux内核结构详解 发布时间:2006-11-16 19:05:29 Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。

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

浅谈嵌入式系统的可靠性与安全性设计

浅谈嵌入式系统的可靠性与安全性设计 1 可靠性与安全性设计的两次重大变革 20世纪初,人类进入到电子时代,随着时代的变迁,电子系统出现了两次巨大的变革,即从传统电子到智能电子与从智能电子到网络电子的变革。前者是微控制器(MCU)诞生后,嵌入式系统带来的变革,后者是物联网时代智能电子系统普遍入网后带来的变革。传统电子时代,只有可靠性概念,没有安全性概念;智能电子时代,诞生了安全性包容设计;网络电子时代,电子系统的安全性设计提升到空前高度。传统电子时代,没有安全性设计概念,可靠性与安全性是统一的。因为,这一时期的电子系统只有正常与失效两种状态。正常即可靠,可安全使用;失效即无法工作,也无安全可言。 智能电子时代,由于有MCU 的介入,众多功能可由软件实现。软件介入后对系统的可靠性设计有两个重大影响:一个是软件介入后系统不可避免地出现失误,出现了正常、失效之间出错概率的多值可靠性;另一个是软件可主动实现系统的可靠性管理。前者引发了多值可靠性设计概念,后者帯来了可靠性控制的设计内容。这时的智能电子系统,借助于集成电路的不断进化、人工智能的可靠性控制与封闭的体系结构,无论是可靠性还是安全性都到达了空前高度。 网络电子时代,由于智能电子系统普遍具有网络接入功能,智能电子系统对外部开放的后果是,所有网络安全问题都会带入到智能电子系统中。病毒入侵、恶意攻击等网络犯罪成为网络电子系统的不安全

因素,安全性设计提升到空前高度。防入侵、防攻击成为网络电子系统安全性设计中不可或缺的重要内容。 下面以汽车电子为例,来描述电子系统可靠性、安全性设计的变革。老爷车时代,是传统电子时代,无论是仪表系统,还是发动机点火系统都只能由分立电子元件组成,其中任何一个元器件失效都会导致汽车瘫痪。电子工程师通过精心挑选每个元器件、可靠的电路设计与精心工艺制作,来保证系统的可靠性与安全性。 现代汽车时代是智能电子时代,在汽车电子中,高可靠的集成电路、分布式总线技术、实时多任务操作系统、软件的可靠性管理、重要组件的冗余技术等,保证了汽车电子系统高可靠地运行;还可以通过汽车运行中的各种工况监测(如发动机运行工况监测、车胎压力监测等),确保汽车的安全运行。 自动驾驶汽车时代是网络电子时代,每辆汽车都与互联网相连。人们在享受自动驾驶方便服务的同时,也带来了很多安全风险。病毒入侵、恶意攻击成为自动驾驶汽车电子系统的最大安全隐患,网络电子的安全性设计将成为主要设计内容。 2 嵌入式系统可靠性设计的基本概念 与传统电子的泛性结构不同,所有智能电子系统都含有归一化智力内核(微控制器)。由于嵌入式系统的软件介入,智能电子系统有了可主动出击的可靠性管理设计。这种主动的管理设计,既能保证智能电子系统达到安全、可靠的最佳状态,又能为网络电子系统安全性(防病毒入侵、恶意攻击)设计提供重要手段。因此,在讨论智能电子时

linux内核启动 Android系统启动过程详解

linux内核启动+Android系统启动过程详解 第一部分:汇编部分 Linux启动之 linux-rk3288-tchip/kernel/arch/arm/boot/compressed/ head.S分析这段代码是linux boot后执行的第一个程序,完成的主要工作是解压内核,然后跳转到相关执行地址。这部分代码在做驱动开发时不需要改动,但分析其执行流程对是理解android的第一步 开头有一段宏定义这是gnu arm汇编的宏定义。关于GUN 的汇编和其他编译器,在指令语法上有很大差别,具体可查询相关GUN汇编语法了解 另外此段代码必须不能包括重定位部分。因为这时一开始必须要立即运行的。所谓重定位,比如当编译时某个文件用到外部符号是用动态链接库的方式,那么该文件生成的目标文件将包含重定位信息,在加载时需要重定位该符号,否则执行时将因找不到地址而出错 #ifdef DEBUG//开始是调试用,主要是一些打印输出函数,不用关心 #if defined(CONFIG_DEBUG_ICEDCC)

……具体代码略 #endif 宏定义结束之后定义了一个段, .section ".start", #alloc, #execinstr 这个段的段名是 .start,#alloc表示Section contains allocated data, #execinstr表示Section contains executable instructions. 生成最终映像时,这段代码会放在最开头 .align start: .type start,#function /*.type指定start这个符号是函数类型*/ .rept 8 mov r0, r0 //将此命令重复8次,相当于nop,这里是为中断向量保存空间 .endr b 1f .word 0x016f2818 @ Magic numbers to help the loader

Linux内核分析-网络[五]:网桥

看完了路由表,重新回到netif_receive_skb ()函数,在提交给上层协议处理前,会执行下面一句,这就是网桥的相关操作,也是这篇要讲解的容。 view plaincopy to clipboardprint? 1. s kb = handle_bridge(skb, &pt_prev, &ret, orig_dev); 网桥可以简单理解为交换机,以下图为例,一台linux机器可以看作网桥和路由的结合,网桥将物理上的两个局域网LAN1、LAN2当作一个局域网处理,路由连接了两个子网1.0和2.0。从eth0和eth1网卡收到的报文在Bridge模块中会被处理成是由Bridge收到的,因此Bridge也相当于一个虚拟网卡。 STP五种状态 DISABLED BLOCKING LISTENING LEARNING FORWARDING 创建新的网桥br_add_bridge [net\bridge\br_if.c] 当使用SIOCBRADDBR调用ioctl时,会创建新的网桥br_add_bridge。 首先是创建新的网桥: view plaincopy to clipboardprint?

1. d ev = new_bridge_dev(net, name); 然后设置dev->dev.type为br_type,而br_type是个全局变量,只初始化了一个名字变量 view plaincopy to clipboardprint? 1. S ET_NETDEV_DEVTYPE(dev, &br_type); 2. s tatic struct device_type br_type = { 3. .name = "bridge", 4. }; 然后注册新创建的设备dev,网桥就相当一个虚拟网卡设备,注册过的设备用ifconfig 就可查看到: view plaincopy to clipboardprint? 1. r et = register_netdevice(dev); 最后在sysfs文件系统中也创建相应项,便于查看和管理: view plaincopy to clipboardprint? 1. r et = br_sysfs_addbr(dev); 将端口加入网桥br_add_if() [net\bridge\br_if.c] 当使用SIOCBRADDIF调用ioctl时,会向网卡加入新的端口br_add_if。 创建新的net_bridge_port p,会从br->port_list中分配一个未用的port_no,p->br会指向br,p->state设为BR_STATE_DISABLED。这里的p实际代表的就是网卡设备。 view plaincopy to clipboardprint? 1. p = new_nbp(br, dev); 将新创建的p加入CAM表中,CAM表是用来记录mac地址与物理端口的对应关系;而刚刚创建了p,因此也要加入CAM表中,并且该表项应是local的[关系如下图],可以看到,CAM表在实现中作为net_bridge的hash表,以addr作为hash值,链入 net_bridge_fdb_entry,再由它的dst指向net_bridge_port。

嵌入式系统的安全与实现

2007.9(中旬刊) 在嵌入式系统的开发过程中,安全性问题一般最后才被考虑。嵌入系统的设计人员在设计时往往以产品的快速上市为目标,而将安全性问题留待最后或将来的版本升级时解决。这也不无道理,因为高级别的安全性会增加产品的成本,并延迟上市时间。 有些情况下,嵌入式系统一开始就需要高级别的安全性。例如:金融部门的销售终端对嵌入式系统安全性提出了严格的要求。在其他情况下,安全性设计被用来保护嵌入系统开发公司本身利益。安全应用则能有效的阻止逆向工程设计,防止产品被仿制。 一、嵌入式系统的安全 1.数据的安全 嵌入式系统内部的数据信息安全,可通过各种成熟的加密算法和密钥管理程序来实现,所以加密算法和密钥管理程序的选择很关键,它直接决定着数据的安全。加密环节的强度,可通过密钥的长度来实现。这些是设计人员考虑得最多的问题,因而数据安全常常并不是安全应用中的薄弱环节。 2.密钥安全 安全性不仅仅取决于加密环节。设想这样一种场景,张三和李四各有一部只能彼此通信的安全电话。电话的加密措施牢不可破,即使使用当今世界所有的计算能力,也需要一个世纪才能破解。那么,薄弱环节在哪儿呢?电话!如果攻击者控制了其中的一个电话,他或她就可以佯装张三或李四,立刻得到他们的秘密信息。攻击者甚至用不着偷电话,只要趁张三或李四不觉,简单地安装一个窃听装置就可以了。 在此场景中,加密措施并未被攻破,而是执行加密的设备,或者“密钥”,安全性被轻而易举地攻破了。在嵌入式系统中,密钥通常是一个很大的密码,被加密程序用来加密信息或认证数据。所以,一个安全嵌入式系统最为重要的工作就是保护该密钥。如果系统遭到攻击,必须清除该密钥,防止其落入攻击者之手。密钥的破坏使设备无法工作,避免攻击者获取敏感信息,例如银行帐号和密码。 为保证密钥的安全性,密钥应永不离开嵌入式系统的边界,否则就为攻击者攻破设备的安全屏障提供了捷径。设计专门的存储器保存密钥的做法不可取,因为微控制器和存储器之间的通信是可见的。最安全的做法是使密钥停留在处理器内部,并用它实现数据的加密和认证。这就是说,系统微控制器需要有内部的非易失存储器。 3.IC引线和塑料封装的安全 即使密钥数据只保存在微控制器中,攻击者还是有可能发现安全信息。例如,如果攻击者可以访问微控制器地址和数据总线,他就可以通过插入指令的办法使密钥数据暴露于外部I/O口。 更高级的攻击者还可以移除微控制器的塑料封装,使用微探针读取内部存储器的内容。所以,安全系统需要采取措施阻止这种访问,甚至在必要时令微控制器擦除其存储器内容。应对这一安全挑战的一个简单方法是将整个“敏感区域”(例如微控制器、时钟和存储器)密封在某种足够牢靠的材料内,可能需要将印制板上的一块区域用塑料填充或用金属罩覆盖。感应线装置可以用来感测高温或外壳的移动。 二、嵌入式系统的实现 由于目前很多文章对加密算法和密钥管理程序设计讨论颇多,在此就不再讨论它的实现问题,而将重点放在后两个问题上。 要解决密钥及IC引线和塑料封装的安全,最好的方法是在IC制造时就予以考虑和实现。这有利于降低设计人员的设计强度、提高安全性和降低制造难度和成本。如:Dallas公司生产的DS5250芯片。它可以协助设计者实现高度安全的系统。 DS5250芯片介绍: 1.使用NVSRAM存储敏感信息和密钥 它利用一个很小的廉价电池供电,就可以使关键数据保持长达数年时间。一旦芯片的入侵侦测电路被触发,关键数据也极易被瞬间擦除。 2.电池供电的入侵侦测 DS5250有多个电池供电的入侵传感器。无需微控制器处于活动状态即可对入侵事件作出反应。利用其片上温度和电压传感器,DS5250可以侦测故障注入攻击手段。当工作电压或温度超出微控制器工作范围,DS5250立即清除其内部NVSRAM。这种机制消除了攻击者获取任何密钥数据的机会。 3.塑料封装入侵侦测 为阻止对NVSRAM单元的微探针探测,DS5250的硅片顶层设置了一层超细网格。如果网格线被短路,DS5250即触发自毁,清除密钥数据。DS5250还提供了允许外电路触发自毁的输入。这样系统可以实现多层保护。 4.加密的代码空间 最初装载系统时,DS5250使用一个随机生成的3DES密钥将指令代码加密后再存储到外部存储器中。这可避免攻击者向DS5250加入恶意代码并运行之,也可阻止对应用进行逆向工程及设备非法仿制。代码中可加入完整性检查,以侦测攻击者改变程序代码的企图。 从上面的叙述中我们已经看到,想获取DS5250中密钥并非易事。 三、结束语 安全系统设计是一富有挑战性的工作。而要强化已有设计的安全性更难。密钥保护是安全系统设计中最关键的部分。通过专门有密钥保护设计的芯片,可为敏感数据提供最高安全等级的保护。 参考文献: [1]瓦伊德著.嵌入式系统设计.北航大学出版社,2004.9. [2]DALLAS著.DALLASMAXIMEngineeringJournal.NO.59.2007.3. [3]DALLAS著.DS5250High-SpeedSecureMicrocontroller.2007.3. 嵌入式系统的安全与实现 □蔡红辉 (湖北交通职业技术学院(西区)湖北?武汉430050) 摘要本文讨论了容易被人们忽视的嵌入式系统的安全问题,并给出了一种简单的实现方法,可提高嵌入式系统的安全等级。 关键词嵌入式系统密钥封装安全 中图分类号:G201文献标识码:A文章编号:1672-7894(2007)09-217-01 理工科研 217

史上最全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设备控制器

基于ARM的嵌入式linux内核的裁剪与移植.

基于ARM的嵌入式linux内核的裁剪与 移植 0引言微处理器的产生为价格低廉、结构小巧的CPU和外设的连接提供了稳定可靠的硬件架构,这样,限制嵌入式系统发展的瓶颈就突出表现在了软件方面。尽管从八十年代末开始,已经陆续出现了一些嵌入式操作系统(比较著名的有Vxwork、pSOS、Neculeus和WindowsCE)。但这些专用操作系统都是商业化产品,其高昂的价格使许多低端产品的小公司望而却步;而且,源代码封闭性也大大限制了开发者的积极性。而Linux的开放性,使得许多人都认为Linu 0 引言 微处理器的产生为价格低廉、结构小巧的CPU和外设的连接提供了稳定可靠的硬件架构,这样,限制嵌入式系统发展的瓶颈就突出表现在了软件方面。尽管从八十年代末开始,已经陆续出现了一些嵌入式操作系统(比较著名的有Vxwork、pSOS、Nec uleus和Windows CE)。但这些专用操作系统都是商业化产品,其高昂的价格使许多低端产品的小公司望而却步;而且,源代码封闭性也大大限制了开发者的积极性。而Linux的开放性,使得许多人都认为Linux 非常适合多数Intemet设备。Linux操作系统可以支持不同的设备和不同的配置。Linux对厂商不偏不倚,而且成本极低,因而很快成为用于各种设备的操作系统。嵌入式linux是大势所趋,其巨大的市场潜力与酝酿的无限商机必然会吸引众多的厂商进入这一领域。 1 嵌入式linux操作系统 Linux为嵌入操作系统提供了一个极有吸引力的选择,它是个和Unix 相似、以核心为基础、全内存保护、多任务、多进程的操作系统。可以支持广泛的计算机硬件,包括X86、Alpha、Sparc、MIPS、PPC、ARM、NEC、MOTOROLA 等现有的大部分芯片。Linux的程序源码全部公开,任何人都可以根据自己的需要裁剪内核,以适应自己的系统。文章以将linux移植到ARM920T内核的 s3c2410处理器芯片为例,介绍了嵌入式linux内核的裁剪以及移植过程,文中介绍的基本原理与方法技巧也可用于其它芯片。 2 内核移植过程 2.1 建立交叉编译环境 交叉编译的任务主要是在一个平台上生成可以在另一个平台上执行的程序代码。不同的CPU需要有不同的编译器,交叉编译如同翻译一样,它可以把相同的程序代码翻译成不同的CPU对应语言。 交叉编译器完整的安装涉及到多个软件安装,最重要的有binutils、gcc、glibc三个。其中,binutils主要用于生成一些辅助工具;gcc则用来生成交叉编译器,主要生成arm—linux—gcc交叉编译工具;glibc主要是提供用户程序所使用的一些基本的函数库。 自行搭建交叉编译环境通常比较复杂,而且很容易出错。本文使用的是

实例解析linux内核I2C体系结构(2)

实例解析linux内核I2C体系结构(2) 华清远见刘洪涛四、在内核里写i2c设备驱动的两种方式 前文介绍了利用/dev/i2c-0在应用层完成对i2c设备的操作,但很多时候我们还是习惯为i2c设备在内核层编写驱动程序。目前内核支持两种编写i2c驱动程序的方式。下面分别介绍这两种方式的实现。这里分别称这两种方式为“Adapter方式(LEGACY)”和“Probe方式(new style)”。 (1)Adapter方式(LEGACY) (下面的实例代码是在2.6.27内核的pca953x.c基础上修改的,原始代码采用的是本文将要讨论的第2种方式,即Probe方式) ●构建i2c_driver static struct i2c_driver pca953x_driver = { .driver = { .name= "pca953x", //名称 }, .id= ID_PCA9555,//id号 .attach_adapter= pca953x_attach_adapter, //调用适配器连接设备 .detach_client= pca953x_detach_client,//让设备脱离适配器 }; ●注册i2c_driver static int __init pca953x_init(void) { return i2c_add_driver(&pca953x_driver); } module_init(pca953x_init); ●attach_adapter动作 执行i2c_add_driver(&pca953x_driver)后会,如果内核中已经注册了i2c适配器,则顺序调用这些适配器来连接我们的i2c设备。此过程是通过调用i2c_driver中的attach_adapter方法完成的。具体实现形式如下: static int pca953x_attach_adapter(struct i2c_adapter *adapter) { return i2c_probe(adapter, &addr_data, pca953x_detect); /* adapter:适配器 addr_data:地址信息 pca953x_detect:探测到设备后调用的函数 */ } 地址信息addr_data是由下面代码指定的。 /* Addresses to scan */ static unsigned short normal_i2c[] = {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,I2C_CLIENT_END}; I2C_CLIENT_INSMOD;

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

相关文档
最新文档