当前位置:文档之家› Linux内核空间与用户空间通信机制的研究

Linux内核空间与用户空间通信机制的研究

Linux内核空间与用户空间通信机制的研究
Linux内核空间与用户空间通信机制的研究

Linux内核空间与用户空间通信机制的研究

Linux kernel space and user space communication

mechanism

摘要

Linux是一个源码开放的操作系统,无论是普通用户还是企业用户都可以编写自己的内核代码,再加上对标准内核的裁剪从而制作出适合自己的操作系统,深受大家喜爱。Linux系统中,在使用虚拟内存技术的多任务系统上,内核和用户有不同的地址空间,因此,在内核与用户之间进行数据交换需要专门的机制来实现。一个或多个内核模块的实现并不能满足一般Linux 系统软件的需要,因为内核的局限性太大,内核空间与用户空间进程通信的方法就显得尤为重要。本文将列举几种内核态与用户态进程通信的方法:Netlink通信机制,基于文件系统的通信机制,内核启动参数通信机制,并用实验板对几种重要的通信机制进行验证,详细分析它们的实现和适用环境,优缺点,并做出比较。提供用户适合使用这种通信机制的环境,以便更好的运用Linux操作系统。

关键字内核空间用户空间地址空间

ABSTRACT

Linux is an open source operating system, whether ordinary users or business users can write your own kernel code, with the modification of the standard kernel,everyone can make up their own operating system, which makes Linux popular.In Linux systems, in the use of multi-tasking system with virtual memory technology, the kernel and the user have different address spaces, so the change of data between kernel and user needs Special Method to achieve. One or more kernel modules can not meet the general needs of Linux system software, just because the limitations of the kernel, make it important that the process communication method between kernel space and user space. In this article I will list some kernel mode and user mode process communication methods: Netlink communication mechanism, communication mechanism based on the file system, the kernel boot parameters of communication mechanism.

I will analysis of their implementation, application environment, the advantages and disadvantages in detail, and make the comparison. I will provide users with suitable environment for each communication mechanism in order to let others make good use of Linux operating system.

Keywords kernel space user space address spaces

目录

第一章绪论 (1)

1.1操作系统发展史 (1)

1.2选题背景及研究意义 (2)

1.3主要工作 (2)

第二章内核空间与用户空间通信机制概述 (4)

2.1L INUX嵌入式操作系统简介 (4)

2.2课题研究所需知识点解释 (4)

2.3内核空间与用户空间通信概述 (5)

第三章用户空间与内核空间通信机制 (9)

3.1N ETLINK通信机制 (9)

3.2基于文件系统的通信机制 (14)

3.3内核启动参数通信机制 (22)

第四章典型通信机制的验证 (24)

4.1验证环境简介 (24)

4.2N ETLINK通信机制 (24)

4.3 PROCFS通信使用方法 (27)

4.4系统调用的使用方法 (29)

第五章结论 (32)

5.1九种通信机制总结 (32)

致谢 (33)

参考文献 (34)

第一章绪论

1.1 操作系统发展史

操作系统的发展历程和计算机硬件的发展历程是密切相关的。从1946年诞生电子计算机以来,计算机的每一代进化都以减少成本、缩小体积、降低功耗、增大容量和提高性能作为目标,随着计算机硬件的发展,同时也加速了操作系统的形成和发展。

操作系统是人与计算机交互的界面,是各种应用程序共同的平台。有了操作系统,一方面很好的实现了程序的共用,另一方面也方便了对计算机硬件资源的管理。随着计算机技术和大规模集成电路的发展,微型计算机迅速发展起来。从20世纪70年代中期开始出现了计算机操作系统。

1976年,美国DIGITAL RESEARCH软件公司研制出8位的CP/M操作系统。这个系统允许用户通过控制台的键盘对系统进行控制和管理,其主要功能是对文件信息进行管理,以实现硬盘文件或其他设备文件的自动存取。此后出现的一些8位操作系统多采用CP/M结构。

计算机操作系统的发展经历了两个阶段。第一阶段为单用户、单任务的操作系统,典型代表为MS-DOS,它是在IBM-PC及其兼容机上运行的操作系统,它起源于SCP86-DOS,是1980年基于8086微处理器而设计的单用户操作系统。后来,微软公司获得了该操作系统的专利权,配备在IBM-PC机上,并命名为PC-DOS。1981年,微软的MS-DOS 1.0版与IBM的PC面试,这是第一个实际应用的16为操作系统。从此,微型计算机进入了一个新纪元。1987年,微软发布的MS-DOS 3.3版本是非常成熟可靠的DOS版本,微软据此取得个人操作系统的霸主地位。

