10 2012 档案
并发与竟态
摘要:概念并发:多个执行单元同时被执行。竟态:并发的执行单元对共享资源(硬件资源和软件上的全局变量等)的访问导致的竞争状态。一 信号量信号量的实现也是与体系结构相关的,定义在<asm/semaphore.h>,struct semaphore类型用来表示信号量。1 定义信号量struct semaphore sem;2 初始化信号量void sema_init(struct semaphore *sem, int val) 该函数用于初始化设置信号量的初值,它设置信号量sem的值为val。void init_MUTEX(struct semaphore *sem)该函数用于初始化一个互斥 阅读全文
posted @ 2012-10-24 10:44 Daniel.G 阅读(618) 评论(0) 推荐(0)
SecureCRT下的串口不能输入
摘要:用串口配置交换机的时候,出现的问题:用secureCRT建了一个串口COM1后,连接上开发板后,可以正确接受和显示串口的输出,但是按键输入无效。解决方法:Session Options -> Connection -> Serial -> Flow Control,将原先默认选中的 RTS/CTS取消掉,再重新connect开发板,再次连上后,此时就可以从键盘输入了。网上解析:【RS232的三种流控制模式】DTR/DSR:硬件上要有对应接口,软件上实现对应协议,才能实现此流控制。具体实现起来,一般好像是和RTS/CTS一直搭配使用。RTS/CTS:硬件上要有对应接口,软件上实 阅读全文
posted @ 2012-10-22 12:46 Daniel.G 阅读(1486) 评论(0) 推荐(0)
系统调用
摘要:一 工作原理一般情况下,用户进程是不能访问内核的。它既不能访问内核所在的内存空间,也不能调用内核中的函数。系统调用是一个例外。其原理是进程先用适当的值填充寄存器,然后调用一个特殊的指令,这个指令会让用户程序跳转到一个事先定义好的内核中的一个位置,内核根据应用程序所填充的固定值来找到相应的函数。1 适当的值在文件(arch/arm/)include/asm/unistd.h中为每个系统调用规定了唯一的编号,这个号称为系统调用号 #define __NR_restart_syscall (__NR_SYSCALL_BASE+ 0) #define __NR_exit ... 阅读全文
posted @ 2012-10-20 20:55 Daniel.G 阅读(415) 评论(0) 推荐(0)
linux进程控制
摘要:* 程序是存放在磁盘上的一系列代码和数据的可执行映像,是一个静止的实体。* 进程是一个执行中的程序。它是动态的实体。* 进程是资源分配的最小单位* 线程是调度的最小单位** 进程四要素1 有一段程序供其执行。这段程序不一定是某个进程所专有,可以与其他进程共用。2 有进程专用的内核空间堆栈。3 在内核中有一个task_struct数据结构,即通常所说的“进程控制块”。有了这个数据结构,进程才能成为内核调度的一个基本单位接受内核的调度。4 有独立的用户空间。*** 进程描述:在Linux中,线程、进程都使用struct task_struct来表示,它包含了大量描述进程/线程的信息,其中比较重要的 阅读全文
posted @ 2012-10-16 20:19 Daniel.G 阅读(438) 评论(0) 推荐(0)
内核定时器
摘要:时钟中断由系统的定时硬件以周期性的间间隔产生,这个间隔(即频率)由内核根 据HZ来确定,HZ是一个与体系结构无关的常数,可配置(50-1200),在X86平台,默认值为1000。每当时钟中断发生时,全局变量jiffies(unsigned long)就加1,因此jiffies记录了自linux启动后时钟中断发生的次数。驱动程序常利用jiffies来计算不同事件间的时间间隔。 定时器用于控制某个函数(定时器处理函数)在未来的某个特定时间执行。内核定时器注册的处理函只执行一次--不是循环执行的。内核定时器被组织成双向链表,并使用struct timer_list结构描述。struct timer_ 阅读全文
posted @ 2012-10-16 18:39 Daniel.G 阅读(263) 评论(0) 推荐(0)
list_entry()详解
摘要:Linux内核中,获取节点地址的函数list_entry()非常常用,由于其定义有点晦涩,先解析如下:list_entry的宏定义:#define list_entry(ptr, type, member) /((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))这个倒是不难理解:从一个结构的成员指针找到其容器的指针。但是正因为如此,我的第一感觉是,这个宏的名字应该更加抽象,名字似乎应该改称叫“寻找容器”一类的,查看list.h源代码,发现现在的定义是这样的:#define list_entry(ptr, t 阅读全文
posted @ 2012-10-16 17:55 Daniel.G 阅读(912) 评论(0) 推荐(0)
Linux内核配置系统浅析
摘要:简介:随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 Linux 内核级的开发中。面对日益庞大的 Linux 内核源代码,开发者在完成自己的内核代码后,都将面临着同样的问题,即如何将源代码融入到 Linux 内核中,增加相应的 Linux 配置选项,并最终被编译进 Linux 内核。这就需要了解 Linux 的内核配置系统。随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 Linux 内核级的开发中。面对日益庞大的 Linux 内核源代码,开发者在完成自己的内核代码后,都将面临着同样的问题 阅读全文
posted @ 2012-10-16 13:21 Daniel.G 阅读(488) 评论(0) 推荐(0)
Linux slab 分配器剖析
摘要:简介:良好的操作系统性能部分依赖于操作系统有效管理资源的能力。在过去,堆内存管理器是实际的规范,但是其性能会受到内存碎片和内存回收需求的影响。现在,Linux® 内核使用了源自于 Solaris 的一种方法,但是这种方法在嵌入式系统中已经使用了很长时间了,它是将内存作为对象按照大小进行分配。本文将探索 slab 分配器背后所采用的思想,并介绍这种方法提供的接口和用法。动态内存管理内存管理的目标是提供一种方法,为实现各种目的而在各个用户之间实现内存共享。内存管理方法应该实现以下两个功能:最小化管理内存所需的时间最大化用于一般应用的可用内存(最小化管理开销)内存管理实际上是一种关于权衡的 阅读全文
posted @ 2012-10-16 13:18 Daniel.G 阅读(335) 评论(0) 推荐(0)
Linux 内核剖析
摘要:简介:Linux® 内核是一个庞大而复杂的操作系统的核心,不过尽管庞大,但是却采用子系统和分层的概念很好地进行了组织。在本文中,您将探索 Linux 内核的总体结构,并学习一些主要的子系统和核心接口。您还可以通过其他 IBM 文章的链接更深入地进行学习。由于本文的目标是对 Linux 内核进行介绍并探索其体系结构和主要组件,因此首先回顾一下 Linux 的简短历史,然后从较高的层次审视 Linux 内核的体系结构,最后介绍它的主要子系统。Linux 内核具有超过 600 万行的代码,因此本文不可能进行完整的介绍。请使用指向其他内容的链接进一步学习。Linux 的简短历史尽管 Linu 阅读全文
posted @ 2012-10-16 13:16 Daniel.G 阅读(374) 评论(0) 推荐(0)
Linux 文件系统剖析 按照分层结构讨论 Linux 文件系统
摘要:简介:在文件系统方面,Linux® 可以算得上操作系统中的 “瑞士军刀”。Linux 支持许多种文件系统,从日志型文件系统到集群文件系统和加密文件系统。对于使用标准的和比较奇特的文件系统以及开发文件系统来说,Linux 是极好的平台。本文讨论 Linux 内核中的虚拟文件系统(VFS,有时候称为虚拟文件系统交换器),然后介绍将文件系统连接在一起的主要结构。基本的文件系统体系结构Linux 文件系统体系结构是一个对复杂系统进行抽象化的有趣例子。通过使用一组通用的 API 函数,Linux 可以在许多种存储设备上支持许多种文件系统。例如,read函数调用可以从指定的文件描述符读取一定数量 阅读全文
posted @ 2012-10-16 13:14 Daniel.G 阅读(383) 评论(0) 推荐(0)
Linux bootloader 编写方法
摘要:简介:对于移植 linux 到其它开发板的人来说,编写 boot loader 是一个不可避免的过程。对于学习linux的人来讲,编写 bootloader 也是一个很有挑战性的工作。本文通过对 linux引导协议进行分析,详细阐述了如何编写一个可以在 i386 机器上引导 2.4.20内核的基本的bootloader。1.概述linux运行在保护模式下,但是当机器启动复位的时候却处于实模式下。所以写bootloader做的工作也是在实模式之下的。linux的内核有多种格式,老式的zImage和新型的bzImage。它们之间最大的差别是对于内核体积大小的限制。由于zImage内核需要放在实模式 阅读全文
posted @ 2012-10-16 13:10 Daniel.G 阅读(1176) 评论(0) 推荐(0)
Linux 引导过程内幕 从主引导记录到第一个用户空间应用程序的指导
摘要:简介:引导 Linux® 系统的过程包括很多阶段。不管您是引导一个标准的 x86 桌面系统,还是引导一台嵌入式的 PowerPC® 机器,很多流程都惊人地相似。本文将探索 Linux 的引导过程,从最初的引导到启动第一个用户空间应用程序。在本文介绍的过程中,您将学习到各种与引导有关的主题,例如引导加载程序、内核解压、初始 RAM 磁盘以及 Linux 引导的其他一些元素。早期时,启动一台计算机意味着要给计算机喂一条包含引导程序的纸带,或者手工使用前端面板地址/数据/控制开关来加载引导程序。尽管目前的计算机已经装备了很多工具来简化引导过程,但是这一切并没有对整个过程进行必要的 阅读全文
posted @ 2012-10-16 13:07 Daniel.G 阅读(415) 评论(0) 推荐(0)
嵌入式系统 Boot Loader 技术内幕
摘要:简介:本文详细地介绍了基于嵌入式系统中的 OS 启动加载程序 ―― Boot Loader 的概念、软件设计的主要任务以及结构框架等内容。1. 引言在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行。一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次:1. 引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分。2.Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。3.文件系统。包括根文件系统和建立于 Flash 内存设备之上文件系统。通常用 ram disk 来作为 root fs。4.用户 阅读全文
posted @ 2012-10-16 13:00 Daniel.G 阅读(294) 评论(0) 推荐(0)
linux内核地址空间
摘要:内核空间是由内核负责映射,它并不会跟着进程改变,是固定的。高端内存:物理内存896M以上部分称之为高端内存。内核空间分布:* 直接内存映射去(Direct Memory Region)从3G开始,最大896的线性地址区间,我们称作直接内存映射区,这是因为该区域的线性地址和物理地址之间存在线性转换关系 线性地址=3G+物理地址* 动态内存映射区(Vmalloc Region)该区域的地址由内核函数vmalloc来进行分配,其特点是线性空间连续,但对应的物理空间不一定连续。vmalloc分配的线性地址所对应的物理页可能处于低端内存,也可能处于高端内存。* 永久内存映射区(PKMap Region) 阅读全文
posted @ 2012-10-16 12:54 Daniel.G 阅读(399) 评论(0) 推荐(0)
进程地址空间
摘要:虚拟内存linux操作系统采用虚拟内存管理技术,使得每个进程都有独立的进程地址空间,该 空间大小为3G,用户看到和接触的都是虚拟地址。linux将4G的虚拟地址空间划分为两个部分--用户空间与内核空间。用户空间:0--0xbfffffff内核空间:3G--4G内存分配:应用程序中:malloc函数进行动态分配linux内核中:kmalloc函数动态分配内存#include<linux/slab.h>void *kmalloc(size_t size, int flags)参数: size:要分配的内存大小 flags:分配标志,它控制kmalloc的行为。flags: GFP_AT 阅读全文
posted @ 2012-10-16 12:22 Daniel.G 阅读(224) 评论(0) 推荐(0)
内存管理子系统
摘要:一 地址类型* 物理地址:是指出现在cpu地址总线上的寻址物理内存的地址信号,是地址变换的 最终结果。* 逻辑地址:程序代码经过编译后,出现在汇编程序中的地址。* 线性地址:又名虚拟地址,在32位的cpu架构下,可以表示4G的地址空间,用16进制表示就是0x00000000到0xffffffff。二 地址转换(图):cpu要将一个逻辑地址转换为物理地址,需要两步:首先cpy利用段式内存管理单元,将逻辑地址转换成线性地址,再利用页式内存管理单元,把线性地址最终转换为物理地址。三 段式管理,页式管理* 段式管理(16位): 逻辑地址=段基地址+段内偏移量由逻辑地址得到物理地址的公式为:PA = 段 阅读全文
posted @ 2012-10-16 11:37 Daniel.G 阅读(284) 评论(0) 推荐(0)
GNU ARM汇编--(十六)bootloader与kernel之间的commandline的传递
摘要:在《GNU ARM汇编--(十五)linux下的printascii》中已经初步分析了自己写的bootloader在引导kernel时候出现的commandline在bootloader和kernel之间传递的问题,今天终于解决了,并对参数传递有一些研究: 传递的参数为:[cpp]view plaincopyprint?params->u1.s.page_size=LINUX_PAGE_SIZE;params->u1.s.nr_pages=(DRAM_SIZE>>LINUX_PAGE_SHIFT);params->commandline[COMMAND_LINE_ 阅读全文
posted @ 2012-10-15 22:29 Daniel.G 阅读(523) 评论(0) 推荐(0)
GNU ARM汇编--(十五)linux下的printascii
摘要:在前面对很多s3c2440的功能模块进行学习后,已经具备了将这些模块综合起来的条件,基于此,将前面的代码综合成一个简单的bootloader.自己写的bootloader在引导kernel的时候,串口输出只有Uncompressing Linux...和done, booting the kernel。串口有这个输出,说明kernel被正确引导了,但是串口有问题。 这篇blog只是分析解决这个问题的第一步: 既然"Uncompressing Linux..."这句打印是kernel代码中的,那kernel的其他打印怎么没有? 在arch\arm\boot\compresse 阅读全文
posted @ 2012-10-15 22:28 Daniel.G 阅读(706) 评论(0) 推荐(0)
GNU ARM汇编--(十四)GNU ARM汇编下做任务调度
摘要:以前工作中用过arm7,没有MMU,也没有用任何OS.现在回忆当时的代码结构,我觉得可以叫无限循环的有限状态机.arm7不跑OS,就相当于单片机,单片机跑的肯定是无限死循环.有限状态机是因为整个代码要处理很多外部的事情,那就是大的循环里面来套小循环,以轮询的方式来检查外界的变化,然后系统作出变化,系统在有限的状态中切换. OS的一个标识就是支持多任务的并发.比方说linux,我们看起来是多个进程在同时运行,实际上还是cpu运行一下这个进程,再运行一下其他进程.这个就涉及到上下文切换以及进程调度的算法.当然我这里说的是单核的情况,如果是SMP的话,可能有些区别.暂时也没研究linux下的进... 阅读全文
posted @ 2012-10-15 22:27 Daniel.G 阅读(538) 评论(0) 推荐(0)
GNU ARM汇编--(十三)GNU ARM汇编下的linker script
摘要:在写GNU ARM汇编下的linker script之前,还是有必要看一下ldr指令,以及ldr和adr伪指令. ldr指令: LDR load word into a register Rd <- mem32[address] ldr伪指令: LDR Rd, =constant LDR load constant pseudoinstruction Rd=32-bit constant adr伪指令: ADR Rd, label ADR load address ... 阅读全文
posted @ 2012-10-15 22:26 Daniel.G 阅读(750) 评论(0) 推荐(0)
GNU ARM汇编--(十二)arm汇编指令的B真的那么简单吗?
摘要:说句题外话,在输入“指令”二字的时候,就想起了google搜索时,提示“令”不能搜索,要我换词汇.如果不能说脏话,我真就无语了. 在前面对具体芯片的各个基本模块做完了学习后,在上一篇小结中自以为已经具备了自己写个bootloader的条件,但其实错了,我还有很多基本的知识不了解.比如编译链接\gnu的linker script等等.也有很多地方只懂表面,没有做深入的理解. 在《GNU ARM汇编--(二)汇编编译链接与运行》中,仿照网上的例子做了makefile和linker script,在那篇blog的末尾我写道“根据google,做了上面的总结,对GNU ARM汇编有了认识,... 阅读全文
posted @ 2012-10-15 22:25 Daniel.G 阅读(417) 评论(0) 推荐(0)
I2C之知(六)--s3c2440用I2C接口访问EEPROM
摘要:前面阅读理解了I2C的官方协议文档后,就拿s3c2440和EEPROM来验证一下. 本来是想用s3c2440的SDA和SCL管脚复用为GPIO来模拟的,但在没有示波器的情况下搞了一周,怎么都出不来,最后还是放弃了.甚至参考了linux下i2c-algo-bit.c和i2c-gpio.c,依然没调出来.如果有示波器,可能很快就能找到原因,现在完全不知道问题出在哪里.其实想用GPIO模拟I2C的目的很简单,以一种简单而又深刻的方式来理解I2C. 既然这条路暂时没法走,退而求其次,用s3c2440的I2C接口来访问EEPROM,只要按照datasheet的来做,基本上不用考虑时序咯. ... 阅读全文
posted @ 2012-10-15 22:24 Daniel.G 阅读(1133) 评论(0) 推荐(0)
GNU ARM汇编--(十)s3c2440的RTC
摘要:RTC概述 在系统电源关掉时RTC可以在备份电池的支持下来工作.RTC可以使用STRB/LDRB指令传输8bit的BCD值到CPU.数据包括秒,分,时,日期,天,月和年.RTC工作在外部32.768KHz的晶振下,而且有报警功能.属性 BCD:秒,分,时,日期,天,月和年 闰年产生器 报警功能:报警中断 从power-off模式唤醒 独立的电源管脚(RTCVDD) 为RTOS kernel time tick支持毫秒级的tick.闰年产生器 闰年产生器通过BCDDATA,BCDMON和BCDYEAR来决定每个月最后一天的日期.一个8bit的计数器只能表示两个BCD码,所以无法决定... 阅读全文
posted @ 2012-10-15 22:23 Daniel.G 阅读(1112) 评论(0) 推荐(0)
GNU ARM汇编--(九)s3c2440的PWM
摘要:依旧从datasheet开始看起,锻炼下阅读英文技术手册的能力PWM TIMER概述 s3c2440有5个16bit的定时器.Timer0,1,2和3有PWM功能.Timer4是没有输出管脚的内部定时器.Timer0有一个dead-zone产生器,用于大电流设备. Timer0和1共用一个8bit的预分频器,而timer2,3,4共用另外一个8bit的预分频器.每一个定时器都有一个时钟除法器,可以产生5个不同的除法信号(1/2,1/4,1/8,1/16和TCLK).每一个定时器从时钟除法器接收各自的时钟信号,除法器从各自的8bit预分频器接收时钟.8bit的预分频器是可编程控制的,将PCL.. 阅读全文
posted @ 2012-10-15 22:22 Daniel.G 阅读(1186) 评论(0) 推荐(0)
GNU ARM汇编--(八)s3c2440的watchdog
摘要:从单片机起,watchdog就是必不可少的.在各种应用环境中,程序很可能跑飞或死掉,这时候就需要通过watchdog来保证整个系统重新恢复到正常状态. 照旧,给出s3c2440的datasheet说明:概述: watchdog timer用于由于噪声或者系统错误引起的程序跑飞了的情况下恢复处理器的正常操作.它可以被用作一个可以请求中断服务的普通16bit的内部定时器.watchdog timer产生128 PCLK的重启信号.特点: 有中断请求的普通内部定时器模式 当定时器计数为0(超时)时,产生内部的长达128PCLK周期的重启信号watchdog timer的操作: F18-... 阅读全文
posted @ 2012-10-15 22:20 Daniel.G 阅读(469) 评论(0) 推荐(0)
GNU ARM汇编--(七)s3c2440的串口控制
摘要:在配置完s3c2440的系统时钟后,我们来控制串口.之所以将串口放在这么靠前,是因为串口会给我们带来更多的信息.在没有串口的时候,uboot启动阶段只能靠led来显示一些信息.那么有了串口,debug就方便很多了.在工作中,一般情况下,很少有机会用jtag口加上昂贵的codeviser工具进行debug,也很少用gdb进行远程debug的,用的最多的还是打开debug的define来分析确定问题. 还是从s3c2440的datasheet开始: s3c2440A的UART提供3个独立的异步串行IO口,每一个都支持中断和DMA.换句话来说,UART可以产生中断请求或DMA请求来在CP... 阅读全文
posted @ 2012-10-15 22:19 Daniel.G 阅读(757) 评论(0) 推荐(0)
GNU ARM汇编--(六)s3c2440的时钟控制
摘要:前面几篇利用GNU ARM汇编控制LED以及ARM的中断处理的设计,对ARM汇编以及体系结构有了一定的认识.后面的汇编学习会结合具体的芯片进行,一个为了更灵活熟练的使用汇编,二也是为了通过学习一款具体芯片来提炼出一些有价值的经验.此次选择的芯片是三星的s3c2440,arm920t的核,整个板子是TQ2440的板子,这个板子放了两年多了,零散的玩过一些,但是为了建立更有体系的知识结构,还是值得把它玩过个遍.可能这个芯片很过时了,应该很多人在玩6410,在工作中接触的也是arm11\Cortex-A9或者ppc,但是很多东西并不会过时的.虽然工作中接触的东西比较新,但是作为做应用的公司,很多底层 阅读全文
posted @ 2012-10-15 22:18 Daniel.G 阅读(642) 评论(0) 推荐(0)
GNU ARM汇编--(五)中断汇编之嵌套中断处理
摘要:在上篇《GNU ARM汇编--(四)中断汇编之非嵌套中断处理》中分析了最简单的中断处理的写法,再看TQ2440启动代码中的中断向量表的写法就一目了然了.今天抽时间对嵌套中断处理的学习做下整理. 嵌套中断处理的核心代码如下:[cpp]view plaincopyprint?;/*;*____________________________________________________________________;*;*Copyright(c)2004,AndrewN.Sloss,ChrisWrightandDominicSymes;*Allrightsreserved.;*_____... 阅读全文
posted @ 2012-10-15 22:17 Daniel.G 阅读(1609) 评论(0) 推荐(0)
GNU ARM汇编--(四)中断汇编之非嵌套中断处理
摘要:在写这篇blog之前,不得不感慨一句:纸上得来终觉浅,绝知此事要躬行.作为EE出身的,虽然好久好久没用汇编写单片机的中断了,但自我感觉对中断的理解还是比较深入的,本以为在GNU ARM汇编下搞个中断会很容易,谁知道断断续续花了我几周.完全用汇编写中断和用c中的_irq写中断还是有区别的,谁用谁知道.还是那句话:深入细节是必须的,也是值得的. 这一篇blog的理论知识主要来源于:《ARM System Developer's Guide》. ARM的异常和相应的模式之间的对应关系见下表:当一个异常导致模式的改变时,内核自动地:1、把cpsr保存到相应模式下的spsr2、把pc保存到相应模 阅读全文
posted @ 2012-10-15 22:16 Daniel.G 阅读(955) 评论(0) 推荐(0)
GNU ARM汇编--(三)ARM处理器的基本原则
摘要:这一篇的知识来源全部来自《ARM System Developer's Guide》 从编程人员的视角来看,arm核是由数据总线连接的功能单元组成,如下图所示: 数据通过数据总线流向处理器核心,这里的数据可以是将要执行的指令,也可以是数据项.上面的图是Von Neumann体系的arm核,数据项和指令共用同一总线.而h哈佛结构体系的arm核就会用两个不同的总线. 就像所有的RISC处理器,arm采用load-store体系结构.也就是说它含有两条不同的指令类型来出入处理器.loar指令将数据从内存拷贝到寄存器,store指令是将数据从寄存器拷贝到内存.没有直接操作内存中... 阅读全文
posted @ 2012-10-15 22:14 Daniel.G 阅读(534) 评论(0) 推荐(0)
GNU ARM汇编--(二)汇编编译链接与运行
摘要:GNU的汇编器是GNU Tools的一部分,可以用来ARM的汇编语言源代码编译为二进制文件.关于GNU汇编器的介绍可以搜索《GNU Assembler Manual》.这里我们只是做一个简短的介绍,对GNU汇编器有一个大概的认识,同时通过两个例子了解一下GNU ARM汇编. 给出一个模板文件:[cpp]view plaincopyprint?.text;Executablecodefollows_start:.global_start;"_start"isrequiredbythelinker.globalmain;"main"isourmainprog 阅读全文
posted @ 2012-10-15 21:33 Daniel.G 阅读(949) 评论(0) 推荐(0)
GNU ARM汇编--(一)开篇
摘要:在大学的时候,汇编就是学的很烂.一是对汇编这门语言没概念,二是那些指令集很难记清楚,用的机会也少,自然学的不好.但是现在觉得相当有必要重头学习一下汇编.部分原因我在上一篇写完设备模型的总结时提到了而.最近在看一本书《ARM:Assembly Language Programming》,作者是Peter Knaggs & Stephen Welsh.作者在开头也提出学习汇编的必要性和重要性,借他们的话重新说一下: 他们首先用三个问句来引出为什么要学习汇编: 外科医生为了知道手术刀的用法而需要学习冶金吗?飞行员需要学习热力学理论来理解飞机引擎是如何工作的?报社的记者要学习电子学来理解照.. 阅读全文
posted @ 2012-10-15 21:31 Daniel.G 阅读(481) 评论(0) 推荐(0)
关于u-boot中的.balignl 16,0xdeadbeef的理解
摘要:最近在分析u-boot的源代码,看到这一行:.balignl 16,0xdeadbeef不理解了,不知道为什么要这样写,0xdeadbeef,明显是个单词组,写在这里有何意义呢?然后在查阅了众多资料的时候才晃然大悟。下面我一步步来说明:首先要弄明白.balignl的意思,这个其实应该算是一个伪操作符,伪操作符的意思就是机器码里,并没有一个汇编指令与其对应,是编译器来实现其功能的。.balignl是.balign的变体,.balign是意思是,在以当前地址开始,地址计数器必须是以第一个参数为整数倍的地址为尾,在前面记录一个字节长度的信息,信息内容为第二个参数。.balign 8, 0xde它的意 阅读全文
posted @ 2012-10-14 19:58 Daniel.G 阅读(445) 评论(0) 推荐(0)
嵌入式文件系统
摘要:linux支持多种文件系统类型,为了对各类文件系统进行统一管理,linux引入了虚 拟文件系统VFS,为各类文件系统提供一个统一的应用编程接口。文件系统类型根据存储设备的硬件特性,系统需求,不同的文件系统类型有不同的应用场合。在嵌入式linux应用中,住哟啊的存储设备为RAM和FLASH,常用的基于存储设备的文件系统类型包括:jffs2,yaffs,cramfs,ramdisk,ramfs等。/************************************************************/基于FLASH的文件系统NOR FLASH: 存放程序(速度快)NAND FLA 阅读全文
posted @ 2012-10-13 20:21 Daniel.G 阅读(669) 评论(0) 推荐(0)
嵌入式linux内核启动流程
摘要:内核构成分析uImage构成:arm linux内核映像uImage生成过程图解:u-boot认为zImage为自解压文件zImage:* (decompress code) Head.s misc.s * compressed vmlinuxvmlinux:* (vmlinux-init)arch/arm/kernel/head.o* (vmlinux-main)driver/build-in.o mm/build-in.o ......* kallsyms.o(符号)linux内核的启动大致可以划分为3个阶段1 解压缩2 初始化3 启动应用程序 阅读全文
posted @ 2012-10-13 19:06 Daniel.G 阅读(1051) 评论(0) 推荐(0)
嵌入式linux内核和根目录制作
摘要:系统组成:Bootloader, Boot parameters, Kernel, Root filesystem嵌入式linux系统有linux内核与根文件系统两部分构成,两者缺一不可。内核制作:1:清除原有配置与中间文件X86:make distcleanarm:make distclean2 配置内核(copy其他类似的配置文件为.config)x86:make menuconfigarm:make menuconfig ARCH=arm /* nfs与ramdisk启动的区别 */3 编译内核x86:make bzImagearm:make uImage ARCH=arm CROSS_ 阅读全文
posted @ 2012-10-13 17:57 Daniel.G 阅读(590) 评论(0) 推荐(0)
u-boot移植
摘要:u-boot移植软硬件配置:Bootloader依赖于:具体的cpu体系,具体的板级设备配置(芯片级移植,板级移植)板级移植:板级设备的配置文件位于linux/include/configs/<board_name>.h # <board_name>用相应的BOARD定义代替(例:smdk2410.h)移植方法:开始移植之前,首先要分析u-boot已经支持的开发板,选择出硬件配置最接近的开发板。选择的原则是,首先选择MCU相同的开发板,如果没有,则选择MPU相同的开发板。移植步骤1 在顶层Makefile中为开发板添加新的配置选项,使用已有的配置项目为例smdk2410 阅读全文
posted @ 2012-10-12 20:48 Daniel.G 阅读(437) 评论(0) 推荐(0)
u-boot工作流程
摘要:启动模式(自主模式)和下载模式(开发模式)uboot启动流程:开发板上电后,执行u-boot的第一条指令,然后顺序执行u-boot启动参数。看一下/board/smdk2410/u-boot.lds这个链接脚本,可以知道目标程序的各部分链接顺序。第一个要链接的是/cpu/arm920t/start.o,那么u-boot的入口指令一定位于start.s这个程序中。下面分两阶段介绍启动流程:第一阶段1 /cpu/arm920t/start.s这个汇编程序是u-boot的入口程序,开头就是复位向量的代码 复位启动子程序 设置cpu为SVC32模式 关闭看门狗 重新定位代码 初始化堆栈 跳转到star 阅读全文
posted @ 2012-10-12 19:58 Daniel.G 阅读(361) 评论(0) 推荐(0)
u-boot命令
摘要:U-BOOT源代码下载:ftp://ftp.denx.de/pub/u-boot/一 目录结构:board:和开发板有关的文件,每个开发板都以一个子目录出现在当前目录中。common:实现u-boot支持的命令。cpu:与特定cpu架构相关的代码,每一块u-boot下支持的cpu在该目录下对应一个子目录。disk:对磁盘的支持。doc:文档目录。drivers: u-boot支持的设备驱动程序都放在该目录下。fs:文件系统的支持include:u-boot使用的头文件。该目录下configs目录有与开发板相关的配置头文件,如smdk2410.h。该目录下的asm目录有与cpu体系结构相关的头文 阅读全文
posted @ 2012-10-12 18:39 Daniel.G 阅读(370) 评论(0) 推荐(0)
Bootloader简介
摘要:先来简单了解下嵌入式系统构建一 嵌入式系统(软件)1 引导加载程序:包括固话在固件(firmware)中的boot程序(可选),和Bootloader 两大部分2 linux内核:特定于嵌入式平台的定制内核3 文件系统:包括了系统命令和应用程序二 Bootloader一个同时装有Bootloader,内核的启动参数,内核映像,和根文件系统映像的固态存储设备的典型空间分配结构图嵌入式系统复位后从地质0x00000000起开始执行,并且将固态存储设备(Flash)安排 (见最下图)在这个地址上。移植:CPU体系结构嵌入式板级流程:stage1: 1 硬件设备初始化(Cpu内部寄存器)2 为加载Bo 阅读全文
posted @ 2012-10-12 13:55 Daniel.G 阅读(280) 评论(0) 推荐(0)
嵌入式linux系统构架 | 开发流程 | 交叉工具链
摘要:一 嵌入式linux系统构架硬件平台:FLASH 网卡 嵌入式处理器 触摸屏 按键软件平台:Bootloader linux内核 根文件系统根文件系统:应用程序 C库/**************************************************************//**************************************************************/二 开发流程1 硬件开发:基于EVM板,添加,修改,删除硬件(硬件工程师)2 Bootloader移植:将Bootloader移植到流程1所开发出来的硬件平台(系统工程师或驱动工 阅读全文
posted @ 2012-10-12 13:15 Daniel.G 阅读(342) 评论(0) 推荐(0)
/etc/profile 解析
摘要:/etc/profile与环境变量相关的文件可能还会有/etc/bashrc等,不过这是shell变量,是局部的,对于特定的shell器作用。/etc/profile是全局的,适用于所有的shell。profile文件会告诉shell使用什么语言,什么shell,命令的搜索路径等等。一些标准的环境变量:SHELL 默认shellLANG 默认语言PATH linux寻找命令的默认路径,一般包括/bin,/usr/bin,/sbin,/usr/sbin,/usr/X11R6/bin,/opt/bin,/usr/local/bin等。用户可以自行添加,如/home/bin等.MANPATH man 阅读全文
posted @ 2012-10-12 12:35 Daniel.G 阅读(1962) 评论(0) 推荐(0)
linux内核模块开发
摘要:一,内核模块功能: 让内核文件(zImage或bzImage)本身并不包含某组件,而是在该 组件需要被使用的时候,动态地添加到正在运行的内核中example:/*********hello.c******************/ 1 #include<linux/init.h> 2 #include<linux/module.h> 3 4 static int __init hello_init(void) 5 { 6 printk("Hello, world!\n"); 7 return 0; 8 } 9 10 static void ... 阅读全文
posted @ 2012-10-11 21:19 Daniel.G 阅读(364) 评论(0) 推荐(0)
linux内核配置与编译
摘要:一:清除临时文件,中间文件和配置文件。 make clean: remove most generated files but keep the config make mrproper: remove all generated files + config files make distclean: mrproper + remove editor backup and patch files二:确定目标系统的软硬件配置情况,比如CPU的类型,网卡的型号,所需支持的网络协议等。三:配置内核 make config:基于文本模式的交互式配置 make menuconfi... 阅读全文
posted @ 2012-10-11 17:32 Daniel.G 阅读(513) 评论(0) 推荐(0)
linux内核源代码
摘要:linux内核源代码内核源代码可以从www.kernel.org里面下载。linux内核源代码采用树形结构进行组织的,非常合理地把功能相关的文件都放在同一子目录下,使得程序更具可读性。arch目录arch是architecture的缩写。内核每种CPU体系,在该目录下都有对应的子目录。每个CPU子目录,又有boot,mm,kernel等子目录,分别包含控制系统引导,内存管理,系统调用等。block目录部分块设备驱动程序crypto目录加密,压缩,CRC校验算法documentation内核的文档drivers设备驱动程序fs目录存放各种文件系统的实现代码。每个子目录对应一种文件系统的实现,公共 阅读全文
posted @ 2012-10-11 15:37 Daniel.G 阅读(532) 评论(0) 推荐(0)
linux内核简介
摘要:(申明)本人第一次发博文,做的不好的地方,大家大量多多谅解。欢迎大家转载!一:linux系统如何构成的?User space:User Applications and GNU C library (glibc)kernel space:System Call interface, Kernel and Architecture-Dependent Kernel Code二:为什么linux系统会划分为User space and Kernel space ?CPU通常实现了不同的工作模式,以ARM为例,实现了7种工作模式:用户模式(usr),系统模式(sys),管理模式(svc),中断模式( 阅读全文
posted @ 2012-10-11 14:59 Daniel.G 阅读(1811) 评论(0) 推荐(0)
详解Linux目录(目录树详细解释)
摘要:给大家一篇关于Linux目录 方面的详细说明,好好读一下!Linux目录详解(RHEL5.4)linux有四种基本文件系统类型:--普通文件:如文本文件、c语言源代码、shell脚本等,可以用cat、less、more、vi等来察看内容,用mv来改名;--目录文件:包括文件名、子目录名及其指针,可以用ls列出目录文件;--链接文件:是指向一索引节点的那些目录条目,用ls来查看时,链接文件的标志用l开头,而文件后以"->"指向所链接的文件;--特殊文件:如磁盘、终端、打印机等都在文件系统中表示出来,常放在/dev目录内;可以用file命令来识别。linux系统中,所有的 阅读全文
posted @ 2012-10-06 13:45 Daniel.G 阅读(10855) 评论(2) 推荐(4)