系统移植

[1]>>提问:我的开发板是什么类型?
-->>我的itop4412的开发板的scp-1G

[2]>>提问format是什么意思?
-->>格式

[3]>>提问:什么是镜像文件?  
-->>所谓镜像文件其实和rar,zip压缩包类似,它将特定的一系列文件按照一定的格式制作成单一的文件,
以方便用户下载和使用,例如一个操作系统、游戏等;不同刻录软件制成的镜像文件格式都各不相同比如iso,img,bin
-->>制作根文件系统镜像文件的工具 == make_ext4fs

[4]>>提问:什么是SSH
-->>Secure Shell 安全外壳协议 == 一种远程登录的协议

[5]>>提问:开发板的启动流程?
-->>硬件启动 --> 加载bootloader --> 加载kernel --> 挂载根文件系统 

[6]>>提问:设备分类与介绍?
-->>字符设备 = 字符为单位传输的设备
-->>块设备 = 信息存储在固定大小的块中,每个块都有自己的地址 = 存储设备
-->>网络设备 = 网络设备

[7]>>提问:HDMI全称?
-->>High Definition Multimedia Interface == 高清多媒体接口

[8]>>提问:开发板两种启动方式?
-->>EMMC启动(fastboot烧写) = Embedded Multi Media Card 嵌入式多媒体卡启动 = 0101 [内0外1]
-->>TF启动(TF卡烧写) = Trans-flash Card 移动flash卡 = 1001 [内0外1]

[9]>>提问:开发板的两种模式?
-->>uboot模式 + 文件系统模式

[10]>>提问:虚拟机的三种联网模式
-->>桥接模式:与主机共用一块网卡
-->>NAT模式:Network Address Translation网络地址转换 ==专用网内使用的专用地址
-->>仅主机模式:仅与主机通讯

[11]>>提问:df命令
-->>df == disk free 显示目前在Linux系统上的文件系统磁盘使用情况统计

[12]>>提问:source insight?
-->>source来源,insight = 查询 
-->>source insight = 面向项目开发的程序编辑器
	
[13]>>提问:Wine?
-->>Wine 在诸如Linux,Mac上运行 Windows 应用的兼容层即Windows运行环境
-->>Wine是完全公开源代码的
-->>Wine运用API转换技术实做出Linux对应到Windows相对应的函数来调用动态链接库以运行Windows程序
	
[14]>>提问:ADB?
-->>Android Debug Bridge = 安卓调试桥 = 安卓调试工具 = 一根普通的安卓线 [fastboot模式烧写需要用到]

[15]>>提问:fastboot模式烧写模式?
-->>fastboot是安卓手机中一种使用USB数据线连接手机的一种刷机模式
-->>注意:烧录顺序任意 ; fastboot模式烧写 <--> 从eMMC启动
-->>fastbootm模式烧写前须知:1将eMMC分区  2:开发板进入fastboot烧录模式 3:待烧录文件拷贝到烧录工具目录  4:连接安卓线/OTG线
-->>fastboot.exe flash bootloader u-boot-iTOP-4412.bin
-->>fastboot.exe flash kernel zImage 
-->>fastboot.exe flash system system.img
-->>fastboot.exe flash ramdisk ramdisk-uboot.img
-->>fastboot.exe flash userdata userdata.img

[16]>>提问:sd卡烧写模式模式?
注意:烧录顺序任意 ; sd烧写 <--> 从sd启动
注意:1:先将TF卡分区  2:系统格式化为fat32格式,并在TF中创建sdupdate文件夹,存放待烧写的文件  
注意:分区是分区;系统格式化是转化为系统识别的格式;格式化是在所分的区基础上进行格式转化;
注意:格式化 = 格式化 + 系统格式化; [格式化 = 合并分区 ; 系统格式化 = 在各个分区基础上转化为系统识别的格式]
-->>sdfuse flash bootloader u-boot-iTOP-4412.bin 
-->>sdfuse flash ramdisk ramdisk-uboot.img
-->>sdfuse flash system system.img 
-->>sdfuse flash kernel zImage
-->>sdfuse flash userdata userdata.img
-->>sdfuse flashall