随着社会的发展,早期的单用户操作系统已经远远不能满足用户的要求,各种新型的现代操作系统犹如雨后春笋一样出现了。现代操作系统是计算机操作系统发展的第二个阶段,它是以多用户多道作业和分时为特征的系统。其典型代表UNIX、Windows、Linux、OS/2等操作系统。

Unix虽然优秀,但因为它的昂贵和后期的操作系统不再提供源代码,让人对它多有不满;而Windows虽然大众化,操作简单,但它的低安全性和闭源性,让许多专业计算机人员对之愤愤不平。这就导致了Minix的诞生,尽管它并不算是优秀的操作系统,但是它提供源代码,它是Unix的克隆。因为Minux坚持不扩展,后来大二的学生Linux Torvalds

开发了Linux系统。Linux操作系统是目前全球最大的一个自由软件,它是一个可与商业Unix和微软Windows系列相媲美的操作系统,具有诸多功能,如完备的网络应用等。

芬兰人Linux Torvalds开发了Linux操作系统,并将其源程序公布在Internet上,这带动了无数计算机爱好者的开发热情,许多人从网上下载Linux源程序,按照自己的需求完善某一方面的功能,再发布到网上,因此被不断地完善成为一个全球最稳定的、最有发展前景的操作系统。经过长期不断的发展,Linux操作系统已经发展得相当成熟,并且在科研、教育、政府、商业以及个人方面被广泛应用,且深受大家喜爱。

1.2 选题背景及研究意义

Linux是一个源码开放的操作系统,无论是普通用户还是企业用户都可以编写自己的内核代码,再加上对标准内核的裁剪从而制作出适合自己的操作系统。目前有很多中低端用户使用的网络设备的操作系统都是从标准Linux改进而来的,这也说明了有越来越多的人正在加入到Linux内核开发团体中。

一般地,在使用虚拟内存技术的多任务系统上,内核和应用有不同的地址空间,因此,在内核和应用之间以及在应用与应用之间进行数据交换需要专门的机制来实现。

由于内核的局限性太大,导致一个或多个内核模块的实现很难满足一般Linux 系统软件的需要,不能做大延时的处理,以及不能在终端上打印是它主要的缺点。但是这些需求在我们正常工作中是必不可少的,因此我们就需要将数据从内核态采集出来,并传送到用户态的一个或多个进程中,再进行处理。实现这一技术,研究内核态与用户空间进程通信的方法便是重中之重。然而,在Linux 的内核发行版本中并没有对该类通信方法进行详细的介绍,也没有其他文章对其进行总结,所以我的论文将列举几种内核态与用户态进程通信的方法,并详细分析它们的实现和适用环境,并作出比较。

1.3 主要工作

随着互联网应用的蓬勃发展,基于Linux操作系统开发的应用软件也越来越多。许多应用都需要实现内核进程与用户进程之间互相通信。一般地,Linux系统在使用虚拟内存技术的多任务时,系统将分配不同的地址空间给内核和应用,因此,我们需要专门的通信机制来实现内核和应用之间以及应用与应用之间的数据交换。众所周知,进程间通信(IPC)机制就是为实现应用与应用之间的数据交换而专门实现的。对于进程间通信,大部分计算机爱好者了解,但对于应用与内核之间的数据交换机制,大家却很陌生。因此,在这篇论文中,我将详细介绍Linux系统下内核与应用进行数据交换的各种方式,包括内核启动

参数、模块参数与sysfs、sysctl、系统调用、Netlink、procfs、seq_file、debugfs和relayfs。

第二章内核空间与用户空间通信机制概述

2.1 Linux嵌入式操作系统简介

2.2.1.Linux的通信机制

在linux嵌入式操作系统环境中,通信可以是内核模块间通信,可以是用户间通信,也可以是用户—内核间的通信,而本文将介绍的是用户—内核间的通信机制。

内核空间与用户空间地址映射机制的不同和内核的保护机制是导致内核空间与用户

空间需要专门的机制进行通信的原因。要了解内核空间和用户空间的通信机制,首先要了解一些概念。

