ARM平台linux内核Notes 1

发布者:梦幻微笑最新更新时间:2024-09-03 来源: cnblogs关键字:ARM平台  linux内核  存储空间 手机看文章 扫描二维码
随时随地手机看文章

linux内存管理

  嵌入式处理器的分页管理为二级映射,内存空间与I/O空间统一编址,而x86处理器采用三级映射,内存空间与I/O空间独立编址。

 

  在32位嵌入式系统中,存储空间的地址范围从0x0000_0000到0xFFFF_FFFF,内存和I/O共享从这4GB地址空间范围。

  其主要包含以下几种存储空间:

  1)设备空间(MT_DEVICE):二级分页

  2)内部高速SRAM空间(MT_CACHECLEAN):一级分段

  3)内部mini cache空间(MT_MINICLEAN):一级分段

  4)低端中断向量(MT_LOW_VECTORS):两级分页

  5)高端中断向量(MT_HIGH_VECTORS):两级分页

  6)RAM内存空间(NT_MEMORY):一级分段

  7)ROM(flash)空间(MT_ROM):一级分段

 

--------------------------------------------- S3C6410 datasheet -----------------------------------------------------

   S3C6410 支持32 位物理地址域,并且这些地址域分成两部分,一部分用于存储,另一部分用于外设。

   通过SPINE 总线访问主存,主存的地址范围是0x0000_0000~0x6FFF_FFFF。主存部分分成四个区域:

引导镜像区、内部存储区、静态存储区和动态存储区。

  引导镜像区的地址范围是从0x0000_0000~0x07FF_FFFF,但是没有实际的映射内存

  每块内部存储器的起始地址是确定的。

  内部ROM 的地址范围是0x0800_0000~0x0BFF_FFFF,但是实际存储仅32KB。该区域是只读的,并且当内部ROM 启动被选择时,该区域能映射到引导镜像区。

  内部SRAM 的地址范围是0x0C00_0000~0x0FFF_FFFF,但是实际存储仅4KB。该区域能被读和写,当NAND 闪存启动被选择时能映射到引导镜像区。

  静态存储区的地址范围是0x1000_0000~0x3FFF_FFFF。通过该地址区域能访问SROM、SRAM、 NOR Flash、同步NOR接口设备、和Steppingstone。

  动态存储区的地址范围是0x4000_0000~0x6FFF_FFFF。DMC0有权使用地址0x4000_0000~0x4FFF_FFFF,并且DMC1有权使用地址0x5000_0000~0x6FFF_FFFF。

  外设区域通过PERI 总线被访问,它的地址范围是0x7000_0000~0x7FFF_FFFF。这个地址范围的所有的SFR 能被访问。而且如果数据需要从NFCON 或CFCON 传输,这些数据需要通过PERI 总线传输。

 

 

--------------------------------------------- 我是分割线 -------------------------------------------------------------

 

内存页(page)

  ARM处理器支持1KB-4KB的页框大小。

  ARM处理器默认页框打下为4KB。

  页内存的结构为 struct page:


struct page {

        unsigned long flags;            /* Atomic flags, some possibly

                                         * updated asynchronously */

        atomic_t _count;                /* Usage count, see below. */

        union {

                atomic_t _mapcount;     /* Count of ptes mapped in mms,

                                         * to show when page is mapped

                                         * & limit reverse map searches.

                                         */

                struct {                /* SLUB */

                        u16 inuse;

                        u16 objects;

                };

        };

        union {

            struct {

                unsigned long private;          /* Mapping-private opaque data:

                                                 * usually used for buffer_heads

                                                 * if PagePrivate set; used for

                                                 * swp_entry_t if PageSwapCache;

                                                 * indicates order in the buddy

                                                 * system if PG_buddy is set.

                                                 */

                struct address_space *mapping;  /* If low bit clear, points to

                                                 * inode address_space, or NULL.

                                                 * If page mapped as anonymous

                                                 * memory, low bit is set, and

                                                 * it points to anon_vma object:

                                                 * see PAGE_MAPPING_ANON below.

                                                 */

            };

#if USE_SPLIT_PTLOCKS

            spinlock_t ptl;

#endif

            struct kmem_cache *slab;    /* SLUB: Pointer to slab */

            struct page *first_page;    /* Compound tail pages */

        };

        union {

                pgoff_t index;          /* Our offset within mapping. */

