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. 听说微软出了个 Windows XP reStart Edition? 重启版?
  2. 【深度学习】CVPR 2021 全部论文链接公布!最新1660篇论文合集!附下载链接
  3. AJAX实现图片文件上传
  4. poj1330Nearest Common Ancestors(LCA小结)
  5. EA出品的java射击类游戏,盘点五款射击类RPG游戏:你喜欢这类型游戏吗?
  6. mysql 命令 pdf_MySQL命令文档 PDF 下载
  7. nobelking 3 js 数字和数字相加 字符串连接 数字和字符串连接1
  8. 没有上市的股权和股票有啥区别
  9. 向窗口发送ctrl c复制 消息
  10. SCPPO(二):禅道的使用—管理员
  11. ZooKeeper下载安装(Windows版本)
  12. oralce 12c集群 ora-01033
  13. 程序员自我学习自我培训指南
  14. HTTPS TSL/SSL详解
  15. STM32 CAN 库函数
  16. Windows 10创建用户
  17. 正则表达式学习——(2)正则回溯
  18. 拼图游戏Canvas版
  19. Passage Re-ranking with BERT
  20. 你想要成为团队里什么样的角色呢?

热门文章

  1. MATLAB中Bessel函数的表示计算
  2. 创始人汪华:创新者去哪儿
  3. 龙芯平台stream编译错误问题解决
  4. Kettle的增量抽取以及定时抽取转换更新数据入门教程
  5. X-ray diffraction
  6. QT6.3 CMake Linguist多语言配置记录
  7. python 根号化简_Python学习之如何简化代码?六大技巧!
  8. 使用渐变实现彩虹效果
  9. 对口高考计算机知识点总结,对口高考计算机试题及答案
  10. jQuery UI 下载 拖动组件