这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 【每日总结】liklon从零学嵌入式Linux

共56条 1/6 1 2 3 4 5 6 ›| 跳转至

【每日总结】liklon从零学嵌入式Linux

高工
2014-04-22 09:48:22     打赏

      之前论坛里一点一滴学习嵌入式Linux的活动没赶上,非常遗憾哟...

      现在开始一点一点的学习嵌入式Linux,决定每天晚上把当天学习的内容贴出来,大家共同学习和交流。

      开工.....

      

      学习过程中对于指出小弟问题的盆友们,将赠送积分作为感谢


      第一天:    Linux基础知识 + Linux虚拟机建立共享文件夹并熟悉常用命令

      第二天:    Linux下C语言编程与调试基础

      第三天:    Linux开发环境搭建

      第四天:    编译Linux内核(1)

      第五天:    编译Linux内核(2)

      第六天:    编译Linux内核(3)+NFS安装配置

      第七天:      文件IO编程(1)     祝大家节日快乐....

      第八天:   文件IO编程(2)

     第九天:   Linux进程控制

      第十天:    Linux进程通信--管道

      第十一天    Linux进程通信-信号通信(1)

      第十二天    Linux进程通信-信号通信(2)

      第十三天    Linux进程通信-信号量 

      第十四天    Linux进程通信-共享内存

      第十五天    Linux进程通信-消息队列

      第十六天    Linux进程通信部分总结

      第十七天    Linux多线程编程(一)

      第十八天    Linux多线程编程(二)

      第十九天    Linux多线程编程(三)

      第二十天    Linux多线程编程(四)

   第二十一天    Linux多线程编程(五)

   第二十二天    网络基础架构

   第二十三天    Linux网络编程-TCP程序设计(一)

   第二十四天    Linux网络编程-TCP程序设计(二)

   第二十五天    Linux网络编程-UDP程序设计(一)      (二)    

   第二十六天    Makefile编写基础。(分享了一份很不错教程,欢迎下载)



嵌入式LINUX学习第二部分(基于OK6410开发板学习)


        第一炮    ARM汇编指令基础     

        第二炮    吐槽一下买了龙芯笔记本8089b之后的“悲惨经历”

        第三炮    两台linux电脑之间传输文件(一)

     第四炮    两台linux电脑之间传输文件(二)




关键词: 嵌入式     Linux     总结    

高工
2014-04-22 09:49:32     打赏
2楼

一、LINUX基础知识

安装的是virtualbox虚拟机和Ubuntu10.04   http://pan.baidu.com/s/1mghtbHA

1.文件系统和根文件系统

    操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。

    根文件系统之所以在前面加一个”根“,说明它是加载其它文件系统的”根“,既然是根的话,那么如果没有这个根,其它的文件系统也就没有办法进行加载的。它包含系统引导和使其他文件系统得以挂载(mount)所必要的文件。根文件系统包括Linux启动时所必须的目录和关键性的文件

详细了解查看链接:http://baike.baidu.com/link?url=6qvwzs01i6cUPXCajLHKDdf79ESNtCPx_4fT88GwgXwwqvDdMuU6S-bbz80_K2-w

http://baike.baidu.com/link?url=R5DGJGK_nDv4jUkd7DtRdKcKSMqadwp3_XG9iz9g9ryhZ_ilOgMYgK3sT4Scym_qggc3QsY0cfYww53eYPrk-K

    linux的文件系统和windows不同,windows每个目录都与分区对应,而linux下文件系统就像一棵树,所有文件和外部设备都以文件的形式挂在这棵树上。这样又出现了一个概念就是挂载在linux中把每个分区与某一个目录对应,之后操作这个目录就是操作这个对应的分区。把分区和目录对应的过程叫挂载。挂载在文件树种的位置就是挂载点。这种关系可以由用户随时改变和中断。

2.主分区,扩展分区,逻辑分区

  主分区就是包含操作系统启动所必须的文件和数据的硬盘分区,要在硬盘上安装操作系统就必须有一个主分区,主分区最多是4个。除了主分区外的就是扩展分区,而扩展分区不能直接使用,必须得分为多个逻辑分区,逻辑分区数量没有限制。

         C盘-------/dev/hda1   (主分区)

         D盘------/dev/hda5  (逻辑分区,从hda5开始)

         E盘-----/dev/hda6    (逻辑分区)

3. root权限

   拥有超级权限的用户称为root用户。root用户的默认目录是在/root下,其他普通用户是在/home下。root用户的权限极高,可以修改内核,所以初学者慎用。