[17]>>提问:将eMMC进行分区?
-->>系统从eMMC卡启动就对eMMC进行分区
-->>fdisk -c 0 
-->>fatformat mmc 0:1
-->>ext3format mmc 0:2
-->>ext3format mmc 0:3
-->>ext3format mmc 0:4

[18]>>提问:将TF卡进行分区?
-->>系统从TF卡启动就对TF卡进行分区
-->>fdisk -c 1
-->>fatformat mmc 1:1
-->>ext3format mmc 1:2
-->>ext3format mmc 1:3
-->>ext3format mmc 1:4

[19]>>提问:如何制作TF的Uboot启动盘?
-->>1:强制格式化[将TF卡各分区合并] 
-->>2:转化为FAT32格式[避免虚拟机不能识别TF卡]  
-->>3:将uboot源代码拷贝到虚拟机
-->>4:./mkuboot /dev/sdb [制作TF的Uboot启动盘]
-->>5:TF卡插入开发板启动 [我们发现进入uboot模式 --> TF的Uboot启动盘制作成功] 

[20]>>提问:虚拟机的共享文件夹?
-->>虚拟机的共享目录权限不足,有很多操作不能进行,所以该共享文件夹适合作为window与Linux的中转站

[21]>>提问:如何编译出uboot镜像?
-->>uboot源码拷贝到虚拟机解压
-->>./build_uboot.sh SCP_1GDDR

[22]>>提问:如何编译出kernel镜像?
-->>内核源码拷贝到虚拟机解压
-->>cp config_for_android_scp_elite  .config  [替换源码默认的配置文件,该配置文件由make menuconfig会生成]
-->>make zImage

==========================================================================================================================
[23]>>提问:如何制作文件系统镜像?
[利用busybox制作根文件系统]
[准备busybox]
-->>1:下载busybox [在busybox根目录下使用make menuconfig打开界面]
-->>2: 设置编译工具前缀 == arm-none-linux-gnueabi-  [采用虚拟机的arm-none-linux-gnueabi-gcc工具编译文件系统,在放在arm环境运行]
Busybox Settings  ---> 
	    Build Options  --->   
	    	  (arm-none-linux-gnueabi-gcc) Cross Compiler prefix    
-->>3: 设置编译后文件系统源码存放路径 == /home/yqj/system [busybox根据配置,制作Linux根文件系统源码,存放在该路径中]
Busybox Settings  ---> 
			(/home/yqj/system) BusyBox installation prefix
-->>4:make  [arm-none-linux-gnueabi-gcc编译busybox工具]  
	[由于busybox是开源的下载后都是代码,需要自己编译一下busybox,才能工作]
	[注意编译时如果报错编译器库文件缺少,这是编译器版本太低,解决办法:安装低版本busybox,或者高版本编译工具]
	[注意:我的编译器是arm-2009q3,busybox 是1.22.1版本]
	[注意:只要没有ERROR就是编译成功]

