Linux基础知识

 

      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操作系统

      uCLinuxLinux基本相同,不同的只是对Linux内存管理和进程管理部分进行了修改,以满足无MMU处理器的要求,因为目前大多数嵌入式系统不需要MMU,或者说无法使用MMU

      uCLinux系统多采用romfs文件系统,它是一种相对简单,占用空间较少的文件系统。随着技术的发展,近年来日志文件系统在uCLinux系统上得到较多的应用,其中以支持NOR FLASHJFFSJFFS2文件系统和支持NAND FLASHYAFFS最为流行。这些文件系统都支持掉电文件保护,同时支持标准的MTD驱动。

      从目标系统开发者的角度来看,创建子进程的函数vfork()uCLinux与标准Linux应用程序之间最重要的不同之处,只有对vfork()fork()两个函数的差异有了详细的了解,才能顺利地完成从LinuxuCLinux的程序移植。

uCLinux并不是为了Linux的实时性提出的,因此uCLinux对实时应用的支持方面并不好。

 

Linux中的C语言和汇编语言

 

      Linux内核中使用的C语言与通常的有所不同,它的编译器为gcc,该编译器是一个C/C++编译器,所以LinuxC语言中使用了很多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&TIntel的区别如下:

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”);

      在上例中,由于在行内汇编中改变了edxebx的值,但因为gcc的特殊处理办法,即先形成汇编文件,再交给GAS去汇编,所以GAS并不知道已经改变了edxebx的值;如果程序的上下文需要edxebx作暂存,这样就会引起严重的后果。为了解决这个问题,就要用到扩展的行内汇编语法。

     

      嵌入C语言代码中的扩展行内汇编

 

           扩展的行内汇编类似于Watcom,其基本格式如下:

           asm(“statements”: output_regs:input_regs:clobbered_regs);

           clobbered_regs指的是被改变的寄存器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值