【Linxu内核设计与实现】-第2章 从内核出发

释放双眼,带上耳机,听听看~!

第二章 从内核出发

主要内容:

Linux内核基本知识

  • 获取源码
  • 编译源码
  • 安装新内核
  • Linux内核程序开发特点
  • 用户空间程序的区别

2.1 获取内核源码

www.kernel.org

2.1.1 使用git

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

git pull

2.1.2 安装内核源码

内核发布:

  • GUN zip:tar xvzf  linux-x.y.z.tar.gz
  • bzip2:tar xvjf linux-x.y.z.tar.bz2

2.1.3 使用补丁

patch -p1 < ../patch-
x.y.z

2.2

内核源码树

目录 说明
arch 特定体系结构的代码
block 块设备I/O层
crypo 加密API
Documentation 内核源码文档
drivers 设备驱动程序
firmware 使用某些驱动程序而需要的设备固件
fs VFS和各种文件系统
include 内核头文件
init 内核引导和初始化
ipc 进程间通信代码
kernel 像调度程序这样的核心子系统
lib 同样内核函数
mm 内存管理子系统和VM
net 网络子系统
samples 示例,示范代码
scripts 编译内核所用的脚本
security Linux 安全模块
sound 语音子系统
usr 早期用户空间代码(所谓的initramfs)
tools 在Linux开发中有用的工具
virt 虚拟化基础结构

1
1

COPYING:内核许可证

CREDITS:内核开发者列表

MAINTAINERS:维护者列表

Makefile:内核Makefile

2.3编译内核

2.3.1 配置内核

(1)配置项:

  • 2选一:YES NO
  • 3选一:YES NO MODULE

(2)配置
make menuconfig

(3)编译
make

2.3.2 减少编译垃圾

make > ../detritus

make > /dev/null

2.3.3 衍生多个编译作业

make -jn

2.3.4 安装新内核

image

System.map

2.4 内核开发的特点

2.4.1 无

libc库抑或无标准头文件

(1)对于内核来说,哪怕是一个C库的子集都太大太低效。

(2)
大部分常用的C库函数在内核中都实现了,如操作字符串的函数组位于lib/string.c文件中。只要包含<linux/string.h>即可。

(3)
头文件

基本头文件在内核目录下的include中,<linux/inotify.h>  –》 include/linux/inotify.h

体系结构相关的头文件在arch/arm/include/asm中,内核通过asm引用。

(4)printk()函数

把格式化好的字符串拷贝到内核日志缓冲区上。
syslog程序就可以通过读取该缓冲区来获取内核信息。

printk(KERN_ERR "THIS IS A ERROR \n");

2.4.2

GUN C

(1)Linux内核是用C语言写的。内核不完全符合ANSI C标准。

(2)内联函数:

函数会在调用的地方展开,消除函数调用和返回所带来的开销。

C99和GUN C都支持内联函数

什么时候用:对时间要求高,本身长度又比较短的函数定义为内联函数。

定义形式:static inline void wolf(),必须在使用前定义(一般在头文件中定义)。

(3)内联汇编

内核使用汇编+c实现,偏向体系结构底层或者时间要求高的用汇编实现。

(4)分支声明

likely() 、unlikely()

2.4.3 没有内存保护机制

(1)用户程序非法内存访问,内核会发现错误,发送SIGSEGV信号,并结束整个进程。

(2)内核错误会导致oops

2.4.4 不要在内核中使用浮点数

2.4.5 容积小而固定的栈

2.4.6 同步和并发

内核需要特性都要求能够并发的访问共享数据。要求存在同步机制不出现竞争条件:

2.4.7 可移植性的重要性

大部分C代码应该与体系结构无关

2.5 总结

      内核拥有系统最高的管理权

补充学习:


(1)libc库

    libc是S
tantard C Library的简称,它是符合ANSI C标准的
一个标准函数库
。libc库提供C语言中所使用的宏,类型的定义,字符串操作符,数学计算函数以及输入输出函数等。正如ANSI C是C语言的标准一样,libc只是一个函数库标准,每个操作系统都会按照该标准对标准库进行具体实现。通常我们所说的libc是特指某个操作系统的标准库,比如:
在Linux操作系统下所说的libc即glibc。glibc是类Unix操作系统中使用最广泛的libc库,它的全称是GNU C Library.

(2)syslog程序

     syslog是Linux系统默认的日志守护进程
。默认的主配置文件和辅助配置文件分别是/etc/syslog.conf和/etc/sysconfig/syslog文件。通常,syslog 接受来自系统的各种功能的信息,每个信息都包括重要级。/etc/syslog.conf 文件通知 syslogd 如何根据设备和信息重要级别来报告信息。

(3)GUN C
     GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。它在编写linux的时候自己制作了一个标准成为 GNU C标准。ANSI 美国国家标准协会,它对C做的标准ANSI C标准后来被国际标准协会接收成为 标准C 所以 ANSI C 和标准C是一个概念。

glibc和libc都是Linux下的C函数库,
libc是Linux下的ANSI C的函数库;
glibc是Linux下的GUN C的函数库;
ANSI C和GNU C有什么区别呢?
ANSI
C是基本的C语言函数库,包含了C语言最基本的库函数。
而GNU
C函数库是一种类似于第三方插件的东西,由于Linux是用C语言写的,所以Linux的一些操作是用C语言实现的,所以GUN组织开发了一个C语言的库.

给TA打赏
共{{data.count}}人
人已打赏
安全运维

WordPress网站专用docker容器环境带Waf

2020-7-18 20:04:44

安全运维

运维安全-Gitlab管理员权限安全思考

2021-9-19 9:16:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索