为了使得虚拟地址与线性地址总是一致,Linux简化了分段机制,使Linux的虚拟地址空间也为0-4G。Linux内核将这4G字节的空间分为两部分。将较低的3G字节(0–3G,从虚拟地址0x00000000到0xBFFFFFFF)作为“用户空间”,供各个进程使用。而将最高的1G字节(3–4G,从虚拟地址0xC0000000到0xFFFFFFFF)作为“内核空间”,供内核使用。当一个任务(进程)执行系统调用从而并执行内核代码时,我们认为该任务(进程)处于内核态。此时处理器在内核代码中执行命令,并为最高的特权级(0级)。当任务(进程)在内核空间执行命令时,被执行的内核代码便会使用该任务(进程)的内核栈,每个任务(进程)都拥有专门的内核栈。当一个任务(进程)执行用户自己的代码时,我们认为该任务(进程)处于用户态。此时处理器在用户代码中运行,并处在最低的特权级(3级)。中断处理程序使用当前进程的内核栈,所以当正在执行的用户程序被中断程序突然中断时,我们也认为该用户程序处于进程的内核态。

内核空间和用户空间是操作系统理论的基础之一,即内核功能模块运行在内核空间,而应用程序运行在用户空间。现代的CPU都具有不同的操作模式,代表不同的级别,不同的级别具有不同的功能,在较低的级别中将禁止某些操作。Linux系统设计时利用了这种硬件特性,使用了两个级别,最高级别和最低级别,内核运行在最高级别(内核态),这个级别可以进行所有操作,而应用程序运行在较低级别(用户态),在这个级别,处理器控制着对硬件的直接访问以及对内存的非授权访问。内核态和用户态有自己的内存映射,即自己的地址空间。

2.2 课题研究所需知识点解释

2.2.1 Linux内核体系结构

Linux出于清晰性、兼容性、可移植性、健壮性和安全性以及速度方面的考虑,采用

单内核的设计,但为了方便移植和维护,加入了微内核的设计概念,具体的是采用了模块的方法。但内核是一个很大的进程。它的内部又可以被分为若干模块(或者称为层次或其他)。但是在运行的时候,它是一个独立的二进制大映象。其模块间的通讯是通过直接调用其他模块中的函数实现的,而不是消息传递。用户程序通过系统调用来使用核心提供的服务,其内核的动作对于应用程序是不可知的。实际上用户的程序并不直接和内核通讯(这样做毫无意义),而是通过libc(标准c库)和内核通信的,这样更容易而且易于程序编写。由于这种内核体系,Linux的进程以系统调用接口为界,分为了用户态的运行和内核态的运行。

2.2.2 用户模式和内核模式

Intel CPU有4个优先级,ring0-ring3。操作系统运行在ring0,用户程序运行在ring3。运行在ring0的程序可以对所有的硬件资源进行控制,而运行在ring3的对资源的控制受到一些限制。内核模式驱动运行在ring0,而用户模式运行在ring3。

硬件系统为内核模式提供了尽可能地内存保护及其他安全措施。而用户进程不能直接存取系统核心,保证了核心的安全。在X86平台下,核心态和用户态的区分主要是通过段选择子确定的,具体来说,在linux环境下,核心态的代码段选择子为0x10,数据段选择子为0x18;而用户态的代码段选择子为0x23,数据态选择子为0x2B,因此核心态程序工作在ring0,而用户态程序工作在ring3。这里有两个术语是内核空间(kernel space)和用户空间(user space),它们分别对应内核保留的内存和用户进程保留的内存。当然,多进程的用户也经常同时运行,而且各个进程之间通常不会共享他们的内存,但是,任何一个用户进程使用的内存都称为用户空间。内核在某一时刻通常只和一个用户进程交互,因此实际上不会引起任何混乱。由于这些内存空间是相互独立的,用户进程根本不能直接访问内核空间,内核也只能通过put_user和get_user宏和类似的宏才可以访问用户空间。用户空间和内核空间的交互通过系统调用来频繁的实施。

2.2.3套接字的概念

多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了成为套接字(Socked)的接口。

2.3内核空间与用户空间通信概述

2.3.1内核代码不同运行环境通信的原理分析

Linux内存保护机制是导致内核空间与用户空间需要专门的机制进行通信的原因。

内核代码运行环境:

运行在用户上下文环境中的代码是可以阻塞的,我们往往使用消息队列和UNIX 域套接字来实现内核态与用户态的通信。但这些方法有很多缺点,如数据传输效率比较低,因此不能被Linux操作系统采纳。为实现内核态与用户态数据的交互,Linux内核提供了两个函数如下:

copy_from_user()/copy_to_user()

但这两个函数同样也会引发阻塞,所以这两个函数在软、硬中断中也不能使用。为解决这一难题,我们在类似于系统调用一类的函数中应用这两个特殊拷贝函数,类似于系统调用的函数在使用中通常可以在内核空间与用户空间被方便的调用。其原理路如图如下:用户态进程内核态程序

