《嵌入式Linux应用程序开发详解》

钮鸿煊
2023-12-01

1、分区、挂载
windows下,各盘符就是分区,各分区有自己的目录结构;
linux下,只有一个目录结构,各分区是挂载在特定的一个目录上,将分区和目录对应的过程叫做挂载,而这个挂载在文件树中的位置就是挂载点。

2、SWAP交换分区
在内存硬件资源有限的条件下,linux在硬盘上划出一个区域来当作临时的内存,而windows操作系统把这个区域叫做虚拟内存,linux 把它叫做交换分区swap,在

安装linux建立交换分区时,一般将其设定为内存大小的2倍。
在安装linux的时候,交换分区是必须建立的。

3、文件系统目录结构
/etc/rc.d该目录主要存放linux启动和关闭时要用到的脚本文件,包括/etc/rc.d/init和/etc/xinetd.d目录下的内容
/mnt该目录是软驱、光驱和硬盘的挂载点
/proc该目录是用于放置系统核心与执行程序所需要的一些信息,而这些信息是在内存中由系统产生的,故不占用硬盘空间,主要是进程信息
/sbin该目录是用来存放系统管理员的常用的系统管理程序
/tmp该目录是用来存放不同程序执行时产生的临时文件
/usr/bin和/usr/sbin系统管理员和超级用户
/usr/src内核源代码
/srv该目录存放一些服务启动之后需要提取的数据
/sys在设备模型中,sysfs文件系统用来表示设备的结构.将设备的层次结构形象的反应到用户空间中.用户空间可以修改sysfs中的文件属性来修改设备的属性值,
/var服务日志信息存放在这里

4、挂载命令
mount -a将/etc/fstab文件中的分区全部挂载一遍
mount -l列出当前已经挂载的设备、文件系统名称和挂载点
mount -t vfat /dev/hda1 /mnt/c 将vfat类型的设备/dev/hda1(实际上为一块硬盘)挂载到/mnt/c下面,可以实现linux访问windows
fdisk -l 查看分区列表


5、网络命令
netstat显示网络连接、路由表和网络接口信息
nslookup查询一台机器的IP地址和其对应的域名
finger查询用户的信息
ifconfig查看和配置网络接口的参数

6、查找命令
find和locate,后者自建一个数据库,并通过crontab每天updatedb,也可以手工更新,相对find更快

7、linux启动详解
(1)第一阶段:BIOS引导。开电源、CPU从地址0XFFFFF0开始执行,也就是从Bios开始执行;Bios开机自检,并按BIOS中设置的启动设备进行启动,安装在启动设

备上的引导程序lilo或grub开始引导linux
(2)第二阶段:linux内核引导。linux主要完成磁盘引导、读取机器系数数据、实模式和保护模式切换、加载数据段寄存器以及重置中断描述符表。从

start_kernel函数开始调用一系列初始化函数。
(3)第三阶段:执行init程序,完成系统初始化工作。init程序调用rc.sysinit和rc等程序。
(4)第四阶段:init启动mingetty,打开终端供用户登陆系统,用户登陆成功后就进入了shell。

8、linux启动第三阶段,执行init程序,完成系统初始化工作
(1)确定用户登陆模式
根据/etc/inittab文件,确定用户登陆模式
(2)执行脚本/etc/rc.d/rc.sysinit,包括判断主机名,挂载文件系统,加载内核模块等等
(3)init进程就会读取这个系统运行级别设置,然后运行/etc/rc.d/rc脚本。通过这个脚本,然后进入/etc/rc.d/rcx.d(x为对应的系统运行级别),启动相应的

程序。其中/etc/rc.d/rcx.d/下的文件均为符号链接,最终绝大部分都是都是链接到/etc/rc.d/init.d下面。各个级别的服务,有的以K开头,有的以S开头,分别

表示停止和启动。
总体的脚本程序执行流程:init->inittab->rc.sysinit->rc->rcx.d->init.d


9、linux系统服务
(1)两种服务
linux的系统服务包括两种,第一种是独立运行的系统服务,很常见的服务,常住内存,开机后一直启动着,存放在rcx.d中,K开头表示kill未开启,S开头表示

Start已启动。
第二种时xinetd设定的服务,不常见的服务,xinet能够同时监听多个指定的端口,在接受用户请求时,它能够根据用户请求的端口不同,启动不同的网络服务进程

来处理请求。可以把xinetd看作一个启动服务的管理服务器。具体配置哪个服务,需要在/etc/xinetd.d目录下新建这个服务的文件。
(2)操作服务的命令
service 服务名 start/stop/status/restart
chkconfig --list 可以看到常驻服务和xinetd启动的服务,然后可以进入/etc/xinetd.d进行查看是否一致
chkconfig --level N ntpd on

10、有用的linux命令
lsof -i:138 查看138端口被哪个程序占用了

11、交叉编译工具
可以使用已经编译好的交叉编译工具cross-3.3.2.tar.bz2,也可以自己手动制作,包括target上的bin和lib,包括gcc、g++、glibc都需要编译成符合目标板的

(ARM交叉编译链的制作)