[制作根文件系统]
-->>5:make install [该指令将自动根据busybox的配置,制作Linux根文件系统源码,存放在我们设置的存放路径中]
[   [busybox只帮我们制作了bin  linuxrc  sbin  usr文件夹,需要自己完善]
	topeet@ubuntu:/home/yqj/system$ ls
	bin  linuxrc  sbin  usr
]
-->>6:完善根文件系统 [完善Linux系统的需要的文件:链接:https://pan.baidu.com/s/18DpeRzs99fiFkvgzNYEXdA 提取码:0000]
[
	 [init.d目录包含许多系统各种服务的启动和停止脚本]
	 -->进入system目录
		 创建文件夹mkdir dev etc lib mnt proc sys tmp var
		-->进入新创建的etc目录
			 创建文件夹mkdir init.d rc.d 
			 -->进入新创建的rc.d文件夹
				  创建文件夹mkdir init.d       
	-->进到system目录,进入var目录
	  	 新建目录mkdir lib lock log run tmp
	-->进到system目录, 进入创建的etc目录
	     将eth0-setting passwd profile三个文件拷贝进去,将文件的权限改为755 = 111 101 101
	-->进入etc目录下的init.d目录
		将ifconfig-eth0和rcS两个文件拷贝进去,将文件的权限改为755  [rcS常常用在自己制作系统的过程中]
	-->进入 etc/rc.d/init.d目录
		将netd文件拷贝进去,将文件的权限改为755
	-->返回到system目录下,进入lib文件夹下
		将编译busybox的编译器的库文件拷贝进去 [/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/* ]
]
-->>7:将制作完成的根文件系统打包为镜像  
[打包工具make_ext4fs是用于制作ext4文件系统的镜像]
[打开工具链接:链接:https://pan.baidu.com/s/1SxsHuFlwB98ndwyjg16EmQ 提取码:0000]
make_ext4fs -s -l 314572800 -a root -L linux system.img system 
[注意:make_ext4fs制作文件系统的命令在文件系统源码上一次目录执行,打包出来的system.img在该命令所在目录]

-->>8:将system.img通过sd卡烧录的方式烧写入开发板即可进入我们制作的文件系统
		sdfuse flashall
==========================================================================================================================


[24]>>提问:QTE
-->>QT/E(Qt Embedded=qt嵌入式)是Qt的嵌入式版本		

[25]>>提问:如何安装交叉编译工具?
-->>将交叉编译包解压到虚拟机 
-->>export PATH=$PATH:/home/topeet/arm-2009q3/bin  [根据自己情况写在.bashrc文件最后]
[编译器的lib动态库库文件位于:~/arm-2009q3/arm-none-linux-gnueabi/libc/lib$]
topeet@ubuntu:~/arm-2009q3/arm-none-linux-gnueabi/libc/lib$ ls
ld-2.10.1.so               libBrokenLocale.so.1  libcrypt.so.1    libgcc_s.so.1     libnsl.so.1              libnss_files-2.10.1.so   libnss_nisplus-2.10.1.so  libpthread.so.0      libSegFault.so
ld-linux.so.3              libc-2.10.1.so        libc.so.6        libm-2.10.1.so    libnss_compat-2.10.1.so  libnss_files.so.2        libnss_nisplus.so.2       libresolv-2.10.1.so  libthread_db-1.0.so
libanl-2.10.1.so           libcidn-2.10.1.so     libdl-2.10.1.so  libmemusage.so    libnss_compat.so.2       libnss_hesiod-2.10.1.so  libnss_nis.so.2           libresolv.so.2       libthread_db.so.1
libanl.so.1                libcidn.so.1          libdl.so.2       libm.so.6         libnss_dns-2.10.1.so     libnss_hesiod.so.2       libpcprofile.so           librt-2.10.1.so      libutil-2.10.1.so
libBrokenLocale-2.10.1.so  libcrypt-2.10.1.so    libgcc_s.so      libnsl-2.10.1.so  libnss_dns.so.2          libnss_nis-2.10.1.so     libpthread-2.10.1.so      librt.so.1           libutil.so.1


[26]>>提问:如何将虚拟机的text1文件拷贝到U盘/TF卡,再将U盘/TF卡挂载到开发板下?
-->>cp text.c /media/disk/  [虚拟机] [df命令] 
-->>mount /dev/sda1 /mnt/disk/  [开发板] [挂载设备都在/dev目录下] [挂载的文件系统都在/mnt目录]

[27]>>提问:为什么要使用静态编译?
-->>gcc -static [静态编译:避免目标环境没有动态库,动态库在制作根文件系统时,将编译器的库文件存放在文件系统的/lib下 ;/lib专门存放动态库文件] 

=====================================================================================================================
[28]:>>提问:如何将虚拟机,开发板,PC三者构成局域网?
-->>注意事项:网线一根
-->>查看开发板网卡的网段 [etc/eth0-setting]
IP=192.168.1.230      [开发板IP不修改]
Mask=255.255.255.0

-->>设置网线连接的网卡的网段   [网线所连接的网卡 == Realtek PCIe GBE Family Controller]
IP=192.168.1.2
Mask=255.255.255.0
	
-->>设置虚拟机网段  [选择桥接模式 --> 选择Realtek PCIe GBE Family Controller网卡 --> 保证虚拟机与PC共同同一网卡]
IP=192.168.1.3
Mask=255.255.255.0
	
-->>三者测试:
虚拟机端测试
topeet@ubuntu:~$ ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_req=1 ttl=64 time=0.357 ms
64 bytes from 192.168.1.2: icmp_req=2 ttl=64 time=0.199 ms
topeet@ubuntu:~$ ping 192.168.1.3
PING 192.168.1.3 (192.168.1.3) 56(84) bytes of data.
64 bytes from 192.168.1.3: icmp_req=1 ttl=64 time=0.051 ms
64 bytes from 192.168.1.3: icmp_req=2 ttl=64 time=0.017 ms
	
PC机端测试
C:\Users\28898>ping 192.168.1.1
正在 Ping 192.168.1.1 具有 32 字节的数据:
来自 192.168.1.1 的回复: 字节=32 时间=3ms TTL=64
来自 192.168.1.1 的回复: 字节=32 时间=1ms TTL=64
C:\Users\28898>ping 192.168.1.3
正在 Ping 192.168.1.3 具有 32 字节的数据:
来自 192.168.1.3 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.1.3 的回复: 字节=32 时间<1ms TTL=64

开发板测试
[root@iTOP-4412]# ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2): 56 data bytes
64 bytes from 192.168.1.2: seq=0 ttl=64 time=1.667 ms
64 bytes from 192.168.1.2: seq=1 ttl=64 time=1.551 ms
[root@iTOP-4412]# ping 192.168.1.3
PING 192.168.1.3 (192.168.1.3): 56 data bytes
64 bytes from 192.168.1.3: seq=0 ttl=64 time=2.756 ms
64 bytes from 192.168.1.3: seq=1 ttl=64 time=2.285 ms
//有时候ping不通是防火墙拦截了数据包的问题
=====================================================================================================================

=====================================================================================================================
[29]>>提问:Linux端TFTP安装?
-->>TFTP (Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中用来在客户机与服务器之间进行简单文件传输的协议,
提供不复杂、开销不大的文件传输服务。
-->>1:sudo apt-get install xinetd  [xinetd守护进程服务程序,管理轻量级Internet服务]
-->>2:sudo apt-get install tftp tftpd  [tftpd是服务搭建软件,tftp是服务]
-->>3:sudo vim /etc/xinetd.d/tftp    [编写xinetd与tftp之间的配置文件]
service tftp
{
		socket_type = dgram
		protocol = udp            
		wait = yes
		user = root
		server = /usr/sbin/in.tftpd
		server_args = -s -s /home/yqj/tftpshare/   //这个是tftp共享的目录
		disable = no
		per_source = 11
		cps = 100 2
		flags = IPv4
}
-->4:验证:sudo /etc/init.d/xinetd restart [重启xinetd服务] 
方式1:tftp 192.168.92.129
>get 1.c
方式2:tftp 192.168.1.3 -g -r 1.c [-l = 本地 ; -r = remote远程 ; -g = 获取 ; -p :发送]
=====================================================================================================================


=====================================================================================================================
30>>提问:Linux端NFS安装?
	-->>NFS  = network file system [UNIX表示层协议,能使使用者访问网络上别处的文件就像在使用自己的计算机一样。]
	-->>1:apt-get install nfs-kernel-server  [安装NFS服务]
	-->>2:vim /etc/exports
	-->>3:/home/yqj/nfsshare *(rw,sync,no_root_squash)
	[
		/home/yqj/nfsshare    :是NFS共享的目录,该目录下应该存放system根文件系统源码,因为要启动该文件系统
		[注意nfs这个目录中不能有中文,因为后面开发板内核配置需要用到该路径,中文识别不了]
		*:代表允许所有的网络段访问;
		rw:是可读写权限;
		sync:是资料同步写入内存和硬盘;
		no_root_squash:是同步目录使用者的权限,如果客户端使用的是 root 用户,那么该共享目录就具有 root 权限;
	]
	-->>4:sudo /etc/init.d/portmap restart                [重启端口映射]
	-->>5:sudo /etc/init.d/nfs-kernel-server restart  [重启NFS服务]
	-->>测试:sudo mount localhost:/home/topeet/桌面/nfsshare /mnt/  
	[测试挂载NFS共享目录,注意localhost:/home/topeet/桌面/nfsshare自动转化为块设备]
	=====================================================================================================================
=====================================================================================================================
31>>提问:打开开发板内核的NFS功能?
-->>1:cp config_for_linux_scp_elite .config   [在内核源码目录.覆盖掉内核默认的.config]
-->>2:make menuconfig  [如果提示缺少图形库函数  -->  sudo apt-get install libncurses*   ]
-->>3:把NFS客户端所有选项全部选上
  		Networking support  --->    
 		     Networking options  --->       
 		     	  [*]   IP: kernel level autoconfiguration 
 		
 		File systems  ---> 
 				 Network File Systems  --->  
 				 [*]   NFS client support  
				 [*]   NFS client support for NFS version 3   
				 [*]   NFS client support for the NFSv3 ACL protocol extension
				 [*]   NFS client support for NFS version 4     
				 [*]   NFS client support for NFSv4.1 (EXPERIMENTAL)          
				 [*]   Root file system on NFS   
		default kernel command -->
				root=/dev/nfs rw nfsroot=192.168.1.3:/home/yqj/nfsshare/system ip=192.168.1.1:192.168.1.3:192.168.1.1:255.255.255.0:iTOP:eth0:on rootfstype=ext4 init=/linuxrc console=ttySAC2,115200
				[
					root=/dev/nfs [内核从nfs启动]
					nfsroot=192.168.1.3:/home/yqj/nfsshare/system  [nfs服务器的文件系统地址]
					 ip=192.168.1.1:192.168.1.3:192.168.1.1:255.255.255.0  [开发板地址:服务器地址:网关地址:地址掩码]
					 iTOP  [开发主机名字,随便写]
					 eth0   [网卡名称]
				]
	-->>4:make zImage  [编译内核]
	-->>5:mount -t nfs -o nolock 192.168.1.3:/home/yqj/nfsshare /mnt/nfsshare
	-->>注意:
	[
	1.内核烧录到开发板后出现停止打印信息,应该将/home/topeet/minilinux/system/etc/init.d/rcS中的/etc/init.d/ifconfig-eth0注释掉
	2.内核烧录进入后出现不断重启 --> 找不到nfs服务器的根文件文件系统 --> nfsroot=192.168.1.3:/home/yqj/nfsshare/system
	]
	
	-->>NFS服务器与客户端的启动流程如下
	[
		客户端:NFS网络文件系统 --> 运行内核 --> 网络 --> 虚拟机上的NFS服务器 --> 运行NFS服务器中的文件系统 --> 共享目录
		客户端:内核启动 --> 启动根文件系统 --> 网络 --> 与虚拟机的NFS服务器通信 --> 找到共享目录 
	]
=====================================================================================================================
32>>提问:应用层延时?
-->>sleep,usleep

33>>提问:内核源码中延时?
-->ndelay,mdelay,udelay

=====================================================================================================================
34>>提问:获得unix时间,获得us级unix时间,获得GMT时间,获得字符时间?
-->>unix时间 == 1970至今秒数  ---->>time_t time(time_t *t); / int gettimeofday(struct timeval *tv, struct timezone *tz);
-->>Greenwich Mean Time==GMT格林威治时间==年月日时分秒 [北京时间=GMT时间+8小时] --->> struct tm *gmtime(const time_t *timep);
-->>字符时间 == 字符串类型的GMT时间 --> char *ctime(const time_t *timep);
-->>代码实现:
[
	#include<stdio.h>
	#include<stdlib.h>
	#include<time.h>
	#include <sys/time.h>
	
	void main()
	{
	        struct timeval tv; 
	        time_t t;
	        struct tm *tm;
	        time(&t);  //获得s级unix时间
	        printf("\nunix时间>>目前距离1970 == %lds",t);
	
	        gettimeofday(&tv,NULL);  //获得us级unix时间
	        printf("\nunix时间>>目前距离1970 == %lds + %ldus",tv.tv_sec,tv.tv_usec);
			
	        tm = gmtime(&t);    //获得GMT时间
	        printf("\n GTM 时间:");
	        printf("\n tm_sec = %d",tm->tm_sec);
	        printf("\n tm_min = %d",tm->tm_min);
	        printf("\n tm_hour = %d",tm->tm_hour);

	        printf("\n字符时间:%s",ctime(&t));  //获得字符时间
	}
	-->>结果:
	topeet@ubuntu:~/桌面$ ./a.out 
	unix时间>>目前距离1970 == 1606976505s
	unix时间>>目前距离1970 == 1606976505s + 162263us
	 GTM 时间:
	 tm_sec = 45
	 tm_min = 21
	 tm_hour = 6
	字符时间:Wed Dec  2 22:21:45 2020
]
=====================================================================================================================
35>>提问:man手册?
	-->>man手册分为八页,我们最常用前3页
	[
		第一页存放Linux命令:man 1 cd
		第二页存放内核提供的系统调用:man 2 fork
		第三页存放C库函数:man 3 printf
	]


36>>shell命令的代码实现?
	-->>ls -l <--> int stat(const char *path, struct stat *buf);  [将PATH路径文件信息保存在stat结构体]
	-->>chmod <--> int chmod(const char *path, mode_t mode); /  int fchmod(int fd, mode_t mode);
	-->>pwd <--> char *getcwd(char *buf, size_t size);
	-->>mkdir <--> int mkdir(const char *pathname, mode_t mode);
	-->>rm <-->  int rmdir(const char *pathname);
	-->>cd <-->  int chdir(const char *path);
	-->>打开目录 <--> DIR *opendir(const char *name);
	-->>关闭目录 <--> int closedir(DIR *dirp);
	-->>mv <--> int rename(const char *oldpath, const char *newpath);
	-->>ln <--> int link(const char *oldpath, const char *newpath);
	-->>ln -s <--> int symlink(const char *oldpath, const char *newpath);
	-->>unlink <--> int unlink(const char *pathname);

37>>提问:软连接[符号连接],硬链接?
	-->>所有文件都有索引号inode存储文件属性与block存储文件数据;链接就是将两个文件链接在一起,硬链接是什么呢
	-->>硬链接就是一个文件的多个文件名。这些文件名可以在不同目录但是都是同一个文件,他们的inode信息都是相同的,
	类似于黑客帝国的克隆人,他们之间完全是一模一样的你就是我,我就是你;使用ln可以创建硬链接;
	-->>软连接类似于孙悟空吹猴毛,虽然有很多分身也长得一样但是分身死了,原本的没有影响;也就是window的快捷连接,两者的inode是不一样的;
	
	-->>ln  text.c text    [硬连接]
	-->>ln -s  text.c text [软连接]
	-->>unlink  text [断开硬链接/软连接]

38>>提问:进程号?
	-->>每个进程有个唯一编号,除了init进程,其他所有进程被分为子进程与父进程,
	每个程序都有一个pid也就是自己的进程号,也必须有个ppid父进程号
	-->>获取子进程号 getpid(void);
	-->>获得父进程号 getppid(void);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值