1、什么叫系统移植?
    根据硬件的变化,对已有的代码进行少量的修改,该套代码就很容易在新的硬件平台上运行,这个过程就叫做移植

    做移植的前提条件:
        1)'对要移植的代码很熟悉;
        2)'对目标平台的硬件差异比较清楚。


2、移植课程主要内容
    1)'u-boot的移植
         bootloader:<==>BIOS
         uboot是bootloader的一种,为操作系统的运行做准备工作:
            >>包括必要硬件的初始化工作;
            >>加载操作系统;
            >>运行操作系统;
        vivi:韩国一家公司开发的,也是一种bootloader,针对三星处理器设计的。
    2)'linux内核的移植
         linux内核的五大功能:
            a)内存管理;
            b)进程管理及进程间通信;
                 main ( ) {
                    // 先创建运行两个线程
                 }
                 某个线程中 ( ) {
                    fork ( ); // 子进程中有 1 个线程(主线程)
                                // 主进程中有 3 个线程(1个主线程2个创建的线程)
                 }
                 $:' ps -T -p PID
            c)虚拟文件子系统;<==>文件系统
            d)设备驱动管理;
            e)网络子系统(很多种类型的网络协议相关的代码);
    3)'根文件系统的制作
         各种命令行命令(ls rm....)对应的代码的移植。

【目标】
1. 熟悉三部分代码的框架;
2. 理解移植的步骤;
3. 掌握根文件系统的制作方法;

3、开发板烧写实验
    注意EMMC的分区。
    分区原则:每个分区的大小要大于等于要存储的镜像文件的大小。
    EMMC:'nandflash + 控制短路'
    开发板中的默认分区:
        0--------1M---------65M------------819M---------------8192M
扇区: 0-------0x800-----0x20800--------0x199800---------0x1000000
         |--uboot--|----linux----|-----rootfs-----|--------appfs---------|

/* 如果实验有问题,可以尝试重新分区:*/
        #:' mmc erase 0 0x1000000
        重新执行 3.1  3.2
        Kernel panic
        ...
        Rebooting in 5 reconds...
        /* 分区命令:*/
        #:' fdisk 2 3 0x100000:4000000 4100000:0x2f200000 33300000:0
        分3个区
        ' 重启开发板,查看分区情况。
        #:' mmc part
        /* 把本地和服务器ip均在TF的ubootpak启动换将下配置 */
        #:' setenv ipaddr 192.168.1.6
        #:' setenv serverip 192.168.1.8
        #:' saveenv
/* 从这个位置上读出linux内核到48000000位置 */

3.1 烧写uboot
        空板子:emmc中无任何代码,可以借助TF卡来完成烧写。arm裸板
        虚拟机共享porting文件夹
        $: cp /mnt/hgfs/porting/env/uboot.bin /tftpboot/
        #:' tftp 48000000 uboot.bin
        #:' update_mmc 2 2ndboot 0x48000000 0x200 0x555f0
        ' 拔出TF卡,重启开发板 '
        // 2:板子emmc设备。0/1:TF卡槽中的设备
        // 2ndboot:指的是uboot分区
        // 48000000:源数据地址
        // 0x200:写入的偏移位置
        // 0x555f0:写入的数据长度

3.2 烧写linux内核
        $: cp /mnt/hgfs/proting/env/uImage /tftpbott/
        #:' tftp 48000000 uImage
        #:' mmc write 48000000 0x800 0x3000
        #:' setenv bootcmd mmc read 0x48000000 0x800 0x3000 \; bootm 0x48000000
        #:' saveenv
        #: help mmc
            0x48000000:源数据地址
            0x800:要写入的位置(单位是扇区,十进制512)
            0x3000:要写入的数据长度(单位是扇区,十进制512)

3.3 烧写根文件系统
        $: cp  /mnt/hgfs/porting/env/rootfs_ext4.img /tftpboot/
        #:' tftp 48000000 rootfs_ext4.img
        #:' mmc write 48000000 20800 0x32000
        #:' setenv bootargs root=/dev/mmcblk0p2 rootfstype=ext4 console=ttySAC0,115200 maxcpus=1 lcd=vs070cxn tp=gslx680-linux
                root:根文件系统所在设备文件的名称
                rootfstype:根文件系统的类型
                console:控制台,ttySAC0,uart0控制器
                maxcpus:=1,只启动cpu0
                lcd:指定lcd的型号
                tp:指定触摸屏的型号
        #:' saveenv

      重启开发板:
           用户名:root
           密码:123456
           #:' cd /

ubuntu上命令:
    $: vi hello.c
    $: arm-c..<table>..gcc hello.c
    $: cp a.out /tftpboot/
开发板上命令:
    #: which tftp
    #: ifconfig eth0                        // 查看ip
    #:' ifconfig eth0 192.168.1.6      // 配置开发板上linux的ip
    #:' ping 192.168.1.8                   // 查看网络连接是否接通
    #: tftp -gr a.out 192.168.1.8     // 将a.out拷贝到开发板的linux文件中
    #: whoami                               // 确认是root用户
    #: ls -l a.out                             // a.out被开发板的linux系统保护策略去掉可执行权限了
    #:' chmod +x a.out                   // 添加可执行权限
    #: a.out                                    // 执行结果 hello,world!

4、网络nfs网络连接根文件系统
     这种方式一般用于开发调试阶段。
    4.1 服务器端设置 - PC-ubuntu-linux "在linux没有nfs服务时执行4.1"
         1) 安装nfs server
             联网:$:' sudo apt-get install nfs-kernel-server
             未联网:$:' cd ~/Downloads/nfs/
                          $:' sudo dpgk -i *.deb
         2) 准备根文件系统数据
             env/rootfs_qt.tar.bz2
             $:' cd /opt/
             $:' cp /mnt/hgfs/porting/env/rootfs_qt.tar.bz2 .
             $:' sudo tar xvf *.bz2
         3) 对服务器进行配置
             配置PC机上的哪些目录可以让客户端通过nfs方式访问
             $:' sudo vi /etc/exports
              /opt/rootfs  *(rw,sync,no_root_squash)
              '/opt/rootfs':允许客户端通过nfs方式访问的目录
              /* ubuntu-linux下操作该目录,即可同步到开发板linux根目录 */
              *:所有客户端都可以访问
                    192.168.1.* 代表客户端IP为192.168.1.X可以访问
              rw:客户端对目录有读写权限
              sync:同步 // man 2 sync; 重要的write函数写入数据后可加。
              no_root_squash:权限,角色
          4) 对新的配置重启nfs服务
              $:' sudo /etc/init.d/nfs-kernel-server restart
              // 看到4个 [ OK ] 重启成功。
    4.2 客户端设置 - 开发板
          #:' reboot
          // 进入u-boot的命令行,3秒倒计时按空格
          #:' setenv bootargs root=/dev/nfs nfsroot=192.168.1.8:/opt/rootfs 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
                /dev/nfs:属于固定写法。只要是nfs方式挂在网络文件系统
          #:' saveenv
          // uboot下 re 命令,不做任何操作等待 starting kernel启动完全
          #:' re
                Welcome to X6818
                tarena login: root
                Password: 123456
                成功!!!
           #:' cd /


Logo

更多推荐