Arm学习

来源:互联网 发布:男士商务双肩包 知乎 编辑:程序博客网 时间:2024/06/06 01:42

怎么学ARM

如果你想学好ARM就得先熟悉整一个linux系统的操作以及架构 待你熟悉之后必须学好C语言还有ui编程(个人推荐QT)一切具备之后,你就开始学习ARM的开发板(新手从mini2440或者三星2440)初学的要懂 交叉编译连 uboot 等 然后往深层次的是驱动编程书籍有很多如果推荐的话 ARM架构 驱动编程  unix环境高级编程 等书籍都要看!!!!而且要吃透 

查看Linux系统架构类型的5条常用命令

1. uname 命令


uname -a 命令可以直接显示 Linux 系统架构的命令,安几乎可以工作在所有 Linux/Unix 系统当中。

–kernel-name内核名称

nodeName 属性

 根据节点的类型返回其名称 

    -a或--all:显示全部的信息;     -m或--machine:显示电脑类型;    -n或-nodename:显示在网络上的主机名称;        -r或--release:显示操作系统的发行编号;        -s或--sysname:显示操作系统名称;        -v:显示操作系统的版本;        -p或--processor:输出处理器类型或"unknown"        -i或--hardware-platform:        输出硬件平台或"unknown";         -o或--operating-system:输出操作系统名称;         --help:显示帮助;        --version:显示版本信息。

linux内核版本的分类

  #41~16.04.1-Ubuntu SMP Fri Oct 6 22:42:59 UTC 2017

命令: uname -v

Linux内核版本有两种:稳定版和开发版 ,Linux内核版本号由3组数字组成:第一个组数字.第二组数字.第三组数字第一个组数字:目前发布的内核主版本。第二个组数字:偶数表示稳定版本;奇数表示开发中版本。第三个组数字:错误修补的次数。

dpkg

dpkg 的命令可用于查看 Debian/ Ubuntu 操作系统是 32 位还是 64 位,此命令只适用于基于 Debian  Ubuntu  Linux 发行版。在终端中执行如下命令:dpkg --print-architecture
如果当前 Linux 是 64 位则输出 amd64,是 32 位则会输出 i386。

getconf LONG_BIT

getconf 命令主要用于显示系统变量配置,我们也可使用如下参数来查看 Linux 系统架构:getconf LONG_BIT

4. arch 命令

arch 命令主要用于显示操作系统架构类型,与 uname -m 命令非常类似。如果输出 x86_64 则表示为 64 位系统,如果输出 i686 或 i386 则表示为 32 位系统。

5.file

File 命令可以配合 /sbin/init 这个特殊参数来查看系统架构类型(/sbin/init 在 Ubuntu 15.10 里面是链接到/lib/systemd/systemd 的):file /sbin/init

Linux系统构架

内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。

linux系统构架

``` 内核是操作系统的核心,具有很多最基本功能,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。   Linux 内核由如下几部分组成:内存管理、进程管理、设备驱动程序、文件系统和网络管理(TCP/IP)等。  ```

这里写图片描述

