嵌入式Linux中常见的问题

Linux问题集

1 linux环境变量设置及保存地点

1. 显示环境变量HOME

$ echo $HOME

/home/terry

2. 设置一个新的环境变量WELCOME

$ exportWELCOME="Hello!"

$ echo$WELCOME

Hello!

3. 使用env命令显示所有的环境变量

$ env

HOSTNAME=terry.mykms.org

PVM_RSH=/usr/bin/rsh

SHELL=/bin/bash

TERM=xterm

HISTSIZE=1000

...

4. 使用set命令显示所有本地定义的Shell变量

$ set

BASH=/bin/bash

BASH_VERSINFO=([0]="2"[1]="05b"[2]="0"[3]="1"[4]="release"[5]="i386-redhat-linux-gnu")

BASH_VERSION=‘2.05b.0(1)-release‘

COLORS=/etc/DIR_COLORS.xterm

COLUMNS=80

DIRSTACK=()

DISPLAY=:0.0

...

5. 使用unset命令来清除环境变量

set可以设置某个环境变量的值。清除环境变量的值用unset命令。如果未指定值,则该变量值将被设为NULL。示例如下:

$ exportTEST="Test..." #增加一个环境变量TEST

$ env|grepTEST #此命令有输入,证明环境变量TEST已经存在了

TEST=Test...

$ unset $TEST#删除环境变量TEST

$ env|grepTEST #此命令没有输出,证明环境变量TEST已经存在了

6. 使用readonly命令设置只读变量

如果使用了readonly命令的话,变量就不可以被修改或清除了。示例如下:

$ exportTEST="Test..." #增加一个环境变量TEST

$ readonlyTEST #将环境变量TEST设为只读

$ unset TEST#会发现此变量不能被删除

-bash: unset:TEST: cannot unset: readonly variable

$TEST="New" #会发现此也变量不能被修改

-bash: TEST:readonly variable

环境变量的全局设置位于/etc/profile文件,如果需要增加新的环境变量可以添加下属行

exportPATH=$PATH:/path1:/path2:/pahtN

2  ubuntu下安装删除命令

apt表示是advancedpacakge Tool.

apt-cachesearch package             搜索包

apt-cacheshow packagename           获取包的信息如版本和大小。

apt-getinstall packagename          安装包。

apt-getinstall pacekage --reinstall   重新安装

apt-get -finstall packagename       强行安装

apt-getremove packagename            删除某个程序

apt-getremove packagename --pure    干净的卸掉

apt-getautoremove                    自动删除不要的包

apt-getupdate

apt-getupgrade             更新已经安装的包

apt-getdist-upgrade       升级系统,没用过

apt-cachedepends pacakgename  了解使用的依赖,很少用

apt-cacherdepends packagename 了解具体的依赖。

apt-getbuild-dep packagename    安装相关的编译环境。这个有时需要用。

apt-getsource package           下载安装该包的源码,编程时有时需要看

apt-get clean

apt-getautoclean      清理下载文件存档。

apt-getcheck          检查是否有损坏的依赖,很少用。

可以通过man apt获得更为详细的解释。

3
如何让linux在启动时自动加载脚本

1 先编写脚本,比如名字为a.sh

2 保存路径为:/etc/rc.d/a.sh

3 修改/etc/rc.d/rc.local

在该文件末尾加入a.sh脚本的存放路径:/etc/rc.d/a.sh

保存,退出 ,就OK了。

4  mount
和 umount 命令

mount语法:

mount [选项]<-t 类型> [-o 挂载选项] <设备> <挂载点>

-t 选项用于指定分区上文件系统的类型。您最常遇到的文件系统应该是ext2FS(GNU/Linux 文件系统)或 ext3FS(改进了日志性能的 ext2FS),VFAT(适用于所有 DOS/Windows? 分区:FAT12, 16 or 32)以及 ISO9660(CD-ROM 文件系统)。如果您不指定任何类型,mount 将会试着读取分区中的超块来猜测文件系统。

-o 选项用于指定一个或多个挂载选项。可供选择的选项视文件系统类型不同而有所不同。请参看 mount(8) 手册页中的细节。通常将分区挂载在 /mnt 或其它挂载点(挂载点必须已经存在)。

举例:

$ mount -text3 /dev/hdb1 /mnt

要卸下分区,可使用umount 命令,语法:

umount <挂载点|设备>

举例:

$ umount /mnt  或者:

$ umount/dev/hdb1

提示:有些时候,可能某些设备(通常是 CD-ROM)正忙或无法响应。此时,大多数用户的解决办法是重新启动计算机。我们大可不必这么做。例如,如果umount /dev/hdc 失败的话,您可以试试“lazy” umount。语法十分简单:

