linux内核中一些关键词讲解

转载 2013年12月03日 15:38:44

 

asmlinkage/FASTCALL()/fastcall
这三个宏指定了函数参数的传递方式。asmlinkage修饰的函数,其参数通过堆栈传递。FASTCALL()/fastcall,此二者实际上是一样的作用。在Intel i386架构中,它们所修饰的函数,其前三个参数分别通过通用寄存器EAX,ECX和EDX来传递。
它们定义于include/asm-i386/linkage.h:
#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
#define FASTCALL(x) x __attribute__((regparm(3)))
#define fastcall __attribute__((regparm(3)))
此处利用的是函数属性regparm。

终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。tty是Teletype的缩写。Teletype是最早出现的一种终端设备,很象电传打字机(或者说就是?),是由Teletype公司生产的。设备名放在特殊文件目录/dev/下,终端特殊设备文件一般有以下几种:

1.串行端口终端(/dev/ttySn)
 串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,因为那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是/dev/tts/0(或/dev/ttyS0)、/dev/tts/1(或/dev /ttyS1)等,设备号分别是(4,0)、(4,1)等,分别对应于DOS系统下的COM1、COM2等。若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。例如,在命令行提示符下键入:echo test > /dev/ttyS1会把单词”test”发送到连接在ttyS1(COM2)端口的设备上。

2.伪终端(/dev/pty/)
 伪终端(Pseudo Terminal)是成对的逻辑终端设备,例如/dev/ptyp3和/dev/ttyp3(或着在设备文件系统中分别是/dev/pty/m3和 /dev/pty/s3)。它们与实际物理设备并不直接相关。如果一个程序把ttyp3看作是一个串行端口设备,则它对该端口的读/写操作会反映在该逻辑终端设备对的另一个上面(ttyp3)。而ttyp3则是另一个程序用于读写操作的逻辑设备。这样,两个程序就可以通过这种逻辑设备进行互相交流,而其中一个使用ttyp3的程序则认为自己正在与一个串行端口进行通信。这很象是逻辑设备对之间的管道操作。
 对于ttyp3(s3),任何设计成使用一个串行端口设备的程序都可以使用该逻辑设备。但对于使用ptyp3的程序,则需要专门设计来使用ptyp3(m3)逻辑设备。
 例如,如果某人在网上使用telnet程序连接到你的计算机上,则telnet程序就可能会开始连接到设备ptyp2(m2)上(一个伪终端端口上)。此时一个getty程序就应该运行在对应的ttyp2(s2)端口上。当telnet从远端获取了一个字符时,该字符就会通过m2、s2传递给getty程序,而getty程序就会通过s2、m2和telnet程序往网络上返回”login:”字符串信息。这样,登录程序与telnet程序就通过“伪终端” 进行通信。通过使用适当的软件,就可以把两个甚至多个伪终端设备连接到同一个物理串行端口上。
 在使用设备文件系统(device filesystem)之前,为了得到大量的伪终端设备特殊文件,HP-UX AIX等使用了比较复杂的文件名命名方式。

3.控制终端(/dev/tty)
 如果当前进程有控制终端(Controlling Terminal)的话,那么/dev/tty就是当前进程的控制终端的设备特殊文件。可以使用命令”ps –ax”来查看进程与哪个控制终端相连。对于你登录的shell,/dev/tty就是你使用的终端,设备号(5,0).使用命令”tty”可以查看它具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接。

4.控制台终端(/dev/ttyn, /dev/console)
 在UNIX系统中,计算机显示器通常被称为控制台终端(Console)。它仿真了类型为Linux的一种终端(TERM=Linux),并且有一些设备特殊文件与之相关联:tty0、tty1、tty2等。当你在控制台上登录时,使用的是tty1。使用Alt+[F1—F6]组合键时,我们就可以切换到 tty2、tty3等上面去。tty1 –tty6等称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上。因此不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上。你可以登录到不同的虚拟终端上去,因而可以让系统同时有几个不同的会话期存在。只有系统或超级用户root可以向/dev/tty0进行写操作.

5.其它类型
还针对很多不同的字符设备存在有很多其它种类的终端设备特殊文件。例如针对ISDN设备的/dev/ttyIn终端设备等

 

 

关于GCC的__attribute__ ((constructor))

    gcc为函数提供了几种类型的属性,其中包含:构造函数(constructors)和析构函数(destructors)。

程序员应当使用类似下面的方式来指定这些属性:

    static void start(void) __attribute__ ((constructor));
    static void stop(void) __attribute__ ((destructor));
带有"构造函数"属性的函数将在main()函数之前被执行,而声明为"析构函数"属性的函数则将在main()退出时执行。
    下面给出一个简单的程序作为例子:
  1. /* test.c */  
  2.   
  3. #include<stdio.h>  
  4. __attribute__((constructor)) void before_main()  
  5. {  
  6.    printf("before main/n");  
  7. }  
  8.   
  9. __attribute__((destructor)) void after_main()  
  10. {  
  11.    printf("after main/n");  
  12. }  
  13.   
  14. int main()  
  15. {  
  16.    printf("in main/n");  
  17.    return 0;  
  18. }  

