I want to be a complete engineer - technical genius and sensitive humanist all in one!

Monday, October 27, 2008

关于kernel里面的asmlinkage

kernelnewibes上的解释是:

What is asmlinkage?
The asmlinkage tag is one other thing that we should observe aboutthis simple function.
 This is a #define for some gcc magic that tellsthe compiler that the function should not
 expect to find any of itsarguments in registers (a common optimization), but only on 
theCPU’s stack. Recall our earlier assertion that system_call consumesits first argument, 
the system call number, and allows up to four morearguments that are passed along to the 
real system call. system_callachieves this feat simply by leaving its other arguments (which 
werepassed to it in registers) on the stack. All system calls are markedwith the asmlinkage tag,
 so they all look to the stack for arguments.Of course, in sys_ni_syscall’s case, this doesn’t make
 any difference,because sys_ni_syscall doesn’t take any arguments, but it’s an issuefor most 
other system calls. And, because you’ll be seeingasmlinkage in front of many other functions, 
I thought you shouldknow what it was about.

在kernel2.6.26
include/linux/linkage.h里面定义如下:

#ifndef asmlinkage_protect
# define asmlinkage_protect(n, ret, args...) do { } while (0)
#endif

CPP_ASMLINKAGE的定义为:
#ifdef __cplusplus
#define CPP_ASMLINKAGE extern “C”
#else
#define CPP_ASMLINKAGE
#endif

而在include/asm-i386/linkage.h里则有更明确的定义:

#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))

__attribute__是GCC的C语言扩展语法。regparm(0)表示不从寄存器中传递参数。

另外,如果是__attribute__((regparm(3))),那么调用函数的时候参数不是通过栈传递,而是直接放到寄存器里,被调用函数直接从寄存器取参数。

通俗而言,asmlinkage是声明在函数之前,表示该函数可以被汇编代码调用。 加上"asmlinkage" 后,C function 就会由 stack 取参数,而不是从 register 取参数。asmlinkage大都用在系统调用中,系统调用需要在entry.s文件中用汇编语言调用,所以必须要保证它符合C语言的参数传递规则,才能用汇编语言正确调用它。

Sunday, October 26, 2008

Ubuntu中软件安装与卸载的相关命令


安装软件
命令: apt-get install softname1 softname2 softname3……

卸载软件
命令: apt-get remove softname1 softname2 softname3……

卸载并清除配置
命令: apt-get remove --purge softname1

更新软件信息数据库
命令: apt-get update

进行系统升级
命令: apt-get upgrade

搜索软件包
命令: apt-cache search softname1 softname2 softname3……

Deb软件包相关安装与卸载

安装deb软件包
命令: dpkg -i xxx.deb

删除软件包
命令: dpkg -r xxx.deb

连同配置文件一起删除
命令: dpkg -r --purge xxx.deb

查看软件包信息
命令: dpkg -info xxx.deb

查看文件拷贝详情
命令: dpkg -L xxx.deb

查看系统中已安装软件包信息
命令: dpkg -l

重新配置软件包
命令: dpkg-reconfigure xxx

按照安装软件包的方式为:

1、通过deb包安装的情况:
安装.deb包:
sudo dpkg -i package_file.deb
卸载.deb包:
sudo dpkg -r package_name

2、通过apt-get安装的情况:
安装命令:
sudo apt-get install package_name
卸载命令:
sudo apt-get remove package_name

Friday, October 24, 2008

Debian/Ubuntu Linux开发者参考

如果你想要升级你的Debian/Ubuntu Linux内核,或者你希望为内核开发新的模块,或者您要为某个硬件写新的驱动程序……这一切都涉及到Debian/Ubuntu Linux内核编程。

作为一个内核编程者,有那么几个软件是你必须要有的,看作是你进行内核编程的几件法宝吧,下面我一一列举出来:

1、gcc

大名鼎鼎的gcc我想没有人不知道的吧?它是任何编程者必然要先安装的一个武器了。不过一般如果你是安装的Debian系统,应该已经默认安装了的。要是Ubuntu你就安装一下吧,安装方法嘛,就是输入:

apt-get install gcc

2、make

如果你实实在在地写过有用的程序,你一定输入过make clean、make、make install等命令的,make是一个源代码维护工具,它能自动检测出需要重新编译的源文件并根据你设定的编译规则去重新编译程序。这里也不多说,如果 不了解的朋友就google一下吧。不过一般如果你是安装的Debian系统,应该已经默认安装了的。要是Ubuntu你就安装一下吧,安装方法一样,输 入:

apt-get install make

3、kernel-source

从这个包的名称上已经知道了,这是内核源码包。你可以apt-cache search kernel-source搜索到内核源代码包,并用uname -r命令查看到当前系统内核版本,然后用apt-get install kernel-source-xxxx来安装和你内核版本一致的内核源代码包。

但我并不建议你这样做,因为大多数发行版的Linux的内核源代码包并不是和你从 kernel.org上下载来的完全一致,应该是经过发行者们修改优化过的包,虽然发行版的制作者们花了心血在上面,但对我们编程者来说这并不是件好事, 因为大多发行版的源代码包缺少某些必要的头文件和某些有用的脚本程序,这会导致我们在编写内核模块时遇到麻烦,比如编译时可能会报错说某个头文件找不到, 又可能报错说某个脚本程序不存在啦。

如果你直接去kernel.org上下载一个新的内核来编译升级你的内核,并在此基础上进行内核编程可能会省事一些,至少我后面讲到的这些包你都可以不用安装了,把KERNEL_DIR变量设置为你内核源代码包的位置就够了。

在这里还是以Debian 3.1、内核2.6.8-2-386为基础来教大家准备内核编程环境吧。那么你依次用这几个命令来安装kernel-source包吧。

apt-cache search kernel-source
uname -r

apt-get install kernel-source-xxxx

注:如果你不想重新编译内核,内核源代码包kernel-source是完全可以不下载来的。

4、kernel-headers

这是内核源代码头文件包,不管你是要进行内核模块开发还是进行驱动程序开发,这个包都是必须 要安装的。因为作为一个内核模块编写者,通常会调用内核里的一些东西,比如内核头文件,内核数据结构申明等。它里面包含了一些关键的内核头文件。否则在编 译内核时会报类似下面的错误:

HOSTCC  scripts/basic/fixdep
scripts/basic/fixdep.c:105:23: error: sys/types.h: 没有那个文件或目录

输入如下命令来安装吧:

apt-cache search kernel-headers
uname -r
apt-get instakk kernel-headers-xxxx

注:在Ubuntu下,好象这个包的前面都加上了linux-,从而变成了linux-kernel-headers。

如果之前没有安装过kernel-kbuild包,安装此包的过程中会安装kernel-kbuild包,这个包在下面介绍。

5、kernel-kbuild

这个包是用来编译内核模块的,下载安装这个包后会发现在/usr/src目录下多了一个kernel-kbuild-xxxx开头的目录,下面只有scripts一个目录,显然这是用来编译内核模块的一些脚本程序。安装方法一样:

apt-cache search kernel-kbuild
uname -r
apt-get install kernel-kbuild-xxxx

注:你也会发现,在上面安装kernel-headers包后,/usr/src/kernel-headers-xxxx目录下有个scripts目录,其实是到/usr/src/kernel-kbuild-xxxx目录下的scripts的一个链接。

6、build-essential

这个包包含一个在建立deb包过程中起关键作用的包的信息列表,如果你不想建立deb包你就不需要安装此表,如果需要生成deb包就最好安装一下这个包吧。安装方法:

apt-get install build-essential

7、kernel-package

如果你想把内核镜像做成一个deb包来用,那么必须用安装这个包了。也就是说只有安装了这个软件包你才能有make-kpkg命令可用。安装方法一样了:

apt-get install kernel-package

8、initrd-tools

如果你想制作启动过程的initrd镜像,则这个包是必不可少的。安装了这个包之后才有mkinitrd命令可用的。安装方法:

apt-get instakk initrd-tools

Labels

Followers