在imx50 ARM主板上从uboot向linux kernel 2.6.35.3传递大量数据(3MB)时遇到一些问题。此数据在内核设备驱动程序探测函数中是必需的,然后应将其释放。首先uboot将数据从闪存加载到RAM,然后使用uboot传递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内存可用),那么我的数据就在内核系统内存区域以上,那么我就会得到我想要的数据。
所以,我的问题是:
为什么我得到零,我如何将大量的二进制数据从uboot传递到linux内核?
发布于 2012-08-27 15:01:09
您可以使用自定义ATAG传递数据块或传递数据的地址和长度。请注意,ATAG中的"A“代表ARM,因此此解决方案不能移植到其他架构。ATAG比命令行bootarg IMO更可取,因为您不希望用户弄乱物理内存地址。此外,Linux内核将在启用MMU (即虚拟内存)之前处理ATAG列表。
在U-Boot中,查看lib_arm/armlinux.c或arch/arm/lib/bootm.c中构建ARM标记列表的例程。为您的新标记编写自己的例程,然后在do_bootm_linux()中调用它。
在Linux内核中,当虚拟内存尚未启用时,ATAG是在arch/arm/kernel/setup.c中处理的。如果您只是从U-Boot传递一个地址和长度值,那么可以将指针和长度分配给导出的全局变量。
void *my_data;
unsigned int my_dlen;
EXPORT_SYMBOL(my_data);
EXPORT_SYMBOL(my_dlen);然后司机就可以取回它了。
extern void *my_data;
extern unsigned int my_dlen;
request_mem_region(my_data, my_dlen, DRV_NAME);
md_map = ioremap(my_data, my_dlen);我使用类似的代码在U-Boot中探测静态随机存取存储器,然后将找到的KBytes的起始地址和编号传递给自定义ATAG中的内核。内核驱动程序获取这些值,如果它们是非零值并且具有相同的值,则在SRAM之外创建一个块设备。与您的情况的主要区别在于,SRAM与SDRAM在完全不同的物理地址范围内。
备注ATAG是由U-为内核可以使用的物理内存构建的,因此这是您真正需要定义和排除保留内存的地方。现在在内核中这样做可能已经太晚了。
https://stackoverflow.com/questions/11580285
复制相似问题