Linux用两种信号量 Linux has two kinds of semaphore

面试中经常会考什么是信号量,对于linux,实际上有两种semaphore.

第一种是指一种IPC(Inter-process communication进程通讯)的方法。这种IPC是从Unix SYstem V时代开始的,System V发布时加入了三种IPC,它们是semaphore信号量,message queues消息队列,shared memory共享内存。

Linux中另一种Semaphore是内核用来同步的机制。在kernel中,semaphore通常当成一个二值信号量使用。获得信号量时有可能会睡眠,这样进程就会被调度开,放弃处理机;如果某段内核代码得到了一个信号量,这段代码还可以睡眠。这点不像spinlock,尝试得到spinlock会不停地忙等,得到spinlock后不充许睡眠。当然这个“不充许”不是语法层面的,而是应该被程序员遵守。否则整个系统的的性能就会被这代不遵守约定的代码毁掉了。

copyright ykyi.net

 

内核线程是什么东东 What is Kernel threads

有一些Unix内核,比如Solaris和SVR4.2/MP,被组织成一些内核线程。一个内核线程是一个执行上下文且可以被调度;这样的内核线程可能与一个用户程序相关联,也有可以只执行一些内核函数。上下文切换的时候,切换内核线程上下文的开销远比切换用户进程上下文的开销要小。因为内核线程通常共用一个地址空间。而Linux的内核线程则有不同。Linux的内核线程仅仅周期性的执行一个内核函数。而且,Linux内核进线程并不表示一个基本的可执行上下文。 zausiu's blog. http://ykyi.net

Some Unix Kernels, such as Solaris and SVR4.2/MP, are organized as a set of kernel threads. A kernel thread is an execution context that can be independently scheduled; it may be aasociated with a user program, or it may run only some kernel functions. Context switches between kernel threads are usually much less expensive than context switches between ordinary processes, because the former usually operate on a common address space. Linux uses kernel threads in a very limited way to execute a few kernel functions periodically; however, they do not represent the basic execution context abstractions.

怎么为Linux源代码生成补丁

怎么为Linux源代码生成补丁

 

用diff命令来为linux源代码生成补丁。如:

$ diff -Nur /path/to/original/kernel /path/to/your/kernel > change.patch

注意原始的源代码在前,更改后的源代码在后。2.6.x内核的补丁包提交约定指出你需要在每个patch后面写上这样一行:

Sined-off-by: name <email>

这样注明这个补丁包由你制作并贡献给社区。

 

参看 Documentation/SubmittingPatches可以知道更多关于提交linux源代码补丁的内容 。

参看 Documentation/applying-patches.txt 可以知道更多如果打补丁包。

copyright ykyi.net

initramfs 和 initrd 的区别

Linux 2.6内核引入了一个新的feature叫做initramfs。与initrd相比,initramfs有几个好处。
initrd模拟一个磁盘(这就是它的名字的由来,initramdisk或initrd)。模拟磁盘也就同时引入了Linux的块IO子系统的开销,比如缓存(caching),而initramfs从根本上把cache也装载(mounted)成filesystem(因此叫做initramfs).

Initramfs建立在page cahce之上,和page cache一样,会动态地自动增长和缩减尺寸来减入内存的使用量,而initrd做不到这点。
另外,不像initrd需要文件系统驱动(filesystem driver)的支持,比如EXT2 driver,如果你的initrd使用ext2。而initramfs则不需要文件系统的支持,initramfs的实现代码很简单,只是基于page cache的简单一层。

copyright ykyi.net

Linux的开机启动顺序

对于x86机器的Linux的启动顺序,BIOS首先从启动设备载入MBR(Master Boot Record).存在MBR里的代码就去找分区表,从活动分区读入Linux的bootloader,最常用的像Grub,其它的有LILO,SYSLINUX。
Bootloader把压缩格式的内核映象载入并把控制权交给内核映像。
内核映像自解压,启动内核!

x86处理器有两种工作模式。实模式和保护模式。在实模式,你只能够寻址1M内存。保护模式下,就复杂得多,可以作到使用处理器的很多高级特性比如分页。CPU必须从实模式转到保护模式是一个单行通道(one-way street)。你不能从保护模式退入实模式。

内核第一阶段的内核初始化是在实模式中完成的。接下来从init/main.c 中定义的 start_kernel()函数进入你保护模式。start_kernel()先初始化CPU subsystem。接下来启动存储器和进程管理。然后启动外围总线和IO设备。启动序列的最后一个阶段便是init进程被启动。这个进程是所有的Linux进程的祖先。Init进程执行用户空间的脚本。这些脚本被用来启动必要的内核服务程序。Init最后spawn一个控制台给你。于是启动就完成了。

copyright ykyi.net