1、压缩指令
把一个文件或者目录(test)压缩成 .tar.bz2 格式:
tar -vcjf test.tar.bz2 test
把一个.tar.bz2 格式的压缩文件解压出来:
tar -vxjf test.tar.bz2
上面的两个操作是互逆的
=
同理压缩成 .tar.gz 或者 .tgz 格式:
压缩:tar -vczf test.tar.gz test
解压缩:tar -vxzf test.tar.gz
=
=
2、diff & patch 指令
生成patch & 用patch来升级一个文件
diff file1 file2 > test.patch
生成一个file1变成file2的patch
patch file1 test.patch
执行完后file1的内容就会和file2一样
若是patch file2 test.patch
则file2也会做同样的改动,如果可以的话
=
=
3、编译内核前必须要先配置内核
CONFIG_SMP 表示是否启用 SMP
这些配置项要么是2选1,要么是3选1
二选一:yes no,分别表示编译进内核,或不编译进内核
三选一:再加一个m,表示编译成一个模块,若要使用需要手动加载
=
make config 逐一询问用户,需要手动配置 y,n(,m)
make defconfig 采用默认配置
make menuconfig
经过上面三步中的某一步配置完成后,会生成1个 .config 文件(根目录下),如下:
#
# Automatically generated file; DO NOT EDIT.
# Linux/arm 4.1.15 Kernel Configuration
#
CONFIG_ARM=y
CONFIG_ARM_HAS_SG_CHAIN=y
CONFIG_MIGHT_HAVE_PCI=y
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
CONFIG_HAVE_PROC_CPU=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_GENERIC_HWEIGHT=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_NEED_DMA_MAP_STATE=y
CONFIG_ARCH_SUPPORTS_UPROBES=y
CONFIG_FIQ=y
CONFIG_VECTORS_BASE=0xffff0000
CONFIG_ARM_PATCH_PHYS_VIRT=y
A 如果.config不存在,运行make config/menuconfig时的缺省设置由固化在各个Kconfig文件中各项目的缺省值决定。
B 如果.config存在,运行make config/menuconfig时的缺省设置即是当前.config的设置,若对设置进行了修改,.config将被更新。
C arch/arm/defconfig是一个缺省的配置文件,make defconfig时会根据这个文件生成当前的.config。
D arch/arm/configs文件夹中有许多命名为xxx_defconfig的配置文件,如果运行make xxx_defconfig,当前.config文件会由xxx_defconfig文件生成。
E make oldconfig的作用是备份当前.config文件为.config.old,如若make config/menuconfig设置不当可用于恢复先前的.config。
=
=
4、内核开发的特点
内核代码的开发,不存在用户态那样的内存保护机制
内核开发哪一进行浮点运算
内核开发能使用标准的c库函数
对于内核来说,完整的c库,甚至是它的一个子集,都太大&太低效了
不过大部分常用的c库函数在内核中都得到了实现,如操作字符串的内核函数集就在 lib/string.c 中,内核的打印函数就是 printk
=
=
5、printk函数的工作机制
printk负责把格式化好的字符串拷贝到内核日志缓冲区上。然后syslog程序就可以通过读取该缓冲区来获取内核信息
=
6、内联汇编的使用场景
偏近体系结构的底层
对执行时间要求严格的地方
=
=
7、利用 likely 和 unlikely 对条件语句进行优化
=
=
8、用户态的代码有内存保护机制,用户程序试图进行一次非法的访问,内核会报错并结束这个进程
内核自己非法访问内存,可能会导致oops或者内核挂死
另外内核中的内存都是不分页的(拓展:内核中的内存都不分页)
内核与其它普通进程一样,也是一个进程,但却与其它普通进程不同,它可以直接操作硬件,并且它也控制着分页机制以及内存页换入换出的替换算法。因此,对内核占用的内存分页没有意义
=
=
9、用户程序在进行浮点操作时,内核会完成从整数操作到浮点数操作模式的转换,执行浮点指令。
但要是在内核中使用浮点数,需要人工保存和恢复浮点寄存器等琐碎的事,比较麻烦。
因此尽量不要再内核中使用浮点操作
=
=
10、内核栈的容积小
linux内核任务的堆栈大小设置,Linux 2.6.32的内核栈和用户空间栈关系
LDD3曾说过:内核具有非常小的栈,它可能只和一个4096字节大小的页那样小。
在内核程序实现过程中,一定要注意栈空间的使用,特别像递归这样的方法尽量少用,否则将可能会对产品产生致命的打击。
=
=
11、内核中,大部分c代码应该与体系结构无关
要把体系结构相关的代码分离出来
疑问:如何在编译过程中配置linux kernel 栈大小