此处内核态通过参数获取用

户空间内存区指针,再由

copy_from_user()/copy_to

_user()函数来读写用户空

间的内存区

图2.1 进程上下文环境内核与用户通信原理图

图2.1中,用户态进程调用系统调用陷入到内核态执行内核代码(当前进程上下文),内核代码通过系统调用传入的用户参数进行具体的数据交互过程。其中相关的系统调用是需要用户自行编写并载入内核。其中后文涉及的7种基于文件系统的通信机制均由此原理

实现。

2.3.3中断上下文环境

用户空间使用的函数为copy_from_user()/copy_to_user() 。但是由于该函数在用户空间数据出现缺页的情况下会引起阻塞,所以以上两个函数不能直接用于中断上下文环境的内核程序与用户空间通信。为了克服这个缺点,中断上下文环境中使用另一套同步机制--自旋锁(spinlock )来完成中断环境与内核线程的同步。内核线程是运行在有进程上下文环境中的,这样为了采集用户空间的数据,我们可以在内核线程中使用套接字或消息队列来,然后再将数据通过临界区传递给中断过程。其原理图如下:

图2.2 中断环境内核使用内核线程与用户通信原理

用户态进程内核线程

中断过程进程发送数据

临界区

(使用自旋锁使内

核线程与

中断过程

同步)中断过程发送数据

此种方法是对进程上下文环境内核与用户通信的一个延伸,也是基于上一种方法

的。但是这样因为内核线程是和其他用户态进程竞争CPU 接收数据的,所以数据传输速率低。于是提出了Netlink 的实现机制。原理如下图的:

中断过程图2.3 中断环境内核使用软中断与用户通信原理

用户态进程软中断

进程发送数据临界区

(使用自旋锁使软

中断与中断过程同

步)中断过程发送数据

数据传输使用软中断而不是内核线程作为中间机制,这样明显提高了数据接收的实时性,不会存在进程抢占CPU 的情况,也加快了数据传输速率。

注意:使用软中断机制来处理大批量的数据同时也会带来负面影响,由于中断的长期占据CPU 会影响系统的调度力度,所以建议,使用软中断来处理优先级高或者数据量少的消息,对于优先级低的大量数据用户可以使用软中断唤醒一个内核线程来处理。这样可以使系统性能最佳。

2.3.4 Linux 应用与内核之间的数据交换机制

Linux 系统提供给用户用于实现应用与内核之间的数据交换的机制有:

内核启动参数、Netlink 、模块参数与 sysfs 、sysctl 、系统调用、procfs 、seq_file 、debugfs 和relayfs 九种。其中后七种方式是基于文件系统的,当然Netlink 也是基于文件系统,但是其实现机制很特殊,有别于后七种方式,所以单独列为一种。内核启动参数也是特殊的一类特殊的通信方式,它主要用于控制内核启动行为,一般的应用程序开发者不会用到此种方法。

第三章 用户空间与内核空间通信机制

3.1 Netlink 通信机制

3.1.1概述

Netlink 是一种特殊的套接字,它是 Linux 所特有的,类似于BSD 中的AF_ROUTE 但又远比它的功能强大。

在内核与用户应用间进行双向数据传输的非常好的方式便是Netlink 。在使用时,用户态使用标准的 socket API 即可,内核态需要使用专门的内核 API ,就可以使用 Netlink 提供的强大功能

3.1.2 Netlink 基本原理

目前,Netlink 套接字通信机制使用广泛,在 Linux 2.4 版以后版本的内核中,几乎全部的中断过程与用户态进程的通信都是使用 Netlink 套接字实现的,同时还使用 Netlink 来实现 ip 队列工具,但 ip 队列的使用具有局限性,不能用于任何中断过程。

我们通常用对应某进程的标识,即定为该进程的 ID 号,来作为Netlink 套接字的通信依据。当通信的一方正处于中断过程时,该标识为 0。当使用 Netlink 套接字进行通信,通信的双方都是用户态进程,则使用方法类似于消息队列。但通信双方有一端是中断过程,使用方法则不同。对中断过程的支持是Netlink 套接字通信机制的最大特点,为完成内核空间接收用户空间数据,Netlink 套接字通信机制使用另一个软中断调用用户事先指定的接收函数,而不再需要用户自行启动一个内核线程。其工作原理如图

中断过程

用户态进程软中断进程发送数据

中断过程发送数据

临界区

(使用自

旋锁来使

内核线程

与中断过

程同步)

