在将大量数据(3 MB)从 uboot 传递到 imx50 ARM 板上的 linux 内核 2.6.35.3 时遇到一些问题。该数据在内核设备驱动探测函数中是必需的,然后应该被释放。首先 uboot 将数据从闪存加载到 RAM,然后使用 bootargs 为 linux 内核传递物理地址。在内核中,我尝试使用 arch/arm/kernel/setup.c 文件中的 reserve_resource() 保留一定数量的内存:
--- a/arch/arm/kernel/setup.c Tue Jul 17 11:22:39 2012 +0300
+++ b/arch/arm/kernel/setup.c Fri Jul 20 14:17:16 2012 +0300
struct resource my_mem_res = {
.name = "My_Region",
.start = 0x77c00000,
.end = 0x77ffffff,
.flags = IORESOURCE_MEM | IORESOURCE_BUSY,
};
@@ -477,6 +479,10 @@
kernel_code.end = virt_to_phys(_etext - 1);
kernel_data.start = virt_to_phys(_data);
kernel_data.end = virt_to_phys(_end - 1);
+ my_mem_res.start = mi->bank[i].start + mi->bank[i].size - 0x400000;
+ my_mem_res.end = mi->bank[i].start + mi->bank[i].size - 1;
for (i = 0; i < mi->nr_banks; i++) {
if (mi->bank[i].size == 0)
@@ -496,6 +502,8 @@
if (kernel_data.start >= res->start &&
kernel_data.end <= res->end)
request_resource(res, &kernel_data);
+
+ request_resource(res, &my_mem_res);
}
if (mdesc->video_start) {
通过这个我试图告诉内核它保留了这个内存区域并且这个数据不应该被内核修改。
70000000-77ffffff : System RAM
70027000-7056ffff : Kernel text
70588000-7062094f : Kernel data
77c00000-77ffffff : My_Region
在驱动程序ioremap(0x77c00000, AREA_SIZE)
中用于获取内核内存地址。但是当我转储内存内容时,只有零。如果使用mem=120M
(总共 128MB RAM 可用)启动内核,那么我的数据在内核系统 ram 区域之上,那么我得到了我期望的数据。
所以,我的问题:
为什么我得到零以及如何将大量二进制数据从 uboot 传递到 linux 内核?