uClinux在S3C4510上的启动分析(ZT)

多目标进化算法(MOEA)来处理动态多目标优化问题(DMOPs)Matlab代码.rar 立即下载
uClinux的执行过程

 

 uCinux的启动主要经历三个阶段。首先,必须完成CPU和存储器的硬件初始化,在系统RAM中建立程序堆栈和数据段,建立程序的运行时的环境。初始化完成之后,uClinux内核就取得了CPU的控制权,开始操作系统自身的初始化,这包括建立RAM中断矢量表、加载设备驱动程序、内存管理模块等等。这一切完成后,uClinux启动一个最初的init线程,进入到第三阶段,这时内核已经正常运行,外围模块也都就绪,开始执行一些脚本文件(如/etc/rc脚本文件)。

 

                       一.kernel代码段之前的系统初始化 

 

1. uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/head.S

 

    开发板从上电开始,最开始执行的程序放在uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/head.S中.

 

   (1) 切换模式,关闭中断. (line 96 )

 

   (2) 首先程序要先给SYSCFG,EXTDBWTH,ROMCON0等一系列系统控制寄存器赋值,此时flash地址在   0X0,DRAM地址在0X1000000.(line 141 )

 

   (3) 点亮I/O口的指示灯. (line 152 )

 

   (4) 把在flash上的image复制到DRAM上.(line 161 )

 

   (5) 执行remap,把flash地址映射为0X1000000,DRAM地址映射为0.(line 172 )

 

   (6) 打开cache和write buffer.(line 196 )

 

   (7) 设置好64K堆栈.(line 204 )

 

   (8) 跳转到decompress_kernel函数(line 217 ),此处的跳转为带返回的跳转,以便于执行完此函数跳转回来.

 

2. uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/misc.c

 

     此时的函数decompress_kernel是用C语言写的,line 297 .

 

   (1) makecrc();进行crc校验.

 

   (2) puts("Uncompressing Linux..."); 输出linux起动后的第一句话.

 

   (3) gunzip();解压缩kernel.

 

   (4) puts(" done, booting the kernel./n");

 

3. uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/head.S

 

   执行完decompress_kernel函数后,kernel又跳转回head.S中,因为此时我们还要检验解压缩之后的kernel起始地址是否紧接着kernel image,如果是,beq call_kernel(line 220),执行解压后的kernel.

 

   如果解压缩之后的kernel起始地址不是紧接着kernel image,执行relocate(line 236),将其拷贝到紧接着kernel image的地方,然后跳转,执行解压后的kernel.

 

 

 

                          二.kernel执行

 

1.uClinux-dist/linux-2.4.x/init/main.c中的start_kernel()  (line 352)   

 

   系统启动过程到此,转入体系结构无关的通用C代码中,start_kernel() 中调用了一系列初始化函数,以完成kernel本身的设置。这些动作有的是公共的,有的则是需要配置的才会执行的。

 

    (1) 输出Linux版本信息(printk(linux_banner))

  (2) 设置与体系结构相关的环境(setup_arch())

 

 

    (3) parse_options(command_line);解析command_line,将其转化为环境变量.

 

    (4) 初始化系统IRQ(init_IRQ())

 

    (5) 核心进程调度器初始化(sched_init())

 

    (6) 软中段初始化softirq_init();

 

    (7) 时间、定时器初始化(包括估测主频、初始化定时器中断等,time_init())

 

    (8) 控制台初始化console_init();

 

    (9) 核心CACHE初始化kmem_cache_init(); 

 

    (10)延迟校准calibrate_delay();

 

    (11)内存初始化(设置内存上下界和页表项初始值,mem_init()) 

 

    (12)文件,目录,块设备读写缓冲区初始化

 

    (13)检查体系结构漏洞(check_bugs())

 

    (14)启动init过程(创建第一个核心线程,调用init()函数,原执行序列调用cpu_idle() 等待调度,init())

 

   至此start_kernel()结束,基本的核心环境已经建立起来了。

 

 

 

2.uClinux-dist/linux-2.4.x/init/main.c中的init() (line 548)

 

现在我们进入内核引导第二部分,init()函数作为核心线程,首先锁定内核(仅对SMP机器有效,我们为空函数),然后调用 do_basic_setup() (line 551)完成外设及其驱动程序的加载初始化。

 

过程如下:

 

    * 网络初始化(初始化网络数据结构,包括sk_init()、skb_init()和proto_init()三部分,在proto_init()中,将调用protocols结构中包含的所有协议的初始化过程,sock_init())

 

    * 创建事件管理核心线程(start_context_thread()函数,这是系统创建的第二个内核线程,名叫“keventd”。其代码context_thread()也在kernel/context.c中,)

 