umount -l<挂载点|设备>

此命令将会断开设备并关闭打开该设备的全部句柄。通常,您可以使用 eject <挂载点|设备>命令弹出碟片。所以,如果eject 命令失效而您又不想重新启动,请使用 lazy umount。

如果我们想让系统在启动的时候自动挂载某些分区,则应该编辑/etc/fstab 文件。该文件的每一行对应一组挂载关系,包括文件系统、挂载点以及其它选项。这里是该文件的一个例子:

/dev/hda1   /          ext2    defaults        1 1

/dev/hda5   /home      ext2    defaults        1 2

/dev/hda6   swap       swap    defaults        0 0

none        /mnt/cdrom  supermount dev=/dev/scd0,fs=udf:iso9660,ro,--0 0

none        /mnt/floppy supermountdev=/dev/fd0,fs=ext2:vfat,--,sync,umask=0 0 0

none        /proc       proc   defaults        0 0

none        /dev/pts    devpts mode=0622       0 0

每行都由以下内容组成:

文件系统所在的设备;

挂载点;

文件系统类型;

挂载选项;

dump 工具备份标志;

fsck(文件系统检查(FileSystem ChecK))的检查顺序。

总是有一行说明了根文件系统。swap 分区是一种特殊的分区,因为您无法在树形结构中找到其对应位置,而且这些分区的挂载点域只写着swap 关键字。至于 /proc 文件系统,我们会在第 10 章 /proc 文件系统中有更详细的描述。另外一种特殊的文件系统是/dev/pts。

举例个例子,如果想把/dev/hdb1自动挂载到/usr ,就得在 /etc/fstab 文件中添加下面一行:

/dev/hdb1        /usr         ext2   defaults  1 2

这样,分区将会在每次启动时自动挂载,并且必要时检查错误。

现在我们来介绍两个特殊选项:noauto 和 user。noauto 选项指定了文件系统不应该在启动时挂载,而只应该在您想要挂载的时候才挂载。而user 选项指定了任何用户都可以挂载或卸下文件系统。这两个选项通常用于 CD-ROM 和软盘驱动器。有关 /etc/fstab 中其它选项的详情,请您查看 fstab(5) 手册页。

使用 /etc/fstab 的好处在于,它将极大简化 mount 命令的语法。要挂载文件中描述的文件系统,您只需要引用挂载点或设备。要挂载软盘,您可以只输入:

$ mount/mnt/floppy

或:

$ mount/dev/fd0


文件的加锁问题

问:用fcntl给文件加锁,在一个进程中加给一个文件多次加同一类型的锁,不会报错吗?

答:如果一个进程对一个文件区间已经有一把锁,后来该进程又企图在同一文件区间再加一把锁,那么新锁将替换老锁。

6   framebuffer简介

FrameBuffer 是出现在 2.2.xx 内核当中的一种驱动程序接口。这种接口将显示设备抽象为帧缓冲区。用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。该驱动程序的设备文件一般是/dev/fb0、/dev/fb1 等等。比如,假设现在的显示模式是 1024x768-8 位色,则可以通过如下的命令清空屏幕:

$ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768

在应用程序中,一般通过将 FrameBuffer 设备映射到进程地址空间的方式使用,比如下面的程序就打开 /dev/fb0 设备,并通过mmap 系统调用进行地址映射,随后用 memset 将屏幕清空(这里假设显示模式是 1024x768-8 位色模式,线性内存模式):

int fb;

unsigned char* fb_mem;

fb = open ("/dev/fb0",O_RDWR);

fb_mem = mmap (NULL, 1024*768,PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);

memset (fb_mem, 0, 1024*768);

FrameBuffer 设备还提供了若干 ioctl 命令,通过这些命令,可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。

通过 FrameBuffer 设备,还可以获得当前内核所支持的加速显示卡的类型(通过固定信息得到),这种类型通常是和特定显示芯片相关的。比如目前最新的内核(2.4.9)中,就包含有对S3、Matrox、nVidia、3Dfx 等等流行显示芯片的加速支持。在获得了加速芯片类型之后,应用程序就可以将 PCI 设备的内存I/O(memio)映射到进程的地址空间。这些memio 一般是用来控制显示卡的寄存器,通过对这些寄存器的操作,应用程序就可以控制特定显卡的加速功能。

PCI 设备可以将自己的控制寄存器映射到物理内存空间,而后,对这些控制寄存器的访问,给变成了对物理内存的访问。因此,这些寄存器又被称为"memio"。一旦被映射到物理内存,Linux的普通进程就可以通过 mmap 将这些内存 I/O 映射到进程地址空间,这样就可以直接访问这些寄存器了。

