1. 嵌入式
1.1 嵌入式定义:
- 以应用为中心,核心是应用
- 软硬件可裁剪
- 体积功能有要求
- 专用计算机系统
1.2 嵌入式特点:
- 自由软件
- 极强的平台可伸缩性
- 强大的网络功能
2. Linux系统一些常见用法总结:
2.1 Linux用户使用常见命令
- 分成普通用户和超级用户登录,其中,
root
是超级用户登录,用#结尾;普通用户则是¥结尾. alt+crtl+f1~f6
是字符型界面,alt+ctrl+f7
是图形化界面useradd zhangkai
这个命令是增加用户名。passwd zhangkai
这个修改用户名的密码。su - zhangkai
这个是切换用户名的命令,注意,只有
root
命令才以#结尾,其余的都是以¥结尾的。另外在从一般用户切换大root用户的时候,需要输入root用户的密码。
su – root
是切换到root用户,并且使用root用户的环境变量
su root
是切换到root用户,但使用的是当前用户的环境变量- (1)共同点:都是root用户的权限;
- (2)不同点:su仅仅取得root权限,工作环境不变,还是在切换之前用户的工作环境;sudo是完全取得root的权限和root的工作环境。
软件安装: rpm [选项][安装文件]
eg:
1rpm -ivh tftp.rpm
安装名字为tftp文件
2.rpm -qa
列车所有已经安装的rpm包
3.rpm -e name
卸载名字为name的rpm包挂载:
(1)mount 格式:mount[选项]设备源 目标目录
例子:mount/dev/cdrom/mnt
将光驱挂载到/mnt目录下面
(2)umount
例子:取消光驱在/mnt下的挂载date
可以显示日期cal
可以显示日历bc
可以使用计算器的功能,比如说+ - * /Tab 键:
(1) Tab键接在一串指令的第一个字的后面时候,则代表命令补全。比如说按下ca+[tab][tab]
则会出现所有的以ca为开头的代码
(2) Tab键接在一串指令的第二个字以后,则为档案补齐。crtl + c
这个组合键是用于正在运作当中的指令中断的,如果你正在运作比较重要的指令时,不要着急使用这个键ctrl + d
这个键时是退出当前,相当于是quit功效
2.2 文件操作常见命令
相对路径和绝对路径:
1. 绝对路径:路径的写法[一定是由根目录/写起],例如:/user/share/doc
2. 相对路径:不是由/写起的,例如从/user/share/dco 要到/user/share/man时候,可以写成cd ../man相对路径指的是相对于当前工作目录的路径
输入输出存在缓冲和非缓冲之分,
文件的二种属性:文本视图以及二进制视图 。
在二进制视图当中,文件每个字节可以依程序来访问。在文本视图当中,程序看到的内容和文件有可能不同。这个要依赖环境。但是在LINUX当中只有一种模式。二者相同的。IO级别:
低级的IO级别,使用操作系统提供基本的IO服务; 高级的IO级别,使用标准的C库和stdio.h头文件的定义。由于操作系统的平台不同,为了实现可移植性,一般使用高级IO服务。标准文件,三个文件,标准输入,标准输出,标准错误输出,默认输入设备是键盘,输出设备是屏幕。可以使用重定向对文件进行不同平台的输出输入。
文件结尾:
1.第一种方法是在文件放置一个特殊字符来标志结尾;第二种方法是让操作系统存储文件大小的信息,通常可以使用EOF来进行定义。
while((ch = putchar())!=EOF) 一般EOF=-1
系统调用-创建
int creat(const char*filename,mode_t mode)
filename:要创建的文件名(包含路径,缺省为当前路径)mode:创建模式
常见的创建模式存在:S_IRUSE(4) S_IWUSER(2) S_IXUSR(1) S_IRWXU(7)
mv/home/test/home/test1
将/home目录下的test文件更改成test1.rm
命令:
(1)rm/home/test
删除/home目录下的test文件
(2)rm -r/home/dir
删除 /home目录下的dir目录
注意:rm文件在删除一个文件时候会询问你是不是要删除文件,如果是的话那么按下y键就可以。如果不删除的话那么就会选择n,
如果不想出现询问是否删除的选项的话的,那么在前面加上一个-f就可以啦。使用touch命令好像可以对文件恢复。
如果直接想把一个目录删除的话,而且不想询问是否确定的话的那么可以使用 -rf命令就可以啦- mkdir 创建一个目录
(1)mkdir/home/test
在home目录下面创建一个test目录
(2)mddir -p/home/dir1/dir2
创建一个目录,如果dir1不存在,则先创建dir1 cd :cd /home进入home文件下面。 cd ./进入当前目录 ; cd ../进入上一级目录
pwd可以查找当前的绝对路径。ls命令 ;
ls /home
查看文件;ls -l
;查看更加详细的文件;ls -a
查看隐藏文件;ls -c
显示当前目录下面,按照修改时间进行排序
touch config
建立一个文件;touch .config
建立一个隐藏文件啦这个可以使用ls -a来进行查看- tar命令:注意打包和解压是二个概念,打包只是单纯的放在一起,里面的内容不发生任何变化,压缩的话的里面 的内容发生了变化。
打包(1)tar cvf dir1.tar dir1/
这个是把当前目录下面的dir1目录‘打包’成为dir1.tar文件,注意tar之后没有/
打包: (2)tar xvf dir1.tar
将当前的tar文件解开
压缩:tar cvfz dir1.tar.gz dir1/
将当前目录下面的dir1压缩成为一个dir1.tar.gz文件;
压缩:tar xvfz dir.tar.gz
将dir1.tar.gz文件解压成为一个dir1文件 unzip
这个是unzip 解压缩zip文件的- 查找文件:
find 路径 -name ‘文件名’
(1)find ./ -name 'co'
在当前目录以及子目录下面寻找co文件
(2)find ./
(注意中间存在一个空格,否则系统找不到)-name ‘co*’ 在当前目录下面查找以co为开头的文件名 - 查找字符串:
grep [选项]字符串
1.grep “file” ./ -rn 在当前目录及其子目录下面。查找包含file字符串的文件,其中file是文件名字,./表示的是当前文件夹, -r表示子目录下面,n表示显示出来行号 - 注意root文件夹和root文件不是一个概念,所以要注意区别。cp语法:这个要注意使用
(1)cp/home/test/tmp
将/home目录下的test文件copy到/tmp目录下面
(2)cp -r/home/dir1/tmp/
将/home目录下的dir1目录copy到/tmp目录下cp
2.3 访问权限的问题:
每一个文件或者目录的访问的权限都有三组,每组有三位表示,分别是为文件所有者,与所有者同组的,系统中其他用户的读。写。执行权限;
例如:-rw-r–r– 第一个字符指定了文件的类型,这里表示了-表示是普通文件,如果是d则表示是目录;后面三个一组分别表示属性关系
R代表了只读,W表示写,x表示可执行操作,横线表示无该项权限。
(1)改变访问的权限问题:chmod[who][+|-|=][mode]文件名
(2)改变文件的权限可以使用数字来进行改变,4:代表可读,2代表可写,1代表可执行;数字可以进行相加的;比如说7代表的是可读可写可执行的;
eg chmod 761 hell0.c
13. 查看磁盘使用的情况:
df -k
以KB为单位显示磁盘的使用情况
6 du 查看目录的大小:
例如:du -b ipc
以字节为单位显示IPC这个目录的大小
2.4 网络配置以及进程常见命令
- 网络配置情况:
ifconfig eth0 192.168.0.1
配置以太网ip地址为这么多;
ifconfig eth0 down
暂停这一网关的运行
ifconfig eth0 up
恢复这一网关的运行 - 查看网络的状态:
netstat -a
查看系统当中所有的网络监听端口
3.netstat -a|grep tffp
查看所以端口用于tffp 端口 top
查看系统当中进程对CPU。内存灯占有情况ps aux
查看系统当中的所有进程kill[选项] 进程号
eg: kill [选项]进程号 kill -s sigkill 4096 杀死4096进程man ping
查找ping 这个命令,注意使用键盘上面的q键可以恢复原状
2.5 文本编辑:
vi 是linux第一个全屏幕的编辑器。存在三种工作模式:命令行模式,插入模式,底行模式
- 第一种模式:命令行模式:开始进入的就是命令行的模式,只可以进行浏览,但是可以整行删除,但是不可以编辑文字
- 第二种:插入模式,在此种模式下面,用户可以进行文字的编辑,按下ESEC进入命令行模式,在命令行模式下面按下键盘上面的i键可以进入此模式
- 第三种:底行模式,用户可以进行文件的保存或者退出操作,也可以设置编辑的环境,寻找字符串列出行号
例如先进入vi hello.c
开始默认的是命令行模式,不可以编辑,那么现在按下键盘的i键进入插入模式,进行编辑,当写好程序之后,按下键盘上面的:则进入底行模式,然后按下wq 保存并退出完成程序的编写。
2.5.1 文本编辑模式常见快捷键:
yy:复制当前光标所在的行;
[n]yy:复制当前光标所在的n行
dd:删除当前光标所在的行
[n]dd:删除当前光标所在的n行
p:粘贴复制到当前行
/name 查找光标之后的名为name的字符串,如果还想要查找其他的同名的话可以使用n键
G:光标移动到文件尾(注意是大写哦 shift + g 就变成了大写)
u: 撤销前面一个动作,注意是小写;
2.5.2 底行模式常见快捷键:
:w 保存
:q 退出vi系统会提示保存修改
:q!强行退出,对修改不做保存
:wq 保存并退出
:w[filename] 另存为filename文件
:set nu; 显示行号
:set nonu 取消行号
2.6 TFTP服务器
2.6.1. 宿主机和目标机
宿主机:是执行编译 链接嵌入式软件的计算机,一般是PC; 目标机是运行嵌入式软件的硬件平台;
比如说开发一个软件的话,宿主机就是PC上面开发的软件,目标机就是手机客户端的软件,不可能在手机上面进行软件的开发TFTP服务器:作为工作于宿主机上的软件,主要提供对目标机的主要映像文件的下载,起到一个媒介的作用。
2.6.2. NFS 网络文件系统(Network File System)
是一种将远程主机的分区金网络挂载到本地的一种机制,类似于windows共享目录
vi /etc/exports
加入允许被其他计算机访问的目录和访问权限
eg :
/home 192.168.1.*(rw,sync,no_root_squash)
/home 允许其他计算机访问的目录
192.168.1.*被允许访问该目录下的客户端的IP地址
rw :可读可写
sync: 同步写入磁盘,资料会暂时存入内存当中,而非直接写入磁盘
no_root_squash:表示客户端丢root用户对该目录具备写权限
- 启动nfs服务器:
/etc/init.d/nfs start
- 重新启动nfs服务器:
/etc/init/nfs restart
- 使用 mount命令来挂载nfs服务器上的共享目录。
mount -t nfs servername:/shared_dir /localdir
例如:# mount -t nfs 10.168.1.100:/home /mnt/nfs
2.6.3 Samba 这个可以用于linux 和windows之间进行交互通信
(1)修改/etc/samba/smb.conf
2.7 磁盘分割技术
windows 使用的是fat 表,linux使用的是ext2,二者是完全不同的,所以是不可以混用的。
磁盘分割的四个主要步骤:
1.将旧的分割表删除
2.建立新的主分割及扩展分割
3.存储分割表
4.以DOS工具格式化以分割的硬盘
2.8 帮助命令
使用man指令的时候
page down
可以向下翻一页page up
向上翻一页home
去到第一页end
去到最后一页/string
向下搜寻string这个字符串?string
向上搜寻这个字符串n , N
当搜到一个时候,继续搜索下面一个了q
退出本次man 查询
一般不太记得一个指令的全部,可以先输入几个按下[tab][tab]然后进行man查询info
这个指令同样可以进行指令的查询的
2.9 介绍一下linux开关机一些注意事项:
shutdown now这个命令是关机命令。
注意linux下面通过拔掉电源直接关机是十分危险的,应该使用shutdown命令,这样才可以防止对磁盘的文件不进行破坏。
在系统关机前使用shutdown命令,系统的管理员通知所以的用户系统将要关闭,并且login指令将要被冻结,新的用户不可以在登陆。
- 观察系统的使用状态,可以使用who这个指令,查看目前谁在线; 使用netstat -a 可以观察网络的联机状态; ps -aux了解主机当前的使用状态
- sync进行数据的更新操作,那么内存当中尚未被更新的数据,就会被写入硬盘当中,这个指令只有 root用户可以执行,多写入几次sync指令比较放心
- 开关机操作:
/sbin/shutdown [-t 秒] [-arkhncfF] [时间][警告信息]
例如:/sbin/shutdown -h 10'I will shutdown after 10 mins'
开机指令:reboot
例如:sync;sync;sync;reboot
2.10 linux档案属性
-rwxrwxrwx 1 root root 293 0ct 10 : 21 : 24 test
档案属性 连接数 档案拥有者 档案所属群组 档案最后被修改的时间 档名
关于档案属性:
d:则是目录
-:则是档案
l:表示连接档
b:表示装置文件里面可供存储的接口设备
c: 表示装置文件里面的串口端口设备,例如键盘,鼠标
2.11 sheel脚本
命令解析器:将用户的指令转换为相应的机器可以运行的程序
sheel script 包含一些列命令序列的文本文件
2.11.1 硬件、核心、使用者关系
基本上,替我们工作的是硬件,而控制硬件的核心,我们使用者乃是利用sheel 控制kernel提供的工具来操控硬件来替我们正确的工作。
在sheel script 格式:
!/bin/sh
1.符号#!来指定该脚本文件的解析程序,另外要注意的是在使用该软件的时候要注意的是该脚本必须可执行的属性;可以使用chmod 777
或者chmod +x
2.使用注释的时候,是用了#进行程序的注释。
下面是一段程序的例子
#!/bin/sh
#set variable a 这个是程序的注释
a="hello" 这里要注意的是,在等号的左右不可以存在空格,否则程序不认识。
#print a 这个也是注释
echo "a is"
echo $a 加一个$输出出来
2.12 变量使用
2.12. 1 默认变量:
$#:
传入脚本的命令行参数的个数
$*
所有的命令行参数值在各个参数值之间留有空格
$0
:命令本身(shell文件名)
$1
:第一个命令行参数
$2
:第二个命令行参数
对变量的注意:
- 变量和变量的内容用=连接,注意=号二边是不可以直接接空格符的
- 变量名称只能是英文字母或者数字,但是不可以以数字开头的
- 另外使用unset可以取消变量的内容
- 单引号和双引号的区别,单引号仅能是一般字符,而不会存在特殊符号,而双引号可以保留变量的内容,这一点要特别注意的
env
和set
这二个命令都可以列出当前所有的变量了。
2.12.2 几个比较重要的提示符
- PS1字符的设定,他有一些参数,比如说:
\d
代表日期;
\H
完整的主机名称,
\h
仅去主机名称的第一个名字;
\t
显示时间,24小时;
\T
显示时间,12小时
\u
目前使用者的账号名称
\W
列出最后一个目录名
\$
,提示字符,如果是root提示字符是#,否则是$
例子:
如果预设的PS1内容是’[\u@\h \W]\$’ 那么提示字符就是[root@linux ~]#
2.12.3 export命令
使用export变量可以把自定变量变成环境变量了,可以把变量继续存在于子程序当中了,但是如果不是环境变量的话,自订变量的内容就不会出现在子程序当中了
2.12.4 read用法
read[-pt] varibale
-p后面可以接提示字符
-t后面可以接等待的秒数。
eg:read -p "Please keyin your name:" -t 30 named
2.12.5 declare/typeset
宣告变量的属性
语法:declare [-aixr] variable
-a 将后面的varibale定义成数组
-i 将后面的varibale定义成整数数字
-x 将后面的varible 变成环境变量
-r 将后面的变量变成readonly该变量不可被更改,也不可以unset
2.13 数据流重导向
就是将某个指令执行后应该要出现在屏幕上的数据,给他传输到其他的地方,例如档案或者装置;
- 标准输入:代码为0,使用< 或者<<
- 标准输出,代码为1,使用>或者>>
- 标准错误输出,代码为2,使用2>或 2>>
例子:ls -l / > ~/rootfile
把原本输出到屏幕上面的数据输出到~/rootfile当中
另外要注意一点:
1. 该档案(本例当中~/rootfile)若不存在,系统会自动将他建立起来
2. 但是当这个档案存在的时候,那么系统会将这个档案清空,然后才会将数据写入
3. 也就是说当>输出到一个既定盘案中,那个档案就会被覆盖掉啊
如果不想要数据被覆盖掉而是叠加上去,那么需要使用>>这个了
现在存在一个问题1:如果希望把错误的信息和正确的信息放在二个不同的文件应该怎么办了?也就是说:
1> :将正确的数据输出到指定的地方去
2> :将错误的数据输出到指定的地方去
例子:
find /home -name testing > list_right 2> list_error
问题之2:如果只想要输出正确的信息,错误的信息不想使用了,该怎么办? 可以使用/dev/null这个垃圾桶
find /home -name testing > list_right 2>/dev/null
问题之3:如果想要将正确的错误的信息都写入一个档案当中了?
可以使用:find /home -name testing > list 2>&1
正确写法
< 和 <<
例子:cat > catfile < somefile
先编辑somefile,然后以上面的指令输出到 catfile
2.13.1 那么命令输出重定向的应用场合:
- 当输出的信息很重要的时候,我们需要将他存下来的时候;
- 背执行的程序,不希望他干扰屏幕的正常输出
- 正确和错误分别输出
- 一些命令,我们知道他有可能输出错误信息时候,我们希望将他丢掉
2.14 管道命令:
2.14.1 cut命令
cut -d '分隔字符' -f fields
cut -c 字符区间
-d后面接分隔字符。与-f一起使用
-f: 一段讯息分隔成数段,用-f取出第几段的意思
-c 以字符为单位取出固定的字符区间
2.14.2 grep命令
grep [-acinv] '搜寻字符串'filename
功能:grep可以解析一行文字,取得关键词,若该行存在关键词,就会整行列出来
2.14.3 sort 排序指令
sort [-fbMnrtuk] [file or stdin]
2.14.4 wc命令
可以知道某个档案当中存在多少字,多少行,多少字符的话就可以使用这个了
语法:wc [-lwm] -l 仅=列出行 -w 仅列出多少字 -m :多少字符
2.14.5 tee命令
tee [-a] file 使用时候可以将一部分信息输出到文档当中,也可以将一部分文档输出到屏幕当中
2.14.6 split 分割命令:
split [-bl] file PRWFIX
-b:后面可接分割档案大小,可以加单位,例如b,k,m
-l以行数来进行分割
2.15 正规表示法 Regular Expression ,RE
简要介绍:RE就是处理字符串的方法,他是以行为单位,来进行字符串的处理行为,他透过一些
特殊符号的辅助,可以让使用者轻易达到搜寻、取代某些特定字符串的处理程序
2.15.1 grep 截取字符串
语法: grep [-acinv] '搜寻字符串' filename
-a: 将binary档案以text档案方式搜寻数据
-c: 计算找到‘搜搜寻字符串’的次数
-i”忽略大小写的不同
-n:顺便输出行号
-v :反向选择。
注意一点: * grep 在操作的时候是以行为单位进行操作的*
例子:grep -n 't[ae]st' regular_express.txt
注解:其实[]里面不论存在几个字符,他仅代表着一个字符。所以上面搜索的是函数含有tast 和test这二个字符串
- 另外在RE下面还存在很多指令的,比如说awk.send命令等等,这些暂时先跳过去,等到需要使用它们的时候我们在去使用它
2.15.2 Shell Script 脚本的训练
什么事shell script:就是领用shell 功能所写的一个程序,这个程序是使用纯文本文件,将一些shell语法和指令写在里面搭配RE,pipe和数据重导向等功能,已达到我们需要达到的目的
2.16 条件语句
第一种:
if 语句:
if[expression]
then
#code block
fi
第二种:
if[expression]
then
#code block
else
#code block
fi
第三种:
if[expression]
then
#code block
else if[expression]
then
#code block
else
#code block
fi
fi
比较:整数 字符串
相同: -eq =
不同:-ne !=
大于:-gt >
小于 -lt <
大于或等于-ge
小于或等于-le
为空-z
不为空 -n
例如:
判断整数a和b是否相等 if[ $a = $b ]
注意事项:
1. 在[“和”]符号的左右都留有空
2. “=”左右都有空格
2.17 GCC编译器
GCC处理分为四个过程:预处理,编译,汇编,链接
2.17.1 GCC基本用法:
gcc [opotion] [filenames]
:
options
:编译器所需要的编译选项 filename:要编译的文件名
-o output_filename
确定可执行文件名称为,如果不加入这个选项,那么gcc给出预设的文件a.out
-c
只编译,不连接成为可执行文件,编译器只是输入,o为目标文件
-g
产生调试工具所必须要的信息,若希望对编译出来的程序进行调试,就必须使用这个选项;这个比单纯的-o输出稍微要大一点;
-o
对程序进行编译,链接,产生可执行文件的执行效率就以提高;
-o2
,比-o更好的优化编译,连接,当然整个编译,连接过程会更慢;
-I
这个是把用户自己所写的头文件也包含到gcc搜索路径下面,这样GCC就可以寻找到文件的位置啦
-static
静态链接库文件 例如:gcc -static hello.c -o hello
-WALL
生成所有的警告信息
-w
不生成任何警告信息
-DMACRO
定义MACRO宏,等效程序中使用#define MACRO
2.17.2 静态库vs动态库
库分为静态库和动态库。动态库通常使用.so为后缀,静态用.a为后缀 ;
区别就是使用静态库时候,连接器找出所需要的函数,将它们拷贝到可执行文件当中,一旦连接成功,静态库就不需要了对于动态库来说,他只是在使用的时候才会用到它,动态库节省空间,系统默认是动态库
2.17.3 GDB
是gnu调试工具,三个方面的功能:
1. 启动被调试程序;
2. 让被调试的程序在指定的位置停住
3. 当程序被停住的时候,可以检查程序的状态,如变量的值
例子:
1. 编译生成可执行文件: gcc -g test.c -o test
2. 启动gdb
3. 在main函数出设置断点 break main
4. 运行程序 run
5. 单步运行 next
6. 继续运行 continue
GDB语法基础:
list(l)
查看程序
break(b)
函数名 在某函数入口添加断点
break(b)
行号 在指定行添加断点
break
行号 if条件
info break
查看所有的断点
delete
断点编对指定变量进行监控
print 变量名
对变量进行查看
watch 变量名
对变量进行监控
quit(q)
退出gdb
makefile 这个相当于是个批处理文件,GNU 的make可以使整个软件工程的编译,链接只需要一个命令就可以了完成;
2.17.4 规则:用于说明如何生成一个或多个obj文件,规则如下:
- targets :prerequistes
目标 依赖 命令
eg: main.0:main.c
gcc -c main.c
在makefile中只应该存在一个最终目标,一般是第一个;
注意:make命令默认是当前目录下寻找名字为makefile或者Makefile工程文件,当名字不一样时候,可以使用如下方法指定;
make -f
文件名 - 伪目标 makefile把那些木有任何依赖只有执行动作的目标称为伪目标
eg:
.PHONY: clean
clean:
rm -f hell0 main.o…. - 变量,可以使用变量来节约空间,
系统变量:
代表所有的依赖文件代表所有的依赖文件@ 代表目标
$< 代表第一个依赖文件