启动任何使用__initcall标识的函数(方便核心开发者添加启动函数,此时由do_initcalls()函数启动)。

 

    此时系统开始加载外部设备的初始化程序,如:在linux-2.4.x/driver/block/genhd.c中的device_init()函数,在genhd.c中由__initcall(device_init)标识在此时调用,device_init()函数是所有外部设备初始化的总入口,包括了块设备的初始化blk_dev_init,网络设备的初始化net_dev_init()和atmdev_init()等。

 

   至此do_basic_setup()函数返回init(),在释放启动内存段(free_initmem())并给内核解锁以后,init()打开/dev/console设备,重定向stdin、stdout和stderr到控制台,最后,搜索文件系统中的init程序(或者由init=命令行参数指定的程序),并使用 execve()系统调用加载执行init程序。(line 576) .

 

   init()函数到此结束,内核的引导部分也到此结束了,

 

 

 

3. uClinux-dist/linux-2.4.x/init/main.c中的execve("/etc/init",argv_init,envp_init); (line 579)

 

       init进程是系统所有进程的起点,内核在完成核内引导以后,即在本线程(进程)空间内加载init程序,它的进程号是1。

 

   init程序需要读取/vendors/SAMSUNG/4510B/inittab文件作为其行为指针,然后执行.

 

 

 

4.系统执行rc脚本.

 

hostname Samsung

 

/bin/expand /etc/ramfs.img /dev/ram0

 

/bin/expand /etc/ramfs2048.img /dev/ram1

 

mount -t proc proc /proc

 

mount -t ext2 /dev/ram0 /var

 mount -t ext2 /dev/ram1 /ramdisk

 

 

chmod 777 /ramdisk

 

mkdir /var/config

 

mkdir /var/tmp

 

mkdir /var/log

 

mkdir /var/run

 

mkdir /var/lock

 

ifconfig lo 127.0.0.1

 

route add -net 127.0.0.0 netmask 255.255.255.0 lo

 

dhcpcd &

 

 

 

cat /etc/motd

 

 

 

rc程序执行完毕后,系统环境已经设置好了,下面就该用户登录系统了。

 

 

 

5.运行Sash command shell

用于在地震反演问题上测试优化算法的简单Matlab代码.rar 立即下载

相关推荐

【嵌入式系统】基于LVGL的轻量化GUI开发:架构剖析、控件实现与硬件移植全流程工程实践

内容概要:本文系统阐述了LVGL(Light and Versatile Graphics Library)嵌入式轻量化图形界面开发的完整技术体系,涵盖从架构原理、环境搭建、控件开发、样式美化、事件机制到硬件移植与性能优化的全流程。深入剖析LVGL的分层架构、对象化编程思想、脏区局部刷新算法、内存管理与低功耗调度机制,并通过PC仿真与可视化工具提升开发效率。全面讲解基础与高级控件的手写实现、UI样式定制、中文字库适配、动画特效开发,并以STM32等主流平台为例,详细演示硬件移植全过程。最后通过一个集数据可视化、多页面导航、参数设置与传感器联动于一体的智能触控终端综合项目,实现理论与实践的深度融合。; 适合人群:具备C语言基础和嵌入式开发经验的工程师、电子信息类专业学生、参与大创或竞赛的开发者,以及从事工业控制、物联网、智能设备研发的技术人员。; 使用场景及目标:① 掌握LVGL在无操作系统MCU上的移植与运行机制;② 实现嵌入式设备的高质量GUI界面开发,包括中文显示、流畅动画与低功耗优化;③ 构建具备多页面、数据联动与用户交互的工业级触控终端项目,满足产品化与结题展示需求。; 阅读建议:学习过程中应结合仿真环境与实际硬件平台同步实践,重视lv_conf.h配置、HAL层接口适配与调试方法,建议按照“仿真验证→代码理解→硬件移植→项目集成”的路径循序渐进,重点关注内存管理、事件机制与性能优化等易出错环节。

uClinux移植和分析(1)

2007-12-25 09:25:19 简介: 前一段时间,曾先后移植了uClinux-2.0.x和uClinux-2.4.x的内核,我的移植基本上是从零做起,linux并没有支持该目标机的代码,所以这个移植工作基本上是新增加对一种目标机的支持。 工作过程中,我学到了不少知识,除了操作系统,还了解了一些编译,调试,汇编,链接的的技术,在此我会一并介绍,可能介绍比

mybirdsky的专栏 808