当然,因为不同的显示芯片具有不同的加速能力,对memio 的使用和定义也各自不同,这时,就需要针对加速芯片的不同类型来编写实现不同的加速功能。比如大多数芯片都提供了对矩形填充的硬件加速支持,但不同的芯片实现方式不同,这时,就需要针对不同的芯片类型编写不同的用来完成填充矩形的函数。

说到这里,读者可能已经意识到 FrameBuffer 只是一个提供显示内存和显示芯片寄存器从物理内存映射到进程地址空间中的设备。所以,对于应用程序而言,如果希望在FrameBuffer 之上进行图形编程,还需要完成其他许多工作。举个例子来讲,FrameBuffer 就像一张画布,使用什么样子的画笔,如何画画,还需要你自己动手完成。

7  strings命令的作用

一些二进制格式的文件。你想知道里面有哪些常量字符串。就非常有用。比如你生成这样一个程序,a.c:

int main(void)

{

return printf ("hello world\n");

}

#cc -o a.outa.c

#strings./a.out

/lib64/ld-linux-x86-64.so.2

_Jv_RegisterClasses_

_gmon_start_

_

libc.so.6

printf

__libc_start_main

GLIBC_2.2.5

hello world


什么是tty?

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

1.串端终端(/dev/ttySn)

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

2.伪终端(/dev/pty/)

伪终端(Pseudo Terminal)是成对的逻辑终端设备,例如/dev/ptyp3和/dev/ttyp3(或着在设备文件系统中分别是/dev/pty/m3和/dev/pty/s3)。它们与实际物理设备并不直接相关。如果一个程序把ttyp3看作是一个串行端口设备,则它对该端口的读/写操作会反映在该逻辑终端设备对的另一个上面(ptyp3)。而ptyp3则是另一个程序用于读写操作的逻辑设备。这样,两个程序就可以通过这种逻辑设备进行互相交流,而其中一个使用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)之前,为了得到大量的伪终端设备特殊文件,使用了比较复杂的文件名命名方式。因为只存在16个ttyp(ttyp0—ttypf)的设备文件,为了得到更多的逻辑设备对,就使用了象q、r、s等字符来代替p。例如,ttys8和ptys8就是一个伪终端设备对。不过这种命名方式目前仍然在于RedHat等Linux系统中使用着。

但Linux系统上的Unix98并不使用上述方法,而使用了”pty master”方式,例如/dev/ptm3。它的对应端则会被自动地创建成/dev/pts/3。这样就可以在需要时提供一个pty伪终端。目录/dev/pts是一个类型为devpts的文件系统,并且可以在被加载文件系统列表中看到。虽然“文件”/dev/pts/3看上去是设备文件系统中的一项,但其实它完全是一种不同的文件系统。

3.控制终端(/dev/tty)

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

4.控制台(/dev/ttyn,/dev/console)

在Linux系统中,计算机显示器通常被称为控制台终端或控制台(Console)。它仿真了类型为Linux的一种终端(TERM=Linux),并且有一些设备特殊文件与之相关联:tty0、tty1、tty2等。当你在控制台上登录时,使用的是tty1。使用Alt+[F1—F6]组合键时,我们就可以切换到tty2、tty3等上面去。tty1–tty6等称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,Linux系统所产生的信息都会发送到该终端上。因此不管当前我们正在使用哪个虚拟终端,系统信息都会发送到我们的屏幕上。C}$k]\

你可以登录到不同的虚拟终端上去,因而可以让系统同时有几个不同的会话存在。但只有系统或超级用户root可以向/dev/tty0进行写操作,而且有时/dev/console会连接至/dev/tty0或/dev/tty1上。

5.其它类型

Linux系统中还针对很多不同的字符设备建有很多其它种类的终端设备特殊文件。例如针对ISDN设备的/dev/ttyIn终端设备等,这里不再赘述。

9  nm 命令和strip 命令

nm 命令显示对象文件、可执行文件以及对象文件库里的符号信息。

strip 命令减少XCOFF 对象文件的大小。strip 命令从 XCOFF 对象文件中有选择地除去行号信息、重定位信息、调试段、typchk 段、注释段、文件头以及所有或部分符号表。一旦您使用该命令,则很难调试文件的符号;因此,通常应该只在已经调试和测试过的生成模块上使用 strip 命令。使用 strip 命令减少对象文件所需的存储量开销。

时间: 2024-08-04 07:00:40

嵌入式Linux中常见的问题的相关文章

linux 中常见的压缩和解压缩的命令

