我的嵌入式linux之路

来源:互联网 发布:linux虚拟机root权限 编辑:程序博客网 时间:2024/06/06 03:59

1.

编译bootloader需要使用2.95.3版的交叉编译器

编译2.6版的内核需要使用3.4.1_softfloat版的交叉编译器

编译Qtopia/Embedded需要3.3.2版的交叉编译器

 

2.

#tar  xvzf  linux-2.6.13-qq2440.tgz  C  /opt/FriendlyARM/QQ2440

说明:执行该命令,将把linux-2.6.13 内核源代码安装到/opt/FriendlyARM/QQ2440目录下. C 表示切换到某个目录然后再展开压缩文件。比如 C / 表示先切换到 / 目录下,然后展开压缩文件 。

 

 

3.

arm-linux 工具链目录加入到环境变量PATH

如下修改/etc/profile 文件,保存退出. 使之生效:1.重新启动系统 2.source /etc/profile.

if [ 'id -u' = 0]; then

    pathmunge /sbin

    pathmunge /usr/sbin

    pathmunge /usr/local/sbin

    pathmunge /usr/local/arm/3.4.1/bin

运行命令#gedit /root/.bashrc编辑/root/.bashrc 文件,在最后一行export PATH=$PATH:/usr/local/arm/3.4.1/bin保存退出。

如 果 设 置 2.95.3 版本的编译器, 只需更改export PATH=$PATH:/usr/loca/arm/2.95.3/bin 即可。

4.

一般把arm-linux-gcc安装到:/usr/loca/arm/version 目录下。

 

 

5.

运行“minicom-s”设置minicom,如果您使用串口1,则输入/dev/ttyS0,如果您使用串口2,则输入/dev/ttyS1。设置被保存到“/etc/minirc.dfl”。要退出minicom,同时按下“Ctrl+A”键,松开后紧接着再按下“Q”键,在跳出的窗口中,选择“Yes”。设置串口,注意必须选择无流控制,否则,或许你只能看到输出而不能输入.

 

 

6.

要中止程序的运行,可以在终端控制台下同时按下Ctrl+c,注意:先按Ctrl,不要放开,再按下c 键即可。例如:我们刚刚使用madplay 命令播放了mp3,如果要中止这个程序的运行,可以按下Ctrl+c 键。另外,如果程序是在后台运行,可以使用 kill 命令杀掉该进程.

 

 

7.

借助启动脚本可以设置各种程序开机后自动运行,也可以设置其他系统设置,这有点类似于Windows 系统中的Autobat 自动批处理文件,启动脚本的位于板子的/etc/init.d/rcS

 

#! /bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin: ##设置默认有效执行路径

runlevel=S ##用户等级,在此为:单用户

prevlevel=N

umask 022

export PATH runlevel prevlevel

#

# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.

#

trap ":" INT QUIT TSTP

#SCSI modules

#Input modules

#/sbin/insmod /lib/input.o

#/sbin/insmod /lib/keybdev.o

#/sbin/insmod /lib/mousedev.o

#/sbin/insmod /lib/evdev.o

#Charactor modules

/bin/ln -s /dev/fb/0 /dev/fb0 ##FrameBuffer 的符号联接

/bin/ln -s /dev/vc/0 /dev/tty1

/bin/ln -s /dev/sound/dsp /dev/dsp #声音设备的符号联接

/bin/ln -s /dev/sound/mixer /dev/mixer #声音设备的符号联接

/bin/ln -s /dev/scsi/host1/bus0/target0/lun0/part1 /dev/sda1

#设置常用临时目录

/bin/mount -t proc none /proc

/bin/mount -t tmpfs none /tmp

/bin/mount -t tmpfs none /var

/bin/mkdir -p /var/lib

/bin/mkdir -p /var/run

/bin/mkdir -p /var/log

#Usb devices

#/sbin/insmod /lib/hid-core.o

#/sbin/insmod /lib/usbmouse.o

#/sbin/insmod /lib/usbkbd.o

#Netcard

#/sbin/insmod /lib/cs8900a.o

#各种服务程序

/etc/rc.d/init.d/netd start # telnet/ftp 服务

/etc/rc.d/init.d/httpd start # web server 服务

/etc/rc.d/init.d/leds start # led 服务

/sbin/ifconfig lo 127.0.0.1 #本地回环设备ip 地址

/sbin/ifconfig eth0 192.168.1.230 up #本机ip 地址,