系统调用接口:SCI 层提供了某些机制执行从用户空间到内核的函数调用。这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。
  1. 内存管理

    对任何一台计算机而言,其内存以及其它资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux  采用了称为“虚拟内存”的内存管理方式。Linux  将内存划分为容易处理的“内存页”(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。

      不过内存管理要管理的可不止 4KB 缓冲区。Linux 提供了对 4KB 缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4KB 缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。
       为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在 ./linux/mm 中找到。

2 .进程管理
进程实际是某特定应用程序的一个运行实体。在 Linux 系统中,能够同时运行多个进程,Linux 通过在短的时间间隔内轮流运行这些进程而实现“多任务”。这一短的时间间隔称为“时间片”,让进程轮流运行的方法称为“进程调度” ,完成调度的程序称为调度程序。

   进程调度控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。     通过多任务机制,每个进程可认为只有自己独占计算机,从而简化程序的编写。每个进程有自己单独的地址空间,并且只能由这一进程访问,这样,操作系统避免了进程之间的互相干扰以及“坏”程序对系统可能造成的危害。 为了完成某特定任务,有时需要综合两个程序的功能,例如一个程序输出文本,而另一个程序对文本进行排序。为此,操作系统还提供进程间的通讯机制来帮助完成这样的任务。Linux 中常见的进程间通讯机制有信号、管道、共享内存、信号量和套接字等。    内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface [POSⅨ] 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSⅨ 机制)。
  1. 文件系统
    和 DOS 等操作系统不同,Linux 操作系统中单独的文件系统并不是由驱动器号或驱动器名称(如 A: 或 C: 等)来标识的。相反,和 UNIX 操作系统一样,Linux 操作系统将独立的文件系统组合成了一个层次化的树形结构,并且由一个单独的实体代表这一文件系统。Linux 将新的文件系统通过一个称为“挂装”或“挂上”的操作将其挂装到某个目录上,从而让不同的文件系统结合成为一个整体。Linux 操作系统的一个重要特点是它支持许多不同类型的文件系统。Linux 中最普遍使用的文件系统是 Ext2,它也是 Linux 土生土长的文件系统。但 Linux 也能够支持 FAT、VFAT、FAT32、MINIX 等不同类型的文件系统,从而可以方便地和其它操作系统交换数据。由于 Linux 支持许多不同的文件系统,并且将它们组织成了一个统一的虚拟文件系统.

    虚拟文件系统(VirtualFileSystem,VFS):隐藏了各种硬件的具体细节,把文件系统操作和不同文件系统的具体实现细节分离了开来,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。

    虚拟文件系统(VFS)是 Linux 内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层。即VFS 在用户和文件系统之间提供了一个交换层。

什么是SCI
嵌入式Linux-系统调用SCI

一,SCI简介
System Call Interface(SCI) 是用户空间访问内核空间的一个接口。
在不同的CPU架构下,SCI陷入内核的方法是不同的。比如x86下是通过0x80软中断来陷入内核的,而ARM下是通过swi(software interrupt)指令来陷入内核的,但是实质都是差不多的。

二,SCI的原理
我们都在系统中执行过SCI,比如read,write,但是你知道它的原理吗,你知道如何向Linux中添加一个新的系统调用吗?请看后文。

SCI原理简介(entry-common.S):
在指定系统调用read时,swi指令会将read的系统调用编号存到R7寄存器中,然后在内核空间利用R7中的编号在系统调用表中查找read对应的sys_read函数,进而执行。

其中比较重要的是系统调用表(Sys Call Table), 它在/arch/arm/kernel/calls.h中,我们填写新的系统调用需要修改这个文件。
详情请见: http://m.blog.csdn.net/qq_22075977/article/details/54708809

这里写图片描述

在 VFS 上面,是对诸如 openclosereadwrite 之类的函数的一个通用 API 抽象。在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。它们是给定文件系统(超过 50 个)的插件。文件系统的源代码可以在 ./linux/fs 中找到。  文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。      因此,用户和进程不需要知道文件所在的文件系统类型,而只需要象使用 Ext2  文件系统中的文件一样使用它们。
4. 设备驱动程序       设备驱动程序是 Linux  内核的主要部分。和操作系统的其它部分类似,设备驱动程序运行在高特权级的处理器环境中,从而可以直接对硬件进行操作,但正因为如此,任何一个设备驱动程序的错误都可能导致操作系统的崩溃。设备驱动程序实际控制操作系统和硬件设备之间的交互。设备驱动程序提供一组操作系统可理解的抽象接口完成和操作系统之间的交互,而与硬件相关的具体操作细节由设备驱动程序完成。一般而言,设备驱动程序和设备的控制芯片有关,例如,如果计算机硬盘是 SCSI  硬盘,则需要使用 SCSI  驱动程序,而不是 IDE 驱动程序。
5.网络接口(NET)          提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。众所周知,TCP/IP  协议是 Internet  的标准协议,同时也是事实上的工业标准。Linux  的网络实现支持 BSD 套接字,支持全部的TCP/IP协议。Linux内核的网络部分由BSD套接字、网络协议层和网络设备驱动程序组成。     网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。
2 . linux shellshell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,是一个命令解释器。另外,shell编程语言具有普通编程语言的很多特点,用这种编程语言编写的shell程序与其他应用程序具有同样的效果。目前主要有下列版本的shell1.Bourne Shell:是贝尔实验室开发的。  2.BASH:是GNU的Bourne Again Shell,是GNU操作系统上默认的shell,大部分linux的发行套件使用的都是这种shell3.Korn Shell:是对Bourne SHell的发展,在大部分内容上与Bourne Shell兼容。    4.C Shell:是SUN公司Shell的BSD版本。

