Linux系统裁剪后烧录到Cortex-A9开发板上
💳

Linux系统裁剪后烧录到Cortex-A9开发板上

Published
Jun 25, 2021
Description
Tags
Linux
uboot
Email
Author
Property
 
 

基础复习

 int a;  int a[1];  int* a[1]; int型的指针数组  int *a;a=b[1]; 指向int 数组的指针 int (*a)[10]  int a();  int *a(); int型的指针函数  int (*a)();int 型的函数指针a

Linux 下的命令

  1. uname ;内核版本
  1. whoami ;查看当前用户
  1. pwd;路径
  1. cd(change directory) ,直接输cd回车后进入家目录
  1. ls 显示目录下的内容 ll:显示目录下内容的详细信息
  1. cp 拷贝
  1. touch ;创建文件
  1. mirdir;创建文件夹
  1. clear ;清屏
  1. chmod ;改变文件权限 (以8进制表示)
  1. rwxrwxrwx 每个文件都有三组权限:第一组 rwx:文件的创建者对该文件的权限 第二组 rwx:文件创建者所在组组内用户对该文件的权限 第三组 rwx:系统里面的其他用户对该文件的权限
  1. ifconfig
  1. ping
  1. tar 压缩或解压 -zxvf 压缩 z 压缩 c 产生 x 解压 v 显示过程 f 后更指定的文件 -xvf 解压缩

Linux

Linux系统

/bin
可执行程序
/dev
块、字符设备节点文件
/etc
主要配置文件和初始化执行文件
/lib
基本的库文件, 茹:C 库,和内核模块(modules)
/mnt
挂载点,临时挂载文件系统用
/opt
附加的软件包
/proc
虚拟文件系统,用于内核和进程通讯
/sbin
基本的系统管理程序
/tmp
临时文件目录
/usr
更多的用户程序,包括X server
/sys
虚拟文件系统 sysfs 挂载点
/var
可变信息储存,如log等

Vim操作

  1. vi 打开文件, 进入浏览模式, 想修改文件, 进入编辑模式(插入模式 )
    1. 进入插入(编辑)模式:
      • i:在光标位置进入插入模式
      • a:在光标后进入插入模式
      • o:在下一行新增一行进入插入模式
      • I:在行首位置进入插入模式
      • A:在行末进入插入模式
      • O:在上一行新增一行进入插入模式
      退出插入(编辑)模式:
      在编辑模式下,按“esc”键 退出编辑模式。
  1. 浏览模式(命令行模式):
      • dd 删除光标所在行
      • ndd:删除光标所在行以下n行
      • yy 复制光标所在行nyy:复制光标所在行以下n行的内容
      • p: 粘贴复制的内容到光标所在行
      • u :撤销上一次操作0:让光标移动到行首
      • $:让光标移动到行尾gg:光标移动到第一行
      • G:光标移动到最后一行ngg------- 光标移动到第n行
      • x:删除光标所在字符全文件搜索 , 输入/跟上要搜素的内容,/string 回车, 后续接着按n, 查找下一个
      • 全文替换操作:g---global c-------confirm :%s/要替换的内容/替换成什么/gc:%s/scanf/scanf_1/gc 在本文件里把scanf 替换成scanf_1 全部替换, 但每一次替换需要’y’ 或 ‘n’确认
  1. 底行模式命令:
    1. (1):q 不保存并且退出文件
      (2):q! 强制退出并且不保存
      (3):w 保存并且不退出文件 *
      (4):wq 保存并且退出文件

Ubuntu和板子通信

1. 虚拟机网卡设置

配置虚拟机的网络为桥接模式(为了连接板子)
  1. VM菜单:编辑->虚拟网络编辑器,配置Vmnet0为桥接模式,选择有线网卡
  1. 虚拟机,菜单:虚拟机->设置->硬件->网络适配器->自定义:特定虚拟网络->VMnet0桥接模式
  1. ubuntu, 右上角,网络处,右键,Edit connections ;wired->Auto Ethernet->Edit;IPv4 settings, 设置为Manual ; Address Add,设置Address为192.168.xxx.xxx,Netmask为255.255.255.0;save,close
  1. 重启网络,ubuntu右上角,勾掉Enable network,然后重新勾上
  1. 用ifconfig命令测试, 查看IP是否已经改过来了

2. tftp 服务器配置

tftp: tiny file transfer protocol 轻量级文件传输协议
  1. 修改tftp服务器的配置文件 /etc/default/tftpd-hpa 来更改tftp的配置
    1. $ sudo vi /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"  TFTP_DIRECTORY="/home/farsight/tftpboot"   // 在用户家目录下, 创建一个目录, 指定该目录为tftp服务器的共享目录   TFTP_ADDRESS="0.0.0.0:69"  TFTP_OPTIONS="-c -s -l" // man tftpd
  1. cd 回车
    1. mkdir tftpboot
      cd tftpboot
      echo “abc” > a.txt
      在/home/farsight/tftpboot 目录下创建了一个文件 a.txt
  1. 重启tftp服务器
    1. $ sudo service tftpd-hpa restart
      成功会显示:
      tftpd-hpa stop/waiting
      tftpd-hpa start/running, process xxxxxx ( 重启不成功, 检查ip 地址, eth0)
  1. 回到家目录, 运行tftp客户端,从服务器上下载文件
    1. $ tftp localhost //tftp 客户端访问本机的
      tftp 服务器tftp> get a.txt //从tftp服务器相应的目录下, 下载a.txt
      tftp> q
  1. 上传文件时要注意权限问题, 在家目录下
    1. cd回车echo “123” > b.txt
      tftp localhost
      tftp> put b.txt 上传
      如果上传不成功, 检查 /home/farsight/tftpboot 文件夹 权限, 给 777权限