/sbin/madplay /shanghaitan.mp3 & #开机后自动运行madplay 播放mp3, 用户可以#仿照此处添加自己的开机程序

/bin/hostname -F /etc/sysconfig/HOSTNAME

 

 

8.

注意:如果您对 Linux 系统的开发环境和开发方法还不熟悉,请一定使用Redhat 9.0平台,使用其他版本的Linux 会出现错误。

 

9.

如何挂接使用网络文件系统NFS

#mount  t  nfs  o  nolock  192.168.1.2:/opt/Embedsky/root_nfs  /mnt

意思是把主机 “192.168.1.2”上的 “/opt/Embedsky/root_nfs”目录挂载到目标板上的“/mnt”目录下

 

10.

nfs 的配置文件为/etc/exports

#gedit /etc/exports

编辑nfs 服务的配置文件(注意:第一次打开时该文件是空的),添加以下内容:

 

/opt/FriendlyARM/MINI2440/root_nfs *(rw,sync,no_root_squash)

 

其中:

1)./opt/FriendlyARM/mini2440/root_nfs” 表示nfs 要共享目录,它可以作为开发板的根文件系统通过nfs 挂接;

2).*” 表示所有的客户机都可以挂接此目录,

3).rw” 表示挂接此目录的客户机对该目录有读写的权力,

4). no_root_squash” 表示允许挂接此目录的客户机享有该主机的root 身份。

#/etc/init.d/nfs start

这将启动nfs 服务,可以输入以下命令检验nfs 该服务是否启动。

 

# mount -t nfs localhost: /opt/Embedsky/mini2440/root_nfs  /mnt/

 

如果没有出现错误信息, 您将可以浏览到/mnt 目录中的内容和

/opt/FriendlyARM/mini2440/root_nfs 是一致的。

 

使用这个命令可以停止 nfs 服务:

#/etc/init.d/nfs stop

 

有时需要手动启动portmap服务:service portmap restart

 

11.

一般编译 2.6 版本的驱动模块需要把驱动代码加入内核代码树,并做相应的配置,编译内核需要设置交叉编译环境为 3.4.1 版本的编译器。

linux系统加载进内存,初始化数据结构体后,第一个执行的程序是init,该程序通过读取/etc/inittab文件来启动其他的用户应用程序或者服务。

 

12.

busyboxinittab文件

与通常的inittab不同,它没有runlevel的概念,语句功能上也有限制。inittab语句的标准格式是

  :::

  各字段的含义如下

  :

  id字段与通常的inittab中的含义不同,它代表的是这个语句中process执行所在的tty设备,内容就是/dev目录中tty设备的文件名。由于是运行processtty设备的文件名,所以也不能象通常的inittab那样要求每条语句id的值唯一。

  :

  busybox不支持runlevel,所以此字段完全被忽略。

  :

  为下列这些值之一:

  sysinit, respawn, askfirst, wait,once, restart, ctrlaltdel, shutdown

  其含义与通常的inittab的定义相同。特别提一下askfirst,它的含义与respawn相同,只是在运行process前,会打出一句话“please press Enter to active this console”,然后等用户在终端上敲入回车键后才运行process

  :

  指定要运行的process的命令行。

 mini linuxinittab

  理解了busyboxinittab格式,我们就可以写mini linuxinittab

  ::sysinit:/etc/init.d/rcS

  tty1::askfirst:/bin/sh

  tty2::askfirst:/bin/sh

  tty3::askfirst:/bin/sh

  tty4::askfirst:/bin/sh

  tty5::askfirst:/bin/sh

  tty6::askfirst:/bin/sh

  ::restart:/sbin/init

  ::ctrlaltdel:/sbin/reboot

  ::shutdown:/bin/umount -a -r

  把这个文件放到imageetc目录下。为了执行reboot命令时避免提示找不到/etc/fstab文件,我们再在etc目录下创建一个空文件:

  touch fstab

  做好了这些,就可以重新编译内核,生成新的init ramfs了。在QEMU试验环境下验证新生成的mini linux,系统运行正常,而且象通常的linux系统一样,用ALT+F1F6键可以在6个终端间切换。

由于mini linux系统不需要登录,所以用askfirst的方式来模拟登录,用户敲回车键后,init进程才会启动shell

 

13.VI

在每个用户的主目录下,都有一个   vi   的配置文件".vimrc"".exrc",用户可以编辑它,使这些设置在每次启动   vi   ,都有效。 可以通过下面方法找到vimrc在底行模式输入:

:scriptnames

vimrc那个就是了

 

  例如,加入如下设置行:  
  set   nu  
显示行号    
   
  set   nonu  
不显示行号    
   
  set   ic  
查找时不考虑大小写    
   
  set   noic  
查找时考虑大小写  
   
  set   softtabstop=4   tab
键为4个字符  

 

syntax on  语法高亮

set number 显示行号

 

set mouse=a  //支持鼠标

 

  :set tabstop=4        " Force tabs to be displayed/expanded to 4 spaces (instead of default 8).
  :set softtabstop=4    " Make Vim treat <Tab> key as 4 spaces, but respect hard Tabs.
  :                     "   I don't think this one will do what you want.
  :set expandtab        " Turn Tab keypresses into spaces.  Sounds like this is happening to you.
                        "    You can still insert real Tabs as [Ctrl]-V [Tab].
  :set noexpandtab      " Leave Tab keys as real tabs (ASCII 9 character).
  :1,$retab!            " Convert all tabs to space or ASCII-9 (per "expandtab"),
                        "   on lines 1_to_end-of-file.
  :set shiftwidth=4     " When auto-indenting, indent by this much.
                        "   (Use spaces/tabs per "expandtab".)
  :help tabstop         " Find out more about this stuff.
  :help vimrc           " Find out more about .vimrc/_vimrc :-)

 

 

14.

open,close,read,write,fcntl,lseek,select函数(下面说的头文件都在usr/include/)

sys/types.hPrimitive System Data Types  <sys/types.h>u_char,u_intpid_t等基本的数据类型。

 

sys/stat.h

 

fcntl.h:有open, fcntl函数的声明,fcntl.h还包含了bits/fcntl.h,该有struct flock O_RDONLY,定义和 values for the second argument to fcntl'

 

unistd.h:有closewrite,read,lseekgetpid函数的声明。

 

15.

Linux命令可以使用参数来精细调节程序的行为。为了与命令的操作对象相区别,参数前通常要加 - 或者 -- 符号。原则上,在命令名之后,参数的位置可以随意,但是为了养成一个良好的习惯,我们建议您在命令名后直接跟参数。按照传统,“-”后跟简写为单个字母的参数,“--”后跟完整单词的参数。不过也有例外。

 

16.

远程路径:

  远程路径的表示方法为协议://用户名:密码@位置/路径:端口

  大多数的远程路径可以使用默认端口匿名访问,由此用户名、密码、端口通常不需要填写。例如:

  http://www.ubuntu.org.cn/.../index.html

  要求身份验证的远程路径,您可以使用下面的方式访问:

  ftp://user:passwd@ftp.ubuntu.org.cn:21

出于意外,有时您会按下 Ctrl+s 这个组合键,Shell便被冻结。尝试使用 Ctrl+q 组合键,看能否恢复正常

 

