1、关于内核模块($: linux   #: 开发板)
     模块化设计。

$:' vi drivers/char/Makefile
            obj-m    += led_drv.o
    $:' make uImage -j4
    $:' cp arch/arm/boot/uImage /tftpboot/
    #:' tftp 48000000 uImage
    #:' bootm 48000000
    #: dmesg | grep "led_init"   
        // 验证并没有执行led_drv.c中的函数
    $:' make modules
    #:' cat /proc/cmdline
        //显示加载根文件的目录
    $:' cp drivers/char/led_drv.ko /opt/rootfs
    #:' cd /
    #:' insmod led_drv.ko
        // 安装内核模块
    #:' lsmod
        // 显示内核中动态安装的模块信息
    #:' rmmod led_drv
        // 卸载模块,无文件后缀名。
    $:' make menuconfig
        Kernel hacking  --->
        [ 4 ]Default message log level (1-7)  // 修改为4,默认打印优先级
    $:' cp arch/arm/boot/uImage /tftpboot/
    #:' tftp 48000000 uImage
        // 在uboot命令行下烧写uImage
    #:' mmc write 48000000 800 3000
    #:' re
        // 进入开发板linux系统
    #:' cd /
    #:' insmod led_drv.ko
        // [  113.771000] call led_init!
    #:' rmmod led_drv.ko
        // [  367.357000] call led_exit!

2. 让自己的模块可以通过make menuconfig来显示
    make menuconfig
    看到的所有的菜单元素都来源于各级子目录下的Kconfig
    关于Kconfig文件的语法规则:
        kernel/Documentation/kbuild/kconfig-language.txt
    $:' vi drivers/char/Kconfig
         10 config MY_LED
         11       tristate "My led driver - Jan"  // 变量类型为三态,3种取值
         12       default y  // 默认取值
         13       help  // 帮助信息不能超过help下第一行的对齐
         14           This is my first kernel driver of led...
         15           hello, world!!!
         16           ah, ha ha ha ha ...
    $:' make menuconfig
        // .config 中会出现1个变量 CONFIG_MY_LED
    $:' vi drivers/char/Makefile
            obj-$(CONFIG_MY_LED)        += led_drv.o
规律:
    cp xxx.c drivers/char/
    vi drivers/char/Kconfig
    vi drivers/char/Makefile
-----------------------------------------------------------
1、根文件系统的制作
1.1 什么是根文件系统
      【文件系统】文件的索引信息、文件的具体数据、操作索引的具体代码
      操作索引的具体源码:kernel/fs/
      ext2/3/4、fat、nfs、jffs2、gfs2、jffs2、yaffs2...
      【根文件系统】linux内核启动时,加载的第1个文件系统
      /bin       可执行程序
      /dev       块、字符设备节点文件
      /etc        主要配置文件盒初始化执行文件
      /lib         基本库文件
      /mnt      挂载点,临时挂载文件系统用
      /opt       附加的软件包
      /proc     虚拟文件系统,用于内核和进程通讯
      /sbin      基本的系统管理程序
      /tmp      临时文件目录
      /usr        更多的用户程序
      /sys        虚拟文件系统
      /var        可变信息存储
      根文件系统中存储的文件都是有特定需求的。

2、 准备根文件系统中必备的文件(目录)
2.1 【生成arm处理器能够使用的命令】
    使用开源软件busybox
    $:' cd ~/jy/porting/
    $:' cp ~/workdir/rootfs/busybox-1.23.2.tar.bz2  .
    $:' tar xvf busy*
    开源程序,首先从README开始读。
    $:' make menuconfig
         Busybox Settings  --->
              Build Options  --->
                      [*] Build shared libbusybox  // 共享库
              Installation Options ("make install" behavior)  ---> 
                      What kind of applet links to install (as soft-links)  --->
                      // 软连接(保持默认)
                      (./_install) BusyBox installation prefix (NEW)
                      // make install(保持默认)
    $:' vi Makefile
         164 CROSS_COMPILE ?= arm-...-gnueabi-
         190 ARCH ?= arm
    $:' make
    $:' make install
** 查看busybox相关信息与linux文件系统对比,非必须步骤 **
    $:' cd _install
    $:' file bin/busybox 
    bin/busybox: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.4.5, BuildID[sha1]=0xe3bc5b540a72815fb0ae47eb360bf32ecaacb350, stripped
    $:' du -h /bin
    8.9M /bin
    $:' du -h bin/
    956K bin/
    $:' du -h /sbin
    9.1M /sbin
    $:' du -h sbin/
    4.0K sbin/

2.2 【准备busybox可执行程序所需要的库文件】
    $:' cd ~/jy/porting/busybox-1.23.2/_install
    $:' mkdir lib
    $:' ll /opt/arm-cortex_a9-...-2.18/arm-...-gnueabi/sysroot/lib/libm.so.6 
    lrwxrwxrwx 1 tarena tarena 20  2月 23 14:26 lib/libm.so.6 -> libm-2.18-2013.10.so
    $:' cp /opt/arm-cortex_a9-...-2.18/arm-...-gnueabi/sysroot/lib/libm.so.6 lib/ -d
    $:' cp /opt/arm-cortex_a9-...-2.18/arm-...-gnueabi/sysroot/lib/libm-2.18-2013.10.so lib/ -d
    $:' cp /opt/arm-cortex_a9-...-2.18/arm-...-gnueabi/sysroot/lib/libc.so.6 lib/ -d
    $:' cp /opt/arm-cortex_a9-...-2.18/arm-...-gnueabi/sysroot/lib/libc-2.18-2013.10.so lib/ -d
    $:' cp /opt/arm-cortex_a9-...-2.18/arm-...-gnueabi/sysroot/lib/ld*.so* lib/ -d

2.3 【准备系统启动所需的】
    $:' mkdir etc
配置一:
    $:' vi etc/inittab
        ::sysinit:/etc/init.d/rcS
        ::respawn:-/bin/sh
        ::ctrlaltdel:/sbin/reboot
        ::shutdown:/bin/umount -a -r
配置二:
    $:' mkdir etc/init.d
    $:' vi etc/init.d/rcS
    // 开机自启动的程序
        #!/bin/sh
        #自动挂载/etc/fstab文件中指定的分区
        mount -a
        #热插拔事件处理 创建设备文件
        echo /sbin/mdev >/proc/sys/kernel/hotplug
        mdev -s
    $:' chmod +x etc/init.d/rcS
$:' vi etc/fstab
        proc    /proc   proc    defaults    0   0
        tmpfs   /tmp    tmpfs   defaults    0   0
        sysfs   /sys    sysfs   defaults    0   0
        tmpfs   /dev    tmpfs   defaults    0   0

2.4 【创建必要的目录】
    $:' mkdir proc/ sys/ tmp/ dev/ var/ mnt/ opt/

2.5 【创建必要的设备文件】
    linux内核启动时需要使用两个设备文件
    /dev/console : 控制台设备
    /dev/null    : 黑洞文件
    // 设备文件的创建使用 mknod 命令
    $:' sudo mknod dev/console c 5 1
    $:' sudo mknod dev/null c 1 3
    $:' sudo chown tarena:tarena dev/console
    $:' sudo chown tarena:tarena dev/null

3、验证根文件系统数据的有效性
    通过nfs方式加载。
服务器:
    $:' sudo vi /etc/exports
        /home/tarena/jy/porting/busybox-1.23.2/_install  *(rw,sync,no_root_squash)
        // 新增此行内容【注意路径!!】
    $:' sudo /etc/init.d/nfs-kernel-server restart
        // 重启服务器
客户端:
    // 进入uboot命令行
    #:' setenv bootargs root=/dev/nfs nfsroot=192.168.1.8:/home/tarena/jy/porting/busybox-1.23.2/_install ip=192.168.1.6:192.168.1.8:192.168.1.1:255.255.255.0 lcd=vs070cxn tp=gslx680-linux console=ttySAC0,115200 maxcpus=1 init=/linuxrc
        // 修改了nfsroot的目录【注意路径!!】,新增了 init=/linuxrc
    #:' saveenv

-------------------------------------------------------
【知识点】:
   【1】 busybox 生成 bin比PC上的bin小很多
         原因一: _install/bin的所有命令都是
                 PC机上对应命令的简化版本
         原因二: _install/bin所有的命令都是执行
                 bin/busybox的软链接文件
                 ls  等效于 busybox ls
   【2】 关于可执行程序busybox
        $:' file bin/busybox
        $:' arm-...-gnueabi-readelf -d bin/busybox
             共享库:[libm.so.6]
             共享库:[libc.so.6]
        $:' which arm-...-gnueabi-gcc
            /opt/arm-cortex_a9-...-2.18/bin/arm-...-gnueabi-gcc
        $:' cd /opt/arm-cortex_a9-...-2.18/
        $:' find ./ -name "libm.so.6"
        ./arm-...-gnueabi/sysroot/lib/libm.so.6
            // 找到所需要的共享库
        $:' ll arm-...-gnueabi/sysroot/lib/libm.so.6
            // 软连接形式存在:libm.so.6 -> libm-2.18-2013.10.so*
         
        <tips>
        $:' cp -d
            -d:保持软连接属性
            -a:等价于 -dR
   
    【3】linux自举完成后会去执行1号进程
         1号进程如果指定为linuxrc// busybox linuxrc
         linuxrc对应的实现代码
         /home/tarena/porting/busybox-1.23.2/init/init.c
         init_main()
         {
            打开 解析/etc/inittab
         } 
         inittab文件有着固定的格式
         <id>:<runlevel>:<action>:<process>
         前两项在嵌入式根文件系统中经常忽略
         
         在action条件下去执行process(可执行程序/脚本)
    【4】fstab文件的格式
         device  mount-point  type   options  dump  fsck
         devcie:要挂载的设备或者分区
         mount-point: 挂载点
         type: 文件系统类型
         options: 挂载时的参数
             -rw,对该device可读可写
             defaults
         dump:  对该分区是否备份
             默认 给0
         fsck: 是否对该分区进行格式检查
             默认 给0
     【5】设备文件的创建
          touch
          mknod dev/xxx c  major  minor
             c: 字符设备        
             major: 主设备号
             minor: 次设备号

Porting:linux内核的模块化、根文件系统的制作和自动挂载相关推荐

  1. linux 内核移植和根文件系统的制作【转载】

    原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...

  2. linux 文件系统覆盖目录,Linux内核裁减及根文件系统定制

    一.内核编译 1.准备工作 (1)整理出系统需要支持的硬件.文件系统类型以及网络协议等内容. (2)建议用命令uname –r 查看一下系统的版本号,如果你的系统版本与将要编译的内核版本一致,建议将/ ...

  3. Linux内核移植和根文件系统制作(详细步骤精讲)

    第一章移植内核 1.1 Linux内核基础知识 1.1.1 Linux版本 1.1.2 什么是标准内核 1.1.3 Linux操作系统的分类 1.1.4 linux内核的选择 1.2 Linux内核启 ...

  4. s5pv210 linux内核移植,简单根文件系统制作 - S5PV210 Linux3.8.3内核移植_Linux编程_Linux公社-Linux系统门户网站...

    1.这里为什么选nfs文件系统呢? 在产品开发阶段,因为nfs根文件系统并不需要编译进内核,方便调试. 2.制作根文件系统需要用到BusyBox 解压进入busybox目录: root@linuxid ...

  5. linux内核加载根文件系统,根文件系统 - Linux 内核引导选项简介

    [KNL] root=字符串 指定根文件系统的所在位置.通常这是一个必须明确设置的选项. "字符串"可以使用如下几种形式: XXxx 一个16进制数,其中"XX" ...

  6. Linux——根文件系统的制作(jffs2 and ubifs)

    一.根文件系统简介 根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统而言它还是内核启动时所挂载(mount)的第一个文件系统,系统引导启动程序 ...

  7. Linux根文件系统的制作

    1. 根文件系统 文件系统是包括在一个磁盘(包括光盘.软盘.闪盘及其它存储设备)或分区的目录结构:一个可应用的磁盘设备可以包含一个或多个文件系统:如果您想进入一个文件系统,首先您要做的是挂载(moun ...

  8. 根文件系统rootfs制作——使用buildroot工具(重制版)

    根文件系统rootfs制作--使用buildroot工具(重制版) 0.前言 一.rootfs配置 1.下载buildroot源码 2.开始配置 Target options配置如下: Toolcha ...

  9. 第一季8:完整版(即包含mpp)根文件系统的制作

    以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除. 一.概述 mpp是海思编写的与视频编解码有关的驱动.库等内容.我们需要部署这些内容,也就是把这些内容放在合适的目录位置. 二.mpp的目 ...

最新文章

  1. ArcGIS License Manager 相关总结
  2. 怎么用python读取大文件_使用Python读取大文件的方法
  3. atitit.提升开发效率---mda 软件开发方式的革命
  4. 暑期英语学习(词组积累)【持续更新中】
  5. 【NIPS 2017】基于深度强化学习的想象力增强智能体
  6. 使用服务器代替雷达信号处理,雷达数字信号处理解决方案
  7. 【爆漏】酷我音乐盒再曝缺陷
  8. 【校招实习面试实战,身临其境】华为软件开发工程师面试复盘总结
  9. c语言程序设计基本模板,《C语言程序设计基础教程》试讲教案模板
  10. 在文档中怎么画横线实线_怎样在一个word文档中添加一根实线,用作分开不同
  11. 所爱隔山海,山海皆可平
  12. MPEG2-PS格式分析实例
  13. 步进电机控制Proteus仿真
  14. IP-guard项目实施前情况调查表
  15. [特别篇] 评中国药学家距诺贝尔奖一步之遥
  16. 安卓微信浏览器唤起系统内部浏览器
  17. 《把时间当作朋友》 - 书评
  18. CV_shortcomings of original GAN
  19. 互联网时代程序员如何避免知识半衰期?
  20. 结构方程模型amos软件一些常见的处理问题

热门文章

  1. 配置上位机软件开发环境BOOST及cmake等
  2. 知到计算机专业英语翻译,计算机专业英语翻译_new重点.doc
  3. 如何快速成为微信小程序流量主
  4. doxygen教程-10-生成调用关系图
  5. 小米笔记本 Pro安装Mac OS_X(10. 15)双系统,亲自实战!
  6. python实现凯撒密码
  7. 基于android平台的云记事本软件,安卓记事本毕业论文--基于Android平台记事本的设计与实现...
  8. 微信H5页面跳转小程序 - Vue中使用微信开放标签<wx-open-launch-weapp>
  9. 一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
  10. 创龙基于TI AM335x ARM Cortex-A8 CPU,主频高达1GHz开发板CAN总线接口、RTC座