3. nfs 服务的配置

nfs: network file system 网络文件系统
  1. 配置NFS服务器
    1. $ sudo vim /etc/exports //nfs配置文件
      /home/farsight/rootfs *(rw,sync,no_subtree_check,no_root_squash) 参数说明 (参考讲义)
      此处目录可以是(home/farsight/rootfs)
      选项可以参考 man 5 exports (/etc/exports注释中提示的)
  1. 将根文件系统的压缩包rootfs.tar.xz拷贝至/home/farsight,然后解压 tar xvf rootfs.tar.xz,注意权限 产生目录 home/farsight/rootfs
  1. 重启NFS服务器
    1. $ sudo service nfs-kernel-server restart
  1. 进行挂载测试
    1. sudo mkdir /mnt/ttt
      $ sudo mount -t nfs localhost:/home/farsight/rootfs /mnt/ttt
      $ ls -l /mnt/ttt //如果看到和/home/farsight/rootfs 相同的文件, nfs 配置好了
  1. 卸载
    1. $ sudo umount /mnt/ttt

4. 交叉编译工具链

【实验环境】
  • ubuntu 12.04发行版
  • FS4412平台
【实验步骤】
  1. 解压工具链压缩包
    1. $ cd ~
      $ mkdir toolchain$ cd toolchain
      将第一天/工具/gcc-4.6.4.tar.xz拷贝到toolchain目录下并解压
      $ tar xvf gcc-4.6.4.tar.xz
  1. 环境变量的添加修改文件
    1. sudo vi /etc/bash.bashrc
      在该文件最后添加如下内容
      export PATH=$PATH:/home/farsight/toolchain/gcc-4.6.4/bin
      重启配置文件
      $ source /etc/bash.bashrc
  1. 工具链的测试
    1. $ arm-none-linux-gnueabi-gcc –vUsing built-in specs.

裁剪Linux内核

1. uboot

1.1 uboot配置

uboot是bootloader的一种,并且是开源的。
uboot需要配置几个重要的环境变量
  • ipaddr —— 描述板子的 ip 地址
  • serverip —— 电脑上ubuntu的 ip 地址
setenv ipaddr 192.168.100.191
  • bootcmd —— uboot 启动后主动执行 bootcmd 环境变量的内容
setenv bootargs root=/dev/nfs nfsroot=192.168.100.192:/home/farsight/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.100.191 clk_ignore_unused
  • bootargs —— 内核启动时需要的参数设置
setenv bootargs root=/dev/nfs nfsroot=192.168.100.192:/home/farsight/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.100.191 clk_ignore_unused
// root=/dev/nfs —— 指明板子用的是nfs 网络文件系统
// nfsroot —— 板子要挂载的文件系统在哪里?

1.2 uboot命令

  1. pri ———— 查看环境变量
  1. setenv var1 123 ———— 设置环境变量var1 , 它的初始值123setenv var1 —— 删除配置的 var1 环境变量
  1. tftp —— uboot 的tftp 客户端
  1. tftp 41000000 uImage // 从服务器的tftp指定的文件夹 下载uImage 到内存41000000
  1. tftp 42000000 exynos4412-fs4412.dtb // 从服务器的tftp指定的文件夹 下载设备树文件exynos4412-fs4412.dtb 到内存41000000
  1. bootm —— 从内存启动bootm 参数1 参数2 参数3参数1 : 内核(uImage) 在内存的地址参数2: 文件系统在内存的地址参数3: 设备树(exynos4412-fs4412.dtb) 在内存的地址
  1. bootm 41000000 - 42000000
  1. boot —— 主动执行bootcmd 环境变量的内容

2. 板子上运行程序

  1. 配置好上述相应环境后,在 ubuntu 中启动 ftp 服务器,nfs 服务器,(sudo),如果无法将 ftp 服务器上的 uImage 内核文件以及设备树文件 exynos4412-fs4412.dtb下载到板子上的话,需要给 ftp服务器目录以及其下的所有内容授予 777 权限。
  1. 在ubuntu系统的 nfs 设置的目录下,新建一个 .c 文件,调用 vim 编辑器,将输出 Hello,Wold! 的程序写好保存,使用之前配置好的交叉编译环境编译该文件 arm-none-linux-gnueabi-gcc test.c -o test // 这里不使用 -o 命令也行,默认会生成 a.out 的文件此时会在该文件该目录下生成一个 test.out 文件
  1. 由于我们之前将该目录挂载到板子上,所以板子上就可以看到该 test.out 文件,通过命令 ./test.out ,就可以看到运行结果,即 putty 上输出 Hello,World!

注:

  1. 配置完之后 ping 主机,检查板子能否和 ubuntu 连通。
  1. 使用 boot 命令重启完成后,如果卡在了下载文件的地方,检查 ftp ,nfs 文件是否配置好,服务是否启。
sudo service tftpd-hpa restart //启动 tftp 服务
 #include <sys/stat.h>  #include <sys/types.h>  #include <unistd.h>  #include <stdio.h>  #include <fcntl.h>    int main(int argc, char *argv[])  {          int i;          int fdin,fdout; //return file number;          char buf[];          ssize_t len,temp          printf("argc = %d",argc);          for (i = 0;i < argc;i++){                  printf("argv[%d]=%s",i,argv[i]);         }          fdin = open(argv[1], O_RDONLY);          fdout = open(argv[2], O_WRONLY);          printf("fdin = %d, fdout = %d",fdin,fdout);          while(1){                  len = read(fdin,buf,20);                  temp = write(fdout,buf,len);         }          close(fdin);          close(fdou);   }
 

Loading Comments...