- 博客(26)
- 资源 (14)
- 收藏
- 关注
原创 uboot之ARM位置无关代码设计
前言:所谓位置无关代码是指:可执行镜像test.bin我将它拷贝至内存0x30000000,然后pc = 0x30000000、它可以顺利执行;我将它拷贝至内存0x38000000,然后pc = 0x38000000、它仍可以顺利执行。1.程序的编译及运行流程源码经过编译、汇编(生成相对地址符号表)和连接(提供绝对首地址、进而确定绝对地址符号表)后编程可执行镜像;特别指出地
2013-05-10 12:34:41 2035
原创 Linux平台下ARM-Linux交叉编译工具链
交叉编译工具链包括:gcc、glibc和binutils三个部分。以下是ubuntu平台下ARM的编译:一、反汇编工具arm-linux-objdump -D -S hello >log //查看hello的汇编代码二、ELF文件查看工具arm-linux-readelf -a hello >log //查看hello文件arm-linux-readelf -d hel
2013-05-08 21:15:53 1390
原创 Linux几种内核镜像及其关系
一、内核ELF文件 /vmlinux 它是Makefile的默认目标。1.顶层Makefile解析内核配置文件.config,递归到各个目录下编译出.o文件;2.根据/arch/arm/kernel/vmlinux.lds将其连接成/vmlinux,该文件是ELF格式。嵌入式系统中经常使用的编译目标zImage并不在顶层Makefile中,它是被顶层Makefile包含的a
2013-05-16 16:49:06 2488
原创 Android动态连接器linker与静态连接器ld
一、静态连接器ld 静态连接器ld是GNU编译工具链的一部分,包含在binutils中;其中,collect2是对ld的一层包装、我们在静态连接时常用collect2。 静态连接是在程序的编译连接中完成的。 静态连接中,连接器会把引用其他目标文件的函数进行地址重定位、进而分配地址;这叫连接时重定位。 eg:静态库编译进程序就是这样。二、动态连接器linker an
2013-05-16 13:44:52 5248
原创 《C编译原理》ubuntu下helloworld程序加载运行分析
一、理论1.程序的动态加载:即将可执行文件中当前要用到的部分从磁盘加载到内存,暂时不用的不加载;这样,可以让远大于物理内存的程序在机器上运行;2.页管理与程序的动态加载:物理内存:16KB;16KB/4KB = 4页,记F0~F3;程序大小:32KB;32KB/4KB = 8页,记P0~P7。完后分时加载,这部分有具体算法;不做讨论。3.程序加载过程首先,创建虚拟地址空
2013-05-13 17:55:42 1784
原创 《C编译原理》ubuntu下helloword编译连接过程分析
一、源程序vi hello.c#include int main(){ printf("helloworld!\n"); return 0;}二、编译及连接gcc -v hello.c -o hello...... /usr/lib/gcc/x86_64-linux-gnu/4.4.6/cc1 -quiet -v -imultilib . -imul
2013-05-13 14:13:49 1334
原创 uboot启动内核代码分析
一、nand分区信息nand一般划分成如下几个区域:bootlader-》params-》kernel-》rootuboot/include/configs/mini2440.h#define MTDPARTS_DEFAULT "mtdparts=nandflash0:250k@0(bootloader)," \ "128K(params)," \ "5m(kernel
2013-05-10 16:44:15 1186
原创 《C编译原理》程序的加载地址与运行地址
一、程序的加载地址程序被加载到RAM中的地址;这个不能由编译器决定、也就是不能由编译参数决定!由该模块的调用者决定!因为程序在nandflash中不能运行,所以需要加载到RAM中。一般我们必须在运行该程序前,将程序加载到运行地址处。即在代码设计时:在跳转至运行地址变量前,必须先完成代码搬运部分工作。二、程序的运行地址这个地址可以由编译器的编译参数来决定。目标文件中各
2013-05-10 10:20:41 2721
原创 ARM Cortex系列
ARM公司将ARM11以后的产品命名为Cortex,并分为A、R和M三个系列。 Cortex系列属于ARMv7架构,是ARM公司最新的指令架构。 由于应用领域的不同,基于v7架构的Cortex处理器系列采用的技术也不相同:基于v7A的Cortex-A系列,基于v7R的Cortex-R系列和基于v7M的Cortex-M系列。一、ARM Cortex-A系列 该系列面向尖端的基于
2013-05-10 09:27:35 1567
原创 uboot编译连接脚本文件uboot.lds
因为内存的执行效率比较高,所以uboot的绝大部分功能应该在SDRAM内存中完成;即uboot在连接时,我们制定它的运行地址是0x30000000。但CPU复位重启时,PC的默认值是0x00000000;因此,uboot开始部分(4KB)必须在0x00000000处执行;这就存在PIC,即位置无关代码设计的问题,见ARM位置无关代码设计。所以,为了让uboot能正常顺利执行;我们必须保
2013-05-09 23:56:23 1232
转载 android linker 浅析
Android 的加载/链接器linker 主要用于实现共享库的加载与链接。它支持应用程序对库函数的隐式和显式调用。对于隐式调用,应用程序的编译与静态库大致相同,只是在静态链接的时候通过--dynamic-linker /system/bin/linker 指定动态链接器,(该信息将被存放在ELF文件的.interp节中,内核执行目标映像文件前将通过该信息加载并运行相应的解释器程序linker.)
2013-05-09 18:00:12 1590
转载 C编译器、连接器与可执行机器码文件
有些人写C/C++(以下假定为C++)程序,对unresolved external link或者duplicated external simbol的错误信息不知所措(因为这样的错误信息不能定位到某一行)。或者对语言的一些部分不知道为什么要(或者不要)这样那样设计。了解本文之后,或许会有一些答案。 首先看看我们是如何写一个程序的。如果你在使用某种IDE(Visual Studio,El
2013-05-09 17:41:58 1520
原创 micro2440/tiny6410使用JLINK直接烧录nand flash
一、将内存初始化程序下载至SRAM并运行1.打开J-Link Commander,将micro开发板拨至nand flash启动。2.以下是常用命令:speed 12000:设置下载速率为12M。r:reset,复位命令。h:halt,停机、也有暂停的功能。loadbin :下载filename文件到地址address上。setpc:设在PC寄存器的值。3.具体操
2013-05-09 14:13:22 3146
原创 Window平台下ADS自带ARMCC编译工具链
ARM可执行文件常用格式有:gnu的elf,axd调试用的axf,以及烧录用的bin。Linux下gnu的c编译器生成的是elf,Window下armcc编译器生成的是axf;两者都可以通过转换生成烧录的bin。其中elf和axf格式基本相同;简单地说:elf和axf格式包含调试信息,bin格式不包含。以下说明是在Window平台下对基于ARM11的S3C6410的编译过程。一、A
2013-05-09 11:23:42 1648
原创 《Linux内核编程》第十五章:Linux设备模型
一、底层数据结构kset及kobjectkernel2.6.35.11/include/linux/kobject.hstruct kobject { const char *name; struct list_head entry; struct kobject *parent; struct kset *kset; struct kobj_type *
2013-05-08 17:42:58 1009
原创 《Linux内核编程》第十四章:Linux驱动基础
一、内核模块1.内核模块的编译在内核源码树之外编译时,Makefile写法:obj-m := hello.oKERNELBUILD := /lib/modules/$(shell uname -r)/builddefault: make -C $(KERNELBUILD) M=$(shell pwd) modulesclean: rm -rf *.o *.ko *.mod.c
2013-05-08 09:22:52 776
原创 《miniOS分析》前言
偶然机会接触到了《嵌入式底层软件开发》一书,杨铸和唐攀编著、北京航空航天大学出版社出版。有幸看到作者写的miniOS,是借鉴的Linux操作系统。发现这款精小的操作系统对认识和学习Linux系统用处颇大,于是从网上下载了作者的miniOS工程。 以此作为自己学习Linux内核的基础,并记录学习心得。 在此,感谢作者!
2013-05-07 16:30:38 1571
原创 ARM协处理器
ARM920T = ARM9 core + MMU + CacheMMU和Cache由CP15的相关寄存器来控制。一、CP15协处理器 在基于ARM的嵌入式系统中,对存储系统的管理通常是通过设置系统控制协处理器CP15来实现。1.CP15可以包含16个32位寄存器,其编号由0~15:其中C1、C7和C9是Cache相关设置;C1、C2、C3、C8和C10是MMU相关设置。
2013-05-07 10:42:18 1346
原创 ARM汇编
一、ARM寄存器R15:别名PC,中文译为程序计数器;它的值是当前正在执行的指令在内存中的位置。R14:别名LR,中文译为链接寄存器;它与子程序的调用密切相关,用于存放子程序的返回地址,是ARM程序实现子程序调用的关键。R13:别名SP,中文译为栈指针寄存器;它是用于存放堆栈的栈顶地址的(内存位置)。寄存器R0~R12是普通的数据寄存器,可用于任何地方。CPSR:中文译为当前程
2013-05-07 10:01:35 1025
原创 《Linux内核编程》第十三章:Linux对进程内存的二级页式管理
举例: 当我们通过系统调用fork创建子进程时,将完全复制父进程的页表、同时将该页表置为写保护。 之后,当父进程或子进程向地址空间写数据时,就会产生缺页异常、分配新的页、同时将两个页都置为可写。 目前Linux版本支持4级分页虚拟地址映射,可满足64位CPU的寻址要求。不过,ARM9的MMU只支持两级页表地址转换,而且两级能满足32位CPU的存储管理需求,因此、ARM体系只使
2013-05-03 17:43:30 1190
原创 《Linux内核编程》第十二章:Linux进程调度
1.Linux进程调度工作由内核完成;即ARM必须切到特权模式,Linux转入内核态时完成。2.Linux发生进程调度,也就是进程上下文切换、有如下两种情况: 进程主动放弃CPU:当前进程执行结束;进程将通过系统调用,然ARM切换至特权模式、同时Linux转入内核态。 进程被抢占:当发生硬件中断(包括时间片用完的定时器中断)时;ARM切换至特权模式、Linux转入内核态。下面通
2013-05-03 14:44:00 1005
原创 《C编译原理》自己写C语言编译器
一个编译器至少需要包含如下几个部分:词法分析器:对源代码的字符串进行扫描和分解,根据构词法将字符流转换成单词流。语法分析器:根据文法规则把单词序列分解成各类语法单位,识别出一个一个句子。语义分析器:根据前边产生的一个个句子,按语言的语义进行翻译,产生四元式或三元式等中间语言。优化器:把中间代码进行转换,以产生更加高效的目标代码。代码生成器:把中间代码转换成汇编指令或可重定位的目
2013-05-03 09:57:08 4188
原创 裸机驱动之理解(*(volatile unsigned *)
#define rGPIOFDAT (*(volatile u32 *)0x7f0080a4) 理解如上宏定义,需要从两个部分:第一:强转指针类型(volatile u32 *)0x7f0080a4 0x7f0080a4只是一个普通值;前面加上(volatile u32 *)后,就是一个地址了,并且该地址指向volatile u32变量。第二:(*(volatil
2013-05-02 22:14:48 2168
原创 《Linux内核编程》第十一章:Linux进程地址空间
Linux将4G的虚拟地址空间划分为2部分---用户空间与内核空间。 用户空间从0到0xbfffffff;内核空间从3G到4G,内核地址空间是固定的、不会随着进程变化而改变。一、所用用户进程共享3~4G Linux将内存分为内核程序、高速缓冲、虚拟盘和主内存四个部分。由此可以得出:内核程序是被单独划出的。原因如下:内核代码在操作系统运行时会经常被调用,因此、需要常驻内存。所以,将
2013-05-02 18:04:29 840
原创 《Linux内核编程》第十章:Linux内核态的进程上下文
1.hello.c#include#include#include#include MODULE_LICENSE("GPL");static int __init lkp_init(void){ printk("Hello World!\n"); printk("The process is %s pid is %d\n", current->comm, cu
2013-05-02 13:40:40 704
window下YUVviewerPlus图像查看
2013-11-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人