4.linux下的文件类型

  linux的一个特点是将设备和目录都看作文件来处理,不需要不同设备用不同的处理方法,提高了效率。Linux中主要的文件类型分为四种:普通文件,目录文件,链接文件,设备文件。

   普通文件就是用户平时使用最多的文件,像WINDOWS中的文本文件之类的。

   目录文件是linux中存储文件的唯一地方 ,在linux中目录也是文件。将文件和目录对应起来时,也就是指针将其链接起来之后,就构成了目录文件。操作目录文件一般不涉及对文件类容的操作。

   链接文件就类似于windows中的快捷方式。

Linux将设备也是当作文件来操作

块设备文件是指数据的读写,是以块为单位的设备,比如硬盘等

字符设备主要是指串行端口的接口设备

5.文件系统的组织结构

/ Linux 文件系统的入口,也是处于最高一级的目录;

/bin 基础系统所需要的那些命令位于此目录,也是最小系统所需要的命令;比如 ls、cp、mkdir等命令;

/usr/bin 这个目录中的文件都是可执行的,做为基础系统所需要的最基础的命令就是放在这里。

/boot Linux的内核及引导系统程序所需要的文件,比如 vmlinuz initrd.img 文件都位于这个目录中。在一般情况下,GRUB或LILO系统引导管理器也位于这个目录;

/dev 设备文件存储目录,比如声卡、磁盘…… ……

/etc 系统配置文件的所在地,一些服务器的配置文件也在这里;比如用户帐号及密码配置文件;

/home 普通用户家目录默认存放目录;

/lib 库文件存放目录

/lost+found 在ext2或ext3文件系统中,当系统意外崩溃或机器意外关机,而产生一些文件碎片放在这里。

/media 即插即用型存储设备的挂载点自动在这个目录下创建,比如USB盘系统自动挂载后,会在这个目录下产生一个目录;

    /mnt 这个目录一般是用于存放挂载储存设备的挂载目录的,有时我们可以把让系统开机自动挂载文件系统,把挂载点放在这里也是可以的。比如光驱可以挂载到/mnt/cdrom .

    /proc 操作系统运行时,进程(正在运行中的程序)信息及内核信息(比如cpu、硬盘分区、内存信息等)存放在这里。/proc目录伪装的文件系统proc的挂载目录,proc并不是真正的文件系统

   /root Linux超级权限用户root的目录;

   /sbin 是超级权限用户root的可执行命令存放地,普通用户无权限执行这个目录下的命令,这个目录和/usr/sbin;/usr/X11R6/sbin或/usr/local/sbin目录是相似的;凡是目录sbin中包含的都是root权限才能执行的。

   /tmp 临时文件目录,有时用户运行程序的时候,会产生临时文件。/tmp就用来存放临时文件的。

   /usr 这个是系统存放程序的目录,这个目录下有很多的文件和目录。当我们安装一个Linux发行版官方提供的软件包时,大多安装在这里。普通用户可执行文件目录/usr/bin 或/usr/local/bin,超级权限用户root的可执行命令存放目录,比如/usr/sbin 或/usr/local/sbin 等;还有程序的头文件存放目录/usr/include.

   /var 这个目录的内容是经常变动的,看名字就知道,我们可以理解为vary的缩写,/var下有/var/log 这是用来存放系统日志的目录。

    



高工
2014-04-22 17:16:44     打赏
3楼
呵呵,每天一点点,生活多姿多彩嘛

高工
2014-04-22 17:17:36     打赏
4楼
再来好好学学

高工
2014-04-22 17:18:43     打赏
5楼
嗯,会把觉得有价值的贴出来,大家一起看

高工
2014-04-22 18:15:56     打赏
6楼

二、基础命令

   通过在linux下安装交叉编译工具来熟悉一些基础命令

1、建立共享文件夹(VirtualBox 系统自带方式)

  

 启动虚拟机,然后选择安装增强功能,等安装完成后开始下一步的配置。  


  设置共享文件夹路径


进入Linux环境修改用户权限,进入/media目录到共享的文件夹sf_liklon-linux,然后查看这个文件夹所在的用户组,并将本机用户添加到对应的用户组。

所用到的指令:

sudo,su:

sudo我们主要用来临时提升权限,主要用以管理员(超级用户)的权限来运行命令,当需要修改当前登录用户力所不能及的文件/目录时需要用sudo。Linux下输入密码不是像windows中显示的是*,而是什么都不显示。添加用户到某一个组,需要在管理员权限,所以要用到这个。

ls:

显示目录内容

最常用参数:

-a        —-显示指定目录所有文件,包括文件名以 . 开头的文件

-l        —-显示文件详细信息(包括文件类型,权限,修改时间,访问时间,大小,文件名…)

-h        —-将文件大小以方便阅读的形式表示出来,配合 -l 参数使用,常有奇效

cd:

切换当前工作目录

不同于其他命令,这是一个shell内置命令

最常用参数:

.        —-切换到当前目录(貌似没有什么意义)(.这个目录可以通过ls -a看到)

..       —-切换到上层目录

~        —-回到家目录(/home/你的登录名/)

gpasswd

功能:管理组

用法:gpasswd[-a user][-d user][-A user,...][-M user,...][-r][-R]groupname

参数:

-a:添加用户到组

-d:从组删除用户

-A:指定管理员

-M:指定组成员和-A的用途差不多

-r:删除密码

-R:限制用户登入组,只有组中的成员才可以用newgrp加入该组


1行:cd /media/   进入/media目录

2行:ls  列出目录下的文件

4行:cd sf_liklon-linux/  进入共享文件夹

5行:提示没有权限,所以需要将当期用户添加到组

6行:详细列表

详细列表7个段分别是:

文件属性:drwxrwx---

文件硬链接数或目录子目录数:

所有者:root

所属用户组:vboxsf

文件大小:0

修改时间:2014---

文件名:sf_liklon-linux

采用gpasswd命令添加当期用户到vboxsf组,得用管理员权限,所以加sudo

添加完成后再进去还是没有权限是因为必须重新登录用户,所以现在注销然后登录。


进去后可以看到共享的文件:


共享文件夹设置完成了,开始安装交叉编译工具。用到的指令:

mkdir [选项] 目录...

创建以 DirName(指定的文件名)命名的文件夹或目录。要创建文件夹或目录的用户必须对所创建的文件夹的父文件夹具有写权限。并且,所创建的文件夹(目录)不能与其父目录(即父文件夹)中的文件名重名,即同一个目录下不能有同名的(区分大小写)。 

-m, --mode=模式,设定权限<模式> (类似 chmod),而不是 rwxrwxrwx 减 umask

-p, --parents  可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录; 

-v, --verbose  每次创建新目录都显示信息

--help   显示此帮助信息并退出

--version  输出版本信息并退出

cp [选项]...  源 目的

将源文件复制至目标文件,或将多个源文件复制至目标目录。

命令参数:

-a,    --archive      等于-dR --preserve=all

    --backup[=CONTROL 为每个已存在的目标文件创建备份

-b            类似--backup 但不接受参数

     --copy-contents  在递归处理是复制特殊文件内容

-d             等于--no-dereference --preserve=links

-f,    --force      如果目标文件无法打开则将其移除并重试(当 -n 选项

              存在时则不需再选此项)

-i, --interactive     覆盖前询问(使前面的 -n 选项失效)

-H             跟随源文件中的命令行符号链接

-l, --link        链接文件而不复制

-L, --dereference      总是跟随符号链接

-n, --no-clobber       不要覆盖已存在的文件(使前面的 -i 选项失效)

-P, --no-dereference   不跟随源文件中的符号链接

-p            等于--preserve=模式,所有权,时间戳

--preserve[=属性列表   保持指定的属性(默认:模式,所有权,时间戳),如果

             可能保持附加属性:环境、链接、xattr 等

-R, -r, --recursive  复制目录及目录内的所有项目

tar 

解包:tar xvf FileName.tar

打包:tar cvf FileName.tar DirName

(注:tar是打包,不是压缩!)

.gz

解压1:gunzip FileName.gz

解压2:gzip -d FileName.gz

压缩:gzip FileName

.tar.gz 和 .tgz

解压:tar zxvf FileName.tar.gz

压缩:tar zcvf FileName.tar.gz DirName

.bz2

解压1:bzip2 -d FileName.bz2

解压2:bunzip2 FileName.bz2

压缩: bzip2 -z FileName

.tar.bz2

解压:tar jxvf FileName.tar.bz2

压缩:tar jcvf FileName.tar.bz2 DirName

.bz

解压1:bzip2 -d FileName.bz

解压2:bunzip2 FileName.bz

压缩:未知

.tar.bz

解压:tar jxvf FileName.tar.bz

压缩:未知

.Z

解压:uncompress FileName.Z

压缩:compress FileName

.tar.Z

解压:tar Zxvf FileName.tar.Z

压缩:tar Zcvf FileName.tar.Z DirName

.zip

解压:unzip FileName.zip

压缩:zip FileName.zip DirName

.rar

解压:rar x FileName.rar

压缩:rar a FileName.rar DirName



上面的几行命令完成的步骤是

建立目录/usr/local/armtest/

然后将共享文件夹里的压缩包复制到新建目录

然后利用解压命令解压。

解压完成后查看



开始设置环境变量(PS.在发帖前已经我已经添加了环境变量,就不重新添加,只介绍方法了)

# vi /etc/profile

在文档最后,添加:

export PATH="目录:$PATH"

保存,退出,然后运行:

#source/etc/profile

这里要用到vi编辑器,可以再网上查找vi编辑器的使用方法。

Vi编辑器的使用方法:http://www.jb51.net/os/RedHat/1131.html

Ubuntu常用命令与技巧 http://www.iteye.com/topic/148375




高工
2014-04-23 17:55:01     打赏
7楼


三、Linux下程序编译以及调试

   编写程序源码是在利用vi编辑器。关于vi编辑器的使用可以再网上查找一些详细的介绍。http://blog.csdn.net/xueziheng/article/details/2048054

1.GCC编译器流程(利用一段简单的源码做的实验)

  Gcc命令详解 http://blog.csdn.net/casularm/article/details/316149


预处理:

这个阶段是对包含的头文件以及宏定义等进行处理,可以先预处理然后查看预处理后的结果。 


-E是预处理之后停止编译。现在查看hello.i的部分内容:

      

编译阶段:

这个阶段GCC首先检查代码的规范性,然后翻译为汇编语言。利用-S来进行只编译不汇编,结果生成汇编代码。

     

    

     

汇编阶段:

这个阶段将.s文件转换为目标文件.o

       

链接阶段:

成功编译之后就进入链接阶段,完成链接之后,GCC就可以生成可执行文件。

       

以上就是GCC的整个编译流程。

2.函数库

  

  静态函数库建立以及使用:

静态库是一系列目标文件的归档文件,文件名格式为libname.a,当链接到静态库时,链接器将会搜索静态库,从中提取出所需要的目标文件直接赋值到该程序的可执行文件ELF格式文件之中。

  1.创建库程序

    

建立源程序:

  

建立静态库:

用到ar命令,关于这个命令的介绍http://blog.csdn.net/xuhongning/article/details/6365200


生成了,静态链接库libtest.a

使用静态链接库:


动态链接库建立与使用

动态链接库libname.so编译时不会被链接到目标代码中,在运行时才会被载入。


  -->先利用-fPIC选项编译出目标文件

  -->再用-shared选项生成动态链接库

  -->使用动态链接库

3.gdb调试

   调试时所有程序员都会经历的步骤,大多数情况下,调试的时间是占大部分的。看看gdb调试,推荐一篇文章:http://blog.csdn.net/haoel/article/details/2879

   1.首先在编译时加入  -g  这样编译出来的可执行文件里才会包含调试信息

   2.启动gdb 开始调试

   3.查看文件  l(list)  列出源代码

   4.根据行号设断点  b 7  在第7行设断点

   5.运行代码 r(run)  

   6.查看变量p加上变量名

   

    
    

   

4.Makefile编写

Makefile的编写推荐一篇文章比较不错:跟我一起写Makefile.pdf



高工
2014-04-24 17:32:57     打赏
8楼

四、 Linux开发环境搭建

1. 交叉编译工具

在第一天的学习中已经安装好了交叉编译工具  http://forum.eepw.com.cn/thread/250307/1#9

今天看了下环境变量的设置。

2.WINDOWS下的超级终端以及LINUX下的MINICOM的安装于使用

WINDOWS下的超级终端设置:


也可以使用一般的串口助手。

LINUXMINICOM安装以及设置:


安装完成,进行设置

 

回车进入设置界面

 

开始根据需要配置:

 

按相应的字母进行选择

  

在minicom的使用中用到三个按键的操作,CTRL-A Z(先同时按下CRTL和A,松开后再按下Z)来查看帮助。

在minicom中ttyS0代表COM1 ttyS1代表COM2。USB转串口,应该先将USB设备分配给虚拟机,如果虚拟机识别到会在/etc/目录下有ttyUSB0等。

3.LINUX下TFTP服务器搭建(不再重新安装一些软件,所以只贴出方法)

  第1步:
   安装tftp所需的软件。首先需要安装tftp-hpa,tftpd-hpa,前者是客户端,后者是服务程序,在终端下输入 
sudo apt-get install tftp-hpa tftpd-hpa,安装tftp-hpa和tftpd-hpa。然后还需要安装xinetd,在终端下输入 sudo apt-get install xinetd,安装好xinetd。

  第2步: 
配置相关服务文件。进入根目录下的etc文件夹(cd /etc/),首先看目录中有没有一个xinetd.conf文件,如果没有则新建一个,有的话查看内容,看是否与下面的一致,若不一致则修改,内容如下:

 

# Simple configuration file for xinetd   
#   
# Some defaults, and include /etc/xinetd.d/   
defaults   
{   
# Please note that you need a log_type line to be able to use log_on_success ont-size: 12pt; "> # log_type = SYSLOG daemon info   
}   
includedir /etc/xinetd.d


第3步:
配置tftp服务器


sudo vi /etc/default/tftpd-hpa
  将内容修改成
# /etc/default/tftpd-hpa 
    TFTP_USERNAME="tftp"
    TFTP_DIRECTORY="/tftpboot"                          
#这是你tftp服务器的工作目录,自行修改,注意,在新建工作目录时,最好修改其权限为777,命令sudo chmod 777 /tftpboot
    TFTP_ADDRESS="0.0.0.0:69"
    TFTP_OPTIONS="-l -c -s"


第4步:
然后进入xinetd.d文件夹(cd xinetd.d),查看是否有一个tftp文件,如果没有就新建一个,如果有的话就查看内容是否与下面的一致,不一致则修改,内容如下:


service tftp
    {
       socket_type = dgram
       wait = yes
       disable = no
       user = root
       protocol = udp
       server = /usr/sbin/in.tftpd
       server_args = -s /tftpboot
       #log_on_success += PID HOST DURATION
       #log_on_failure += HOST
       per_source = 11
       cps =100 2
       flags =IPv4
    }


其中server_args一行是配置服务器的文件存放的位置,就是进行tftp传输的时候,都是从该文件夹中搜索文件的


第5步:
修改所需文件夹的权限。需要修改的文件夹也就是上一步提到的那个服务器文件存放的文件夹,以我的配置文件为例,创建一个文件夹(sudo mkdir /tftpboot),然后把它可以设置成访问权限最宽松的(sudo chmod 777 /tftpboot),也可以设置成合适的权限。


第6步:
重新启动服务。sudo service tftpd-hpa restart,这也是我经常疏忽的一步,当配置好tftp的配置文件后,需要重新启动一下xinetd,在终端中输入 sudo /etc/init.d/xinetd reload,重新加载一下进程,再输入 sudo /etc/init.d/xinetd restart,重启服务。记住,每次修改完配置文件后,都需要重新启动一下服务。
执行次序:
sudo service tftpd-hpa restart
sudo /etc/init.d/xinetd reload
sudo /etc/init.d/xinetd restart

4.测试TFTP服务器

1.设置虚拟机网卡为桥接方式

      

   2.查看虚拟机IP以及在超级终端中查看板子IP

     

     

在虚拟机的TFTP服务器目录放入一个文件,我放入的是aa.c

     

板子开始获取这个文件:

   

获取成功!!!



高工
2014-04-25 20:13:28     打赏
9楼

五、编译LINUX内核

今天尝试了一下编译内核,但是还没有完成哟,Linux内核中不同的目录结构里都有相应的makefile,而不同的makefile又通过彼此之间的依赖关系构成一个整体。共同完成建立依赖关系,建立内核等功能。内核的编译主要分为:内核配置,建立依赖关系,创建内核镜像。

 看了看内核的配置,下载了一份内核源码:http://url.cn/MHdFRt

      内核支持四种不同的配置方法,这几种方法只是与用户的交互界面不同,实现的功能都是一样的。每种方法都是通过读入一个默认的配置文件(根目录下“.config”隐藏文件)。可以手动修改,但是不推荐这种方法。

——>make config 基于文本的最为传统的配置界面。不推荐

——>make menuconfig 基于文本选单的配置界面 字符终端下推荐

——>make xconfig  基于图形窗口模式的配置界面 Xwindow下推荐

——>make oldconfig 自动读入.config配置文件,并且只要求用户设定前次没有设定过的选项。

  一般都是采用make menuconfig

在敲入make menuconfig之后出现了错误,如下面代码:

*** 'make menuconfig' requires the ncurses libraries.
 *** 
 *** Install ncurses (ncurses-devel) and try again.
 *** 

make[1]: *** [scripts/kconfig/dochecklxdialog] 错误 1
make: *** [menuconfig] 错误 2

这个错误的解决办法是按照需要安装ncurses-devel的库,但是,通过命令

sudo apt-get install libncurses5-dev

 


 安装完毕之后再运行make menuconfig就可以了。


目前还在配置中,还没有进一步的进展,参考一片文档http://www.doc88.com/p-716936409366.html




高工
2014-04-25 20:47:33     打赏
10楼
我的老电脑也快跑不动了,想着下一件大事就是换电脑

共56条 1/6 1 2 3 4 5 6 ›| 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]