Nor Flash 代码压缩

1.   代码压缩需求

目前,feature phone普遍采用nor flash存放imageNor flash多采用16MB大小,如果超出,市场上很难采购到合适大小的nor flash,即使有,成本也很难令人接受。所以,在nor flash固定的情况下,只有想办法压缩image大小。

上述情况,就是feature phone采用压缩文件存放在nor flash的原因。当然,没有完美的方案,代码压缩同样需要付出代价:

1.     额外的RAM空间,用来存放解压缩后的code

2.     增加MMU模块,用来管理地址空间,并且在预取指令异常或者数据缺失异常发生的情况下,解压缩相应pagecode到空闲ram空间中去,并且刷新页表;

3.     增加硬件解压缩模块,用来减少解压代码需要的时间;

4.     压缩code执行需要更多的时间。


1.   代码压缩实现方案

代码压缩首先需要考虑对哪部分代码进行压缩。RTOS对代码执行效率要求较高,并且mmu的配置和中断处理都处于此image中,所以不能进行压缩。一般主要是对安装的应用程序进行压缩,对存放的各种图片等资源进行压缩。

注意:一旦压缩,就只能采取只读方式,无法修改image文件了。

 

压缩实现方案:

1.     编译时候,对生成的image文件进行压缩处理。主要是需要提供一个压缩命令,对文件压缩处理。压缩命令应该能按照指定的page大小(1K,4K)进行压缩,并且在压缩后的文件头部存放每个page压缩后的位置和大小,供解压缩使用。Page大小需要综合考虑压缩效率和解压缩时间来衡量。压缩算法比较灵活,由硬件的解压缩的实现方案决定;

 

2.     MMU初始化,此时需要考虑:mmu页表(pgdpte)内存空间,解压缩后code存放空间位置和大小,各个虚拟地址空间的各种属性,比如访问权限等。Mmu初始化pgd表项,根据虚拟地址空间属性,申请pte表项,并且完成初始化。最后,读取nor flash压缩文件,获取压缩文件相关信息,比如说page压缩后位置和大小等;

