[置顶] 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...
阅读(2617) 评论(0)

[置顶] powerpc-linux内核start_kernel之前启动分析(1)-开门见山

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

[置顶] 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指令...
阅读(4190) 评论(2)

[置顶] 移植linux kernel,应该怎么做

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

[置顶] arm-linux内核start_kernel之前启动分析(2)- 页表的准备

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

[置顶] arm-linux内核start_kernel之前启动分析(1)-接过bootloader的衣钵

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

[置顶] 逻辑地址 虚拟地址 物理地址 总线地址的区别

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

[置顶] uboot的relocation原理详细分析

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

[置顶] 2014.4新版uboot启动流程分析

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

心理调整

在新公司工作近2个月,还没适应节奏和大公司的沉重流程。占空,有时间写下...
阅读(504) 评论(0)

新的开始,全力以赴!

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

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

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

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

uncached区域到uncached区域memcpy提升3倍,uncached区域到cached区域提升3.5倍,cached区域到uncached区域提升13.2倍,连我自己都吓到了!...
阅读(6646) 评论(6)

Thank You,Kobe

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

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

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

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

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

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

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

uboot下netconsole的原理及使用方法

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

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

linux系统是时间片调度算法,微观上所有可运行进程都是串行,不管进程中作何操作,该进程的时间片一到就切换到下一进程,那为什么一个空循环进程CPU占用率还这么高...
阅读(3569) 评论(2)
226条 共23页1 2 3 4 5 ... 下一页 尾页
    个人资料
    • 访问:1129840次
    • 积分:10044
    • 等级:
    • 排名:第1602名
    • 原创:131篇
    • 转载:95篇
    • 译文:0篇
    • 评论:302条
    博客专栏
    最新评论