linux底层是0和1_互斥锁和自旋锁,linux自旋锁底层实现 - CSDN
精华内容
参与话题
  • Linux文件系统底层实现

    千次阅读 2016-11-24 22:23:40
    1、引言 Linux文件管理从用户的层面介绍了Linux管理文件的方式。Linux有一个树状结构来组织文件。树的顶端为根目录(/),节点为目录,而末端的叶子为包含数据的文件。当我们给出一个文件的完整路径时,我们从根...

    1、引言

    Linux文件管理从用户的层面介绍了Linux管理文件的方式。Linux有一个树状结构来组织文件。树的顶端为根目录(/),节点为目录,而末端的叶子为包含数据的文件。当我们给出一个文件的完整路径时,我们从根目录出发,经过沿途各个目录,最终到达文件。

    我们可以对文件进行许多操作,比如打开和读写。在Linux文件管理相关命令中,我们看到许多对文件进行操作的命令。它们大都基于对文件的打开和读写操作。比如cat可以打开文件,读取数据,最后在终端显示:

    $cat test.txt
    • 1
    • 1

    对于Linux下的程序员来说,了解文件系统的底层组织方式,是深入进行系统编程所必备的。即使是普通的Linux用户,也可以根据相关的内容,设计出更好的系统维护方案。


    操作系统的很多核心组件都是相互关联的,比如虚拟内存管理,物理内存管理,文件系统,缓存系统,IO,设备管理等等,都要放在一起来看才能从整体上理解各个模块到底是如何交互和工作的。这个系列的目的也就是从整体上来理解计算机底层硬件和操作系统的一些重要的组件是如何工作的,从而来指导应用层的开发。这篇讲讲文件系统的重要概念,为后面的IO系统做铺垫。

    文件系统主要有三类 
    1. 位于磁盘的文件系统,在物理磁盘上存储文件,比如NTFS, FAT, ext3, ext4 
    2. 虚拟文件系统,在内核中生成,没有物理的存储介质 
    3. 网络文件系统,位于远程主机上的文件系统,通过网络访问

    一个操作系统可以支持多种底层不同的文件系统,为了给内核和用户进程提供统一的文件系统视图,Linux在用户进程和底层文件系统之间加入了一个抽象层,即虚拟文件系统(Virtual File System, VFS),进程所有的文件操作都通过VFS,由VFS来适配各种底层不同的文件系统,完成实际的文件操作。 
    通俗的说,VFS就是定义了一个通用文件系统的接口层和适配层,一方面为用户进程提供了一组统一的访问文件,目录和其他对象的统一方法,另一方面又要和不同的底层文件系统进行适配。 
    这里写图片描述

    VFS采用了面向对象的思路来设计它的核心组件,只是VFS是用C写的,没有对象的语法,只能用struct来表示。我们按照面向对象的思路来理解VFS。 
    它有4个主要的对象类型: 
    1. 超级块对象,代表一个具体的已安装(mount)的文件系统 
    2. inode对象,表示一个具体的文件 
    3. 目录项对象,代表一个目录项,是路径的一部分,比如一个路径 /home/foo/hello.txt,那么目录项有home, foo, hello.txt 
    4. 打开文件对象,表示一个打开的文件,有读写的pos位置,也叫文件句柄,说白了就是open系统调用在内核创建的一个数据结构

    VFS给每个对象都定义了一组操作对象(函数指针),给出了这些操作的默认实现,底层不同的文件系统可以重写(override)VFS的操作函数来给出自己的具体操作实现,也可以复用VFS的默认实现。实际情况是底层文件系统部分操作由自己单独实现,部分复用了VFS的默认实现。 
    操作对象有: 
    1. super_operations对象,针对超级块对象,包含了内核对特定文件系统所能调用的方法,比如wirte_inode(),sync_fs()等 
    2. inode_operations对象,针对inode对象,包含了内核对特定文件所能调用的方法,比如create(), link()等 
    3. dentry_operations对象(directory entry),针对目录项对象,包含了内核对特定目录所能调用的方法,比如d_compare()和d_delete()方法等 
    4. file_operations对象,针对打开文件对象,包含了进程对打开文件对象所能调用的方法,比如read()和write()等

    文件系统说白了就是文件内容和存储系统对应的块的映射关系,是来管理文件的存储的。inode-block结构把文件分为了两部分,inode表示元数据,block表示存储文件内容的具体的逻辑块。VFS没有用单独的对象来表示block,block的属性在超级块和inode块中包含了。

    2、存储设备分区

    文件系统的最终目的是把大量数据有组织的放入持久性(persistant)的存储设备中,比如硬盘和磁盘。这些存储设备与内存不同。它们的存储能力具有持久性,不会因为断电而消失;存储量大,但读取速度慢。

    观察常见存储设备。最开始的区域是MBR,用于Linux开机启动(参考Linux开机启动)。剩余的空间可能分成数个分区(partition)。每个分区有一个相关的分区表(Partition table),记录分区的相关信息。这个分区表是储存在分区之外的。分区表说明了对应分区的起始位置和分区的大小。

    这里写图片描述

    我们在Windows系统常常看到C分区、D分区等。Linux系统下也可以有多个分区,但都被挂载在同一个文件系统树上。

    数据被存入到某个分区中。一个典型的Linux分区(partition)包含有下面各个部分:

    这里写图片描述

    分区的第一个部分是启动区(Boot block),它主要是为计算机开机服务的。Linux开机启动后,会首先载入MBR,随后MBR从某个硬盘的启动区加载程序。该程序负责进一步的操作系统的加载和启动。为了方便管理,即使某个分区中没有安装操作系统,Linux也会在该分区预留启动区。

    启动区之后的是超级区(Super block)。它存储有文件系统的相关信息,包括文件系统的类型,inode的数目,数据块的数目。

    随后是多个inodes,它们是实现文件存储的关键。在Linux系统中,一个文件可以分成几个数据块存储,就好像是分散在各地的龙珠一样。为了顺利的收集齐龙珠,我们需要一个“雷达”的指引:该文件对应的inode。每个文件对应一个inode。这个inode中包含多个指针,指向属于该文件各个数据块。当操作系统需要读取文件时,只需要对应inode的”地图”,收集起分散的数据块,就可以收获我们的文件了。


    最后一部分,就是真正储存数据的数据块们(data blocks)了。

    3、inode简介

    上面我们看到了存储设备的宏观结构。我们要深入到分区的结构,特别是文件在分区中的存储方式。

    文件是文件系统对数据的分割单元。文件系统用目录来组织文件,赋予文件以上下分级的结构。在硬盘上实现这一分级结构的关键,是使用inode来虚拟普通文件和目录文件对象。

    在Linux文件管理中,我们知道,一个文件除了自身的数据之外,还有一个附属信息,即文件的元数据(metadata)。这个元数据用于记录文件的许多信息,比如文件大小,拥有人,所属的组,修改日期等等。元数据并不包含在文件的数据中,而是由操作系统维护的。事实上,这个所谓的元数据就包含在inode中。我们可以用$ls -l filename来查看这些元数据。正如我们上面看到的,inode所占据的区域与数据块的区域不同。每个inode有一个唯一的整数编号(inode number)表示。

    在保存元数据,inode是“文件”从抽象到具体的关键。正如上一节中提到的,inode储存由一些指针,这些指针指向存储设备中的一些数据块,文件的内容就储存在这些数据块中。当Linux想要打开一个文件时,只需要找到文件对应的inode,然后沿着指针,将所有的数据块收集起来,就可以在内存中组成一个文件的数据了。

    这里写图片描述

    数据块在1, 32, 0, …

    inode并不是组织文件的唯一方式。最简单的组织文件的方法,是把文件依次顺序的放入存储设备,DVD就采取了类似的方式。但如果有删除操作,删除造成的空余空间夹杂在正常文件之间,很难利用和管理。

    复杂的方式可以使用链表,每个数据块都有一个指针,指向属于同一文件的下一个数据块。这样的好处是可以利用零散的空余空间,坏处是对文件的操作必须按照线性方式进行。如果想随机存取,那么必须遍历链表,直到目标位置。由于这一遍历不是在内存进行,所以速度很慢。

    FAT系统是将上面链表的指针取出,放入到内存的一个数组中。这样,FAT可以根据内存的索引,迅速的找到一个文件。这样做的主要问题是,索引数组的大小与数据块的总数相同。因此,存储设备很大的话,这个索引数组会比较大。

    inode既可以充分利用空间,在内存占据空间不与存储设备相关,解决了上面的问题。但inode也有自己的问题。每个inode能够存储的数据块指针总数是固定的。如果一个文件需要的数据块超过这一总数,inode需要额外的空间来存储多出来的指针。

    4、inode示例

    在Linux中,我们通过解析路径,根据沿途的目录文件来找到某个文件。目录中的条目除了所包含的文件名,还有对应的inode编号。当我们输入$cat /var/test.txt时,Linux将在根目录文件中找到var这个目录文件的inode编号,然后根据inode合成var的数据。随后,根据var中的记录,找到text.txt的inode编号,沿着inode中的指针,收集数据块,合成text.txt的数据。整个过程中,我们参考了三个inode:根目录文件,var目录文件,text.txt文件的inodes。

    在Linux下,可以使用$stat filename,来查询某个文件对应的inode编号。

    这里写图片描述 
    在存储设备中实际上存储为:

    这里写图片描述

    当我们读取一个文件时,实际上是在目录中找到了这个文件的inode编号,然后根据inode的指针,把数据块组合起来,放入内存供进一步的处理。当我们写入一个文件时,是分配一个空白inode给该文件,将其inode编号记入该文件所属的目录,然后选取空白的数据块,让inode的指针指像这些数据块,并放入内存中的数据。

    5、文件共享

    在Linux的进程中,当我们打开一个文件时,返回的是一个文件描述符。这个文件描述符是一个数组的下标,对应数组元素为一个指针。有趣的是,这个指针并没有直接指向文件的inode,而是指向了一个文件表格,再通过该表格,指向加载到内存中的目标文件的inode。如下图,一个进程打开了两个文件。

    这里写图片描述

    可以看到,每个文件表格中记录了文件打开的状态(status flags),比如只读,写入等,还记录了每个文件的当前读写位置(offset)。当有两个进程打开同一个文件时,可以有两个文件表格,每个文件表格对应的打开状态和当前位置不同,从而支持一些文件共享的操作,比如同时读取。

    要注意的是进程fork之后的情况,子进程将只复制文件描述符的数组,而和父进程共享内核维护的文件表格和inode。此时要特别小心程序的编写。

    展开全文
  • 《Android底层开发技术》学习总结

    万次阅读 2013-10-23 11:18:54
    《Android底层开发技术实战详解——内核、移植驱动》学习总结

    《Android底层开发技术实战详解——内核、移植和驱动》学习总结
    整本书看的比较粗,了解个大概,以后需要的时候,可以针对性的学习!

    Android与Linux的关系
    Linux Kernel的版权是GPL(General Public License),它要求对源代码的任何修改都必须开源。
    Android的Kernel采用的GPL,但Android采用ASL(Apache Software License),不必开源。
    Google特意修改了Kernel,将某些功能转移到上层HAL(Hardware Abstraction Layer)中。
    因此,从2010年2月,即Linux2.6.33起,Android Kernel已经从Linux Kernel中删除。

    三种内核
    1、Goldfish,它是由Google提供的一种虚拟的ARM处理器,在Android的仿真环境中使用。
    2、MSM(Mobile Station Modem),它是由美国高通(Qualcomm)公司提供的ARM处理器芯片组。
    3、OMAP(Open Multimedia Application Platform),它是由美国德州仪器(Texas Instruments,简称TI)公司提供。

    三类驱动程序
    1、字符设备
    2、块设备
    3、网络设备

    两种驱动类型
    1、专用驱动,非Linux标准,纯软件
    2、设备驱动

    Android专用驱动
    1、Staging,分期,分段,脚手架
    Binder,进程间通信
    Logger,日志系统
    LowMemoryKiller,低内存处理
    Timed Output,定时输出
    Timed GPIO,定时GPIO
    Ram Console,内存控制台
    2、WakeLock和early_suspend,休眠,唤醒
    3、Ashmem(Alocate SHare MEMory),内存映射与共享
    4、Pmem(Physical MEMory),物理内存共享,不一定连续
    5、Alarm,硬件时钟
    6、USB Gadget,USB设备驱动
    7、Paranoid,网络驱动

    Android设备驱动
    FrameBuffer,屏幕显示
    Keyboard,键盘
    RTC(Real Time Clock),实时时钟
    TTY(TeleTYpe),终端,串口
    NandFlash,硬盘,FLASH存储器
    MMC(MultiMedia Card),存储卡
    Battery,电池

    显示系统(LCD,VGA)
    FrameBuffer
    SurfaceFlinger
    Gralloc

    输入系统(键盘,触摸屏,轨迹球)
    事件:MotionEvent,KeyEvent
    配置文件:kl=KeyLayout,kcm=KeyCharacterMap

    音频系统
    AudioFlinger
    ALSA(Advanced Linux Sound Architecture),MIDI

    视频输出系统
    主显示区,RGB;额外显示区,YUV
    Overlay(FrameBuffer,V4L2=Video for Linux 2)

    多媒体框架
    OpenMAX,底层驱动
    OpenCORE,复杂,稳定
    StageFright,简单,后入

    照相机系统
    V4L2=Video for Linux 2
    Camera HAL

    电话系统(通话Call,短信SMS,数据连接,SIM卡,电话本)
    MODEM调制(Modulator)解调器(Demodulator)
    RIL(Radio Interface Layer),AT命令

    其他
    WIFI,Bluetooth蓝牙,GPS(Global Positioning System)
    Alarm报警器,Light光,Battery电池
    Vibrator振动器
    Sensor传感器

    展开全文
  • 1.Linux底层性能分析——概述及监控架构图  从蛤蟆所经历的事情来看,很多生产业务其实并不是真的需要底层级别的性能分析。因为生产中基本上不会在乎多个1%或少个1%的性能,而更关注在乎的是产品的稳定性。  ...

    1.Linux底层性能分析——概述及监控架构图

                      从蛤蟆所经历的事情来看,很多生产业务其实并不是真的需要底层级别的性能分析。因为生产中基本上不会在乎多个1%或少个1%的性能,而更关注在乎的是产品的稳定性。

                      那么底层性能分析用于何处?

                      第一是,底层软件开发需要,我们需要计算每个调用消耗的时间、资源等。

                      第二是,benchmark测试,很多发布的指标成败就在这1%甚至是1‰。

                      如何进行底层性能分析呢?后续蛤蟆会慢慢记录之。让小伙伴们有所收获。

                      那么先附上一张接地气的监控架构图如下:

     

     

     

     

     

     

    展开全文
  • linux-malloc底层实现原理

    万次阅读 多人点赞 2016-06-15 14:02:39
    本文大致讲解一下linux下malloc的底层实现原理。 首先malloc肯定是从堆中分配内存,而堆又在用户空间中占据什么位置?通过下面这张图可以看出来: 很明显是32位系统,寻址空间是4G,linux系统下0-3G是用户模式,3-...

    本文大致讲解一下linux下malloc的底层实现原理。

    首先malloc肯定是从堆中分配内存,而堆又在用户空间中占据什么位置?通过下面这张图可以看出来:


    很明显是32位系统,寻址空间是4G,linux系统下0-3G是用户模式,3-4G是内核模式。而在用户模式下又分为代码段、数据段、.bss段、堆、栈。各个segment所含内容在图中有具体说明。

    其中bss段:存放未初始化的全局变量和局部静态变量。数据段:存放已经初始化的全局变量和局部静态变量。至于局部变量存放在栈中。


    可以看到heap段位于bss下方,而其中有个重要的标志:program breakLinux维护一个break指针,这个指针指向堆空间的某个地址。从堆起始地址到break之间的地址空间为映射好的,可以供进程访问;而从break往上,是未映射的地址空间,如果访问这段空间则程序会报错。我们用malloc进行内存分配就是从break往上进行的。

    进程所面对的虚拟内存地址空间,只有按页映射到物理内存地址,才能真正使用。受物理存储容量限制,整个堆虚拟内存空间不可能全部映射到实际的物理内存。Linux对堆的管理示意如下:

    Linux进程堆管理

      

    获取了break地址,也就是内存申请的初始地址,下面是malloc的整体实现方案

    malloc 函数的实质是它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。 调用 malloc()函数时,它沿着连接表寻找一个大到足以满足用户请求所需要的内存块。 然后,将该内存块一分为二(一块的大小与用户申请的大小相等,另一块的大小就是剩下来的字节)。 接下来,将分配给用户的那块内存存储区域传给用户,并将剩下的那块(如果有的话)返回到连接表上。 调用 free 函数时,它将用户释放的内存块连接到空闲链表上。 到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段, 那么空闲链表上可能没有可以满足用户要求的片段了。于是,malloc()函数请求延时,并开始在空闲链表上检查各内存片段,对它们进行内存整理,将相邻的小空闲块合并成较大的内存块。

    1、malloc分配内存前的初始化:

    malloc_init 是初始化内存分配程序的函数。 它完成以下三个目的:将分配程序标识为已经初始化[3],找到操作系统中最后一个有效的内存地址,然后建立起指向需要管理的内存的指针。这里需要用到三个全局变量。

     malloc_init 分配程序的全局变量

    int has_initialized = 0; /* 初始化标记 */

    void *managed_memory_start; /* 管理内存起始地址 */

    void *last_valid_address; /* 操作系统的最后一个有效地址*/

    被映射的内存边界(操作系统最后一个有效地址)常被称为系统中断点或者当前中断点。为了指出当前系统中断点,必须使用 sbrk(0) 函数。 sbrk 函数根据参数中给出的字节数移动当前系统中断点,然后返回新的系统中断点。 使用参数 0 只是返回当前中断点。 这里给出 malloc()初始化代码,它将找到当前中断点并初始化所需的变量:

    Linux通过brk和sbrk系统调用操作break指针。两个系统调用的原型如下:

    int brk(void *addr);
    void *sbrk(intptr_t increment);

    brk将break指针直接设置为某个地址,而sbrk将break从当前位置移动increment所指定的增量。brk在执行成功时返回0,否则返回-1并设置errno为ENOMEM;sbrk成功时返回break移动之前所指向的地址,否则返回(void *)-1。如果将increment设置为0,则可以获得当前break的地址。

    2、下为malloc_init()代码:可以看到使用sbrk(0)来获得break地址。

    #include <unistd.h> /*sbrk 函数所在的头文件 */
    void malloc_init()
    {
    last_valid_address = sbrk(0); /* 用 sbrk 函数在操作系统中
    取得最后一个有效地址 */
    managed_memory_start = last_valid_address; /* 将 最 后 一 个
    有效地址作为管理内存的起始地址 */
    has_initialized = 1; /* 初始化成功标记 */
    }

    3、内存块的获取

    所要申请的内存是由多个内存块构成的链表。

    a、内存块的大致结构:每个块由meta区和数据区组成,meta区记录数据块的元信息(数据区大小、空闲标志位、指针等等),数据区是真实分配的内存区域,并且数据区的第一个字节地址即为malloc返回的地址。

    typedef struct s_block *t_block;
    struct s_block {
    size_t size; /* 数据区大小 */
    t_block next; /* 指向下个块的指针 */
    int free; /* 是否是空闲块 */
    int padding; /* 填充4字节,保证meta块长度为8的倍数 */
    char data[1] /* 这是一个虚拟字段,表示数据块的第一个字节,长度不应计入meta */
    };
    现在,为了完全地管理内存,我们需要能够追踪要分配和回收哪些内存。在对内存块进行了 free 调用之后,我们需要做的是诸如将它们标记为未被使用的等事情,并且,在调用 malloc 时,我们要能够定位未被使用的内存块。因此, malloc 返回的每块内存的起始处首先要有这个结构:

    struct mem_control_block
    {	
    	int is_available;//是否空闲
    	int size; //内存块大小
    };


    b、寻找合适的block

    现在考虑如何在block链中查找合适的block。一般来说有两种查找算法:

    • First fit:从头开始,使用第一个数据区大小大于要求size的块所谓此次分配的块
    • Best fit:从头开始,遍历所有块,使用数据区大小大于size且差值最小的块作为此次分配的块

      两种方法各有千秋,best fit具有较高的内存使用率(payload较高),而first fit具有更好的运行效率。

    find_block从frist_block开始,查找第一个符合要求的block并返回block起始地址,如果找不到这返回NULL。这里在遍历时会更新一个叫last的指针,这个指针始终指向当前遍历的block。这是为了如果找不到合适的block而开辟新block使用的。

    c、如果现有block都不能满足size的要求,则需要在链表最后开辟一个新的block。下为利用sbrk()创建新的block示意代码:

    #define BLOCK_SIZE 24 /* 由于存在虚拟的data字段,sizeof不能正确计算meta长度,这里手工设置 */
     
    t_block extend_heap(t_block last, size_t s) {
    t_block b;
    b = sbrk(0);
    if(sbrk(BLOCK_SIZE + s) == (void *)-1)
    return NULL;
    b->size = s;
    b->next = NULL;
    if(last)
    last->next = b;
    b->free = 0;
    return b;
    }

    4、内存分配,下为内存分配代码

    void *malloc(long numbytes)
    {
    	void *current_location;
    	struct mem_control_block *current_location_mcb;
    	void *memory_location;
    	if(! has_initialized)
    	{
    		malloc_init();
    	}
    	numbytes = numbytes + sizeof(struct mem_control_block);
    	memory_location = 0;
    	current_location = managed_memory_start;
    	while(current_location ! = last_valid_address)
    	{
    		current_location_mcb =(struct mem_control_block *)current_location;
    		if(current_location_mcb->is_available)
    		{
    			if(current_location_mcb->size >= numbytes)
    			{
    				current_location_mcb->is_available = 0;
    				memory_location = current_location;
    				break;
    			}
    		}
    		current_location = current_location +current_location_mcb->size;
    	}
    	if(! memory_location)
    	{
    		sbrk(numbytes);
    		memory_location = last_valid_address;
    		last_valid_address = last_valid_address + numbytes;
    		current_location_mcb = memory_location;
    		current_location_mcb->is_available = 0;
    		current_location_mcb->size = numbytes;
    	}
    	memory_location = memory_location + sizeof (struct mem_control_block);
    	return memory_location;
    }
    








    展开全文
  • Mac OS和Linux的区别

    万次阅读 2013-07-12 11:55:25
    关于“学习与使用Mac OS和Linux的区别”  首先,对于使用mac和linux两种不同的系统来做事情,最重要的差别并不是系统差异,而是你将会从不同的环境中养成不同的思维方式  在mac下时间呆长了,当你需要使用某种...
  • Android系统底层架构【译】

    万次阅读 2015-04-09 09:14:43
    Android系统底层架构  设备移植  Android提供了设备移植支持方面有较大的自由度,可以制定自有的设备规范驱动。通过硬件抽象层(HAL-Hardware Abstraction Layer),可以在底层硬件驱动上层平台之间建立...
  • macOS Linux 的内核区别

    万次阅读 2018-07-31 11:03:10
    有些人可能会认为 macOS Linux 内核之间存在相似之处,因为它们可以处理类似的命令类似的软件。有些人甚至认为苹果公司的 macOS 是基于 Linux 的。事实上是,两个内核有着截然不同的历史特征。今天,我们来看...
  • Android底层调取摄像头方案

    万次阅读 2012-08-21 15:18:17
    Android底层调取摄像头方案 背景: 公司致力于3D裸眼显示的,说的通俗点就是不带3D眼镜也能看3D效果,但是裸眼有个问题:当眼镜调整到一定角度达到理想的效果后,如果头部移动画面将发虚,为了避免此问题研发了...
  • 树莓派与嵌入式开发的关系

    万次阅读 2017-07-18 22:40:54
    树莓派是一款基于Linux系统的单板机电脑。它由英国的树莓派基金会所开发,目的是以低价硬件及自由软件刺激在学校的基本的计算机科学教育。树莓派被赋予的希望是,能够帮助全世界的孩子学习编程,并能够了解计算机是...
  • Linux系统的分类

    万次阅读 2017-11-04 20:46:42
    当前市面上流行的Linux系统主要分为ReadhatDebian两大系列,而android底层直接用linux原版内核。 一、Redhat系列 Redhat:主要是服务器型Linux,商用收费;RHEL是Red Hat Enterprise Linux的缩写。 CentOS:...
  • RTLinux(Real-TimeLinux):是由新墨西哥大学(NMT)开发,是可嵌入系统并支持硬实时特性,部分支持POSIX.1b标准。其内核结构系统特点是实现了一个小的实时核心,并“架空”了Linux内核,而实时任务作为可加载模块...
  • Linux:信号的底层实现机制

    千次阅读 2018-11-14 21:33:54
    1.信号:系统先定义好的某些特定的事件,可以被发生,也可以被接受。发生接受的主体都是进程。 2.信号机制:系统预先定义好的一些事件 3.进程对信号的响应方式:当进程发生时,用户可以要求进程以以下三种方式...
  • Android内核和Linux内核的区别

    万次阅读 2016-12-22 20:12:47
    1.Android系统层面的底层Linux,并且在中间加上了一个叫做Dalvik的Java虚拟机,从表面层看是Android运行库。每个Android应用都运行在自己的进程上,享有Dalvik虚拟机为它分配的专有实例。为了支持多个虚拟机在同一...
  • 嵌入式软件工程师岗位要求

    万次阅读 多人点赞 2018-04-28 01:02:21
    1.嵌入式上层的软件应用开发需要:精通嵌入式Linux C语言编程、嵌入式Linux C语言数据结构、嵌入式Linux项目开发流程、嵌入式 Linux并发程序设计、嵌入式 Linux应用编程、嵌入式 Linux网络编程、嵌入式数据库开发;...
  • 浅析Linux从API调用到底层驱动的过程

    千次阅读 2018-11-20 09:45:02
    本篇只是嵌入式Linux的开篇,仅仅通过如下结构来简单说说调用流程。  分析:应用层调用open()函数打开鼠标文件时的调用过程。  当用户通过API中的open()函数试图去打开一个鼠标文件时,open()函数会有一个返回值...
  • 最近在ARM上的Linux进行开发,需要将Windows下编写的C程序移植到Linux上去,其中需要将底层的SPI驱动实现,以及上层的Socket通信改写,其中应用程序也需要改变一些,整个过程中,让程序顺利跑起来没花费大的力气,...
  • 根据linux操作系统定义,底层的文件的write()方法是会进行缓存的 当用python或者java操作文件时,尤其是需要又读又写同一个文件的,比如: 我需要从头先读这个文件f1,同时往这个f1 又需要向末尾添加写,同时...
  • 主要是自己使用Linux系统时一些常用操作以及对自己之前一直不理解的new malloc的分析
  • Android 开发之 ---- 底层驱动开发(一)

    万次阅读 多人点赞 2012-05-07 10:48:48
    驱动概述  说到 android 驱动是离不开 Linux 驱动的。Android 内核采用的是 Linux2.6 内核 (最近Linux 3.3 已经包含了一些 Android 代码)。...android 驱动 主要分两种类型:Android 专用驱动 Android 使用
  • 于此,将框架(Framework)设计模式(Design Pattern)应用于Linux驱动开发,说明了如何以面向对象、设计模式框架概念来看待Linux驱动程序的架构。其直接的益处就是:让我们能基于一致的设计理念来结合Android HAL与...
1 2 3 4 5 ... 20
收藏数 227,813
精华内容 91,125
关键字:

linux底层是0和1