rev 0.1

快乐虾

http://blog.csdn.net/lights_joy/

lights@hb165.com

本文适用于

ADI bf561 DSP

uclinux-2008r1-rc8 (移植到vdsp5)

Visual DSP++ 5.0

欢迎转载,但请保留作者信息

在BF561中,它的整个存储空间是这样的:

cplb_data这个全局变量的定义在arch/blackfin/kernel/cplb-nommu/cplb_init.c文件中,从这个全局变量可以看出内核对整个存储区域的划分。

staticstruct cplb_desc cplb_data[] = {

{

.start = 0,

.end = SIZE_1K,

.psize = SIZE_1K,

.attr = INITIAL_T | SWITCH_T | I_CPLB | D_CPLB,

.i_conf = SDRAM_OOPS,

.d_conf = SDRAM_OOPS,

#ifdefined(CONFIG_DEBUG_HUNT_FOR_ZERO)

.valid = 1,

#else

.valid = 0,

#endif

.name = "Zero Pointer Guard Page",

},

{

.start = 0,/* dyanmic */

.end = 0,/* dynamic */

.psize = SIZE_4M,

.attr = INITIAL_T | SWITCH_T | I_CPLB,

.i_conf = L1_IMEMORY,

.d_conf = 0,

.valid = 1,

.name = "L1 I-Memory",

},

{

.start = 0,/* dynamic */

.end = 0,/* dynamic */

.psize = SIZE_4M,

.attr = INITIAL_T | SWITCH_T | D_CPLB,

.i_conf = 0,

.d_conf = L1_DMEMORY,

#if((L1_DATA_A_LENGTH > 0) || (L1_DATA_B_LENGTH > 0))

.valid = 1,

#else

.valid = 0,

#endif

.name = "L1 D-Memory",

},

{

#ifdefined(CONFIG_BF561) || defined(CONFIG_BF54x)

.start = L2_START,

.end = L2_START+L2_LENGTH,

.psize = SIZE_1M,

.attr = L2_ATTR,

.i_conf = L2_MEMORY,

.d_conf = L2_MEMORY,

.valid = 1,

#else

.valid = 0,

#endif

.name = "L2 Memory",

},

{

.start = 0,

.end = 0,/* dynamic */

.psize = 0,

.attr = INITIAL_T | SWITCH_T | I_CPLB | D_CPLB,

.i_conf = SDRAM_IGENERIC,

.d_conf = SDRAM_DGENERIC,

.valid = 1,

.name = "Kernel Memory",

},

{

.start = 0, /* dynamic */

.end = 0, /* dynamic */

.psize = 0,

.attr = INITIAL_T | SWITCH_T | D_CPLB,

.i_conf = SDRAM_IGENERIC,

.d_conf = SDRAM_DNON_CHBL,

.valid = 1,

.name = "uClinux MTD Memory",

},

{

.start = 0, /* dynamic */

.end = 0,/* dynamic */

.psize = SIZE_1M,

.attr = INITIAL_T | SWITCH_T | D_CPLB,

.d_conf = SDRAM_DNON_CHBL,

.valid = 1,

.name = "Uncached DMA Zone",

},

{

.start = 0, /* dynamic */

.end = 0, /* dynamic */

.psize = 0,

.attr = SWITCH_T | D_CPLB,

.i_conf = 0, /* dynamic */

.d_conf = 0, /* dynamic */

.valid = 1,

.name = "Reserved Memory",

},

{

.start = ASYNC_BANK0_BASE,

.end = ASYNC_BANK3_BASE + ASYNC_BANK3_SIZE,

.psize = 0,

.attr = SWITCH_T | D_CPLB,

.d_conf = SDRAM_EBIU,

.valid = 1,

.name = "Asynchronous Memory Banks",

},

{

.start = BOOT_ROM_START,

.end = BOOT_ROM_START + BOOT_ROM_LENGTH,

.psize = SIZE_1M,

.attr = SWITCH_T | I_CPLB | D_CPLB,

.i_conf = SDRAM_IGENERIC,

.d_conf = SDRAM_DGENERIC,

.valid = 1,

.name = "On-Chip BootROM",

},

};

从上面可以看出,内核将整个存储空间分为10个区域,每个区域的序号可以用下面的宏来表示。

