自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

做一个有技术追求的人

但求好事 莫问前程!

  • 博客(223)
  • 资源 (3)
  • 收藏
  • 关注

原创 powerpc uboot链接脚本大改造

uboot中bss段的生成过程可以分为如下步骤:(1)链接脚本中定义bss段地址范围__bss_start __bss_end。(2)编译链接elf时,根据链接脚本确定下__bss_start __bss_end的绝对地址,记录在elf文件的段表中。(3)elf objcopy生成u-boot.bin时,去掉bss段。(4)加载u-boot.bin启动运行,根据__bss_start __bss_en

2015-10-01 16:40:50 5308

原创 powerpc-linux内核start_kernel之前启动分析(1)-开门见山

公司处理器换核,前期用FPGA仿真板进行了芯片验证和软件移植,借这个机会也学习了powerpc处理器的一些知识,对powerpc的内核启动也有所了解。 完成了arm版本内核start_kernel之前汇编分析,也想尝试写几篇文章对powerpc的启动进行分析,与大家分享。其实不管哪个平台处理器,内核启动之初,因为运行地址无法保证与链接地址一致,都要完成一次地址的配置和跳转来保证内核运行地址与链接地址的一致性。

2015-09-16 16:34:06 6792

原创 arm-linux内核start_kernel之前启动分析(3)-开启MMU,走进新时代

在第二篇启动分析文章中讲到create pgtable时,对__turn_mmu_on所在的1M地址空间做了平映射,到现在这个阶段就看出其作用了。CPU执行完成“mcr p15, 0, r0, c1, c0,0”指令后开启MMU,接下来CPU取指地址是当前pc+4,由于做了平映射,虽然接下来是虚拟地址,但是该虚拟地址跟之前的物理地址是完全一致的,pc+4可以取到mrc p15, 0, r3, c0, c0, 0指令

2015-08-28 16:35:38 8682 2

原创 移植linux kernel,应该怎么做

对于移植kernel的思路我觉得还是很有必要总结下,这里总结不涉及具体代码,而只是说说保证kernel能进入console稳定运行这样一个最小系统,我们需要完成哪些部分的移植呢。根据这次移植我的思路,需要以下几个方面的移植:cpu core初始化,内存管理子系统(mmu),硬件时钟系统,早期调试打印机制,异常中断子系统,时间子系统(timer),串口驱动

2015-01-31 20:52:37 7625 7

原创 arm-linux内核start_kernel之前启动分析(2)- 页表的准备

create_page_table完成了3种地址映射的页表空间填写:(1)turn_mmu_on所在1M空间的平映射(2)kernel image的线性映射(2)bootparams所在1M空间的线性映射

2014-11-24 17:17:56 9230 7

原创 arm-linux内核start_kernel之前启动分析(1)-接过bootloader的衣钵

如果想运行和链接地址不一致,我能想到的办法,只能是汇编中尽量不去涉及一些绝对地址,使用PIC位置无关代码。联想之前分析的uboot relocation原理,uboot在relocation之后,kernel在开启MMU之前,都实现了链接地址和运行地址不一致,看看它们用的什么方法?(1)uboot在relocation时修改rel.dyn段(存储所有变量地址),实现将所有变量地址重定位到新运行地址(2)kernel在开启MMU之前,计算运行地址(物理地址)与链接地址(虚拟地址)的偏移,对变量寻址时都进

2014-11-21 10:05:03 13834 5

原创 linux kernel下输入输出console如何实现

kernel和user空间下都有一个console,关系到kernel下printk的方向和user下printf的方向,实现差别还是很大的。kernel下的console是输入输出设备driver中实现的简单的输出console,只实现write函数,并且是直接输出到设备。user空间下的console,实际就是tty的一个例子,所有操作函数都继承与tty,全功能,可以打开 读写 关闭,所以对于console的读写,都是由kernel的tty层来最终发送到设备。kernel的tty层之下还有ldi

2014-11-17 17:02:28 31037 7

