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

来源:互联网 发布:26转行程序员如何 编辑:程序博客网 时间:2024/05/16 07:16

第二章 从内核出发

主要内容:
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加密APIDocumentation内核源码文档drivers设备驱动程序firmware使用某些驱动程序而需要的设备固件fsVFS和各种文件系统include内核头文件init内核引导和初始化ipc进程间通信代码kernel像调度程序这样的核心子系统lib同样内核函数mm内存管理子系统和VMnet网络子系统samples示例,示范代码scripts编译内核所用的脚本securityLinux 安全模块sound语音子系统usr早期用户空间代码(所谓的initramfs)tools在Linux开发中有用的工具virt虚拟化基础结构
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是Stantard C Library的简称,它是符合ANSI C标准的一个标准函数库。libc库提供C语言中所使用的宏,类型的定义,字符串操作符,数学计算函数以及输入输出函数等。正如ANSI C是C语言的标准一样,libc只是一个函数库标准,每个操作系统都会按照该标准对标准库进行具体实现。通常我们所说的libc是特指某个操作系统的标准库,比如:在Linux操作系统下所说的libc即glibc。glibc是类Unix操作系统中使用最广泛的libc库,它的全称是GNU C Library.
http://blog.csdn.net/yasi_xi/article/details/9899599
http://blog.csdn.net/ruanjianruanjianruan/article/details/47264639

(2)syslog程序
     syslog是Linux系统默认的日志守护进程。默认的主配置文件和辅助配置文件分别是/etc/syslog.conf和/etc/sysconfig/syslog文件。通常,syslog 接受来自系统的各种功能的信息,每个信息都包括重要级。/etc/syslog.conf 文件通知 syslogd 如何根据设备和信息重要级别来报告信息。
https://www.cnblogs.com/bonelee/p/6234647.html
https://baike.baidu.com/item/syslog/2802901?fr=aladdin

(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语言的库.
http://blog.csdn.net/hzhongk/article/details/38258531
http://blog.sina.com.cn/s/blog_a2c2b1810100yvlj.html