# linux 中常见的压缩和解压缩的命令 一.tar 1.解压: tar zxvf filename.tar 2.压缩: tar czvf filename.tar dirname 二.gz 1.解压: gunzip filename.gz gzip -d filename.gz 2.压缩: gzip filename 三.tar.gz 和 tgz 1.解压 tar zxvf filename.tar.gz 2.压缩 tar zcvf filename.tar.gz dirname 3.压缩多

linux中常见的命令

linux 中的命令非常多,但是玩过linux的人也从来不会因为Linux的命令如此之多而烦恼,我们只需要掌握其中常见的命令即可,可以在使用时去找man,会帮助你解决不少问题.下面就列出一些常见的linux命令. 1.cd命令 这是最基本的一条命令,用于切换文件目录,进入某一个文件夹内,参数为需要切换文件目录的路径,可以是绝对路径也可以是相对路径,例如: 1 cd /ren/text/ren1 #切换到目录/ren/text/ren1下面 当前位置在---ren1 2 cd ./ren2 #切换

Linux中常见find命令的使用

Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找文件,功能很强大.由于find具有强大的功能,所以它的选项也很多,需要我们花时间来了解. 命令格式:     find pathname -options [-print -exec -ok ...] 命令功能: 用于在文件树种查找文件,并作出相应的处理(可能访问磁盘) 命令参数: pathname: find命令所查找的目录路径.例如用.来表示当前目录,用/来表示系统根目录.   -pri

嵌入式开发中常见3个的C语言技巧

Hey,大家好!我是CrazyCatJack.今天我来说几个在嵌入式开发中常用的C语言技巧吧.也许你曾经用过,也许你只是见到过但是没有深入理解.那么今天好好补充下吧^_^ 1.指向函数的指针 指针不光能指向变量.字符串.数组,还能够指向函数.在C语言中允许将函数的入口地址赋值给指针.这样就可以通过指针来访问函数.还可以把函数指针当成参数来传递.函数指针可以简化代码,减少修改代码时的工作量.通过接下来的讲解大家会体会到这一点的. /*函数指针简单讲解 *通过指向函数的指 *针调用比较两个数 *大小

Linux 中常见的填空题

一.填空题: 1. 在Linux系统中,以文件方式访问设备 . 2. Linux内核引导时,从文件/etc/fstab中读取要加载的文件系统. 3. Linux文件系统中每个文件用i节点来标识. 4. 全部磁盘块由四个部分组成,分别为引导块.专用块. i节点表块和数据存储块. 5. 链接分为:硬链接和符号链接. 6. 超级块包含了i节点表和空闲块表等重要的文件系统信息. 7. 某文件的权限为:d-rw-_r--_r--,用数值形式表示该权限,则该八进制数为:644,该文件属性是目录. 8. 前台

Linux中常见的加密技术介绍

常见的加密技术: 对称加密:非对称加密:单向加密:SSL/TLS:秘钥交换 1.对称加密 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密. 对称加密的常见算法:DES.3DES.AES.IDEA.RC6.CAST5等 (1)优点 加密.解密使用同一个密钥,效率高: (2)缺点 必须商定秘钥:数据传送前,双方必须商定好秘钥.线上商定,存在被窃取风险: 来源无法确认:如果钥匙被窃取,窃取者就可以冒充另一方进行通讯,接收者无法确认来源:

解决嵌入式Linux中的时区问题

如果说让我做上层软件的工作,我做起来可以得心应手,但是让我做平台方面的工作(系统问题解决.驱动编写.软件移植等工作),确实不熟悉.所以很多问题都是摸着石头过河,没有经验.许多问题在有经验的朋友那里是小菜一碟,而放在我面前总是如遇大山.不免被嘲笑为"弱鸡"- 最近我在做基于 Realtek 芯片RTL8196E的家庭网关的研发工作.Realtek提供了一个Linux的SDK开发环境.由于硬件上没有RTC,所以其中Linux的系统(下面简称为RTLinux)时钟是不正确的.需要时间同步.这

Linux 中常见信号介绍

http://blog.csdn.net/eager7/article/details/8290937 我们运行如下命令,可看到Linux支持的信号列表: $ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR213) SIGPIPE 14) SIGALRM 15) SIGTER

Linux中常见日志文件的介绍

/var / log / cron:记录crond计划任务相关的时间信息: 一.内核及系统日志分析 /var / log / messages:记录Linux内核消息及各种应用程序的公共日志信息,包括启动.I/O错误.网络错误.程序故障等.对于未使用独立日志文件的应用程序或服务,一般都可以在该日志文件中获得相关信息. /var /log /dmesg:记录Linux操作系统在引导过程中的各种事件信息: /var / log / maillog:记录进入或发出系统的电子邮件活动: /var / l