                void *freelist;         /* SLUB: freelist req. slab lock */

        };

        struct list_head lru;           /* Pageout list, eg. active_list

                                         * protected by zone->lru_lock !

                                         */

        /*

         * On machines where all RAM is mapped into kernel address space,

         * we can simply calculate the virtual address. On machines with

         * highmem some memory is mapped into kernel virtual memory

         * dynamically, so we need a place to store that address.

         * Note that this field could be 16 bits on x86 ... ;)

         *

         * Architectures with slow multiplication can define

         * WANT_PAGE_VIRTUAL in asm/page.h

         */

#if defined(WANT_PAGE_VIRTUAL)

        void *virtual;                  /* Kernel virtual address (NULL if

                                           not kmapped, ie. highmem) */

#endif /* WANT_PAGE_VIRTUAL */

#ifdef CONFIG_WANT_PAGE_DEBUG_FLAGS

        unsigned long debug_flags;      /* Use atomic bitops on this */

#endif


#ifdef CONFIG_KMEMCHECK

        /*

         * kmemcheck wants to track the status of each byte in a page; this

         * is a pointer to such a status block. NULL if not tracked.

         */

        void *shadow;

#endif

};


/*

 * A region containing a mapping of a non-memory backed file under NOMMU

 * conditions.  These are held in a global tree and are pinned by the VMAs that

 * map parts of them.

 */

struct vm_region {

        struct rb_node  vm_rb;          /* link in global region tree */

        unsigned long   vm_flags;       /* VMA vm_flags */

        unsigned long   vm_start;       /* start address of region */

        unsigned long   vm_end;         /* region initialised to here */

        unsigned long   vm_top;         /* region allocated to here */

        unsigned long   vm_pgoff;       /* the offset in vm_file corresponding to vm_start */

        struct file     *vm_file;       /* the backing file or NULL */


        int             vm_usage;       /* region usage count (access under nommu_region_sem) */

        bool            vm_icache_flushed : 1; /* true if the icache has been flushed for

                                                * this region */

};


内存区段(bank)


  一个内存bank表示一块连续内存区域,,一个bank一般对应处理器的一个RAM片选管脚(pin)上链接的RAM芯片内存空间。

[1] [2]
关键字:ARM平台  linux内核  存储空间 引用地址:ARM平台linux内核Notes 1

上一篇:ARM平台linux内核Notes 2
下一篇:s3c6410裸机程序(2)

推荐阅读最新更新时间:2024-11-11 08:27