$ gcc test.c -o test 
$ ./test 
before main 
in main 
after main

根据上面的代码以及输出结果,我们可以猜到__attribute__((constructor))表示这段代码将在main函数前调用,就像在C++里面的全局变量类的构造一样

 

 

 

关于gcc、glibc和binutils的关系


关于gcc、glibc和binutils模块之间的关系,以及在现有系统上升级glibc
gcc、glibc和binutils模块之间的关系
1) gcc(gnu collect compiler)是一组编译工具的总称。它主要完成的工作任务是“预处理”和“编译”,以及提供了与编译器紧密相关的
运行库的支持,如libgcc_s.so、libstdc++.so等。
2) binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编
(objdump)、elf结构分析工具(readelf)、无效调试信息和符号的工具(strip)等。通常,binutils与gcc是紧密相集成的,没有binutils
的话,gcc是不能正常工作的。
3) glibc是gnu发布的libc库,也即c运行库。glibc是linux系统中最底层的api,几乎其它任何的运行库都会倚赖于glibc。glibc除了封装
linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现,主要的如下:
 (1)string,字符串处理
 (2)signal,信号处理
 (3)dlfcn,管理共享库的动态加载
 (4)direct,文件目录操作
 (5)elf,共享库的动态加载器,也即interpreter
 (6)iconv,不同字符集的编码转换
 (7)inet,socket接口的实现
 (8)intl,国际化,也即gettext的实现
 (9)io
 (10)linuxthreads
 (11)locale,本地化
 (12)login,虚拟终端设备的管理,及系统的安全访问
 (13)malloc,动态内存的分配与管理
 (14)nis
 (15)stdlib,其它基本功能

php (十六)常见关键字

1. Final 关键字  PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。  语法: ...
  • bao990423420
  • bao990423420
  • 2013年11月20日 16:22
  • 875

《Linux内核分析》笔记与课件整理

学习思路 孟宁老师这门课并没有完整的分析Linux内核中代码,而是针对关键部分进行了讲解分析,个人认为内核代码也是存在二八定律的情况,少部分关键代码经常被使用,而理解这部分代码对我们认识操作系统的真...
  • yz764127031
  • yz764127031
  • 2017年04月30日 22:48
  • 398

Linux 内核时钟架构之时钟源描述

include/linux/clocksource.h /**  * struct clocksource - hardware abstraction for a free running ...
  • sunlei0625
  • sunlei0625
  • 2017年03月24日 16:00
  • 98

Linux内核从原理到代码详解|Linux内核视频教程

Linux内核从原理到代码详解 链接: http://pan.baidu.com/s/1sj0Szj3 密码: ywyv 网盘失效的话,请加QQ: 3113533060 ...
  • linuxdashi
  • linuxdashi
  • 2014年12月16日 14:10
  • 571

一些二进制数的特性

1、如果一个二进制数的尾数是一,那么这个数就是奇数,反之就是偶数。2、如果一个二进制数的低端n位都是零,那么这个数就可以被2n整除。3、如果一个二进制数的第n位是一,其他各位都是零,那么这个数等于2n...
  • wangMail_3366
  • wangMail_3366
  • 2009年01月22日 21:47
  • 1305

一些经久不衰的linux 视频教程列表

这15 张光盘最为值得推荐的是国嵌的视频教程,其中的一些wince资料以及中嵌的视频教程也比较适合初学者。 国嵌视频教程由嵌入式Linux专业培训机构成都国嵌公司免费提供的4个培训班完整最新视频。总...
  • gooogleman
  • gooogleman
  • 2011年08月13日 13:46
  • 9278

蓝桥杯-算法提高 P1003·c++实现

算法提高 P1003   时间限制:1.0s   内存限制:256.0MB   作为一名网络警察,你的任务是监视电子邮件,看其中是否有一些敏感的关键词。不过,有些狡猾的犯罪嫌疑人会改变某些单...
  • sukeeeeeeeee
  • sukeeeeeeeee
  • 2016年12月11日 22:11
  • 476

Linux内核编程视频教程

(点击上方蓝字,快速关注) Linux内核编程-入门篇 链接:http://pan.baidu.com/s/1bpAnVWz 密码:6rj9 Linux内核编程-进阶篇 ...
  • T146lLa128XX0x
  • T146lLa128XX0x
  • 2017年12月02日 00:00
  • 404

转载_linux内核分析(某位大牛的文章)

启动     当PC启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFFF0处的代码,也就是ROM-BIOS起始位置的代码。BIOS先进行一系列的系统自检,然后初始...
  • williamwanglei
  • williamwanglei
  • 2013年08月29日 15:11
  • 13504

蓝桥杯 算法提高 P1003 要敲帅气的代码

算法提高 P1003 时间限制:1.0s 内存限制:256.0MB 提交此题   作为一名网络警察,你的任务是监视电子邮件,看其中是否有一些敏感的关键词。不过,有些狡猾的犯罪嫌疑人会改变某些...
  • qq_32734731
  • qq_32734731
  • 2017年03月09日 19:29
  • 338
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux内核中一些关键词讲解
举报原因:
原因补充:

(最多只允许输入30个字)