enum{

ZERO_P, L1I_MEM, L1D_MEM, L2_MEM, SDRAM_KERN, SDRAM_RAM_MTD, SDRAM_DMAZ, RES_MEM, ASYNC_MEM, OCB_ROM

};

1.1.1ZERO_P区域

这块区域的初始化信息为:

{

.start = 0,

.end = SIZE_1K,

.psize = SIZE_1K,

.attr = INITIAL_T | SWITCH_T | I_CPLB | D_CPLB,

.i_conf = SDRAM_OOPS,

.d_conf = SDRAM_OOPS,

#ifdefined(CONFIG_DEBUG_HUNT_FOR_ZERO)

.valid = 1,

#else

.valid = 0,

#endif

.name = "Zero Pointer Guard Page",

},

从它的name猜测,应该是用来保护对NULL地址的访问的,当访问此地址时,将引发一个cplb error,然后内核就可以进行相应的处理了。

1.1.2L1指令区域

这块区域初始化为:

{

.start = 0,/* dyanmic */

.end = 0,/* dynamic */

.psize = SIZE_4M,

.attr = INITIAL_T | SWITCH_T | I_CPLB,

.i_conf = L1_IMEMORY,

.d_conf = 0,

.valid = 1,

.name = "L1 I-Memory",

},

在BF561中,AB两个核都有各自的大小为16K的L1 INSTRUCTION SRAM,对于A核,其地址为0xffa0 0000 ~ 0xffa0 4000,对于B核,其地址为0xff60 0000 ~ 0xff60 4000。因此在这里将它们的start和end设置为0,但是在下面的设置函数中将对其进行初始化:

void__init generate_cpltab_cpu(unsigned int cpu)

{

………………………………

cplb_data[L1I_MEM].start = get_l1_code_start_cpu(cpu);

cplb_data[L1I_MEM].end = cplb_data[L1I_MEM].start + L1_CODE_LENGTH;

……………..

}

1.1.3L1数据区域

这个区域初始化为:

{

.start = 0,/* dynamic */

.end = 0,/* dynamic */

.psize = SIZE_4M,

.attr = INITIAL_T | SWITCH_T | D_CPLB,

.i_conf = 0,

.d_conf = L1_DMEMORY,

#if((L1_DATA_A_LENGTH > 0) || (L1_DATA_B_LENGTH > 0))

.valid = 1,

#else

.valid = 0,

#endif

.name = "L1 D-Memory",

},

在BF561中,每个核都有两块L1 SRAM用于存储数据,这两块32K的SRAM又都可以分为两半,一半存数据,一半用于cache,但是这两块SRAM之间并不连续。对于A核来讲,其空间为:0xff80 0000 ~ 0xff80 8000和0xff90 0000 ~ 0xff90 8000。而对于B核,它的空间则为:0xff40 0000 ~ 0xff40 8000和0xff50 0000 ~ 0xff50 8000。

看看它的初始化:

void__init generate_cpltab_cpu(unsigned int cpu)

{

…………………………………

cplb_data[L1D_MEM].start = get_l1_data_a_start_cpu(cpu);

cplb_data[L1D_MEM].end = get_l1_data_b_start_cpu(cpu) + L1_DATA_B_LENGTH;

……………………………

}

也就是说,内核定义的这块空间包括bank a全部和bank b的一半,还包括bank a和bank b之间reserve的部分。

1.1.4L2缓存

这块区域定义为:

{

#ifdefined(CONFIG_BF561) || defined(CONFIG_BF54x)

.start = L2_START,

.end = L2_START+L2_LENGTH,

.psize = SIZE_1M,

.attr = L2_ATTR,

.i_conf = L2_MEMORY,

.d_conf = L2_MEMORY,

.valid = 1,

#else

.valid = 0,

#endif

.name = "L2 Memory",

},

这个就比较简单了,指向128K的L2。

/* Level 2 Memory */

#defineL2_START0xFEB00000

#defineL2_LENGTH0x20000

1.1.5内核区域

这块区域定义为:

{

.start = 0,

.end = 0,/* dynamic */

.psize = 0,

.attr = INITIAL_T | SWITCH_T | I_CPLB | D_CPLB,

.i_conf = SDRAM_IGENERIC,

.d_conf = SDRAM_DGENERIC,

.valid = 1,

.name = "Kernel Memory",

},

在下面还有一行初始化的代码:

cplb_data[SDRAM_KERN].end = memory_end;

在不使用mem这个内核参数的情况下,这个区域将包含CONFIG_MEM_SIZE指定的内存的整个空间(可能除去1M或者2M的DMA区域)。在使用mem内核参数的情况下,将指向mem指定的空间大小(同样可能除去1M或者2M的DMA区域)。但由于ANOMALY_05000263的缘故,这个值将被限制为60M,即0x03c0 0000。

1.1.6根文件系统区域

这块区域初始化为:

{

.start = 0, /* dynamic */

.end = 0, /* dynamic */

.psize = 0,

.attr = INITIAL_T | SWITCH_T | D_CPLB,

.i_conf = SDRAM_IGENERIC,

.d_conf = SDRAM_DNON_CHBL,

.valid = 1,

.name = "uClinux MTD Memory",

},

这块区域仅当启用了CONFIG_MTD_UCLINUX时才有效,也就是说,仅当内核使用ext、cramfs或者romfs做为根文件系统时才有效。因为这个时候会在内核结束的位置插入一个rootfs,然后在setup_arch中将这个rootfs搬移到SDRAM的最高位置,此时就可以用这块区域来表示这个rootfs。

当没有启用CONFIG_MTD_UCLINUX时,这块区域没有使用,因而在下面的初始化代码中将它的.valid设置为0。

void__init generate_cpltab_cpu(unsigned int cpu)

{

…………………………

#ifdefCONFIG_MTD_UCLINUX

cplb_data[SDRAM_RAM_MTD].start = memory_mtd_start;

cplb_data[SDRAM_RAM_MTD].end = memory_mtd_start + mtd_size;

cplb_data[SDRAM_RAM_MTD].valid = mtd_size > 0;

# if defined(CONFIG_ROMFS_FS)

cplb_data[SDRAM_RAM_MTD].attr |= I_CPLB;

/*

* The ROMFS_FS size is often not multiple of 1MB.

* This can cause multiple CPLB sets covering the same memory area.

* This will then cause multiple CPLB hit exceptions.

* Workaround: We ensure a contiguous memory area by extending the kernel

* memory section over the mtd section.

* For ROMFS_FS memory must be covered with ICPLBs anyways.

* So there is no difference between kernel and mtd memory setup.

*/

cplb_data[SDRAM_KERN].end = memory_mtd_start + mtd_size;;

cplb_data[SDRAM_RAM_MTD].valid = 0;

# endif

#else

cplb_data[SDRAM_RAM_MTD].valid = 0;

#endif

………………..

}

1.1.7保留的DMA区域

这块区域初始化为:

{

.start = 0, /* dynamic */

.end = 0,/* dynamic */

.psize = SIZE_1M,

.attr = INITIAL_T | SWITCH_T | D_CPLB,

.d_conf = SDRAM_DNON_CHBL,

.valid = 1,

.name = "Uncached DMA Zone",

},

在下面还有一段初始化的代码:

cplb_data[SDRAM_DMAZ].start = _ramend - DMA_UNCACHED_REGION;

cplb_data[SDRAM_DMAZ].end = _ramend;

即这块区域将表示未用cache的SDRAM。这里根据配置DMA_UNCACHED_REGION的值可以是1M或者2M,也可以为0。

1.1.8RES_MEM

这块区域初始化配置为:

{

.start = 0, /* dynamic */

.end = 0, /* dynamic */

.psize = 0,

.attr = SWITCH_T | D_CPLB,

.i_conf = 0, /* dynamic */

align=

linux全局变量区空间多大,从cplb_data全局变量看uclinux的存储空间划分相关推荐

  1. Linux系统盘爆满根目录100%,又找不到占空间的大文件 原因与解决方法

    最近一位朋友他的Linux(Centos7)根目录一直100%,也就是系统文件磁盘已经爆满了.虽然通过:df -h, du -sh * 等指令配合使用,发现当前系统任然存在大量可以使用的空间(6.5G ...

  2. 【Linux】Linux的内核空间(低端内存、高端内存)

    内核也是程序,也应该具有自己的虚存空间,但是作为一种为用户程序服务的程序,内核空间有它自己的特点. 内核空间与用户空间的关系 在一个32位系统中,一个程序的虚拟空间最大可以是4GB,那么最直接的做法就 ...

  3. Linux虚拟机磁盘空间不足的解决方法

    问题描述: 其实很多时候,在我们虚拟机安装了一些软件后,你发现磁盘莫名其妙的空间就满了,这个时候我们需要学会找到Linux系统中的大文件以及清理Linux的磁盘. 原因分析: 一个主要原因是在vmwa ...

  4. 关于Linux服务器磁盘空间占满问题的解决方法

    下面给大家分享一篇关于Linux服务器磁盘占满问题解决方法(/dev/sda3 满了),需要的的朋友参考下吧 下面我们一起来看一篇关于Linux服务器磁盘占满问题解决(/dev/sda3 满了),希望 ...

  5. linux系统vmalloc分配过大,Linux内核,iptables和vmalloc大小

    在我们的一些Linux机器上我们遇到了iptables的问题,似乎被加载的规则的剪切数导致vmalloc错误(大小3506176的vmap分配失败:使用vmalloc =增加大小.)出现在dmesg和 ...

  6. linux扩容根目录空间_Linux系统扩容根目录磁盘空间的操作方法

    Linux系统扩容根目录磁盘空间的操作方法 一.使用背景 Linux根目录磁盘空间不够用了,当修改了虚拟机模版增加磁盘大小或者插入了一块新硬盘,但是发现系统里的大小还是没改变. 产生的原因是没有给磁盘 ...

  7. linux增加 inode空间,linux 增加inode 的方法

    创建文件系统时,可以指定块的大小.如果将来在你的文件系统中是一些比较大的文件的话,使用较大的块大小将得到较好的性能.将ext2文件系统的块大小调整为4096byte而不是缺省的1024byte,可以减 ...

  8. linux扩展磁盘空间命令_在Linux上监视磁盘空间– SQL Server DBA的有用命令

    linux扩展磁盘空间命令 In this article, we will explore the different Linux commands related to the disk spac ...

  9. Linux运维实战|大文件切割

    介绍 日常工作中需要对日志文件进行分析,当日志文件过大时,Linux中使用vim.cat.vim.grep.awk等这些工具对大文件日志进行分析将会成为梦魇,具体表现在: 执行速度缓慢,文件内容需要加 ...

最新文章

  1. 2.27 MapReduce Shuffle过程如何在Job中进行设置
  2. linux-awk的简单应用
  3. python递归实例_python实现递归实例代码
  4. 请描述定时器初值的计算方式_51单片机定时器初值计算器
  5. html前端开发作品,Web前端开发(HTML5+CSS3)
  6. 集群资源管理与任务调度系统综述
  7. 全国省市县行政代码表1
  8. 问卷调查报告html模版,问卷调查报告的格式
  9. 未来教育计算机二级题库如何更新,未来教育的计算机二级题库准吗?
  10. 开机出现grub rescue,修复办法
  11. pygame初探:复刻小游戏《Flappy Bird》
  12. 汤姆猫代码python_iOS开发:纯代码实现汤姆猫小游戏
  13. docker学习笔记(四)使用docker搭建环境
  14. 【Java】电报 Telegram messenger for Android
  15. 学习笔记之——Python中类和对象的理解
  16. 斗地主 功能测试实战--需求分析,欢乐豆到底怎么输光的
  17. Centos7下搭建DMHS(源端oracle目的端达梦,另附目的端oracle)
  18. 风云邀请成为IT168社区Silverlight版主
  19. java高并发synchronized学习
  20. k8s Canal (by quqi99)

热门文章

  1. 红帽linux .iso,最好的redhat iso资源
  2. 大学生职业生涯规划计算机科学与,计算机科学与技术专业大学生职业生涯规划书...
  3. 第二章 卡耐基与人相处的秘诀 二 与人相处的秘诀
  4. html制作一个四分之三圆,美工考试试题
  5. CSS3实现一个小风车
  6. ChatGPT 拓展资料:论文阅读A Comprehensive Survey on Pretrained Foundation Models: A History from BERT to Chat
  7. 小米“手机+AIoT”双引擎战略一年,雷军将目光投向了更远方
  8. 网易笔试题之DFS回溯法求解黑白棋(翻翻棋)
  9. idea字体大小放大和缩小的快捷键设置
  10. 强势来袭!有人破了阿里云盘的限制!官方慌了!!!(附最新福利码扩容领取!)