图3.1 内核空间使用netlink 与用户空间通信示意图

如图所示,使用Netlink套接字通信机制来完成内核空间与用户空间的通信时,为了保证数据接收的实时性,我们使用了软中断,而不是内核线程。

当Netlink套接字用于内核空间与用户空间的通信时,在用户空间的创建方法和一般套接字的使用类似,但内核空间的创建方法则不同,下图是Netlink套接字实现此类通信时创建的过程:

图3.2 netlink通信建立流程

用户空间使用Netlink:

用户态应用使用标准的socket APIs,socket(), bind(), sendmsg(), recvmsg() 和close() 就能很容易地使用Netlink socket。其一般流程如下图:

图3.3 用户使用netlink流程图

内核空间使用Netlink:

其一般流程如下图:

图3.4 内核使用netlink流程图

3.1.3 应用场景

Netlink应用场景广泛,不仅可以用于用户进程间的通信,用户与处于进程上下文环境的内核态通信,更重要是其支持中断环境下内核与用户的通信。在Linux 2.4 版以后版

本的内核中,几乎全部的中断过程与用户态进程的通信都是使用Netlink 套接字实现的,同时还使用Netlink实现了ip queue工具。

Netlink是一个异步双工的通信方式,内核可以主动向用户空间发送数据。同时Netlink 内核模块与用户程序之间并无依赖关系,只要开发者遵从Netlink所提供的协议进行编程即可。

3.1.4特点及优缺点

Netlink 的特点是对中断过程的支持,也就是说,可以在中断程序中直接调用Netlink 相关函数。它在内核空间接收用户空间数据时不再需要用户自行启动一个内核线程,而是通过另一个软中断调用用户事先指定的接收函数。

Netlink相对于系统调用,ioctl以及/proc文件系统而言具有以下优点:

1.应用方法简单。为了使用Netlink,用户仅需要在include/linux/Netlink.h 中增加一个新类型的Netlink协议定义,然后,内核和用户态应用就可以立即通过socket API 使用该Netlink协议类型进行数据交换。但系统调用需要增加新的系统调用,ioctl需要增加设备或者文件,必须需要很多代码,proc 文件系统则需要在/proc 下建立新的文件或者目录,本来就混乱的/proc将被改造的更加混乱。

2. Netlink是一种异步通信机制,socket缓存队列中保存了内核与用户态应用之间传递的消息,接收者的socket的接收队列负责保存发送的消息,就可以避免接受者等待消息,但系统调用和ioctl却是同步通信机制,如果传递的数据过长,将影响调度的粒度。

3.采用模块的方式实现可以Netlink的内核部分的使用,使用Netlink 的应用部分和内核部分相对没有编译时的依赖,有依赖的是系统调用,而且若要实现新的系统调用必须静态的连接内核,无法在模块中被实现,且新系统调用的应用在编译时会依赖内核。

4.Netlink支持多播,一个Netlink组可以收到内核模块或应用的多播消息,该消息可以被该Netlink组的任何内核模块或应用接收到,内核里的事件对用户态的通知机制就应用了这一特性,该子系统会发送给对内核事件感兴趣的应用以内核事件。

5.内核可以使用Netlink优先发起通话,但系统调用和ioctl 只能被用户应用发起以及调用。

6.Netlink应用标准的socket API,因此容易应用,但系统调用和ioctl则需要进行专门的培训。

缺点:暂无

3.2 基于文件系统的通信机制

基于文件系统来实现内核与用户数据交互的原理大致相同,其共同原理如下图:

图3.5 基于文件系统的通信原理图

此种模型是基于文件系统的,其中procfs是比较古老的文件系统,它的初衷是用来出口内核信息给用户,譬如进程信息,文件系统信息,系统各种设备有关信息等等,它也允许动态模块在其目录下创建特殊文件来出口模块信息,所以很有一段时间被应用程序广泛运用和依赖,导致其内容混乱不堪。其中sysfs,seq_file,sysctl都是由于procfs的这个原因而出现的,他们都有自己特定的运用场景,例如sysfs主要用于出口模块参数,而sysctl 主要用于设定模块参数,Seq_file是用格式化输出proc下的大文件(超过一个页面的文件)。

debugfs主要在内核调试时使用,用于出口调试信息和修改调试信息,它一个很小的文件系统,当然功能也很单一。

后文中将讲述的伪设备方式,其实是用户自行编写一个伪字符设备,然后用户空间通过对该设备的读写来实现内核与用户空间数据交互的目的,此种方法比较灵活,甚至可以完成零拷贝的消息传递。但也有其局限性,其中用户与内核的同步便是最主要的问题,用户若是希望使用其完成复杂的通信工作,须自行编写互斥协议来协调收发者之间的时序。

Relayfs主要是用于内核快速转发大量数据到用户空间,其使用机制比较复杂,后文中将较为详细的阐述其原理和方式。

3.2.1 procfs

3.2.1.1概述

procfs 是比较老的一种用户态与内核态的数据交换方式,内核的很多数据都是通过这种方式出口给用户的,内核的很多参数也是通过这种方式来让用户方便设置的。除了sysctl 出口到/pro c 下的参数,procfs 提供的大部分内核参数是只读的。实际上,很多应用都严重地依赖于procfs ,因此它几乎是必不可少的组件。

3.2.1.2 procfs 应用场景

procf s 对一般的内核与用户通信的应用都能实现。尤其是在进程上下文的环境中内核与用户的的通信,只要内核使用了procfs 提供的API 将自己的参数以特殊文件形式出口到虚拟文件系统/proc 目录下,用户空间程序便可以使用系统提供的对文件操作的系统调用来实现对内核数据的读写,完成数据交互的目的。

procfs ,其目的是反映进程的状态信息。

3.2.1.3基本原理

procfs 所提供的数据结构与API 主要是在编写内核模块时使用,其使用流程如下图:

图3.5 procfs 使用简易流程图

内核空间

用户空间

3.2.1.4 特点及优缺点

优点:弥补了procfs的导出大量数据的缺陷,它能很好的导出文件记录。

缺点:seq_file是单向的,即只能向内核传递数据,而不能从内核获取数据。seq_file 实际上依赖于procfs,因此为了使用seq_file,必须使内核支持procfs。

3.2.2 模块参数与sysfs

3.2.2.1概述

内核子系统或设备驱动可以直接编译到内核,也可以编译成模块,如果编译到内核,可以通过内核启动参数来向它们传递参数,如果编译成模块,则可以通过命令行在插入模块时传递参数,或者在运行时,通过sysfs来设置或读取模块数据。

Sysfs是一个基于内存的文件系统,实际上它基于ramfs,sysfs提供了一种把内核数据结构,它们的属性以及属性与数据结构的联系开放给用户态的方式,它与kobject子系统紧密地结合在一起,因此内核开发者不需要直接使用它,而是内核的各个子系统使用它。用户要想使用sysfs 读取和设置内核参数,仅需装载sysfs就可以通过文件操作应用来读取和设置内核通过sysfs 开放给用户的各个参数。

对于模块而言,声明为static的变量都可以通过命令行来设置,但要想在sysfs下可见,必须通过宏module_param 来显式声明。

Sysfs文件系统是一个类似于proc文件系统的特殊文件系统,用于将系统中的设备组织成层次结构,并向用户模式程序提供详细的内核数据结构信息。

3.2.2.2 sysfs应用场景

sysfs其实与procfs非常类似,其实就是简化了procfs使用时模块中对条目的创建,使用sysfs只需要使用一个宏module_param()便可以实现将内核参数以条目形式出口给用户态程序。其目录路径为/sys。所有动态插入内核的模块都会在/sys下创建与其模块名相同的目录,用于管理该模块的版本等信息。

其主要用用于出口系统模块的内部参数给用户,一般由sysfs出口的参数都是只读形式的。

3.2.2.3 基本原理

Sysfs使用方法非常简单,如下图:

探究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 内核中五个主要子系统的介绍

关于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内核IMQ源码实现分析

本文档的Copyleft归wwwlkk所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性,严禁用于任何商业用途。 E-mail: wwwlkk@https://www.doczj.com/doc/4816119704.html, 来源: https://www.doczj.com/doc/4816119704.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.doczj.com/doc/4816119704.html, 红联Linux论坛: https://www.doczj.com/doc/4816119704.html,/bbs 红联Linux 论坛大全,所有致力点都体现在这 https://www.doczj.com/doc/4816119704.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) 支持进程间各种通信机制。 处于中心位置的进程调度,所有其它的子系统都依赖它,因为每个子系统都需要挂起或恢复进程。一般情况下,当一个进程等待硬件操作完成时,它被挂起;当操作真正完成时,进程被恢复执行。例如,当一个进程通过网络发送一条消息时,网络接口需要挂起发送进程,直到硬件成功地完成消息的发送,当消息被成功的发送出去以后,网络接口给进程返回一个代码,表示操作的成功或失败。其他子系统以相似的理由依赖于进程调度。

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。

