QualComm lk和kernel之间内存共享

来源:互联网 发布:剑侠情缘捏脸数据 编辑:程序博客网 时间:2024/06/05 08:34

一个需求:LK中初始化操作一块32K的内存,Kernel中读取出来。


LK中看到的内存都是物理内存,本来打算使用adsp内存(0x85B00000)前的32K内存,即0x85AF8000--0X85B00000这段的内存。但这LK中一使用这块内存,程序就会崩溃,可能是TZ导致。解决方法,将Kernel占据的内存地址增大32K,然后LK和Kernel之间共享这块内存。


参考代码如下:

diff --git a/bootable/bootloader/lk/app/aboot/aboot.c b/bootable/bootloader/lk/app/aboot/aboot.c
index 892189d..297e120 100644
--- a/bootable/bootloader/lk/app/aboot/aboot.c
+++ b/bootable/bootloader/lk/app/aboot/aboot.c
@@ -1025,7 +1025,7 @@ void boot_verifier_init()
  dprintf(CRITICAL, "Keystore verification failed! Continuing anyways...\n");
  }
 }
-
+char xgd_buf[50] = "this is reserved for XGD!!!\0";
 int boot_linux_from_mmc(void)
 {
  struct boot_img_hdr *hdr = (void*) buf;
@@ -1098,7 +1098,13 @@ int boot_linux_from_mmc(void)
  }
  /* Set Lun for boot & recovery partitions */
  mmc_set_lun(partition_get_lun(index));
-
+ //memcpy((void *)0x83400000,xgd_buf,50);
+ {
+ char buf_t[50];
+ memcpy((void *)0x83400000,xgd_buf,50);
+ memcpy((void *)buf_t,(void *)0x83400000,50);
+ dprintf(CRITICAL, "ERROR: buf_t[%s]\n",buf_t);
+ }
  if (mmc_read(ptn + offset, (uint32_t *) buf, page_size)) {
  dprintf(CRITICAL, "ERROR: Cannot read boot image header\n");
                 return -1;
diff --git a/bootable/bootloader/lk/platform/msm8953/include/platform/iomap.h b/bootable/bootloader/lk/platform/msm8953/include/platform/iomap.h
index b162644..9ae5502 100644
--- a/bootable/bootloader/lk/platform/msm8953/include/platform/iomap.h
+++ b/bootable/bootloader/lk/platform/msm8953/include/platform/iomap.h
@@ -534,6 +534,6 @@
 #define DDR_START                          get_ddr_start()
 #define ABOOT_FORCE_KERNEL_ADDR            (DDR_START + 0x8000)
 #define ABOOT_FORCE_KERNEL64_ADDR          (DDR_START + 0x80000)
-#define ABOOT_FORCE_RAMDISK_ADDR           (DDR_START + 0x3600000)
-#define ABOOT_FORCE_TAGS_ADDR              (DDR_START + 0x3400000)
+#define ABOOT_FORCE_RAMDISK_ADDR           (DDR_START + 0x3608000)
+#define ABOOT_FORCE_TAGS_ADDR              (DDR_START + 0x3408000)
 #endif
diff --git a/kernel/arch/arm/boot/dts/qcom/msm8953.dtsi b/kernel/arch/arm/boot/dts/qcom/msm8953.dtsi
old mode 100644
new mode 100755
index 1caba19..e22ea81
--- a/kernel/arch/arm/boot/dts/qcom/msm8953.dtsi
+++ b/kernel/arch/arm/boot/dts/qcom/msm8953.dtsi
@@ -23,7 +23,7 @@
  interrupt-parent = <&intc>;
 
  chosen {
- bootargs = "sched_enable_hmp=1 sched_enable_power_aware=1";
+ bootargs = "sched_enable_hmp=1 sched_enable_power_aware=1 xgd_mem=0x83400000";
  };
 
  reserved-memory {
@@ -36,7 +36,6 @@
  no-map;
  reg = <0x0 0x85b00000 0x0 0xd00000>;
  };
-
  modem_mem: modem_region@0 {
  compatible = "removed-dma-pool";
  no-map-fixup;
diff --git a/kernel/arch/arm64/kernel/setup.c b/kernel/arch/arm64/kernel/setup.c
index 89c2ac2..1559730 100644
--- a/kernel/arch/arm64/kernel/setup.c
+++ b/kernel/arch/arm64/kernel/setup.c
@@ -326,7 +326,7 @@ static void __init setup_machine_fdt(phys_addr_t dt_phys)
  while (true)
  cpu_relax();
  }
-
+ pr_info("%s: device tree blob at physical address 0x%p (virtual address 0x%p)\n",__func__,(void *)dt_phys,phys_to_virt(dt_phys));
  machine_name = of_flat_dt_get_machine_name();
  if (machine_name) {
  dump_stack_set_arch_desc("%s (DT)", machine_name);
diff --git a/kernel/init/main.c b/kernel/init/main.c
index c986118..c3b8518 100644
--- a/kernel/init/main.c
+++ b/kernel/init/main.c
@@ -235,6 +235,20 @@ static int __init loglevel(char *str)
 
 early_param("loglevel", loglevel);
 
+static int __init xgd_mem(char *str)
+{
+ unsigned long addr;
+ void * addr_v;
+ char buf[50];
+ addr = simple_strtoul(str, NULL, 0);
+ addr_v = phys_to_virt(addr);
+ memcpy(buf,addr_v,50);
+ printk(KERN_ERR "%s addr=0x%p,addr_v=0x%p,buf[%s] \n",__func__,(void *)addr,addr_v,buf);
+ return 0;
+}
+
+early_param("xgd_mem", xgd_mem);
+
 /* Change NUL term back to "=", to make "param" the whole string. */
 static int __init repair_env_string(char *param, char *val, const char *unused)
 {


注意:

1.对于一个指针,想要打印对应的地址,使用%p。

2.MMU功能在kernel启动的.S即汇编程序中已经开启。这样kernel中使用LK中的内存,需要通过 phys_to_virt()API函数来转换一下,即内存的物理地址转换到对应的内核虚拟地址。


原创粉丝点击