3 . linux 文件系统

文件系统是文件存放在磁盘等存储设备上的组织方法。Linux系统能支持多种目前流行的文件系统,如EXT2、 EXT3、 FAT、 FAT32、 VFAT和ISO9660。

3.1 文件类型

Linux下面的文件类型主要有:
1) 普通文件:C语言元代码、SHELL脚本、二进制的可执行文件等。分为纯文本和二进制。
2) 目录文件:目录,存储文件的唯一地方。
3) 链接文件:指向同一个文件或目录的的文件。
4) 设备文件:与系统外设相关的,通常在/dev下面。分为块设备和字符设备。

5)管道(FIFO)文件 : 提供进程建通信的一种方式
6)套接字(socket) 文件: 该文件类型与网络通信有关

可以通过ls –l, file, stat几个命令来查看文件的类型等相关信息。

3.2 Linux目录
  文件结构是文件存放在磁盘等存贮设备上的组织方法。主要体现在对文件和目录的组织上。
  目录提供了管理文件的一个方便而有效的途径。

  Linux使用标准的目录结构,在安装的时候,安装程序就已经为用户创建了文件系统和完整而固定的目录组成形式,并指定了每个目录的作用和其中的文件类型。

  完整的目录树可划分为小的部分,这些小部分又可以单独存放在自己的磁盘或分区上。这样,相对稳定的部分和经常变化的部分可单独存放在不同的分区中,从而方便备份或系统管理。目录树的主要部分有 root、/usr、/var、/home  等(图2) 。这样的布局可方便在 Linux 计算机之间共享文件系统的某些部分。 

这里写图片描述

3.3 Linux磁盘分区

一、主分区,扩展分区和逻辑分区:  

linux分区不同于windows,硬盘和硬盘分区在Linux都表示为设备.硬盘分区一共有三种:主分区,扩展分区和逻辑分区。   硬盘的分区主要分为主分区(Primary Partion)和扩展分区(Extension Partion)两种,主分区和扩展分区的数目之和不能大于四个。主分区(Primary Partion):可以马上被使用但不能再分区。扩展分区(Extension Partion):必须再进行分区后才能使用,也就是说它必须还要进行二次分区。逻辑分区((Logical Partion)):由扩展分区建立起来的分区。逻辑分区没有数量上限制。扩展分区只不过是逻辑分区的“容器”,实际上只有主分区和逻辑分区进行数据存储。 

二、Linux下硬盘分区的标识

硬盘分区的标识一般使用/dev/hd[a-z]X或者/dev/sd[a-z]X来标识,其中[a-z]代表硬盘号,X代表硬盘内的分区号。整块硬盘分区的块号标识:Linux下用hda、hdb、sda、sdb 等来标识不同的硬盘;其中:IDE接口硬盘:表示为/dev/hda1、/dev/hdb ...;SCSI 接口的硬盘、SATA接口的硬盘表示为/dev/sda、/dev/sdb ... ... ;硬盘内的分区:如果X的值是1到4,表示硬盘的主分区(包含扩展分区);逻辑分区从是从5开始的,比如/dev/hda5肯定是逻辑分区了;例如:用hda1、hda2、 hda5、hda6 来标识不同的分区。其中,字母a 代表第一块硬盘,b代表第二块硬盘,依次类推。而数字1 代表一块硬盘的第一个分区、2 代表第二个分区,依次类推。1 到4 对应的是主分区(Primary Partition)或扩展分区(Extension Partition)。从5开始,对应的都是硬盘的逻辑分区(Logical Partition)。一块硬盘即使只有一个主分区,逻辑分区也是从5开始编号的,这点应特别注意。总结:一个硬盘分区首先要大确认在哪个硬盘,然后再确认它所在硬盘内的哪个分区。
原创粉丝点击