2019-01-20 13:53:52 qq_43668159 阅读数 638
  • 嵌入式Linux文件与串口编程

    本课程介绍Linux环境下shell编程,普通文件与设备文件的编程方法,串口介绍与应用编程。 学习条件: 1.C语言编程基础 2.嵌入式Linux开发基础

    7263 人正在学习 去看看 沈寒
               

vim作为十六进制编辑器用vim打开二进制文件,切换到command模式,输入 :%!xxd可以把当前打开的文件转化为十六进制编辑模式,编辑完成以后再 :%!xxd -r转换回去保存。
在vim下,首先找开文件,按<esc>键,输入:%!xxd可以把当前buffer中的文件转换成十六进制和ASCII的形式,其中十六进制部分可以编辑,但ASCII部分不会随着编辑同步变动。编辑完成后,按<esc>键,输入:%!xxd-r可以把文件转换回去,然后保存文件。%!xxd中的%是command-linecommand模式下的%,表示地址范围,相当于1,$的作用。另外normalmode下的%表示跳转到匹配的串上,比如光标停留在{上然后按下%,光标会跳转到与之匹配的}上。输入:help:%查看command模式下的%帮助。
如果需要专门的命令行十六进制编辑器,可以试一下hexedit。
图形界面的十六进制编辑器可以使用ghex2。
浏览十六进制文件可以用hexdump -C <file>。
以上工具在centos中都随着光盘一起发布。

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

2016-01-17 20:08:06 zhanghe2775115 阅读数 281
  • 嵌入式Linux文件与串口编程

    本课程介绍Linux环境下shell编程,普通文件与设备文件的编程方法,串口介绍与应用编程。 学习条件: 1.C语言编程基础 2.嵌入式Linux开发基础

    7263 人正在学习 去看看 沈寒

查看一些java的class文件时,经常需要使用16进制查看器,windows下的是winhex,linux下的就是hexdump了.

$ hexdump filename

这样打开的文件以两个字节为一组,其顺序取决于本机字节序.x86构架就是小端格式了

任意一个class文件:

0000000 feca beba 0000 3200 1f00 000a 0008 0715

正常情况下的jvm class 文件的魔数由 cafe babe变成了 feca beba .(class文件采用了大端格式).

这样看起来非常不习惯,也容易出错.

$hexdump -C filename

这样就可以了,并且在控制台右侧还会显示翻译的acsii码