史上最全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内核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

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内核I2C体系结构

实例解析linux内核I2C体系结构 作者:刘洪涛,华清远见嵌入式学院讲师。 一、概述 谈到在linux系统下编写I2C驱动,目前主要有两种方式,一种是把I2C 设备当作一个普通的字符设备来处理,另一种是利用linux I2C驱动体系结构来完成。下面比较下这两种驱动。 第一种方法的好处(对应第二种方法的劣势)有: ●思路比较直接,不需要花时间去了解linux内核中复杂的I2C子系统的操作方法。 第一种方法问题(对应第二种方法的好处)有: ●要求工程师不仅要对I2C设备的操作熟悉,而且要熟悉I2C的适配器操作; ●要求工程师对I2C的设备器及I2C的设备操作方法都比较熟悉,最重要的是写出的程序可移植性差; ●对内核的资源无法直接使用。因为内核提供的所有I2C设备器及设备驱动都是基于I2C子系统的格式。I2C适配器的操作简单还好,如果遇到复杂的I2C适配器(如:基于PCI的I2C适配器),工作量就会大很多。 本文针对的对象是熟悉I2C协议,并且想使用linux内核子系统的开发人员。 网络和一些书籍上有介绍I2C子系统的源码结构。但发现很多开发人员看了这些文章后,还是不清楚自己究竟该做些什么。究其原因还是没弄清楚I2C子系统为我们做了些什么,以及我们怎样利用I2C子系统。本文首先要解决是如何利用现有内核支持的I2C适配器,完成对I2C设备的操作,然后再过度到适配器代码的编写。本文主要从解决问题的角度去写,不会涉及特别详细的代码跟踪。 二、I2C设备驱动程序编写 首先要明确适配器驱动的作用是让我们能够通过它发出符合I2C标准协议的时序。 在Linux内核源代码中的drivers/i2c/busses目录下包含着一些适配器的驱动。如S3C2410的驱动i2c-s3c2410.c。当适配器加载到内核后,接下来的工作就要针对具体的设备编写设备驱动了。

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/4816119704.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/4816119704.html, https://www.doczj.com/doc/4816119704.html, Tel:+86-551-56909635690964

linux内核gpio操作函数解析

详解内核驱动操作GPIO引脚API函数 函数原型: void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function); unsigned int s3c2410_gpio_getcfg(unsigned int pin); void s3c2410_gpio_pullup(unsigned int pin, unsigned int to); void s3c2410_gpio_setpin(unsigned int pin, unsigned int to); unsigned int s3c2410_gpio_getpin(unsigned int pin); unsigned int s3c2410_modify_misccr(unsigned int clear, unsigned int change); int s3c2410_gpio_getirq(unsigned int pin); 关于函数中用到的虚拟地址到物理地址转换的变量及算法可以参考 https://www.doczj.com/doc/4816119704.html,/hefeng330467115@126/blog/static/78205842201 0620511659/ 或https://www.doczj.com/doc/4816119704.html,/u3/102836/showart_2065945.html 看简单led驱动程序是用到的文件及头文件可能有: linux/include/asm-arm/arch-s3c2410/map.h linux/include/asm-arm/arch-s3c2410/regs-gpio.h linux/arch/arm/plat-s3c24xx/gpio.c linux/include/asm-arm/io.h 用Source Insight 打开这些文件,然后再看驱动程序,可以随意跳转到定义处,很是方便 pin参数: gpio引脚及特殊功能寄存器助记符都在 linux/include/asm-arm/arch-s3c2410/regs-gpio.h中定义: eg: S3C2410_GPACON S3C2410_GPADAT S3C2410_GPA0 - S3C2410_GPA22 //引脚 S3C2410_GPA0_OUT - S3C2410_GPA22_OUT //设置引脚为输出 用到哪个不清楚的可以直接到这个文件去查找 还有中断和GSTATUS: S3C2410_EXTINT0 -> irq sense control for EINT0..EINT7 S3C2410_EXTINT1 -> irq sense control for EINT8..EINT15 S3C2410_EXTINT2 -> irq sense control for EINT16..EINT23 …… function参数: 指定引脚功能:输出、输入还是特殊功能,也在 linux/include/asm-arm/arch-s3c2410/regs-gpio.h中定义。 函数功能: 1原型:void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int

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内核编程规范