3.     当发生指令预取异常的时候,或者数据异常的时候,获取解压缩code空间的尾部,然后无效其虚拟地址的pgdtlb,然后根据发生异常的虚拟地址空间,在存储page压缩后位置和大小的空间中获取对应虚拟地址对应的nor flash offsetsize,使用解压缩硬件,把此page解压缩到解压缩地址空间对应的尾部的物理地址上,然后生成新的pgd表项,刷新tlb


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
linuxdriver_code_tool |-- 03 | `-- 2.6内核升级工具 | |-- device-mapper-1.00.19-2.i386.rpm | |-- lvm2-2.00.25-1.01.i386.rpm | |-- mkinitrd-4.2.0.3.tar.tar | |-- module-init-tools-3.2.2.tar.bz2 | `-- modutils-2.4.5-1.src.rpm |-- 04 | |-- 内核模块参数范例 | | `-- book.c | |-- 内核模块导出符号 | | `-- export_symb.c | `-- 最简单的内核模块 | `-- hello.c |-- 05 | `-- udev源代码 | `-- udev-114.tar.gz |-- 06 | |-- globalmem驱动 | | `-- globalmem.c | `-- 包含2个globalmem设备的驱动 | `-- globalmem_two.c |-- 07 | `-- 含并发控制的globalmem驱动 | `-- globalmem_lock.c |-- 08 | |-- globalfifo驱动 | | `-- globalfifo.c | `-- poll应用程序范例 | `-- pollmonitor.c |-- 09 | |-- 异步通知应用程序范例 | | `-- asyncmonitor.c | `-- 支持异步通知的globalfifo | `-- globalfifo_async.c |-- 10 | |-- S3C2410实时钟驱动 | | `-- s3c2410-rtc.c | `-- 秒设备驱动与应用程序 | |-- second.c | `-- second_test.c |-- 11 | |-- DMA范例 | | |-- 3c505.c | | |-- 3c505.h | | `-- dma.h | `-- 静态映射范例 | `-- mach-smdk2440.c |-- 12 | |-- NVRAM驱动 | | `-- generic_nvram.c | |-- 触摸屏驱动 | | |-- 作为input设备 | | | |-- s3c2410_ts.c | | | `-- s3c2410_ts.h | | `-- 作为普通字符设备 | | `-- s3c2410-ts.c | |-- 看门狗驱动 | | `-- s3c2410_wdt.c | `-- 平台设备 | `-- devs.c |-- 13 | |-- IDE驱动 | | |-- ide-disk.c | | `-- ide-h8300.c | `-- RAMDISK驱动 | `-- rd.c |-- 14 | |-- S3C2410串口驱动 | | |-- regs-gpio.h | | |-- regs-serial.h | | `-- s3c2410.c | `-- 串口核心层 | |-- serial_core.c | `-- serial_core.h |-- 15 | |-- S3C2410 I2C主机驱动 | | |-- i2c-s3c2410.c | | |-- iic.h | | |-- regs-gpio.h | | `-- regs-iic.h | `-- SAA711x I2C设备驱动 | `-- saa711x.c |-- 16 | `-- CS8900以太网设备驱动 | |-- cs89x0.c | `-- cs89x0.h |-- 17 | |-- ALSA工具及库 | | |-- alsa-driver-1.0.15.tar.bz2 | | |-- alsa-firmware-1.0.15.tar.bz2 | | |-- alsa-lib-1.0.15.tar.bz2 | | |-- alsa-oss-1.0.15.tar.bz2 | | |-- alsa-tools-1.0.15.tar.bz2 | | |-- alsa-utils-1.0.13.tar.bz2 | | `-- pyalsa-1.0.15.tar.bz2 | |-- ALSA驱动范例 | | |-- sa11xx-uda1341.c | | `-- uda1341.h | |-- ALSA应用程序范例 | | |-- pcm.c | | `-- pcm_min.c | |-- OSS驱动范例 | | `-- s3c2410-uda1341.c | `-- OSS应用程序范例 | |-- mixer.c | `-- sound.c |-- 18 | |-- FRAMEBUFFER应用程序范例 | | `-- fb_display | | |-- fb_display.c | | |-- fb_display.h | | |-- Makefile | | |-- README | | `-- test.c | `-- S3C2410 LCD驱动 | |-- s3c2410fb.c | `-- s3c2410fb.h |-- 19 | |-- busybox源代码 | | `-- busybox-1.2.1.tar.bz2 | |-- MTD工具 | | `-- mtd-utils-1.0.0.tar.gz | |-- nand驱动范例 | | `-- s3c2410.c | |-- nor驱动范例 | | `-- s3c2410nor.c | `-- yaffs&yaffs2源代码 | |-- yaffs.tar.gz | `-- yaffs2.tar.gz |-- 20 | |-- USB串口驱动 | | |-- usb-serial.c | | `-- usb-serial.h | |-- USB工具 | | `-- usbview-1.0.tar.tar | |-- USB骨架程序 | | `-- usb-skeleton.c | |-- USB键盘驱动 | | |-- input.h | | |-- usb_input.h | | `-- usbkbd.c | `-- usb主机控制器驱动范例 | |-- ohci-s3c2410.c | `-- usb-control.h |-- 21 | |-- PCI骨架程序 | | `-- pci-skeleton.c | `-- PCI驱动范例 | `-- i810_audio.c `-- 22 |-- 范例代码 | |-- oops范例 | | |-- oops_example.asm | | `-- oops_example.c | `-- proc范例 | `-- sim_proc.c `-- 内核调试工具 |-- ddd-3.3.11.tar.gz |-- gdbmod-2.4.bz2 |-- kdb-v4.4-2.6.15-rc5-common-1.bz2 |-- kdb-v4.4-2.6.15-rc5-common-2.bz2 |-- kdb-v4.4-2.6.15-rc5-i386-1.bz2 `-- linux-2.6.15.5-kgdb-2.4.tar.tar 73 directories, 91 files
Nor Flash代码是一种非易失性存储器的编程语言。Nor Flash是一种常见的闪存技术,用于存储固件、操作系统和其他固化数据。Nor Flash代码使用类似于C语言的语法,它可以用来编写存储在Nor Flash芯片中的程序和数据。以下是一个简单的Nor Flash代码示例: ```c #include <flash.h> // 定义存储位置和大小 #define FIRMWARE_START_ADDRESS 0x100000 #define FIRMWARE_SIZE 0x8000 // 定义固件数据 const uint8_t firmware_data[FIRMWARE_SIZE] = { 0x00, 0x01, 0x02, 0x03, // 在这里添加实际的固件数据 }; // 主程序入口 int main() { // 初始化Nor Flash硬件 flash_init(); // 擦除存储区域 flash_erase(FIRMWARE_START_ADDRESS, FIRMWARE_SIZE); // 写入固件数据 flash_write(FIRMWARE_START_ADDRESS, firmware_data, FIRMWARE_SIZE); // 退出程序 return 0; } ``` 以上是一个简单的Nor Flash代码示例,它首先包含了flash头文件,然后定义了固件在Nor Flash中的存储位置和大小。接着,定义了固件数据的数组,这里只是一个简单的示例,实际情况下应该包含实际的固件数据。然后,在主程序入口函数中,通过flash_init()函数初始化Nor Flash硬件,然后使用flash_erase()函数擦除存储区域,最后使用flash_write()函数写入固件数据。最后,返回0表示程序正常退出。 这只是一个简单的示例,实际应用中可能涉及更复杂的代码和功能。Nor Flash代码可以根据具体需求进行编写和调整,以实现相应的应用功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值