等等,有必要记这么多快捷键么?都这么复杂!

  我们强烈建议您记住,以大幅度的提高操作效率。而且这是readline控件的键绑定,在任何使用readline控件的程序中,您都可以使用它们。例如bashlftpgdb等程序;同时,Linux下最著名的Emacs编辑器,也是这种风格的键绑定(其实是readline使用了Emacs风格的键绑定才对),甚至FireFox中,也可以使用类似风格的快捷键!(Linux下主要有两种风格的键绑定,一种是VI风格,另一种是Emacs风格,我们会在 简明VIM教程中介绍)

  现在列举一些ReadLine的键绑定,您可以自行尝试。(运行 man readline 命令,来查看ReadLine手册)

  先来了解一些约定:

     /C-a 表示 Ctrl+a

     /M-a 表示 Meta+a Meta键在PC中通常为ALT

     A 表示 Shift+a

    (下面括号中的/A代表Alt/S代表Shift

 

  移动命令:

    /C-a 移动到行首 Aheah

    /C-e 移动到行末 End

    /C-f 向前移动一个字符 Forward

    /C-b 向后移动一个字符 Backward

    /M-f 向前移动一个单词

    /M-b 向后移动一个单词

    /C-l 清空屏幕 cLear

  这两个命令也可以理解为移动命令

    /C-p 上翻,前一条命令 Previous

    /C-n 下翻,后一条命令 Next

  编辑命令:

    /C-d 删除光标后的一个字符 /M-d 删除光标后的一个单词 Delete

    /BackSpace 删除光标前的一个字符 /M-BackSpace 删除光标前的一个单词

    /C-k 删除光标至行末的部分 Kill

    /C-u 删除光标至行首的部分 Unix-line-discard

    /C-w 删除光标前的一个单词 Word

    /C-y 粘贴(最后删除的对象) Yank

    /C-- 撤消

  搜索历史纪录:

    /C-r 连续使用 ``C-r`` 可以查找下一个

    /M-p

    /M-n

  补全:

    /Tab 使用频率最高的功能!

    /C-o 遍历补全 (未定义)

    /M-? M-= 列出所有可能选项,相当于按两次Tab键(M-? 实际按键为/A+/S+/

    /M-# 注释掉当前命令,用于将当前命令暂存于历史纪录列表(/A+/S+3

    /M-! 补全命令,通常用来补全子命令,例如 ``sudo`` 的子命令(/A+/S+1

    /M-~ 补全用户名(/A+/S+`

    /M-@ 补全主机名(/A+/S+2

    /M-$ 补全变量(/A+/S+4

    /M-_ 补全历史纪录中的纪录(/A+/S+-

    /M-* 将所有可能选项放到命令行中(/A+/S+8

通过修改 /etc/inputrc 文件,可以更改键绑定。建议您使用默认的键绑定,以避免不必要的烦恼。

在文件中添加该行,可以将ReadLine的键绑定设为VI风格。(BashLftp等使用ReadLine的软件同时生效)

    set editing-mode vi

  找到这一行:

    $if mode=emacs

  在它的下面添加如下内容

    "/C-o": menu-complete

    ###这两行不是必须的,视情况而定###

    "/c-p": non-incremental-reverse-search-history

    "/c-n": non-incremental-forward-search-history

  重新登录Shell,您就可以使用 /C-o Ctrl+o)来遍历补全。假如您的文件名为中文,或者出现乱码时,您

可以使用 /M-* 将所有文件名放入命令行,再删除多余的,这真是麻烦极了!所以您可以使用 /C-o 遍历补全,

将所有可能的选项轮流放入命令行。

  或者使用Vim编辑器编辑 /etc/inputrc 文件,在插入模式下使用 Ctrl+v 组合键。按下 Ctrl+o ,这时编辑区新增一个 ^O 字符,等价于 /C-o

 

可以使用 whereis xxx 命令,来查找 xxx 程序的安装位置

 

 /etc/shells 中列出系统中所有可用Shell /bin/false 代表禁用Shell)  也可以使用如下命令更改您的默认Shell:

    chsh -s /usr/bin/fish(需要输入您的密码)

 

 cd /usr/local/ && ./mplayer -menu xxx.rmvb

 

可以修改 /etc/environment 文件来设定您的命令搜索路径,找到 PATH 起始的行

    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin"

在双引号中添加您的自定义路径,并以 : 分隔。

 

17.

Linux系统主要通过以下步骤启动:

1)读取MBR的信息,启动Boot Manager

  Windows使用NTLDR作为Boot Manager,如果您的系统中安装多个版本的Windows,您就需要在NTLDR中选择您要进入的系统。  Linux通常使用功能强大,配置灵活的GRUB作为Boot Manager,我们将在启动管理章节中向您介绍它的使用方式。

2)加载系统内核,启动init进程

  init进程是Linux的根进程,所有的系统进程都是它的子进程。

4init进程读取 /etc/inittab 文件中的信息,并进入预设的运行级别,按顺序运行该运行级别对应文件夹下的脚

本。脚本通常以 start 参数启动,并指向一个系统中的程序。

5)通常情况下, /etc/rcS.d/ 目录下的启动脚本首先被执行,然后是 /etc/rcN.d/ 目录。例如您设定的运行级别为3,那么它对应的启动目录为 /etc/rc3.d/ 。  根据 /etc/rcS.d/ 文件夹中对应的脚本启动Xwindow服务器 xorg

6XwindowLinux下的图形用户界面系统。

7)启动登录管理器,等待用户登录

  Ubuntu系统默认使用GDM作为登录管理器,您在登录管理器界面中输入用户名和密码后,便可以登录系

统。(您可以在 /etc/rc3.d/ 文件夹中找到一个名为 S13gdm 的链接)

 

 

更改启动服务

  在运行级别对应的文件夹中,您可以看到许多文件名以 S## K## 起始的启动脚本链接。例如:

    /etc/rcS.d/S35mountall.sh 挂载文件系统

    /etc/rcS.d/S40networking  启用网络支持

    /etc/rc2.d/S13gdm         启动登录管理器

    /etc/rc2.d/S20makedev     创建设备文件

    /etc/rc2.d/S23xinetd      启动超级进程

  init进程将以 start 为参数,按文件名顺序执行所有以 S## 起始的脚本。脚本名称中的数字越小,它将被越早执行。例如在 /etc/rc2.d/ 文件夹中, S13gdm 文件名中的数字小于 S23xinetd , S13gdm 将比 S23xinetd 先执行。

如果一个脚本链接,以 K## 起始,表示它将以 stop 参数被执行。如果相应服务没有启动,则不执行该脚本。例如:

/etc/rc2.d/K20powernowd 针对某种硬件的电源管理支持如果您想禁止某一服务在启动时自动运行,您可以将相应运行级别中的脚本由 S##xxx 重命名为 K##xxx

 

手动控制服务

您也可以手动运行带有以下参数的启动脚本,来控制系统服务。

- start 启动

- stop 停止

- restart 重启

 

  例如:

    /etc/rc2.d/K20powernowd start

  有时您并不清楚当前运行级别,该运行级别下未必有相应脚本;而且此类脚本的前三位字符并不固定,不便于记忆。这时,可以直接使用 /etc/init.d/ 文件夹中的启动脚本( /etc/rcX.d/ 中的启动脚本链接到 /etc/init.d/ 文件夹下相应脚本),这也是推荐的方式。

  例如:

    /etc/init.d/powernowd start

  Note:以上命令的位置并没有包含在环境变量的搜索路径中,所以要输入完整路径。

 

18.

查看磁盘使用情况

#df  -h

 

 

19.

我的第1linux下的LED驱动程序

 

19.1.把源代码-myled.c放到/opt/EmbedSky/kernel-2.6.13/drivers/misc目录下

19.2.修改Kconfig文件

menu "Misc devices"

 

config IBM_ASM

    tristate "Device driver for IBM RSA service processor"

    depends on X86 && PCI && EXPERIMENTAL

……

//-------这部分是我加的

config MY_LED

    tristate "Device driver for my own TQ2440 Board LED"

    default y

//----------

endmenu

修改之后在配置内核的时候就会出现 Device driver for my own TQ2440 Board LED 选项,可以把该项配置为 “M”、“*”或不选。

19.3.修改Makefile文件,生成myled.o目标文件

 

obj- := misc.o    # Dummy rule to force built-in.o to be made

 

obj-$(CONFIG_IBM_ASM)    += ibmasm/

obj-$(CONFIG_HDPU_FEATURES) += hdpuftrs/

 

//----------这个是自己加的

obj-$(CONFIG_MY_LED) += myled.o

 

19.4.运行make menuconfiog 配置内核,记得要把 “Device driver for my own TQ2440 Board LED”配置为“M”,才会生成myled.ko模块。

 

19.5.编译模块:到目录kernel-2.6.13下运行:make modules SUBDIR=drivers/misc/                               

就会在 misc 目录下生成myled.ko,把它传送到目标板,到myled.ko的目录下用 insmod ./myled.ko 命令便可加载模块。

 

19.6.编写myled_main测试程序,用 arm-linux-gcc  o  myled_main  c myled_main.c 自成myled_main可执行程序,把myled_main传送到目标板,加载myled.ko模块后便可运行 myled_main 。如果运行不了,可能是权限原因,可用命令 :chmod a+rwx 修改权限,然后再运行即可。

 

 

20.搜索文件及目录

    如要在/home/ecos目录下搜索myled_main.c find /home/ecos/ -name myled_main.c

注意:用find要写出完整的文件或目录名

      /home/ecos 后可加/或不加

       一定要用 name

       如果没有指定目录则系统会以当前目录为搜索范围

       find默认会搜索子目录

 

21.搜索包含特定字符串

    如要在/etc目录下搜索包含字符串“password

    grep n password /etc/*

加参数-n会标出符合指定的字符串的列数

注意:

不能指定在目录中搜索,如 /etc/* 不能写/etc/

password也可写成 password

grep默认不会搜索子目录,可加-r选项来让grep搜索子目录

 

23.

如果加载模块成功,会在/proc/devices下见到设备的主设备号

cat  /proc/devices

register_chrdev_region(devno, NUM_DEV_MYLED, "myled" );

其中的“myled”就是要出现在/proc/devices目录下

 

 

24.

/etc/hosts 文件中添加“127.0.0.1  localhost  localdomain  beyond

 

...待续