这是一篇关于关于嵌入式Linux操作系统知识点的文章,希望通过此,大家能温故了解Linux和嵌入式的知识点概念。
1. Linux系统组成
用户角度:由内到外,依次是:内核-》系统程序(工具)-》shell-》用户工具;
开发者角度:分两部分,软件与硬件:硬件是基础,软件包括两部分:系统软件和用户软件,其中系统软件包含驱动程序。系统软件主要实现对系统软、硬件资源的管理,用户软件主要根据具体需求实现相应功能。
静态角度:以PC为例的话,包括:BIOS、Grub、内核、根文件系统;以嵌入式系统为例的话,包括:Bootloader、内核、根文件系统。
2. Linux文件系统主要目录作用:
- /bin:普通命令;
/sbin:系统命令;
/lib:动态库默认位置;
/dev:设备文件目录;
/etc:配置文件所在目录;
/root:root用户所在目录;
/home:普通用户所在目录
3. linux常见命令:
- ls:查看目录文件或其属性;
cp:拷备
rm:删除
mv:剪切、重命名
tar:打包、压缩、解压、拆包,常用操作:
打包压缩:tar -jcvf file.tar.bz2 file //注:前面的”-”也可省掉,采用bsd模式
tar -zcvf file.tar.gz file
解压拆包:tar -jxvf file.tar.bz2
tar -zxvf file.tar.gz
man:查系统命令、库函数等
tab:用于自动补齐文件名---------------------------------------------------------------------
4. 嵌入式系统概念:以应用为中心、以计算机技术为基础,软、硬件可裁剪,对性能、可靠性、功耗、体积等有严格要求的专用计算机系统。
5. 静态角度看嵌入式Linux系统构成:bootloader、内核、根文件系统
6. 本地开发:在一种平台上完成编辑、编译、调试、运行的开发模式; 交叉开发:在一种平台上完成编辑、编译、调试,在另一种平台上运行的开发模式。通常采用的模式为宿主机——目标机。
7. 嵌入式系统软件分类:系统软件、应用软件。前者用于完成系统软、硬件资源,后者用于满足用户具体应用需求。
8. 常用交叉工具:arm-linux-gcc/as/ld/ar等。
9. 嵌入式Linux系统在emmc上布局:最开头部分放置bootloader,然后放置内核,通常内核与bootloader之间会空一些区域用于存放系统启动参数,其他区域放置根文件系统或其他扩展文件系统。
10. gcc编译四个阶段:预处理、编译、汇编、链接。
- 预处理:gcc -E -o hello.i hello.c
编译: gcc -S -o hello.s hello.i
汇编: gcc -c hello.s -o hello.o
链接: gcc hello.o -c hello
执行: ./hello
11. 采用gdb调试程序时,在编译程序时需使其包含调试信息,编译时需加“-g”选项。
12. bootloader概念:在系统启动前或应用程序执行前,首先执行的一小段代码。
13. bootloader作用:初始化硬件,建立内存映射,为系统启动准备环境。
14. bootloader不属于内核,其与平台相关的代码采用汇编编写,该部分程序不具备可移植性。
15. ARM上电后从0地址开始执行。因此,需将uboot映射到0地址处。
16. bootloader程序分两阶段:汇编、C。前者完成模式切换、关MMC、看门狗、中断等,初始化时钟、内存、可信域,拷备uboot部分代码,设置栈,跳到C部分(board_init_f());汇编阶段初始化本阶段所需硬件,等一小会(要么进uboot系统,要么设置内核参数、启动内核)。
---------------------------------------------------------------------
- uboot常用命令:
- help; //查命令集,查具体命令
- mmc类命令:
- 环境变量类:setenv、editenv、saveenv、printenv(pri)
- 命令序列定义:用setenv定义,命令序列用双引号括起,各命令用分号分隔。
命令序列运行:run 命令序列变量名
18. 与内核启动相关的两个重要环境变量:
- bootcmd:自启动命令序列;
bootargs:自启动命令参数;以实验时bootargs取值为例,详细说明每一段的作用。
“root=/dev/nfs” --告诉内核根目录是网络中的共享
“nfsroot=ipaddr” --开发板的ip地址
“ethmac=$usbethaddr” --开发板的mac地址
“console=ttySAC0,115200” --内核启动时,信息向哪里打印,ttySAC0指的是开发板的串口0。
“init=/sbin/init” --告诉内核,内核启动后,第一个要启动的程序是什么,也就是1号进程。 - bootdelay:自启动延迟时间
19. 内核配置4种方法:make config、make menuconfig、make gconfig、make xconfig
20. 内核配置操作:三选一、二选一、字符串,以及各自采用的括号。
21. 内核最终配置文件为:.config
22. 内核编译:make,可用选项:-jn,采用n线程;v=1,完整信息输出;重定向
23. Linux内核编译的最终结果:zImage,位置在arch/arm/boot下,是一个可执行文件。
24. Linux内核配置系统三部分:Makefile、Kconfig、以及配置工具。其中,Makefile和Kconfig通过.config文件联系起来。
25. zImage生成过程:(理解),执行make时,读取.config文件,根据其中的配置项,再由Makefile对相应目录下源文件进行编译,生成*.o,之后对各目录下的*.o文件进行合并得到built-in.o,再对各个built-in.o文件进行链接,得到最原始的内核文件vmlinux,接着对vmlinux文件进行瘦身,去除调试信息、符号表等内容,进行格式转换(转成二进制),生成arch/arm/boot/Image文件,再接着利用gzip对其进行压缩,生成arch/arm/boot/compressed/piggy.gz文件,然后编译head.s、misc.s等文件,将piggy.o一起合并为压缩的、包含自解压工具的内核文件arch/arm/boot/compressed/vmlinux,之后再进行格式化转换得到zImage。
26. 根文件系统概念:存放运行、维护系统所必须的各种工具软件、库、配置文件及其他文件的地方。
27. 根文件系统构建方法:按照FHS标准创建目录,然后填充目录:填充命令(/bin、/sbin、/usr/bin、/usr/sbin)、填充库(/lib、/usr/lib)、填充/etc(initfs、inittab、profile)、填充/dev(null、console)
28. init执行完整流程:
挂载完根文件系统后,首先执行init程序,init程序读取inittab初始化列表,先执行其中动作为sysinit的命令,然后执行动作为wait的命令,接着once的命令;之后循环执行:respawned/askfirst的命令。具体:
29. 模块概念:没有经过链接,不能独立执行的目标文件,链接后运行在内核空间。
特点:灵活;缺点:易破坏系统稳定性。
30. 模块入口声明:module_init();出口声明:module_exit()
31. 模块编译两种方法:树内、树外。
32. 编译方法:make或make modules
33. 模块命令:insmod、rmmod、lsmod、modinfo等
34. 驱动程序:内核通过驱动驾驭硬件,是内核与硬件之间的接口。
35. 设备分类:字符、块、网络设备。设备节点,即设备文件。位置在/dev目录下。
36. 设备号:一个具体的硬件,通过主、次设备号来表示。
37. 设备驱动三大数据结构:file_operations、file、inode
38. 字符设备注册:
- 早期方法:
注册:register_chrdev()
注销:unregister_chrdev()
新方法:
新申请、注册设备号,再申请cdev结构,注册字符设备。
设备号申请与注册:
register_chrdev_region() //设备号已知
alloc_chrdev_region() //设备号未知
注销:unregister_chrdev_region()
设备申请与注册:
cdev_alloc()
cdev_init()
cdev_add()
注销:cdev_del()
39. 手动创建设备文件:mknod 文件名 类型 主设备号 次设备号
40. 设备号:dev_t类型数据,高12位主设备号,低20位次设备号
宏: MAJOR()、MINOR()、MKDEV()
41. 自动创建设备文件:
class_create()
device_create()
销毁:
device_destroy()
class_destroy()
42. 虚地址概念:操作系统启动MMU后,CPU经MMU获取的地址。
实地址概念:物理地址。
43. 地址映射:
- 建立映射: 虚地址=ioremap(实地址,大小)
取消映射: iounmap(虚地址)
44. 并发:真并发、伪并发,及原因。
45. 临界区的概念:会产生并发访问,且包含共享资源的代码段。
46. 原子操作:整型原子操作、位原子操作。仅用于保证这两种类型的变量在进行操作时具有不可分割性。
47. 死锁:单进程死锁、多进程多资源死锁。
48. 其他同步:自旋锁、读写自写锁、信号量、读写信号量、互斥体,掌握各种同步方法的特点。