JJJ:linux内核设计与实现 笔记

第2章:

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来升级一个文件

Linux 命令 - 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内核任务的堆栈大小设置,Linux 2.6.32的内核栈和用户空间栈关系

LDD3曾说过:内核具有非常小的栈,它可能只和一个4096字节大小的页那样小。

在内核程序实现过程中,一定要注意栈空间的使用,特别像递归这样的方法尽量少用,否则将可能会对产品产生致命的打击。

=

=

11、内核中,大部分c代码应该与体系结构无关

要把体系结构相关的代码分离出来

疑问:如何在编译过程中配置linux kernel 栈大小

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值