竭诚为您提供优质文档/双击可除 linux内核编程规范 篇一:00-linux系统编程常识-王保明 linux系统编程-应用编程常识--专题讲座 writtenby王保明 计算机系统组成 1计算机系统硬件组成 2操作系统 篇二:linux2.6驱动开发系列教程 [置顶]linux2.6驱动开发系列教程 这段时间一直在做android下的驱动,android驱动底层跟linux如出一辙,所以这里准备做一个专题,把linux 驱动做一个总结,为android接下来的驱动开发打好基础,大致的思想如下: 一、linux驱动基础开发 0、 1、 2、 3、

4、linux驱动基础开发4——linux字符驱动模型(memdriver内存读写) 5、linux驱动基础开发5——linux设备文件注册(devfs、mdev、sys、proc)讲解 6、linux驱动基础开发6——linuxgpio驱动实例分析(s3c2440/6410io操作) 7、linux驱动基础开发7——linux1*3io键盘驱动实例分析 8、linux驱动基础开发8——linux中断机制讲解与实 例分析(s3c2440/6410外部中断机制) 9、linux驱动基础开发9——linux数据缓冲机制(kfifo)讲解与实例分析 10、linux驱动基础开发10——linux并发、同步、互 斥机制(信号量、互斥锁、等待任务队列)讲解与实例分析 11、linux驱动基础开发11——linux周期性事件(内 核定时器)讲解 12、linux驱动基础开发12——linux周期性事件(内 核线程)讲解 13、linux驱动基础开发13——linux任务阻塞 (select\poll)机制讲解 14、linux驱动基础开发14——linux异常处理(内核 信号)讲解

基于Linux内核定制X86平台的微操作系统(很完整详尽文章)

基于Linux内核定制X86平台的微操作系统摘要:1 0 前言2 0.1 Linux系统简介2 0.2 Linux的基本思想2 0.3 Linux内核2 0.4 Linux内核版本命名3 0.5 Linux文件系统3 0.6Linux内核引导4 0.7Linux系统组成4 1 平台的搭建4 1.1 硬件平台4 1.2 软件平台4 1.2.1 Ubuntu系统的下载4 1.2.2 Ubuntu系统的安装4 1.2.3 Ubuntu系统的配置4 2 Linux内核的编译5 2.1 内核的下载5 2.2 内核的定制5 2.3 内核的编译5 2.4 内核的制作6 3 BusyBox的编译6 3.1 BusyBox的下载6 3.2 BusyBox的配置6 3.3 BusyBox的编译7 4 Linux文件系统的制作7 4.1 文件系统的制作7 4.2 文件系统的配置9 4.3 文件系统的压缩7 5 Linux引导程序配置10 5.1 ISOLINUX的下载10 5.2 ISOLINUX的配置10 6 LinuxCD-ROM的制作10 7 Linux定制系统的运行11 7.1 VirtualBox下的运行11 7.2 U盘引导在X86平台下的运行12 8定制系统过程中的问题12 8.1 平台搭建中的问题12 8.2 内核编译中的问题12

8.3 BusyBox编译中的问题12 8.4 文件系统制作中的问题12 8.5 引导程序制作中的问题12 8.6 CD-ROM制作中的问题13 8.7 定制系统运行的问题13 参考13 基于Linux内核定制X86平台的微操作系统 王林强 (河南大学物理与电子学院通信专业,河南开封,475004) 摘要: Linux是一种自由和开放,用C语言和汇编语言写成,并符合POSIX标准的类Unix操作系统。并且由于其可定制、可裁剪的特性,不仅在桌面操作系统中有重要的地位,而且在手机、平板电脑、路由器和视频游戏控制台等嵌入式设备有其巨大的优势。 为了更好、更深入的了解及掌握Linux系统。本文详细的讲述并实践,如何从Linux内核源码,经过定制、裁剪、编译、制作文件系统、内核引导,iso光盘制作到最终完整的基于Linux内核定制的微操作系统。 通过基于Linux内核定制的微操作系统的制作,深入的理解Linux内核的工作原理、文件系统结构、内核引导等,从而精通嵌入式开发。 关键词: Linux;定制;嵌入式;微系统 An implementation of micro-operating system based on the x86 platform Linux kernel customization Wang Lin-qiang (School of Physics and Electronics, Henan University, Henan Kaifeng 475004, China) Abstract: Linux is a free and open, and POSIX-compliant Unix-like operating system written in C and assembly language. And can be cut because of its customizable features, not only in the desktop o perating system in an important position, and its huge advantage in the embedded devices, mobile phones, tablet PCs, routers, and video game consoles. In order to better and deeper understanding of and master Linux system. This article tells in d etail and practice, from the Linux kernel source code has been customized, cutting, compiling, pro

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