Linux是一个典型的宏内核(一体化内核)结构。
进程管理的系统调用包括进程的创建,调度,中止,等待等。
Linux支持内存管理控制器MMU,使用虚拟内存管理机制。虚拟内存管理系统调用包括:内存分配,内存回收请求分页和交换页等。
由于Linux使用了虚拟文件管理系统VFS,从而使它能够支持不同的文件系统。文件管理系统允许用户进程通过一组通用的系统调用(例如open,close,read,write,chmod等)对不同文件系统中的文件进行访问。
实现实时Linux的思路
A) 提高时钟精度,解决中断和调度延时问题;
B) 解决在Linux内核不允许调度的问题;
C) 提供对于实时多媒体应用的支持,包括引入新颖的调度算法(网络包调度,进程调度和磁盘调度);
D) 引入新颖的调度框架以及资源管理思想,以更好地支持网络系统中的QoS要求
uCLinux
uCLinux是一种由Linux 2.0 内核发展而来的嵌入式Linux版本,是专为没有MMU的微处理器(如ARM7TDMI)等设计的嵌入式Linux操作系统。
uCLinux与Linux基本相同,不同的只是对Linux的内存管理和进程管理部分进行了修改,以满足无MMU处理器的要求,因为目前大多数嵌入式系统不需要MMU,或者说无法使用MMU。
uCLinux系统多采用romfs文件系统,它是一种相对简单,占用空间较少的文件系统。随着技术的发展,近年来日志文件系统在uCLinux系统上得到较多的应用,其中以支持NOR FLASH的JFFS,JFFS2文件系统和支持NAND FLASH的YAFFS最为流行。这些文件系统都支持掉电文件保护,同时支持标准的MTD驱动。
从目标系统开发者的角度来看,创建子进程的函数vfork()是uCLinux与标准Linux应用程序之间最重要的不同之处,只有对vfork()与fork()两个函数的差异有了详细的了解,才能顺利地完成从Linux到uCLinux的程序移植。
uCLinux并不是为了Linux的实时性提出的,因此uCLinux对实时应用的支持方面并不好。
Linux中的C语言和汇编语言
在Linux内核中使用的C语言与通常的有所不同,它的编译器为gcc,该编译器是一个C/C++编译器,所以Linux在C语言中使用了很多C++的技术。例如用了修饰字inline,使被修饰的函数成为了内联函数;另外,在定义一个结构类型的对象时,不像普通C语言那样只使用结构名,而是在结构名面前还要有关键字struct。
总之,在阅读Linux代码时会碰到一些与普通C语言不同的语法格式,这时最好查看Linux手册。
Linux中的汇编语言
通常见到的或使用的是Intel格式的汇编语言,而gcc采用的是AT&T的汇编格式语言。
A) 寄存器命名原则。在AT&T汇编指令中,在寄存器命称前面要带有前缀%,例如%eax
B) 源/目的操作数顺序。在AT&T汇编语言数据传输指令中,数据的传递方向相反。例如:Intel指令“mov ebx, eax”在AT&T中为“movl %ebx, %eax”
C) 常数/立即数的格式。在AT&T指令中的常数要带有前缀$,例如“movl %_value, %eax”;而在Intel中则为“mov eax,_value”。这两条指令的功能均为把_value放入eax寄存器。
D) 操作数长度标识。在AT&T的数据传输指令助记符中带有表明数据长度的后缀:字符l表示长整型(32位)数据;字符w表示字(16位);字符b表示字节(8位),例如:“movw %ax,%bx”
E) 寄存器间接寻址。在使用寄存器间接寻址方式时,在AT&T指令中使用”()”,而不像Intel汇编那样使用”[]”,例如“(%eax)”。
F) 变址寻址。在使用变址寻址方式时,AT&T与Intel的区别如下:
AT&T: _variable(%eax)
Intel: [eax + _variable]
AT&T: _array(,%eax,4)
Intel: [eax*4 + _array]
AT&T: _array(%ebx,%eax,8)
Intel: [ebx + eax*8 + _array]
嵌入C代码中的行汇编
在行内汇编方面比较简单,一般的格式是asm(“statements”).例如:
asm(“nop”);asm(“cli”);
asm与_asm_是完全一样的。如果有多行汇编,则每一行都要交上”/n/t”。例如:
asm(“pushl %eax/n/t”
“movl $0, %eax/n/t”
“popl %eax”);
实际上,gcc在处理汇编时,要把asm(…)的内容“打印”到汇编文件中,所以格式控制字符是必要的。再如:
asm(“movl % eax, %ebx”);
asm(“xorl % ebx, %edx”);
asm(“movl $0, _booga”);
在上例中,由于在行内汇编中改变了edx和ebx的值,但因为gcc的特殊处理办法,即先形成汇编文件,再交给GAS去汇编,所以GAS并不知道已经改变了edx和ebx的值;如果程序的上下文需要edx或ebx作暂存,这样就会引起严重的后果。为了解决这个问题,就要用到扩展的行内汇编语法。
嵌入C语言代码中的扩展行内汇编
扩展的行内汇编类似于Watcom,其基本格式如下:
asm(“statements”: output_regs:input_regs:clobbered_regs);
clobbered_regs指的是被改变的寄存器。