ExecuTorch 测试版上线,加速 Arm 平台边缘侧生成式 AI 发展
通过 Arm 计算平台与 ExecuTorch 框架的结合,使得更小、更优化的模型能够在边缘侧运行,加速边缘侧生成式 AI 的实现 新的 Llama 量化模型适用于基于 Arm 平台的端侧和边缘侧 AI 应用,可减少内存占用,提高精度、性能和可移植性 全球 2,000 万名 Arm 开发者能够更迅速地在数十亿台边缘侧设备上大规模开发和部署更多的智能 AI 应用 Arm 正在与 Meta 公司的 PyTorch 团队携手合作,共同推进新的 ExecuTorch 测试版 (Beta) 上线 ,旨在为全球数十亿边缘侧设备和数百万开发者提供人工智能 (AI) 和机器学习 (ML) 功能,进而确保 AI 真正的潜力能被最广泛的
[嵌入式]
嵌入式arm学习总结(九)--ARM启动代码总结-基于mini2440平台
1.要看懂启动代码:首先要熟悉ARM9的存储系统和指令系统 2.启动的大概步骤: 进入复位异常--》关看门狗、关中断和子中断等--配置时钟(UPll和MPll)--》初始化内存(初始化13个存储器控制器),清零内存 --》初始化堆栈--拷贝代码到sdram,跳转到sdram中运行--》进入main函数 3.启动代码作用 启动代码的最终目的:把代码从nanflash复制到内存中并运行 1).进入管理模式,设置主频和分频比,初始化相关外设(串口) 2).判定代码是否进行复制(NORFLASH,还是NANDFLSASH复制) 3).异常怎样处理 4).跳入主函数main() 第一步:从resetEntry开始,运行到b Re
[单片机]
ARM与Linux些许问题》第四章:ARM平台系统调用原理分析
本文基于mstar801平台Linux2.6.35.11版本。 首先说明:系统调用不会导致进程上下文切换。 一、介绍系统调用 Linux用户空间主动进入内核空间的唯一方法 1.系统调用是操作系统提供给用户程序调用的一组 特殊 接口;用户程序可以通过这组 特殊 接口来获得操作系统内核提供的服务。 从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口;把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。 2.系统调用按照功能逻辑大致可分为 进程控制 、 文件系统控制 、 系统控制 、 存储管理 、 网络管理 、 socket控制 、 用户管理 和 进程间通信 几类。 3.内
[单片机]
linux内核中的文件描述符(一)--基础知识简介
Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blog.csdn.net/ce123) 作为文件的使用者,进程理所当然的要将所使用的文件记录于自己的控制块中,也就是task_struct。另外,由于进程所对应的程序也是一个文件,因此进程控制块还必须记录这个文件的相关信息。由于OS要对所有进程提供服务,因此OS还要维护一个记录所有进程打开的文件的总表。 1.文件对象 当进程通过open系统调用打开一个文件时,该系统调用找到这个文件后,会把文件封装到一个file结构的实例中提供给进程,这个实例称为file对象。file结构的定义如下:
[单片机]
<font color='red'>linux内核</font>中的文件描述符(一)--基础知识简介
STM32处理器存储空间布局解析
一、Cortex-M3支持最大4GB的存储空间,其地址映射关系如下图 二、存储器映射实例:256KB Flash 48KB SRAM IROM1为片上程序存储器,即片上集成的Flash存储器,对该处理器Flash大小为256KB,即0x40000 IRAM1为片上数据存储器,即片上集成的SRAM存储器,对该处理器Flash大小为48KB,即0xC000 片上SRAM的起始地址是0x20000000,这是由Cortex-M3内核决定的,从0x20000000开始的512KB存储空间内都可以SAM,即所谓的 大框架 ,但具体的SRAM大小由半导体厂商来决定,因为SRAM成本较高一般容量都不是很大。 代码区的起始地址范
[单片机]
STM32处理器<font color='red'>存储空间</font>布局解析
ARM发布最新平台安全架构:支持碎片化物联网系统
12月3日消息,世界互联网大会先进科技成果发布会上,ARM全球执行副总裁兼大中华区总裁吴雄昂发布了最新的平台安全架构,通过这样一个安全架构,不光是解决了安全架构的一致性问题,而且能够支持多样化、碎片化的物联网系统。 吴雄昂称,物联网系统的安全不仅仅在于设备,而在于网络、在于云。这里面有上百家芯片公司、上千家系统公司,同时有上百万的开发者,这个安全架构得到了从芯片、安全、系统、软件、云,一百多家科技公司的一致支持。 以下是吴雄昂的演讲: 女士们、先生们,下午好! 首先我代表ARM感谢组委会给我们这个机会,发布ARM最新的平台安全架构。ARM至今为止已经设计了全球应用最广泛的计算技术,今天全球有上千亿个电子设备使用
[网络通信]
linux内核中的typeof
内核版本:2.6.14 今天分析内核时又看到了typeof,只知道它大概是返回变量的类型,后来上网查了下发现这个关键字在linux中用的非常多。如果你对sizeof很熟悉的话,那么大可进行类推,sizeof(exp)返回的是exp的数据类型大小,那么typeof(exp.)返回的就是exp的数据类型。下面是linux内核中typeof的一些例子。 include/linux/kernel.h view plain copy print ? /* * min()/max() macros that also do * strict type-checking.. See the * unnecessa
[单片机]
ARM64平台下WFE和SEV相关指令解析
WFE 等待事件(Wait For Event)指令。 ARM架构下,有一个全局的事件寄存器(Event Register),系统中的每一个CPU核在这个寄存器上都有对应的位。 当当前CPU执行WFE指令的时候,如果事件寄存器对应当前CPU的位没有被设置(也就是0),则当前CPU核会进入低功耗模式,会被挂起,不会再执行其它操作;而如果事件寄存器对应当前CPU的位被设置了(也就是1),则会将事件寄存器对应当前CPU的位清空(设置成0),然后立即返回,继续执行下面的指令,不会进入低功耗模式。 如果当前CPU核通过WFE指令进入了低功耗模式,那么只有在如下情况下才可能被重新唤醒: 发生了IRQ中断(前提是没有被屏蔽);
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved