linux全局变量区空间多大,从cplb_data全局变量看uclinux的存储空间划分
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的存储空间划分相关推荐
- Linux系统盘爆满根目录100%,又找不到占空间的大文件 原因与解决方法
最近一位朋友他的Linux(Centos7)根目录一直100%,也就是系统文件磁盘已经爆满了.虽然通过:df -h, du -sh * 等指令配合使用,发现当前系统任然存在大量可以使用的空间(6.5G ...
- 【Linux】Linux的内核空间(低端内存、高端内存)
内核也是程序,也应该具有自己的虚存空间,但是作为一种为用户程序服务的程序,内核空间有它自己的特点. 内核空间与用户空间的关系 在一个32位系统中,一个程序的虚拟空间最大可以是4GB,那么最直接的做法就 ...
- Linux虚拟机磁盘空间不足的解决方法
问题描述: 其实很多时候,在我们虚拟机安装了一些软件后,你发现磁盘莫名其妙的空间就满了,这个时候我们需要学会找到Linux系统中的大文件以及清理Linux的磁盘. 原因分析: 一个主要原因是在vmwa ...
- 关于Linux服务器磁盘空间占满问题的解决方法
下面给大家分享一篇关于Linux服务器磁盘占满问题解决方法(/dev/sda3 满了),需要的的朋友参考下吧 下面我们一起来看一篇关于Linux服务器磁盘占满问题解决(/dev/sda3 满了),希望 ...
- linux系统vmalloc分配过大,Linux内核,iptables和vmalloc大小
在我们的一些Linux机器上我们遇到了iptables的问题,似乎被加载的规则的剪切数导致vmalloc错误(大小3506176的vmap分配失败:使用vmalloc =增加大小.)出现在dmesg和 ...
- linux扩容根目录空间_Linux系统扩容根目录磁盘空间的操作方法
Linux系统扩容根目录磁盘空间的操作方法 一.使用背景 Linux根目录磁盘空间不够用了,当修改了虚拟机模版增加磁盘大小或者插入了一块新硬盘,但是发现系统里的大小还是没改变. 产生的原因是没有给磁盘 ...
- linux增加 inode空间,linux 增加inode 的方法
创建文件系统时,可以指定块的大小.如果将来在你的文件系统中是一些比较大的文件的话,使用较大的块大小将得到较好的性能.将ext2文件系统的块大小调整为4096byte而不是缺省的1024byte,可以减 ...
- linux扩展磁盘空间命令_在Linux上监视磁盘空间– SQL Server DBA的有用命令
linux扩展磁盘空间命令 In this article, we will explore the different Linux commands related to the disk spac ...
- Linux运维实战|大文件切割
介绍 日常工作中需要对日志文件进行分析,当日志文件过大时,Linux中使用vim.cat.vim.grep.awk等这些工具对大文件日志进行分析将会成为梦魇,具体表现在: 执行速度缓慢,文件内容需要加 ...
最新文章
- 听说微软出了个 Windows XP reStart Edition? 重启版?
- 【深度学习】CVPR 2021 全部论文链接公布!最新1660篇论文合集!附下载链接
- AJAX实现图片文件上传
- poj1330Nearest Common Ancestors(LCA小结)
- EA出品的java射击类游戏,盘点五款射击类RPG游戏:你喜欢这类型游戏吗?
- mysql 命令 pdf_MySQL命令文档 PDF 下载
- nobelking 3 js 数字和数字相加 字符串连接 数字和字符串连接1
- 没有上市的股权和股票有啥区别
- 向窗口发送ctrl c复制 消息
- SCPPO(二):禅道的使用—管理员
- ZooKeeper下载安装(Windows版本)
- oralce 12c集群 ora-01033
- 程序员自我学习自我培训指南
- HTTPS TSL/SSL详解
- STM32 CAN 库函数
- Windows 10创建用户
- 正则表达式学习——(2)正则回溯
- 拼图游戏Canvas版
- Passage Re-ranking with BERT
- 你想要成为团队里什么样的角色呢?