博文
Linux的启动和核心介绍(2009-02-26 15:07:00)
摘要:前几天大家对Linux的启动有些讨论。
于是整理了一下前段时间与他人交流的提纲,希望起到抛砖引玉的作用。
Xiaoman04@hotmail.com
这是一次对Linux介绍后的整理。
对象是一些刚对Linux核心感兴趣,并且准备进一步研究和改造的同志。
因为是由提纲整理而成,有些乱,见谅!
四部分内容:
一、Linux核心源码结构介绍
二、编译和配置的过程
三、系统启动顺序的相关文件
四、核心改造的一些经验
一、
当我们安装好一个Linux系统,通常核心源码存放在/usr/src/linux/目录。
下面先看看这目录下的各个子目录及文件。
[/]#cd /usr/src/linux
[linux]#ls -aF
./ MAINTAINERS drivers/ kernel/ scripts/
../ Makefile fs/ lib/
COPYING README include/ mm/
CREDITS Rules.make init/ modules/
Documentation/ arch/ ipc/ net/
下面我们逐一描述:
COPYING
GPL版权申明,看后你至少应该知道,你对具有GPL版权的源代码改动而形成的程序,或使用GPL工具产生的程序,具有使用GPL发表的义务。其中之一就是公开源代码。 bitsCN#com中国网管联盟
CREDITS
光荣榜,你应当感谢的一些人的信息,其中的每一个人都对Linux做出过很大贡献。
Documentation/
文档目录,可有选择地看一下你感兴趣的部分
MAINTAINERS
维护人员列表,对当前版本的内核各部分都有谁负责,如果你研究的够深入,可以与他们讨论
Makefile
如果你在UNIX编译过程序,可以看明白README,Linus 所写,核心及其编译配置方法简单介绍Rules.make: make时使用的一些共同规则
diff和patch的使用(2009-02-26 15:00:00)
摘要:1) diff/patch这对工具在数学上来说,diff是对2个集合求差,patch是求和
diff A B > C 生成A和B的diff文件C
patch A C 给A打上diff文件得到B
patch -R B C B还原为A
2) 内核补丁
生成
diff -uNr linux-2.6.xxx linux-2.6.xxx.1 > diff.patch
升级
cp diff.patch linux-2.6.xxx/.
cd linux-2.6.xxx
patch -p1 < diff.patch
可以参考$(linux_src)/Documentation/applying_patches.txt
还可以参考这一篇:http://www.hzlitai.com.cn/bbs/dispbbs.asp?boardid=28&id=1215
原文地址:http://www.hzlitai.com.cn/article/ARM9-article/system/1632.html......
WinCE电源管理的实现(2009-02-26 14:56:00)
摘要:[背景和早期版本]
电源管理的目的是节能,基本的节能方法是使系统适时的进出休眠状态.比如用户按下On/Off按钮,或者监视用户活动的定时器超时,或者应用呼叫api都可以使得系统休眠,用户再次按下On/Off或者其他唤醒中断将使得系统退出休眠.从而可见,电源管理模块和用户活动情况密不可分,电源管理是用户活动所驱动的. WinCE中处理用户与系统交互的部分是GWES,所以早期电源管理工作是由GWES来实现.( GWES:Graphics,Windows and Events Subsystem.图形,窗口和事件子系统.主要负责图形输出和用户交互). 但GWES提供的电源管理模块功能过于粗糙死板:所有子设备只能有On和Suspend状态,应用程序无法得到任何状态转换通知,等等……直到WinCE4.0才引入了电源管理模块用以替代GWES中的电源管理功能.(进一步的,为了方便电源管理模块的集中管理,还需要关闭原来GWES对电源管理功能.方法是注册表HKLM\SYSTEM\CurrentControlSet\Control\Power设置DisableGwesPowerOff=1来禁止GWES插手电源管理.系统是默认禁止的.此外,一些用户活动情况仍旧依赖GWES获得,设置注册表HKLM\system\GWE下的ActivityEvent=PowerManager/ActivityTimer/UserActivity.从而告诉GWES,当鼠标,键盘,触摸屏等输入发生时候,GWES要SetEvent这个全局事件以通知电源管理模块.)
新的电源管理模块提供更完整和灵活的功能,系统电源可以自由灵活设定,子设备电源状态可以单独设定,应用可以获得电源通知等等.
[系统电源]
OEM可以依据需要任意定义系统电源状态,比如On,ScreenOff,UserIdle,SystemIdle,Suspend等.系统电源状态更多的是代表系统电源的一种配置方案,它是各个子设备电源配置的集合.它设定一种可能出现的情景,并且事先拟定了此情景下电力分配策略(哪些子设备打开,哪些子设备关闭).比如,也许On可以代表常规工作的情景,所有子设备打开的状态; ScreenOff可以代表LCD被用户请求关闭的情景,LCD背灯电源被关闭的状态; UserIdle可以代表用户一段时间没有操作的情景,cpu/soc将......
wince5.0中断的详细解释(2009-02-26 14:50:00)
摘要:1 WinCE中第一次对中断的处理是在OAL的OEMInit()中,该函数调用OALIntrInit()完成对中断的初始化.
2 OALIntrInit()对中断的初始化做了如下工作:
2.1 通过配置IPR0-IPR33设置中断优先级,优先级定义在g_IntPriorities和g_IntPriorities2中,其中IRQ_OSMR0为最高优先级, IRQ_KEYPAD为最低优先级.
2.2 设置ICCR,在空闲模式时只对有效的,非屏蔽的中断响应.
2.3 BSPIntrInit().该函数对BSP中需要处理的中断进行初始化工作,主要是设置ICMR寄存器使GPIO1(CPLD)和GPIO2为非屏蔽状态,然后通过OALIntrStaticTranslate建立IRQ和sysintr之间的关联.
2.4 对于WinCE来说,中断可以作如下分类:
1> 与BSP无关的Kernel使用的内部中断, 比如IRQ_OSMR0(for
sched),IRQ_RTCALARM;
2> 与BSP有关的CPU内部中断,比如IRQ_USBOHCI, IRQ_OSM
R1, IRQ_KEYPAD, IRQ_FFUART, IRQ_BTUART, IRQ_STUART, IRQ_DMAC, IRQ_USBFN;
3> CPLD所管理的中断,以GPIO1通知CPU中断的产生,在收到G
PIO1产生的中断后可以通过读取地址0x0A00_0010判断具体的中断源,比如IRQ_GPIO1_MMCCD(MMC_IN_INT, MMC_OUT_INT), IRQ_GPIO1_USBCD(USB_IN_INT, USB_OUT_INT), IRQ_GPIO1_PCMCIA_S0_CSC(CF_IN_INT. CF_OUT_INT),还有在代码中没有处理的SIM卡中断(SIM_IN_INT, SIM_OUT_INT).
4> GPIO2_120产生的中断,通过寄存器ICIP的位10-GPIO_x通
知CPU中断的产生,然后查询寄存器GEDR_x可以判断具体的中断源,比如IRQ_GPI......
中断代码结构比较之WinCE4.2 VS WinCE5.0(2009-02-26 14:45:00)
摘要:现在项目要从wince4.2下port到wince5.0下,今天将sd卡的驱动加到wince5下。用的是现有的也就是wince4.2下的驱动程序,几个dll文件:SDBusDriver.dll;SDCSDCard.dll;SDMemory.dll。这个工作主要就是将相应的中断加上就好了。
下面进入正题。4.2下的中断:InterruptInitialize(具体的驱动中注册中断与事件)->SC_InterruptInitialize(系统的函数,可以根据private\winceos\coreos\nk\kernel\kwin32.c中的const PFNVOID Win32Methods[]数组得知这是一个系统函数。这一步为猜测,该函数在private\winceos\coreos\nk\kernel\intrapi.c中实现。enable中断-通过调用下面的函数,之后将相应的事件放入中断事件队列)->DoInterruptEnable(在private\winceos\coreos\nk\kernel\intrapi.c中实现,先调用pfnOEMTranslateSysIntr映射一下,不过我没有找到这个函数指针的原型。之后才是OEMInterruptEnable)->OEMInterruptEnable(在platform\xxx\kernel\hal\cfw.c中,地球人都知道。在这个文件中有个static void OEMInitInterrupts(void),是在oeminit中被调用的,差点被忽悠了。)这只是enable(也包含初始化),相应的disable和done也在相应的文件中实现。可能用4.2用多了,感觉这些中断的处理一气呵成,很容易理解,就是修改或者增加比较麻烦。要分别处理OEMInterruptXXX中相应的各个中断。
5.0下的中断:感觉上就一个字“乱”,主要是这些代码分别放在不同的地方,或许这样更合理化吧,谁知道MS怎么想的。主要分布在以下几个地方:(A1)platform\common\src\common\intr;(A2)platform\common\src\xxx(type of......
Windows CE内核启动分析(2009-02-26 14:34:00)
摘要:
Windows CE内核启动分析
移植或者创建一个BSP,也许需要先熟悉Windows CE的内核启动过程.
目录
基于ARM的Windows CE内核启动分析1
1.startup.s2
2.KernelStart2
2.1 ARMInit()3
2.1.1 OALIntrInit3
2.1.2 OALTimerInit4
2.1.2.1 Variable Tick Scheduler4
2.2 KernelInit()4
2.3 FirstSchedule5
1.startup.s
内核入口点startup.S,内核从这里启动.因为内核经过bootloader加载,内核运行时候,已经由bootloader完成了硬件的基本初始化(关闭watchdog, pll设置等等)所以,startup.S的任务比较简单,只是将oemaddrtab_cfg.inc里面的g_oalAddressTable数组地址作为参数,传递给KernelStart,这个数组用来描述和实现物理地址到虚拟地址的映射.
(. + 8)是流水线处理.KernelStart()位于
PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\armtrap.s
2.KernelStart
ARMInit()位于本目录的mdram.c文件.
KernelInit()位于PRIVATE\WINCEOS\COREOS\NK\KERNEL\kwin32.c中.
FirstSchedule()位于armtrap.s的一个label.
主要关注ARMInit()和KernelInit(),前一个进行目标板的初始化,后一个负责内核的初始化.FirstSchdule()开始调度第一个程序.
2.1 ARMInit()
先看看ARMInit()它的几个关键性动作如下:
KernelRelocate()是进行重定位.KernelFindMemory()是查找系统可用内存,并分成应用内存和object store两部分.这2个函数都已由MS自己实现.我们需要添加的函数是名字以OEM开头的函数.
OEMInitDebugSerial()初始化一个调试口,我们一般使用一个串口来作为调试口,这个函数需要自己实现,在 PLATFORM\SMDK2440......
ARMSYS-MULTIUART多串口通信终端(2009-02-26 14:30:00)
摘要:ARMSYS-MULIUART多串口通信终端服务器,基于S3C2410A/S3C2440处理器,提供了8路RS-485半双工串行口、1路10M/100M以太网接口,2路RS-232全双工串行口,LCD接口、4*4键盘接口、主USB接口、IDE接口等。只需一台ARMSYS-MULIUART设备,就可以能连接多达256个RS485标准串口设备,并将串口数据进行选择、处理和分析,转化成以太网数据流,实现多个串口设备的上网和远程监控。采用此种方案,无需淘汰原有串口设备,多台设备可同时入网,既可以提高设备利用率,又节约组网费用,还可在已有的网络基础上简化布线复杂度,是一种兼具低成本、容易集成、控制简单的设备联网方案。
文章的详细资料请看
ARMSYS-MULIUART.pdf
若不能下载请点击原文:http://www.hzlitai.com.cn/article/ARM9-article/example/1513.html......
如何在WINCE4.2/WINCE5.0中“永久”保存设置(保存注册表的方法)(2009-02-26 14:29:00)
摘要:参考的一篇(原连接无效,换上立宇泰的连接):
http://www.hzlitai.com.cn/article/ARM9-article/cphelp/20061013319.html
另一篇好文章在“技术频道”里(WINCE4.2下的修改看它就OK了):
http://www.hzlitai.com.cn/article/ARM9-article/cphelp/200706221551350.html
谢谢大家支持,下面分享一下我在WINCE5。0下做好保存设置的方法(用的ARMSYS2440平台,很简单哦,理论的东西就不多说了,上面两篇文章讲得比较清楚了):
第(1)步,在当前Platform下加入Hive-based Registry的支持;
第(2)步,在注册表platform.reg中查找“; HIVE BOOT SECTION”,有两处,在第二处(原来是:IF BSP_NONANDFS !的地方),将; HIVE BOOT SECTION 和 ; END HIVE BOOT SECTION之间的内容替换成:
[HKEY_LOCAL_MACHINE\init\BootVars]
"SystemHive"="system.hv"
"Start DevMgr"=dword:1
"RegistryFlags"=dword:1
[HKEY_LOCAL_MACHINE\init\BootVars]
"DefaultUser"="default"
IF BSP_NONANDFS !
[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\SMFLASH]
"DriverPath"="Drivers\\BuiltIn\\SMFLASH"
; LoadFlags 0x01 == load synchronously
"LoadFlags"=dword:1
......
ARM汇编中的立即数(2009-02-26 14:24:00)
摘要:作者:Walzer
日期:2005.2.4
同事遇到这样一个问题:
在eVC编译出的汇编代码中我看到这样的语句:
mov r2, #0xFF, 28 和 orr r2, r2, #0xB
这样得到的结果时 r2=#0xffb ,
他试图更直接一点优化成一句:MOV r2,#0xffb
但是这样之后编译就出了问题:error A0092: no immediate rotate operand can be created: 4091
------------------------------------我是无辜的分割线--------------------------------
在 mov r2,#0xffb 这句中,不是MOV的用法出错,而是立即数用法出错。
立即数的用法定义在Arm Architechture Reference Manual(简称ARMARM)的A5-4页开始
很重要的一段:
An immdediate operand value is formed by rotating an 8-bit constant (in a 32-bit word) by an even number of bits (0,2,4,8,26,28,30). Therefore, each instruction contains an 8-bit constant and a 4-bit rotate to be applied to that constant.
Some valid constants are:
0xFF, 0x104, 0xFF0, 0xFF00, 0xFF000, 0xFF000000, 0xF000000F
Some invalid constants are:
0x101, 0x102, 0xFF1, 0xFF04, 0xFF003, 0xFFFFFFFF, 0xF000001F
而在下面的A5-6页中提到
<immediate> Specifies the immediate constant wanted. It is encoded in the instruction as an 8-bit immediate ......
ARMSYS2410系列产品FAQ(常见问题快速回答)(2009-02-26 14:21:00)
摘要:请到立宇泰电子论坛中查看最新的FAQ(常见问题快速回答)!
点击下面的链接>>
ARMSYS2410系列产品FAQ
问:ARMSYS2410开发板的功耗有多大?
答:ARMSYS2410在25℃环境温度,单板无外接设备的情况下测试的功耗如下: 答:区别主要在于配套液晶屏不同,支持的图形界面不同。
套餐1配套8英寸L80T64型TFT液晶模块,支持WinCE与Qt图形界面;
套餐2配套7.8英寸L78C64型STN液晶模块,支持WinCE图形界面;
套餐3配套3.5英寸L35T23型TFT液晶模块,支持WinCE与Qt图形界面。
测量项目
峰值电流
平均电流
静态电流
ARMSYS2410-CORE
核心板
1.8V
110mA
45 mA
1.2 mA
3.3V
150 mA
80 mA
20 mA
ARMSYS2410-B开发套件(核心板+底板)
5.0V输入
370 mA
230 mA
110 mA
问:ARMSYS2410各款套餐的区别是什么?
问:ARMSYS2410-B型开发板上USB接口情况?如何复用USB口?
答:ARMSYS2410型开发板上有三个USB口,其中两个是USB HOST口,一个是USB DEVICE口; USB DEVICE口和上面一个USB HOST口可以复用。S1拨动开关用来切换这个USB口的功能。拨动至SLAVE端,则USB DEVICE口有效,上面的USB HOST口失效;拨动至HOST端,则上面的USB HOST口有效,USB DEVICE口失效。详情请参考用户手册。
问:我需要配置仿真器吗?
答:一般不需要,仅当您需要调试硬件(ADS测试程序)时才需要使用仿真器。通常MultiICE兼容型仿真器无法支持linux的调试,ARMice可以支持,但必须要在kernel中自行移植好GDBServer的支持。虽然仿真器支持WinCE的调试,但由于系统庞大,速度较慢。
问:Linux下支持USB摄像头吗?
答:支持。详细步骤请点击:http://www.hzlitai.com.c......