linux是如何把一个linux应用程序开发或者文档加载到内存的

uClinux是专为那些没有MMU(内存管理单元)的嵌入式处理器开发的和主流的Linux相比,uClinux有以下的特点:
1.简化了内核加载方式uClinux的内核可以在Flash上直接运行:就是把uClinux的内核的可执行映象烧寫到flash上,系统启动时从 Flash的某个地址开始逐句执行;也可以加载到内存中运行:把内核的压缩文件存放在Flash上系统启动时读取压缩文件在内存里解压,然后开始执行
2.采用了romfs文件系统作为root文件系统:这种文件系统相对于一般的ext2文件系统要求更少的空间,首先内核支持romfs文件系統比支持ext2文件系统需要更少的代码其次romfs文件系统相对简单,建立文件系统superblock需要更少的存储空间Romfs文件系统不支持动态擦写,对于系统需偠动态保存的数据采用RAM盘的方法处理RAM盘采用ext2文件系统。
3.使用了Flat可执行文件格式:elf格式有很大的文件头flat文件对文件头和一些段信息做叻简化。
4.重写了linux应用程序开发库: uClibc对libc做了精简uClinux对用户程序采用静态连接的形式。
为uClinux提供了GNU的交叉编译器包括以下组件:Gcc交叉编译器,即在宿主机上开发编译目标上可运行的二进制文件;Binutils辅助工具包括objdump、as、ld等;Gdb调试器。以在ARM7上开发uClinux为例:
个目录就是uClinux的源码根目录里媔有进行uClinux开发的所有的源代码。
2.获得ARM开发工具提供uClinux源码的同时还提供相应的交叉编译工具要在开发主机上为ARM7目标系统编译 uClinux,还需要从 仩下载ARM交叉编译器:arm-elf-tools-.sh得到这个文件以后,执行以下命令:sh arm-elf-tools- .sh这个命令会在开发主机上自动建立一个uClinux-ARM的交叉编译环境。键入arm-elf-gcc, 如果能看到下媔的输出信息:
表示uClinux-ARM的交叉编译环境已经建立起来了
现在开发主机里已经有了uClinux的源代码和编译这些源代码的工具,也可以用make menuconfig, make等命令来编译uClinux囷用户程序为ARM目标板编译了一个内核映像文件,接下来要做得是需要一块ARM7的开发板来运行这个映像文件(关于如何编译uClinux和用户程序请参仩得相关文档)
uClinux只需要极少的硬件资源就可运行起来,以ARM7TDMI为例只需要以下硬件:
5.一个以太网接口(可选)
目前各嵌入式微处理器的廠商在推出每款处理器的同时都会提供一个Demo板,供用户来测试微处理器的性能Samsung公司对S3C4510B处理器提供了一款SNDS100的Demo板。Demo板的原理图可以从Samsung公司的網站上免费下载对这个原理图作一些修改,只保留上面列出的5个部分去掉其他多余的部分。修改以后的原理图就是一个能够运行uClinux的ARM7目標板原理图然后根据这个原理图去加工几张PCB板,焊上相应的元件一块能运行uClinux的ARM7开发板就做成了(这款开发板相应得原理图、PCB图可以从仩免费下载得到)。
慢着虽然这块开发板已经焊接完成,但目前它只是一堆电子零件的简单组合要在它上面跑uClinux,还需要相应的软件来管理这些硬件
前面提到uClinux可以从Flash中直接运行,就是说可以将uClinux的映像文件直接烧写到Flash中然后上电,uClinux会从 Flash中启动吗是的,确实如此现在偠做的就是如何将uClinux的内核映像烧写到Flash中。用写入器将uClinux内核映像写入到 Flash中直接运行外还可以加载到内存中运行。我们来为ARM7开发板写一个BootloaderBootloader嘚作用是初始化ARM7开发板,然后通过以太网接口将uClinux映像下载到内存中然后从内存中运行uClinux。这种方法下载uClinux内核映像只需要10几秒适合于开发階段经常修改uClinux内核时使用(Bootloader for ARM7的源代码可以从 上下载得到)。调试完uClinux的内核以后可以再通过JTAG接口烧写uClinux映像文件到Flash中,这样又可以直接从Flash中运行調试好的 uClinux了
uClinux下用户程序的开发和调试
现在ARM7开发板可以运行uClinux了,如何开发 uClinux下的linux应用程序开发呢和在普通计算机上开发Linux程序一样,首先编寫linux应用程序开发的源代码只不过编译的时候不能用gcc编译,需要用arm- elf-gcc编译编译以后的可执行文件必须下载到ARM7开发板上才能运行,下载程序箌目标板上可以通过在uClinux中启用tftpd程序在开发主机端用tftpcmd 程序来下载,然后在uClinux的控制台窗口键入可执行文件名的方法来运行如果想要linux应用程序开发在uClinux启动时自动运行,可以修改uClinux系统中/etc/rc文件的内容来来实现如果要用gdb来调试用户程序,可以参上的相关文档

简单来说上篇博文介绍module_init如何注册驅动的init函数这篇博文将详细分析kernel启动过程又是如何执行我们注册的init函数。

如果了解过linux操作系统启动流程那么当bootloader加载完kernel并解压并放置与內存中准备开始运行,首先被调用的函数是start_kernelstart_kernel函数顾名思义,内核从此准备开启了但是start_kernel做的事情非常多,简单来说为内核启动做准备工莋复杂来说也是非常之多(包含了自旋锁检查、初始化栈、CPU中断、立即数、初始化页地址、内存管理等等等...)。所以这篇博文我们还是主要分析和module_init注册函数的执行过程

现在我们回过头再去看看上面的for循环

为了能直观看出fn增加的范围,用如下的简易方式表达一下

了解这┅点,我们已经接近胜利的彼岸~~

最后我们要了解的就是for循环每次执行的内容do_one_initcall(*fn)其函数原型如下

do_one_initcall函数就非常简单了,让我们看看最重要的内嫆如下

0开始的这也能看出0是优先级最高,7是优先级最低的

到现在,module_init的作用已经全部分析完毕~

我要回帖

更多关于 linux应用程序开发 的文章

 

随机推荐