原创 逻辑地址 虚拟地址 物理地址 总线地址的区别

UTLK上说用于内存芯片级的单元寻址,真实的开发环境中不止这些,因为处理器外部除了RAM还需要别的外设,如nand, spi,serial(当然是指的这些外设的controller)等。物理地址实际是处理器真实发送到其地址总线上的地址,而该地址应该访问到谁(ram?nand controller?)这个需要看该设备系统总线的仲裁,也就是总线仲裁,现在常用的总线仲裁有AXI AHBA等。

2014-11-02 13:14:53 8547

原创 uboot的relocation原理详细分析

所谓的relocation,就是重定位,uboot运行后会将自身代码拷贝到sdram的另一个位置继续运行,这个在uboot启动流程分析中说过。但基于以前的理解,一个完整可运行的bin文件,link时指定的链接地址,load时的加载地址,运行时的运行地址,这3个地址应该是一致的,relocation后运行地址不同于加载地址 特别是链接地址,ARM的寻址会不会出现问题?

2014-07-11 10:06:58 31282 27

原创 2014.4新版uboot启动流程分析

2014.4最新版本uboot启动过程详解在网上搜索讲uboot启动过程的文章,大多都是比较老的版本,于是决定将新版uboot启动过程记录下来,以备后用。2014.4版本uboot启动至命令行几个重要函数为:_start,_main,board_init_f,relocate_code,board_init_r。

2014-05-14 16:10:40 89804 28

原创 心理调整

在新公司工作近2个月,还没适应节奏和大公司的沉重流程。占空,有时间写下

2016-11-30 22:40:39 2740 3

原创 新的开始,全力以赴!

就这样,工作4年多来第一次有了一个大半个月的假期,工作日早晨看着上班族匆匆忙忙的身影,深切感受到了李涉“偷得浮生半日闲”的惬意,钓钓鱼,看看景,美好的时光总是过的很快。

2016-10-07 16:36:47 2738 1

原创 arm-linux内存管理学习笔记(3)-页表前戏

我们在arm-linux内核中看到各种相关宏定义都表示,linux看到的arm一级页目录项有2048个,每个页目录项8bytes,二级页表项是512个。不过arm-mmu的硬件机制却是4096个一级页目录项,每个页表有256个页表项。两种软硬件机制是靠把2个相邻页目录项的页表存储空间连续分配实现平滑过渡的。

2016-07-24 17:35:38 5148 2

原创 Cortex-A8处理器memcpy的优化方案

uncached区域到uncached区域memcpy提升3倍,uncached区域到cached区域提升3.5倍,cached区域到uncached区域提升13.2倍,连我自己都吓到了!

2016-05-24 19:51:04 14701 7

原创 Thank You,Kobe

大学3年遇到了08到10的两连冠湖科,荣幸! 6年已去。 老科退役,老鱼指教, 奥多姆死里逃生,拜纳姆不知去向, 加嫂公牛,扎扎火箭, 巴恩斯快船,阿泰留守。 你们还好吗? 曾经一起荣耀,如今散落联盟各自飞。 thank you,kobe 谢谢湖科,愿老科在商界延续传奇。 thank you,brother 更感谢一起看球的大学兄弟!! 曾经一起疯狂到天亮,如今为梦想四方天涯

2016-04-14 22:03:25 3012

原创 arm-linux内存管理学习笔记(2)-内核临时页表的建立

需要搞明白的是,linux系统上执行./a.out运行,其实并不是运行的a.out这个elf文件。内核对于要运行的elf文件会调用load_elf_binary进行解析,首先是根据elf文件的header信息获取它需要的解释器,然后加载需要运行的各个段到内存中,把控制权交给解释器,解释器会加载该程序需要动态链接库(静态链接就不运行解释器),最后解释器将控制权交给内存中的程序入口,程序运行。

2016-04-06 19:24:56 6533

原创 arm-linux内存管理学习笔记(1)-内存页表的硬件原理

学习内核的内存管理如果脱离了MMU的硬件原理,只去学习其软件逻辑,真的很难懂。说到底,软件代码的逻辑是为硬件服务,只是为了充分发挥硬件的各项功能,因此学习linux的内存管理机制,首先要学习下该处理器架构下MMU的工作原理,这样对我们理解页表机制的逻辑很有帮助

2016-04-05 16:40:52 8369 1

原创 处理器一条指令需要几个时钟周期?

思考个小问题,处理器执行一条指令需要几个时钟周期。 对于软件工程师来说,印象流我们可能会觉得执行一条指令一个时钟周期嘛,一条指令算是一个最小的原子操作,不可能再细分了吧。 如果看看诸如《see mips run》,《arm体系架构》等书籍就会了解到,这个问题可没这么简单了,因为处理器设计中使用了流水线技术。 一条指令还是相当复杂的,处理器在一个时钟周期内肯定是完不成的,可能需要好多个时钟周期来

2016-03-30 19:47:42 37328 4

原创 uboot下netconsole的原理及使用方法

kernel下也有netconsole机制,不过由于内核下的console只有write功能(因为内核启动是没有交互的,只有输出信息),因此kernel下netconsole机制其实就是向内核注册提供网络发送数据功能的console_device,具体实现代码在drivers/net/netconsole.c中。

2016-03-17 18:54:43 8659 3

原创 为什么空循环进程会导致CPU占有率很高?

linux系统是时间片调度算法,微观上所有可运行进程都是串行,不管进程中作何操作,该进程的时间片一到就切换到下一进程,那为什么一个空循环进程CPU占用率还这么高

2016-01-29 19:57:13 14670 4

原创 2015年年尾总结

人就这样吧,闲着的时候老是感觉不踏实,想忙起来,忙的时候又想早点弄完休息休息,人这一辈子不就是在这一条无间之道上反复煎熬,踽踽独行吗。

2015-12-31 23:05:10 2580 2

原创 收获的季节

我了解自己是一个追求成就感的人,坚持带给我很多成就感,那就坚持下去!

2015-11-12 19:19:56 2523 4

原创 串口线的交叉直连之痛

首先我感觉要明确一点的是2台设备串口相连最基本的原则:保证2台设备串口的收发引脚交叉相连,即设备的发送引脚与另一台设备的接收引脚相连,RX与TX交叉相连,其余引脚还是一一对应。

2015-10-20 10:44:22 25597 5

原创 一场大雨引发的思考

2个人下雨天由公司去食堂吃饭,一个走的快,一个走的慢,哪个淋雨少。

2015-09-23 16:26:43 3341 15

原创 kernel如何保证cache数据一致性

那么问题就来了,正因为嵌入式处理器软件管理cache,就需要我们代码主动去操作cache,但在内核开发中很少会直接进行cache操作,cache操作到底在哪里进行的,什么时候需要操作cache。首先想明白一点,为什么要进行cache操作,只能说cache是天使也是魔鬼。cache在提高了系统性能同时却导致了数据的不一致性。嵌入式处理器软件管理cache的初衷就是保证数据一致性。那什么地方需要保证数据一致性呢?对于由CPU完全操作的数据,数据是完全一致的。也就是该数据完全由CPU写读操作,没有对CPU不

2015-08-27 10:31:21 21455 4

原创 /dev/mem可没那么简单

