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函数来转换一下,即内存的物理地址转换到对应的内核虚拟地址。
- QualComm lk和kernel之间内存共享
- linux用户态和kernel之间共享内存 --- remap_pfn_range + mmap的实现方式
- linux用户态和kernel之间共享内存 --- remap_pfn_range + mmap的实现方式
- Qualcomm LK机制介绍
- 高通Qualcomm平台lk(light kernel)启动流程2——aboot_init()
- 高通Qualcomm平台lk(light kernel)启动流程1——aboot_init()之前
- [lcm] Qualcomm平台兼容多显示屏lcd的方法&并从lk传输到kernel过程
- 高通Qualcomm平台lk(light kernel)启动流程3——到高通lcm屏点亮
- 用户和kernel空间使用mmap共享内存
- IPC 资源、kernel.shmmax和Oracle 共享内存的调整
- M版本如何快速build kernel、lk 和 preloader
- little kernel分析 [LK]
- bootloader(lk---->kernel)
- Qualcomm 如何修改lk 开机logo
- qualcomm 平台的lk启动流程
- 不同进程之间共享内存
- 修改qualcomm kernel config文件
- 高通(Qualcomm)LK源码深度分析
- Spring static resource 自动配置和手动配置
- 事件对象和事件委托
- MFC内存泄露与检测
- 网络&加密刷题笔记-1
- javascript常用方法函数收集
- QualComm lk和kernel之间内存共享
- mysql 比较两个字符串(是否有包含关系)
- js倒计时60s
- Weex开发-致native移动开发者
- 中日文互译网站
- R数据分析入门知识点总结
- 阿里云linux环境下搭建配置SVN
- Spring-AOP实例
- Windows安装zookeeper