00000000  ca fe ba be 00 00 00 32  00 1f 0a 00 08 00 15 07  |.......2........|
00000010  00 16 0a 00 02 00 15 07  00 17 0a 00 04 00 15 0b  |................|
00000020  00 18 00 19 07 00 1a 07  00 1b 01 00 09 4f 4f 4d  |.............OOM|
00000030  4f 62 6a 65 63 74 01 00  0c 49 6e 6e 65 72 43 6c  |Object...InnerCl|
00000040  61 73 73 65 73 01 00 06  3c 69 6e 69 74 3e 01 00  |asses...<init>..|
00000050  03 28 29 56 01 00 04 43  6f 64 65 01 00 0f 4c 69  |.()V...Code...Li|
00000060  6e 65 4e 75 6d 62 65 72  54 61 62 6c 65 01 00 04  |neNumberTable...|
00000070  6d 61 69 6e 01 00 16 28  5b 4c 6a 61 76 61 2f 6c  |main...([Ljava/l|
00000080  61 6e 67 2f 53 74 72 69  6e 67 3b 29 56 01 00 0d  |ang/String;)V...|
00000090  53 74 61 63 6b 4d 61 70  54 61 62 6c 65 07 00 1c  |StackMapTable...|
000000a0  01 00 0a 53 6f 75 72 63  65 46 69 6c 65 01 00 0c  |...SourceFile...|
000000b0  48 65 61 70 4f 4f 4d 2e  6a 61 76 61 0c 00 0b 00  |HeapOOM.java....|
000000c0  0c 01 00 13 6a 61 76 61  2f 75 74 69 6c 2f 41 72  |....java/util/Ar|
000000d0  72 61 79 4c 69 73 74 01  00 11 48 65 61 70 4f 4f  |rayList...HeapOO|
000000e0  4d 24 4f 4f 4d 4f 62 6a  65 63 74 07 00 1c 0c 00  |M$OOMObject.....|
000000f0  1d 00 1e 01 00 07 48 65  61 70 4f 4f 4d 01 00 10  |......HeapOOM...|
00000100  6a 61 76 61 2f 6c 61 6e  67 2f 4f 62 6a 65 63 74  |java/lang/Object|


2015-12-31 13:28:32 lgh1117 阅读数 4043
  • 嵌入式Linux文件与串口编程

    本课程介绍Linux环境下shell编程,普通文件与设备文件的编程方法,串口介绍与应用编程。 学习条件: 1.C语言编程基础 2.嵌入式Linux开发基础

    7263 人正在学习 去看看 沈寒

vi命令打开需要查看的文件:

$ vi info


在vi的命令状态下,执行如下指令 :

:%!xxd ——将当前文本转换为16进制格式。

:%!od ——将当前文本转换为16进制格式。

:%!xxd -c 12——将当前文本转换为16进制格式,并每行显示12个字节。

:%!xxd -r ——将当前文件转换回文本格式。

2014-05-24 23:51:12 me10zyl 阅读数 675
  • 嵌入式Linux文件与串口编程

    本课程介绍Linux环境下shell编程,普通文件与设备文件的编程方法,串口介绍与应用编程。 学习条件: 1.C语言编程基础 2.嵌入式Linux开发基础

    7263 人正在学习 去看看 沈寒
 为了转换进制方便,记住这个表格

 任意进制转10进制 = 系数 * 进制位数 ^ 权重

2进制→10进制  110 系数 * 进制位数 ^ 权重  110 = 0 * 2 ^ 0 + 1 * 2 ^ 1+ 1 * 2 ^ 2 = 6;
2进制→8进制    110 每三位为一个10进制  110 =  0 * 2 ^ 0 + 1 * 2 ^ 1+ 1 * 2 ^ 2 = 6;  8进制→10进制 系数 * 进制位数 ^ 权重  6=6 * 8 ^ 0 = 6;
2进制→16进制   110 每四位为一个10进制  110 =  0 * 2 ^ 0 + 1 * 2 ^ 1+ 1 * 2 ^ 2 + 0 * 2 ^ 3= 6;  16进制→10进制 系数 * 进制位数 ^ 权重  6=6 * 16 ^ 0 = 6;
---------------------example------------------
二进制  | 八进制 | 十六进制 | 十进制
110110 | 66 | 36 | 54

2 -> 10(2 -> 10) 110110 = 0 * 2 ^ 0 + 0 * 2 ^ 1 + 0 * 2 ^ 2 + 0 * 2 ^ 3 + 0 * 2 ^ 4 + 0 * 2 ^ 5 + 0 * 2 ^ 6 = 0*1 + 1*2 + 1*8 +0*16 + 1* 32 +1*64 = 2 + 4 + 16 + 32 = 54
2 -> 8(2 -> 10 ->8)  110110 =  0 * 2 ^ 0 + 0 * 2 ^ 1 + 0 * 2 ^ 2  |  0 * 2 ^ 0 + 0 * 2 ^ 1 + 0 * 2 ^ 2  = 6 | 6 = 66
2 -> 16 (2 -> 10 ->16) 110110 =  1 * 2 ^ 0 + 1 * 2 ^ 1 + 0 * 2 ^ 2 +0 * 2 ^ 2 |  0 * 2 ^ 0 + 1 * 2 ^ 1 + 1 * 2 ^ 2 +0 * 2 ^ 2  = 3 | 6 = 36
===============================
Linux文件访问权限                                                               
        -         ---            ---             ---           (共10个)
当前用户   当前用户 当前用户组 其他用户
  - | d        rwx           rwx              rwx         
-------------------解释------------------
-文件           r可读        
r可读          r可读
d可读          w可写       
w可写        w可写
                    x可执行    
x可执行     x可执行

------example------------------

- rw- rw- rw-       0 110 110 110 ->  6 6 6 (八进制)       当前用户、用户组、其他用户可访问
d rw- rw- ---       1 110 110 000 ->  1 6 6 0 (八进制)     当前用户、用户组可访问 | 其他用户不可访问
 
所以更改Linux文件访问权限的时候可以使用 chmod(changeMode)来更改
如 chmod 666 zyl.txt      这样的话所有用户的程序都能访问这个程序了 
2019-01-14 23:57:38 m0_37542524 阅读数 206
  • 嵌入式Linux文件与串口编程

    本课程介绍Linux环境下shell编程,普通文件与设备文件的编程方法,串口介绍与应用编程。 学习条件: 1.C语言编程基础 2.嵌入式Linux开发基础

    7263 人正在学习 去看看 沈寒

文章目录

1,根文件系统基本概念

1.1,什么是根文件系统?

  • 根文件系统(root filesystem)是存放运行、维护系统所必须的各种工具软件、库文件、脚本、配置文件和其他特殊文件的地方,也可以安装各种软件包。
  • 整个系统起来之后运行的第一个文件系统
  • 根文件系统下还可以搭建其他的文件系统

1.2,根文件系统主要目录结构

在这里插入图片描述

1.3,程序文件的放置

程序文件目录

/bin: 普通用户和root用户都能执行的基本程序

ping, mknod, mount, tar, grep, gzip, etc

/sbin: root用户能执行的基本程序

int, insmod, route, mkfs, rmmod, ifconfig

/usr/bin: 更多非必须的用户程序

autorun, bibtex, latex, biff, ftp, wc, whereis, whoami

/usr/sbin: 更多非必须的root工具程序

automount, httpd, in.telnetd, in.talkd, sendmail

1.4,定制应用程序

  1. 配置基本的linux命令(嵌入式linux通过busybox制作)
	cat, chmod, chown, cp, chroot, copi, date, dd, df, dmesg, dos2unix, du, echo, env, expr,  find, grep, gunzip, gzip, halt, id, ifconfig, init, insmod等等
  1. 配置用户自己的应用
    桌面管理器等等

1.5,库文件的放置

/lib: 系统和运行基本命令时需要的动态库文件
/usr/lib:所有的其他库
/usr/lib/xxx: 一些工具包的私有库
如:/usr/lib/perl5

2,Linux 设备文件

  1. Linux 系统中所有的对象(包括设备)都是以文件的形式体现的
  2. Linux系统中,所有的设备文件(如:设备节点),通常放到/dev
  3. 嵌入式系统中只需要创建必须的设备节点即可

2.1,举例

2.1.1,字符设备举例

ls –l /dev/“c” 指明该设备节点是字符设备

crw-rw---- 1 root uucp  4,    64 Feb 23 2004 /dev/ttyS0      //4表示主设备号,64表示次设备号
crw--w---- 1 jdoe tty    136, 1   Feb 23 2004 /dev/pts/1
crw-------- 1 root root   13,   32 Feb 23 2004 /dev/input/mouse0
crw-rw-rw 1 root root   1,    3    Feb 23 2004 /dev/null

典型设备

keyboards, mice, parallel port, IrDA, Bluetooth port, consoles, terminals, sound, video...

2.1.2,块设备举例

“b” 指明该设备节点是块设备 (ls -l)

brw-rw--- 1 root disk      3, 1 Feb 23 2004 hda1
brw-rw--- 1 jdoe floppy  2, 0 Feb 23 2004 fd0
brw-rw--- 1 root disk      7, 0 Feb 23 2004 loop0
brw-rw--- 1 root disk      1, 1 Feb 23 2004 ram1
brw------- 1 root root      8, 1 Feb 23 2004 sda1

典型块设备

磁盘, ramdisk,SD,U盘等等

2.2,设备的主设备号次设备号

  1. Linux系统是通过主设备号和次设备号来区分设备的
  2. 主设备号: (major)
    内核用来区分哪类设备
  3. 次设备号: (minor)
    区分某类设备中的哪个设备
  4. 内核中的相关文档 Documentation/devices.txt

2.3,创建设备节点

  1. 设备文件不能在加载驱动程序时自动创建,要通过指令创建
  2. 创建设备文件的一般语法:
    $ mknod /dev/<device> [c|b] <major> <minor>
  3. 例如:
    $ mknod /dev/ttySAC0 c 4 64
    $ mknod /dev/hda1 b 3 1

2.3.1,基本的设备节点

在这里插入图片描述

2.4,Linux系统的引导过程

在这里插入图片描述

3,制作根文件系统

3.1,文件系统制作步骤

  1. 制作根文件系统的内容
    采用Busybox创建基本命令
    创建基本的目录/lib /etc /var /tmp /dev /sys /proc
    添加glibc基本动态库
    创建基本的设备节点
    添加启动配置和脚本程序/etc/inittab /etc/fstab /etc/init.d/rcS
  2. 测试rootfs内容正确性
  3. 制作需要的rootfs类型的格式

3.1.1,BusyBox项目构建系统命令

  1. BusyBox 项目是由Bruce Perens in 在1996创建的
    http://www.busybox.net/
    BusyBox 是在 GNU GPL 许可协议下发行的开源软件
  2. 享有“嵌入式Linux的瑞士军刀”美誉,Erik Andersen先生维护;
  3. Busybox是一个UNIX系统工具集,它将很多普通的UNIX工具集成到一个很小的可执行文件中,为普通用户提供大多数常用的命令;
  4. BusyBox常用于制作linux命令 主要指令包括
    cat, chmod, chown, cp, chroot, copi, date, dd, df, dmesg, dos2unix, du, echo, env, expr, find, grep, gunzip, gzip, halt, id, ifconfig, init, insmod, etc

3.1.2,BusyBox工具安装

linux@linux:~$ cp /mnt/hgfs/Linuxsharexiaomei/busybox-1.22.1.tar.bz2 .
linux@linux:~$ tar -vxf busybox-1.22.1.tar.bz2 
linux@linux:~$ cd busybox-1.22.1/

在这里插入图片描述

3.2,制作根文件系统的内容

$ make menuconfig
    Busybox Settings ---> 
	Build Options --->
		[*] Build BusyBox as a static binary (no shared libs)
		(arm-none-linux-gnueabi-) Cross Compiler prefix   注意 一定要指定交叉编译工具
$ make
$ file busybox   确认编译生成的是 ARM 平台的(显示为ELF 32-bit LSB executable, ARM)

在这里插入图片描述

$ make  install   安装(默认安装路径为_install)

在这里插入图片描述

$ cd _install
$  ls
      bin  linuxrc  sbin  usr
$ mkdir  dev  etc  mnt  proc  var  tmp  sys  root       创建需要的目录

在这里插入图片描述

$ cp  ~/store/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib/  .  -a      注意是lib/ 
$ du -mh lib     查看lib库的大小
$ rm  lib/*.a     裁剪,删除掉静态库文件  
$ arm-none-linux-gnueabi-strip  lib   裁剪掉调试信息   not recognized  有些库是不能strip的 忽略掉
$ sudo rm  lib/libstdc++*   删除不需要的库,确保所有库大小不超过4M  
$ du -mh lib    查看lib库的大小  可能 显示3.4M lib   (这里确保小于 8M) 	

在这里插入图片描述

$ cp /nfs/rootfs/etc   -rf   .      拷入成熟的参考配置 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

$sudo mknod   dev/console  c  5  1      必须要有  console设备节点

在这里插入图片描述

3.2.1,测试

看新的根文件系统能否正常挂载到开发板

linux@linux:~/busybox-1.22.1$ mv /nfs/rootfs /nfs/rootfs.ok      把原有的根文件系统备份一下
linux@linux:~/busybox-1.22.1$ sudo cp -rf _install /nfs/rootfs      把新的根文件系统拷贝过去(改名rootfs)

在这里插入图片描述
挂载成功

3.3,配置文件一

3.3.1,文件 /etc/inittab

#this is run first except when booting in single-user mode.
:: sysinit:/etc/init.d/rcS  指定系统初始化脚本是rcS 也可指定别的名字,但习惯用rcS
# /bin/sh invocations on selected ttys
# start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh    指定初始的控制台(启动后进入# 状态)  
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot

3.3.2,文件 /etc/init.d/rcS(启动脚本)

#!/bin/sh
# This is the first script called by init process
/bin/mount  -a                                 mount all stuff from /etc/fstab  
/etc/init.d/rc.local                           扩展子脚本
echo  /sbin/mdev  >  /proc/sys/kernel/hotplug  设置系统的hotplug程序为mdev
/sbin/mdev  -s                                 
./app.exe   //让脚本自动运行你的程序 

3.4,配置文件二

3.4.1,文件 /etc/fstab

#device     mount-point     type        options        dump     fsck order
 proc          /proc        proc        defaults         0             0
tmpfs         /tmp          tmpfs       defaults         0             0
sysfs          /sys         sysfs       defaults         0             0
tmpfs         /dev          tmpfs       defaults         0             0   

3.4.2,文件 /etc/profile

#!/bin/sh
export HOSTNAME=farsight
export USER=root
export HOME=root
export PS1="[$USER@$HOSTNAME \W]\# "       终端前的提示符
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH  LD_LIBRARY_PATH 

3.5,测试rootfs内容正确性

$ cd /nfs
$ mkdir rootfs
$ cp  _install/*   rootfs   –a                        
$ chmod 777 /nfs/rootfs/		

NFS能挂载成功表示根文件系统 内容基本正确

3.6,制作需要的rootfs类型的格式

在这里插入图片描述

  1. 根文件系统是存储数据的仓库,应用程序和第三方库都在根文件系统中,根文件系统最终要做成镜像,放在设备上面
  2. 不同设备有不同特点,比如有的设备只有内存,有的有flash,有的有硬盘,不同的硬件机械特性不一样
  3. 针对不统计硬件,为了提升其访问效率,就制定了不同的根文件系统
  4. Nand flash存取数据是按块设备访问的(存储空加大,便宜)
    Nor flash存取数据是按字节访问的,BootLoader可以直接在Nor flash上运行(存储空间小,贵)

3.6.1,不同根文件系统详解

3.6.1.1,nfs rootfs

是网络文件文件系统,通过网线远程挂载一个文件系统,文件系统在远程的电脑上。最大的好处是同步,主要用于开发调试

3.6.1.2,CRAMFS

只读,不能写。安全性高,某些区域的数据不能改,就可以定义为CRAMFS。

3.6.1.3,JFFS2和YAFFS2

可读,可写,针对都是flash。JFFS2在小型应用系统用的比较多。JFFS2有一个特点:是一个日志文件系统,用的过程中可以随时掉电。YAFFS2只能针对Nand flash,手机中用的最多的是Nand flash,文件系统就是YAFFS2

3.6.1.4,EXT2 over RAM disk

把一块内存虚拟成为一个磁盘。内存只能按地址空间像一个buffer一样访问,当应用产品内存比较大而flash比较小时,就可以按这种格式把一块内存虚拟成为一个磁盘

3.6.2,制做EXT2 over RAM disk文件系统

3.6.2.1,制作一个大小为8M的镜像

linux@linux:~$ dd if=/dev/zero of=ramdisk  bs=1k  count=8192
  1. if :(input file)输入文件
  2. /dev/zero :是一个虚拟的设备,从这个设备中读到的数据全是0
  3. of :(output file)输出文件
  4. bs=1k count=8192: 单元大小是1k,数量是8k,就是8M大小

在这里插入图片描述

3.6.2.2,格式化这个镜像为EXT2

linux@linux:~$ mkfs.ext2 -F ramdisk

在这里插入图片描述

3.6.2.3,在mount下面创建initrd目录作为挂载点

linux@linux:~$ sudo mkdir /mnt/initrd

3.6.2.4,将这个磁盘镜像文件挂载到/mnt/initrd下

注意这里的ramdisk不能存放在rootfs目录中

linux@linux:~$ sudo mount -t ext2 ramdisk /mnt/initrd

在这里插入图片描述

3.6.2.5,将我们的文件系统复制到ramdisk中

将测试好的文件系统里的内容全部拷贝到/mnt/initrd目录下面

linux@linux:~$ sudo cp /nfs/rootfs/* /mnt/initrd/ -a

在这里插入图片描述

3.6.2.6,卸载initrd

linux@linux:~$ sudo umount /mnt/initrd

在这里插入图片描述

3.6.2.7,压缩ramdisk为ramdisk.gz并拷贝到/tftpboot下

linux@linux:~$ gzip --best -c ramdisk > ramdisk.gz

在这里插入图片描述

3.6.2.8,格式化为uboot识别的格式,并拷贝到/tftpboot下

linux@linux:~$ mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img
linux@linux:~$ cp ramdisk.img /tftpboot/

在这里插入图片描述

3.6.2.9,配置内核支持RAMDISK

制作完ramdisk.img后,需配置内核支持RAMDISK作为启动文件系统

make menuconfig

	File systems  --->   
		<*> Second extended fs support  
	Device Drivers  --->        
		SCSI device support  --->     
          	<*> SCSI disk support     
		[*] Block devices  --->  
			<*>   RAM block device support                                                   
			(16)    Default number of RAM disks                                            
			(8192)  Default RAM disk size (kbytes)  (修改为8M)
	General setup  --->  
		[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support  

重新编译内核,复制到/tftpboot

3.6.2.10,在U-BOOT命令行重新设置启动参数

在这里插入图片描述

3.6.2.11,开发板上电重启,看是否成功

在这里插入图片描述

没有更多推荐了,返回首页