【有功-无功协调优化】基于改进多目标粒子群优化算法(小生境粒子群算法)的配电网有功-无功协调优化研究(Matlab代码实现)

内容概要:本文围绕基于改进多目标粒子群优化算法(小生境粒子群算法)的配电网有功-无功协调优化问题展开研究,旨在通过智能优化算法有效降低网络损耗、提升电压质量并增强配电系统的运行效率。研究系统地介绍了小生境粒子群算法的改进策略,构建了包含功率平衡、电压安全、设备容量等多重约束的多目标优化模型,并采用IEEE标准测试系统进行仿真验证,充分证明了该方法在处理多目标、多约束优化问题上的优越性能。全文涵盖从数学建模、算法设计、约束处理到多目标折衷解选择的完整流程,并配套提供了完整的Matlab代码实现,便于读者复现结果与进行二次开发。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事电力系统优化、智能算法研究或相关领域工作的研究生、科研人员及工程技术人员。; 使用场景及目标:①解决配电网中有功与无功功率的协同优化问题,实现节能降耗与电压稳定;②学习并掌握多目标粒子群算法及其小生境改进策略在电力系统中的具体应用与实现细节;③通过Matlab代码进行仿真,加深对智能优化算法在工程实践中应用的理解,提升科研与工程实践能力。; 阅读建议:此资源以理论分析与代码实现紧密结合的方式呈现,建议读者在深入理解算法原理和模型构建的基础上,结合所提供的Matlab代码进行仿真实验,重点关注参数设置、收敛性分析与结果可视化等关键环节,从而实现从理论认知到实践验证的完整闭环。

Shell脚本交互之:自动输入密码

平时在控制台输入指令如:sudo、ssh、ftp或者修改admin权限的文件时候都会要求输入password,但是在she'll脚本运行过程中该如何交互实现自动输入密码呢? 下面总结三种实现方法。 一、重定向:用重定向方法实现交互的前提是指令需要有参数来指定密码输入方式,如ftp就有-i参数来指定使用标准输入来输入密码         shell用重定向作为标准输入的用法是:cmd   实

zhangjikuan的专栏 16万+

uClinux中注意事项

1.       如何自己单独写一个makefile来编译一个单个的文件到xg2000上运行.(1).编译一个驱动程式见/xglj/example/driver/drivertest.c.这个程式是一个简单的驱动程式,可以测试一些内核信息.帮助了解内核结构和内核参数.makefile是编译用的.最后都把文件copy到/kls目录中去了,这样的话只要把/kls 目录mount到xg2000中就能

Rill的专栏 814

我焊的S3C4510开发板

PCB是从lumit项目购买的,其他器件自己采购,亲自焊接。编写了JTag烧写程序,现已可以运行bootloader,下一步编写我的bootloader ... 

Bekars涡轮增压的Blog ^_^ 2285

uClinux 启动过程详细分析

http://www.ibm.com/developerworks/cn/linux/l-cn-uclinuxboot/index.html

typhoonzb的专栏 451

uClinux在S3C4510上的启动分析2(ZT)

在配置uclinux是添加菜单:一.在linux 2.4的menuconfig中,添加驱动程序菜单,需要修改两个文件config.in(也可能为Config.in)和Makefile如:把程序mydriver.c放在drivers/char目录下1.修改drivers/char/Config.in,在合适的位置加上一行:tristate XXXXX

我的仓库 My Storehouse 1800

嵌入式uCLinux内核启动过程分析与设计(ZT)

 摘要:本文介绍了ARM+uCLinux嵌入式系统的结构,重点分析uCLinux操作系统启动引导过程,给出了基于一种实际应用系统如何设计uCLinux启动代码。该方法已成功应用于实际系统中。关键词:ARM  uCLinux  启动引导0 引言    32位ARM嵌入式处理器具有高性能、低功耗、高性价比的特性,已被广泛应用于消费电子产品、无线通信、控制和网络通信等领域。uCLinux是专门

我的仓库 My Storehouse 2184

uclinux 与 linux的区别

第一篇 这两天看公司的一个产品 用的是arm7 系统用的uclinux 发现程序的内存管理方面有些看不懂,还有程序几乎用的全是线程。查过资料后才恍然明白,原来没有mmu 所以uclinux对多进程的支持非常有限。 不过这是比较老的版本。新版本已经支持了!? --------------------------------------------------------------

bytxl的专栏 7677

【图论聚类算法】一种图论方法用于非参数聚类分析(Matlab代码实现)

