Android深度探索与HAL驱动开发(卷1)-- 第六章随笔

内核空间与用户空间

介绍

  Linux系统将自身划分为两部分,一部分为核心软件,即是kernel,也称作内核空间,另一部分为普通应用程序,这部分称为用户空间。

  Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G.Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为"内核空间".而将较低的3G字节(从虚拟地址 0x00000000到0xBFFFFFFF),供各个进程使用,称为"用户空间)。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。

  Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。从图中可以看出(这里无法表示图),每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的。最高的1GB字节虚拟内核空间则为所有进程以及内核所共享。

  内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中。

  虽然内核空间占据了每个虚拟空间中的最高1GB字节,但映射到物理内存却总是从最低地址(0x00000000)开始。对内核空间来说,其地址映射是很简单的线性映射,0xC0000000就是物理地址与线性地址之间的位移量,在Linux代码中就叫做PAGE_OFFSET.

相互作用

现在,越来越多的应用程序需要编写内核级和用户级的程序来一起完成具体的任务,通常采用以下模式:首先,编写内核服务程序利用内核空间提供的权限和服务来接收、处理和缓存数据;然后编写用户程序来和先前完成的内核服务程序交互,具体来说,可以利用用户程序来配置内核服务程序的参数,提取内核服务程序提供的数据,当然,也可以向内核服务程序输入待处理数据。

比较典型的应用包括: Netfilter(内核服务程序:防火墙)VS Iptable(用户级程序:规则设置程序);IPSEC(内核服务程序:VPN协议部分)VS IKE(用户级程序:vpn密钥协商处理);当然还包括大量的设备驱动程序及相应的应用软件。这些应用都是由内核级和用户级程序通过相互交换信息来一起完成特定任务的。

交互

  在进行设备驱动程序开发,内核功能模块等系统级开发时,常常需要在内核和用户态之间交互信息。Linux针对不同的情况提供了多种方法实现内核态和用户态的交互。包括内核启动参数、模块参数与 sysfs、sysctl、系统调用、netlink、procfs、seq_file、debugfs和relayfs,除此之外,还有其他的一些,比如brk()系统调用,信号,内存映射机制等等。

时间: 2024-08-02 15:14:36

Android深度探索与HAL驱动开发(卷1)-- 第六章随笔的相关文章

Android深度探索与HAL驱动开发(卷1)-- 第一章随笔

本文主要从 Android版本与对应的linux内核版本关系 和 Android系统架构 两部分来讨论. 1.Android版本与Linux内核的关系 (1)Android最初使用Linux2.6作为其内核,随着Android与Linux内核的发展,不同版本的Android使用的linux内核版本差异较大,所以不同Android版本驱动可能并不通用. 下表显示了目前所有Android版本与linux内核版本的联系. Code name Android Version number Linux K

Android深度探索与HAL驱动开发(卷1)-- 第九章随笔

第9章 硬件抽象层:HAL Hal(Hardware Abstract Layer,硬件抽象层)是建立在Linux驱动之上的一套程序库.这套程序库并不属于Linux内核,而是属于Linux内核层之上的应用层. 编写支持HAL的Linux驱动程序的步骤: 第一步:编写Linux驱动 第二步:编写HAL Library 第三步:编写 Service Library 编写HAL 模块的步骤和原理如下: 第一步:定义结构体和宏 第二步:编写HAL模块的open函数 第三步:定义hw_module_met

Android深度探索与HAL驱动开发(卷1)-- 第二章随笔

Android软件开发是指创建新的Android操作系统的过程.通常是使用Android软件开发工具包(SDK)利用Java语言进行开发. Android SDK Android软件开发工具包(SDK)包括一套全面的开发工具.这些措施包括调试器,库文件,一个基于QEMU的手机模拟器,文档,示例代码和教程.目前支持的开发平台,包括可运行Linux的计算机,Mac OS X 10.5.8以上版本,和Windows XP或更高版本.截至2015年3月, Android 自带的SDK本身不可再用,但软件

Android深度探索与HAL驱动开发(卷1)-- 第七章随笔

应用程序.库.内核.驱动程序的关系   从上到下,一个软件系统可以分为:应用程序.库.操作系统(内核).驱动程序.开发人员可以专注于自己熟悉的部分,对于相邻层,只需要了解它的接口,无需关注它的实现细节.以点亮LED为例,这4层软件的协作关系如下: 1.应用程序使用库提供的open函数打开代表LED的设备文件. 2.库数据open函数传入的参数执行“swi”指令,这条指令会引起CPU异常,进入内核. 3.内核的异常处理函数根据这些参数找到相应的驱动程序,返回一个文件句柄给库,进而返回给应用程序.

Android深度探索与HAL驱动开发(卷1)-- 第十章随笔

第10章 嵌入式Linux的调试技术 通过虚拟文件系统(/proc)进行数据交互 在编写代码时应了解一下几点: 1.creat_proc_read_entry 函数在内部是通过调用creat_proc_entry 函数实现的.所谓只读就是通过 creat_proc_read_entry 函数可以指定处理文件读动作的函数,并且通过mode参数设置文件的只读属性(0944).如果想把只读文件改成读写文件,只需要设置处理文件写动作的函数,并且将文件属性改成0666. 2.Linux文件的读写由属性决定

Android深度探索与HAL驱动开发(卷1)-- 第四章随笔

Linux内核源代码目录含义 arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录.和32位PC相关的代码存放在i386目录下,其中比较重要的包括kernel(内核核心部分).mm(内存管理).math-emu(浮点单元仿真).lib(硬件相关工具函数).boot(引导程序).pci(PCI总线)和power(CPU相关状态).    block:部分块设备驱动程序.    crypto:常用加密和散列算法(如AES.SHA等),还有一些压缩和CRC校验算法.    Document

Android深度探索与HAL驱动开发(卷1)-- 第五章随笔

RISC(reduced instruction set computer)精简指令集计算机 简介 精简指令集,是计算机中央处理器的一种设计模式,也被称为RISC(Reduced Instruction Set Computer的缩写).[1] 这种设计思路对指令数目和寻址方式都做了精简,使其实现更容易,指令并行执行程度更好,编译器的效率更高.常用的精简指令集微处理器包括DECAlpha.ARC.ARM.AVR.MIPS.PA-RISC.PowerArchitecture(包括PowerPC)和

Android深度探索(卷1)HAL与驱动开发学习笔记(2)

Android深度探索(卷1)HAL与驱动开发学习笔记(2) 第二章搭建Android开发环境 书中介绍了两种JDK的安装方法, 方法一: 从官网下载JDK并进行配置,解压后在终端打开profile文件来设置PATH环境变量(# soure /etc/profile),打开profile文件后输入下面的内容 export PATH=.:developer/jdk6/bin:$PATH 保存profile文件以后,有两种方法可以重新加载profile文件. 1.# sourse  /etc/pro

Android深度探索(卷1)HAL与驱动开发 心得体会 第十章 嵌入式Linux的调用技术

Android深度探索(卷1)HAL与驱动开发 心得体会 第十章  嵌入式Linux的调用技术 对于复杂的Linux驱动以及HAL等程序库,需要使用各种方法对其进行调试.例如,设置断点,逐步跟踪代码.输出调试信息等.虽然嵌入式Linux在调试方面并没有Visual Studio.Delphi.Eclipse这些可视化工具方便,但是学习一些这方面的技术无疑更有助于开发强大而稳定的Linux内核模块. 对于嵌入式Linux内核模块,可执行程序.代码库的调试可能更要复杂些.因为在大多数时候需要至少两台