这几天研究了下/dev/mem,发现功能很神奇,通过mmap可以将物理地址映射到用户空间的虚拟地址上,在用户空间完成对设备寄存器的操作,于是上网搜了一些/dev/mem的资料。网上的说法也很统一,/dev/mem是物理内存的全映像,可以用来访问物理内存,一般用法是open("/dev/mem",O_RDWR|O_SYNC),接着就可以用mmap来访问物理内存以及外设的IO资源,这就是实现用户空间驱动的一种方法。用户空间驱动听起来很酷,但是对于/dev/mem,我觉得没那么简单,有2个地方引起我的怀疑:(

2015-08-13 14:05:07 44994 4

原创 mac与phy如何实现网络自适应

对于100M phy,外部网络10/100M切换,仅需要改变mac提供的数据时钟即可,mac接口模式不变,因为MII兼容10/100M。对于1000M phy,外部网络10/100/1000M切换,首先需要改变mac的接口模式(使用的数据线个数不同了),因为10/100M下phy会切换为MII模式,根据接口模式在改变其数据时钟。当然phy在自动协商完成后是其硬件逻辑会完成模式GMII/MII的转换,而对于mac,则要由驱动根据phy的工作状态来确定mac的接口模式以及需要提供的clk。这也是我们软件开

2015-07-29 18:46:28 15281 4

原创 熟悉又陌生的udelay

内核开发中经常用到延时函数,最熟悉的是mdelay msleep。虽然经常会使用,但是具体实现却不了解,今天来研究下。这2个函数在实现上有着天壤之别。msleep实现是基于调度,延时期间调用schedule_timeout产生调度,待时间到期后继续运行,该函数实现在kernel/timer.c中。由于linux内核不是实时系统,因此涉及调度的msleep肯定不会精确。今天不细说msleep,有时间再来分析它,今天重点来学习mdelay。mdelay是使用最多的延时函数。它的实现是忙循环,利用了内核

2015-07-05 16:25:21 7712 1

原创 内核中断号必须要跟硬件中断号一致吗

首先说明,答案是否定的,内核中断号可以与硬件中断号不一致,但是这是个无聊的问题。。实用价值不大。但是却可以引起对内核软件中断号与硬件中断号关系的思考。两者的关系我觉得可以从中断的初始化和分发过程来一探究竟。这里就从ARM PPC MIPS 3款主流嵌入式处理器架构的内核代码框架中来分析下他们中断的初始化和分发过程。

2015-06-29 14:14:54 6214 1

原创 嵌入式开发调试,我到底学到了什么?

记忆力是有限的,我之前有过这样的疑惑:做过一些项目,对于处理器及各种外设都接触调试过,但是再次调试还是需要对其datasheet,涉及的specification,以及软件代码进行复习。做过项目的一些调试,写博客总结相关知识,但是一个月后,再看博客,跟看别人写的一样,顶多混过脸熟。

2015-05-28 10:19:11 3430 6

原创 嵌入式设备的网络性能该如何分析

设备的网络性能如何,影响因素很多,受所在局域网网络状况,对端设备性能影响很大,而且不同的应用程序测试速度也会有所不同。那么该如何来分析设备的性能瓶颈?对于嵌入式设备,测试网络性能一般是看从局域网内的PC服务器上下载上传数据速度。这里我们假设对端设备(PC服务器)性能够高,可以达到最大带宽。分析影响网络性能因素,以下载为例,我的想法,可以从数据整个的流程来分析,就像一条河流,判断最终水流速度受哪些影响,可以看水流经过的地段哪里宽哪里窄。

2015-04-19 10:58:05 3929 2

原创 linux kernel对于浮点运算的支持

这里有一点思考:对于一款处理器,处理器设计中有浮点异常(MIPS PPC都是),其外也可以接FPU。在接FPU后,处理器核内就要屏蔽掉浮点异常,不然浮点运算还是产生浮点异常,FPU就没有实用意义了。无FPU,则处理器核内要使能浮点异常,不然就跟我上面遇到的问题一样,处理器不知道该如何运行该浮点指令,结果就无法预测了。

2015-04-18 14:51:24 15903 1

原创 linux kernel软中断及其衍生品-定时器 tasklet的实现

软中断概念在嵌入式开发可以有两个不同的解释:其一,软中断在处理器设计中是处理器异常之一,程序软件使用指定指令(如arm的SWI指令)引发该异常从而陷入内核态执行,最典型的软件应用就是系统调用。其二,在kernel代码中实现了一套软中断机制,区别于硬件中断的硬件触发软件处理,而是软件触发软件处理。

2015-04-07 17:13:01 4245

原创 linux kernel 时钟系统的前世今生

针对kernel时钟系统初始化我有3个地方的思考:(1)根据上面分析,clocksource在kernel下默认是有default,也就是jiffies,从default_clocksource获取的cycle就是jiffies值,精度只有1。而clockevent没有default,所以在编写timer driver时clockevent实现是必须的,我感觉clocksource倒是可选的,如果没有定义,使用default clocksource,jiffies在timer中断中更新,倒是也可以用。

2015-04-03 15:12:14 7290

原创 一个奇葩bug的解决

关于这个bug发现4种现象:(1)PC端接收不到设备端应用程序采集通过网络发送的图像(2)PC端可以ping通设备端,telnet可以登录设备,设备ping PC端只能通一个数据包(3)设备端sleep会阻塞(4)设备端date系统时间走180s回跳

2015-03-25 16:49:43 5226 4

原创 简析PPC的Device Tree机制

我的理解是为了适应灵活的嵌入式平台,FDT将一些固定人为需要修改的参数信息从uboot和kernel中(如uboot下的bd_t)剥离出来,修改硬件后,不需要重新修改烧录uboot kernel,仅需要修改FDT文件即可完成对新硬件的支持。但是有一些动态修改的信息还是需要uboot以及kernel来操作,如cmdline,usb以及pci的枚举设备信息。

2015-03-05 11:03:54 2909

原创 linux kernel如何处理大端小端字节序

根据之前的理解,字节序可以认为是处理器主观的概念,就像人如何去看待事物一样,处理器分大端和小端,对于内存的读写,只要保证数据类型一致,就不存在字节序的问题。因此我感觉,字节序不同造成的最大差异在于对于寄存器的读写。因为外设寄存器都是小端的(根据kernel代码得出结论,下面还会在详细解释)根据我之前字节序思考的文章,对于寄存器读写差异,有2种方案:(1)从硬件上解决这个问题,对于32位cpu,将32根数据总线反接,但是这样对于寻址小于32位数据可能有问题,并且不能所有模块都反接(如内存),这还涉及到编

2015-02-13 10:53:18 6862

原创 对于字节序小端和大端的思考

从网上可以查到的大小端的解释,小端是低端数据存放在低端地址,大端是高端数据存在低端地址。大小端真的就这么简单吗,不是这样的。可以这样理解: 对于小端处理器,如果要寻址一个word型数据,处理器首先由地址总线发出地址,之后对于由32位数据总线(32位处理器)返回的数据,小端处理器认为0-7位数据线是低端数据,而24-31位数据线为高端数据。 相反,对于大端处理器,寻址一个word型数据,处理器对于数据线返回的数据,认为24-31位数据线为低端数据,而0-7位数据线为高端数据。

2014-12-21 23:06:42 5564

转载 PPC r0-r31寄存器介绍

最近在做kernel从ARM到一款PPC处理器的移植,需要学下下PPC的通用寄存器,找到的文档整理如下:RegisterClassificationNotesr0localcommonly used to hold the old link register when building the stack frame

2014-12-19 16:31:02 14376

原创 我要做一个什么样的程序员

2年前毕业误入程序员行业,是奔着传说的高薪水来的(绝大部分刚出校门毕业生的心态)。自己不是一个甘于平庸的人,总觉得既然入这一行,就要在这行有一番作为,不能仅仅是为了赚钱,每天上班打卡似的工作,那不是我要的工作生活。所以该做一个什么样的程序员,这个问题工作3年以来我一直在思考,探索。希望能给自己的技术生涯一个完美的规划。

2014-12-14 13:19:10 15852 65

ARMV7架构官方手册

ARMV7架构的官方datasheet,详细介绍armv7架构处理器的各个模块设计细节

2016-05-25

ARM体系架构详细的官方说明手册

ARM架构的官方说明手册,其中详细介绍了ARM处理器核各个模块的详细设计和原理,非常适合嵌入式工程师使用

2016-05-25

linux设备驱动开发

ldd3本书,在网上找了很久,这个很全很方便,里面有超链接

2012-12-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除