内容概要:本文详细介绍了一种基于图论的非参数聚类分析方法,并提供了完整的Matlab代码实现。该方法通过构建数据样本间的相似性图,利用图论中的图划分技术实现聚类,能够有效处理无需预设簇数量的复杂数据结构,具有良好的适应性与鲁棒性。文中系统阐述了算法的核心原理、关键步骤及具体实现流程,并通过实验验证了其在实际应用中的有效性与优越性。; 适合人群:具备一定数学基础和Matlab编程能力,从事数据分析、模式识别或机器学习相关研究的科研人员及研究生。; 使用场景及目标:①解决传统聚类算法需预先设定簇数的局限性;②应用于存在复杂结构或非球形分布的数据集的无监督分类任务,如生物信息学、社交网络分析、图像分割等领域;③为科研工作者提供一个可复现、可扩展的图论聚类算法实现范例,促进算法的二次开发与改进。; 阅读建议:建议读者结合Matlab代码逐行理解算法实现细节,动手在不同类型的数据集上运行程序,以深入掌握图论聚类的内在机制,并鼓励在此基础上进行算法优化与性能对比研究。

高效的球形通量计算(2D)研究(Matlab代码实现)

内容概要:本文围绕“高效的球形通量计算(2D)研究”展开,基于Matlab实现相关算法,旨在提升二维空间中球形通量的计算效率与精度。研究聚焦于数值积分方法的优化,结合几何建模与数学分析手段,针对传统计算过程中存在的复杂度高、耗时长等问题,提出简化的算法流程与高效的数值求解策略。通过模块化代码设计与关键算法优化,显著提升了通量计算的运行效率与结果稳定性,适用于物理场仿真、电磁学分析、热力学建模及环境科学等需要频繁进行区域通量估算的工程与科研场景。文中提供了完整的Matlab代码实现,便于读者复现与拓展应用。; 适合人群:具备Matlab编程基础,从事科研或工程仿真的研究生、工程师及科研人员,尤其适合在物理、电磁、能源、图像处理或环境工程等领域有数值计算需求的技术人员。; 使用场景及目标:①应用于科学计算中二维球形区域内通量的高效求解,如电场、磁场或热量通量的定量分析;②服务于教学演示、算法性能对比研究及工程仿真平台开发,提升复杂积分问题的求解速度与准确性。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注算法实现细节与性能优化策略,深入理解数值积分与几何建模的结合方式,并参考文档中提到的技术方向拓展至三维场景或其他物理场的通量计算应用。

生产流水线.rar

生产流水线.rar

欧盟CRA《网络弹性法案》-全译文.pdf

欧盟CRA《网络弹性法案》-全译文.pdf

基于观测器异构冗余与柔性切换的永磁同步电机宽速域无传感器控制关键技术研究(Simulink仿真实现)

内容概要:本文围绕永磁同步电机(PMSM)在宽速域范围内的无传感器控制技术展开研究,提出了一种基于观测器异构冗余与柔性切换的复合控制策略。该策略融合高频信号注入法(适用于零低速区)与自适应滑模观测器(SMO,适用于中高速区),通过设计动态加权融合机制实现全速域内转子位置与速度的精确估计。系统在静止和低速状态下采用脉振方波高频注入实现初始定位,在中高速运行时则利用模糊超螺旋滑模观测器提升鲁棒性与动态响应性能,并引入相位同步校正与平滑切换算法以有效抑制模式切换过程中的抖动与误差累积。研究在Simulink平台构建了完整的控制系统仿真模型,全面验证了所提方法在启动精度、稳态性能、动态响应及抗负载扰动等方面的优越性。; 适合人群:具备电机控制、现代控制理论及MATLAB/Simulink仿真基础的电气工程、自动化及相关专业的研究生、科研人员和工程技术人员。; 使用场景及目标:①解决永磁同步电机在无机械传感器条件下全速域运行的控制难题;②为高性能电机驱动系统(如电动汽车、精密伺服系统)提供可靠的速度与位置估算方案;③深入理解高频注入、滑模观测器、多观测器融合与平滑切换等先进控制算法的设计与实现。; 阅读建议:此资源以Simulink仿真实现为核心,不仅提供了详细的算法原理与模型架构,还包含了完整的运行结果分析。建议读者结合文中框架在MATLAB环境中动手复现仿真模型,重点关注不同速度区间下观测器的切换逻辑与参数整定过程,并通过对比实验深入理解各模块的作用机理与系统整体性能。

日本绕线机.rar

日本绕线机.rar

上一篇: 在uclinux添加设备驱动的完整过程(ZT)
下一篇: uClinux在S3C4510上的启动分析2(ZT)
TrueLie
博客等级 码龄24年 85粉丝 23原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值