新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 低固存嵌入式系统的uClinux小型化方法

低固存嵌入式系统的uClinux小型化方法

作者: 时间:2011-06-21 来源:网络 收藏
1.2.1 对调用的影响

本文引用地址:https://www.eepw.com.cn/article/150585.htm

  调用约有177个,包括关于进程的调用函数、文件的调用函数,以及其它相关的调用,其中文件的调用占了71个。由于没有根系统,系统调用中涉及到从根文件系统上或挂接在它某个文件节点上的其它文件系统上,装载、执行可执行文件的系统调用都是没必要的,所以必须做相应的更改。典型的是系统调用execve(),其执行流程主干线如图2所示。

  exeeve()

  ↓

  do_exeeve()

  ↓

  open_execve()

  ↓

  prepare_binpma()

  ↓

  search_binary_hanlder()

  图2 execve()执行流程

  do_execve()是execve()的核心,它调用open_exec()寻找可执行文件并打开,函数open_exec()返回一个file结构指针,代表着读入可执行文件的上下文,将其保存在数据结构bprm中。然后调用prepare_binprm()完成对bprm的进一步工作,包括从可执行文件头读取相关信息,以及拷贝运行环境参数等到bprm 中。内核中有一个叫formats的队列,队列中的每个成员只认识并且处理一种特定格式的可执行文件的运行。search_binary_handler()就是在formats的队列中,寻找跟bprm中信息相符的一个成员,并由此成员来完成可执行文件的装载并初始化运行。由于不存在从文件系统加载可执行文件,所以bpma数据结构,及涉及prepare_binprm(),search_binary_hanlder()等相关操作都是可以删除的。

  再者,由于没有可供mount的文件节点,所以有关挂接的系统调用也必须做出调整。比如:mount()是用于文件系统挂接的系统调用,完全可以删去;内核函数mount_root()在初始化时用于安装根文件系统,也是可以删去的;vfsmount()是内核数据结构,用于描述挂载节点的信息,包括挂载点的根目录,被挂载系统的级块指针等信息。vfsmount()完全是跟挂载有关的,可以将它删除,同时内核中有好多涉及操作此数据结构的函数也必须做出更改。比如alloc_vfsmnt()和free_vfsmnt()是分配和释放vfsmount结构,完全可以删去,但有些内核函数只有一部分涉及到对vfsrmnt结构的操作,所以不能全部删除,必须对相应部分做出修改。

  1.2.2 对内核启动初始化的影响

  由于init()进程不能从根文件系统加载,所以凡是涉及根文件系统初始化函数的都必须删除,以支持内核与应用程序一体化。初始化进程init代码如下:

  static int init(void *unused)

  {……

  if(open(/dev/console,O_RDWR,0) 0)

  ……

  if(execute_command)

  execve(execute_command,argv_init,envp_init);

  execve(/sbin/init,argv_init;envp_init);

  ……

  panic(No init found.Try passing init= option to kernel);

  }

  init()完成系统的初始化,包括外部设备的初始化,释放init()前初始化后代码占用的内存,以及控制台的初始化,最后从根文件系统加载整个系统的第一个进程init,它是所有进程的“鼻祖”。由于根文件的删除,所以可以删除控制台以及调用init进程。

  1.2.3 对ReFS和外部设备的影响

  ReFS可以像mount_root()那样直接把ReFS当成根文件系统来装,但它并不像根文件系统那样有bash,gretty等应用程序,也不具备挂载其它系统的能力,所以不是真正的根文件系统。内核中有几个根文件系统和外设相关的重要内核级全局变量:file_system_type,btkdevs[MAX_BLKDEV],chrdevs[MAX_CHRDEV],super_block。

  file_system_type是一个描述系统中所有支持的文件系统的数据结构。VFS在内存中维护这样一个数据结构的列表,全局指针变量为file_systems。新文件系统必须通过register_filesystem()来注册以让系统识别,即是在链表file_systems结尾插人一个file_systm_type数据结构。blkdevs[MAX_BLKDEV]和chrdevs[MAX_CHRDEV]分别为块设备和字符设备的注册数组,包含主设备号和次设备号,以及有关设备操作的跳转指针。块设备和字符设备分别通过register_blkdev()和register_chrdev()向系统注册设备。super_block是超级块数据结构,存放着整个文件系统的信息和超级块操作的函数。在通用内核中根文件系统的安装的顺序是:从file_systems处取得根文件系统的read_super(),read_super()指向具体的驱动程序读操作,通过读取得超级块,然后在内存中创建inode,file,dentry等数据结构,用于文件的读写操作。

  在这里,同样可以用与根文件系统相同的装载来初始化ReFS,但是比前者简单多,因为后者不涉及安装挂载点及与此相关的操作。对于外设,内核一般是通过根文件系统搜索到设备文件,再来访问外设,当中要涉及到搜索路径和挂接点到外设翻译的问题,而在这里外设是独立的,不依赖于根系统,所以实现起来更简单,可以直接依据内核数据结构blkdevs[]和chrdevs[]提供的操作函数表指针,来操作具体的驱动程序操作外设。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

linux相关文章:linux教程




评论


相关推荐

技术专区

关闭