12、GCC编译流程
(1)预处理(将头文件内容包含进来)
gcc -E hello.c -o hello.i
(2)编译(将高级语言转换成汇编语言)
gcc -S hello.i -o hello.s
(3)汇编(将汇编语言转换成二进制目标代码)
gcc -c hello.s -o hello.o
(4)链接(将显示指定的库或者默认库链接生成最终的目标程序)
gcc hello.o -o hello

13、GCC编译选项
-g:在可执行程序中包含标准调试信息
-I dir:在头文件的搜索路径列表中添加dir目录
-L dir:在库文件的搜索路径列表中添加dir目录
-lA:链接名为A的库文件

14、Makefile
(1)功能
管理整个工程,多个文件的编译;
自动编译管理器,指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量;
(2)使用方法
make 目标名;
make(以找到的第一个目标为默认目标);
(3)自动生成makefile工具autotools

12、GCC编译流程
(1)预处理(将头文件内容包含进来)
gcc -E hello.c -o hello.i
(2)编译(将高级语言转换成汇编语言)
gcc -S hello.i -o hello.s
(3)汇编(将汇编语言转换成二进制目标代码)
gcc -c hello.s -o hello.o
(4)链接(将显示指定的库或者默认库链接生成最终的目标程序)
gcc hello.o -o hello

13、GCC编译选项
-g:在可执行程序中包含标准调试信息
-I dir:在头文件的搜索路径列表中添加dir目录
-L dir:在库文件的搜索路径列表中添加dir目录
-lA:链接名为A的库文件

14、Makefile
(1)功能
管理整个工程,多个文件的编译;
自动编译管理器,指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量;
(2)使用方法
make 目标名;
make(以找到的第一个目标为默认目标);
(3)自动生成makefile工具autotools

15、嵌入式体系结构、操作系统
(1)目前嵌入式处理器有1000多种,常见的体系结构有30多种,常见的有ARM,PowerPC,MC68000,MIPS等使用的最为广泛
(2)嵌入式linux操作系统:uCLinux、RT-Linux、Embedix、XLinux、PocketLinux和红旗嵌入式Linux
     vxWorks、QNX、Windows CE、Palm OS


16、JTAG
 JTAG就是一个通信/调试的接口,即便在操作系统损坏了或未安装的情况下,也可以直接访问flash芯片。如果你的flash烧录了不当固件,或中断烧录过程等,导致该设备报销了,可以通过JTAG使你的设备起死回生!还可以通过JTAG来备份现存flash中的内容。这对移植大有裨益。

17、带缓冲和不带缓冲IO操作
 (1)read、write、open和close,为系统调用,符合POSIX规范,是不带缓冲IO操作
 (2)fread、fwrite、fopen和fclose,为库(glibc)函数调用,符合ANSI C规范,带缓冲IO操作
 (3)不带缓冲IO操作,在用户层没有缓存,但对于内核来说,还是进行了缓存,操作流程:数据---内核缓存区---磁盘文件
 (4)带缓存IO操作,在用户层有缓存,操作流程:数据---流缓存区---内核缓存区---磁盘
 (5)两者区别:不带缓存返回的是文件描述符,带缓存返回的是文件指针,是基于流缓存的;带缓存IO操作,亦称为标准IO,因为可以移植,而不带缓存IO操作是不可移植的;
    带缓存IO操作和不带缓存IO操作是调用与被调用的关系,前者调用后者;带缓存IO比不带缓存IO效率要高,因为其减少了系统调用的次数;
 (6)标准IO提供流缓存的目的是尽可能减少使用read和write调用的数量。标准IO提供了3种类型的缓存存储。全缓存:当填满标准IO缓存后才进行实际的IO操作;行缓存:当输入和输出中遇到新行符时,标准IO库执行IO操作;
 不带缓存:标准IO库不对字符进行缓存。
    
18、fcntl函数
fcntl是一个非常通用的函数,功能有待进一步的发掘。
(1) 复制一个现有的描述符(cmd=F_DUPFD).
(2) 获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD).
(3) 获得/设置文件状态标记(cmd=F_GETFL或F_SETFL).可以设定的标志位O_NONBLOCK(将socket由阻塞变为非阻塞)、O_APPEND、O_DIRECT、O_ASYNC
(4) 获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN).
(5) 获得/设置记录锁(cmd=F_GETLK , F_SETLK或F_SETLKW).

19、fork和vfork区别
(1)fork:子进程拷贝父进程的数据段,代码段
    vfork:子进程与父进程共享数据段
(2)fork父子进程的执行次序不确定
    vfork保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec
     或exit 之后父进程才可能被调度运行。
(3)vfork保证子进程先运行,在她调用exec 或exit 之后父进程才可能被调度运行。如果在
   调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
(4)vfork创建新进程的主要目的在于用exec函数执行另外的程序。当子进程需要改变内存中数据时才拷贝父进程,这就是著名的“写操作时拷贝”(copy-on-write)技术。
(5)fork和vfork详细的区别及代码示例见:http://blog.csdn.net/jianchi88/article/details/6985326

20、Linux进程间通信
Linux进程间通信方式由三部分组成:基于System V进程间通信(System V消息队列、System V信号灯、System V共享内存)(贝尔实验室)、Posix进程间通信(Posix消息队列、Posix信号灯、Posix共享内存)和socket(伯克利)


 类似资料: