标签:
2. 关于Linux内核简介
3. 操作系统和内核简介
- 支持对称多处理(SMP)
- 内核可以抢占(preemptive),允许内核运行的任务有优先执行的能力
- 不区分线程和进程
Linux内核有两种:稳定的(具有工业级的强度,可以广泛应用和部署)、处于开发中的。
Linux命名机制(可用于区分稳定的和处于开发中的内核):
如果版本号是偶数,则内核是稳定版;如果是奇数,内核就是开发版。
git实际上是一种开源的分布式版本控制工具。 Linux作为一个开源的内核,其源代码也可以用git下载和管理
- 获取最新提交到版本树的一个副本
- $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
- 下载代码后,更新自己的分支到最新分支
- $ git pull
压缩形式为bzip2:$ tar xvjf linux-x.y.z.tar.bz2
压缩形式为zip:$ tar xvzf linux-x.y.z.tar.gz
关于参数:
-x 解开.tar格式的文件
-v 显示详细信息
-j 使用bzip2程序
-z 使用gzip程序
-f 使用归档文件
从内部源码树开始,运行$ patch -p1 < ../patch-x,y,z
二、内核源码结构
配置项的二选一和三选一:
二选一:yes 或者 no
三选一:yes 或者 no 或者 module(module意味着该配置被选定了,以模块生成。驱动程序一般都用三选一的配置项)
字符页面的命令行工具:
make config
图形界面工具:
make menuconfig
基于默认配置为体系结构创建一个配置:
make defconfig
验证和更新配置:
make oldconfig
编译内核:
make
重定向到该文件中:
make > .. /detritus
把无用的输出信息重定向到永无返回值的黑洞中:
make > /dev/null
将所有已编译的模块安装到正确的主目录/lib/modules下
make modules_install
原因:(速度与大小)保证内核高效和简练。
内核源代码文件不能包含外部头文件。
基本头文件:内核源代码顶级目录下的include中
体系结构相关头文件:内核源代码树的arch/<architecture>/include/asm目录下
printk()函数:把格式化好的字符串拷贝到内核日志缓冲区上,syslog程序可以通过读取该缓冲区来获取内核信息。
什么是GNU?GNU是一种操作系统,GNU提供的C编译器就是我们之前使用的gcc。
static inline void wolf(unsigned long tail_size);
- static:关键字
- inline:用于限定关键字
内联函数:编译时在它被调用的地方展开。
优点:减少了函数调用的开销,性能较好。
缺点:频繁的使用内联函数也会使代码变长,从而在运行时占用更多的内存。
定义内联函数特点:时间要求高,本身长度较短的函数。
使用之前就要定义好内联函数,一般在头文件中定义。
为了类型安全和易读性,优先使用内联函数而不是复杂的宏。
unsigned int low, high;
asm volatile("rdtsc" : "=a" (low), "=d" (high));
/* low 和 high 分别包含64位时间戳的低32位和高32位 */
- asm:嵌入汇编代码
- volatile:不优化
汇编语言用于偏近底层或对执行时间严格要求的地方。
/* 如果error在绝大多数情况下为0(假) */
if (unlikely(error)) {
/* ... */
}
/* 如果success在绝大多数情况下不为0(真) */
if (likely(success)) {
/* ... */
}
对于条件选择语句,在一个条件经常/很少出现时,编译器可通过gcc内建的一条指令对条件分支选择进行优化。
内核把这条指令封装成了宏。
内核自己非法访问内存的风险
内核中的内存都不分页:每用掉一个字节,物理内存都减少一个
使用浮点数时,需要人工保存和恢复浮点寄存器及其他一些繁琐的操作。
不建议使用
内核栈的大小是编译内核时决定的,对于不用的体系结构,内核栈的大小不一样,但都是固定的。(不像用户空间的栈可以动态增长)
原因:
Linux是抢占多任务操作系统
内核支持对称多处理器系统(SMP)
中断异步到来
内核可以抢占
常用解决方法:自旋锁和信号量
需要保持的特点:大部分C语言代码与体系结构无关。
标签:
原文地址:http://www.cnblogs.com/fuyujing/p/5286777.html