linux子系统_linux子系统安装位置修改 - CSDN
  • 周围的同学都已经用win10内置的Linux子系统了,在坚持过几个Linux实验后,我也怀着好奇心试了一把。(忍不住了啊,亲!看着好方便的诶~o(* ̄︶ ̄*)o)WSLBash 是 Linux/Unix 上非常流行的命令行 Shell,它是 Ubuntu...

    周围的同学都已经用win10内置的Linux子系统了,在坚持过几个Linux实验后,我也怀着好奇心试了一把。

    (忍不住了啊,亲!看着好方便的诶~o(* ̄︶ ̄*)o)

    WSL

    Bash 是 Linux/Unix 上非常流行的命令行 Shell,它是 Ubuntu、RHEL 等 Linux 发行版以及苹果 OS X 操作系统默认的命令行 Shell。通过 Windows Subsystem for Linux(WSL)这一 Windows 10 的最新特性实现的,使用此功能,你可以在 Windows 中原生运行 Linux 的大多数命令行程序。

    总体来讲这个子系统比虚拟机好用得多,就像软件一样,没有作为系统应有的累赘感。在这里我就分享一些安装过程中关键的步骤。

    (1)安装Ubuntu

    在应用商城中搜索Linux,点击进入【获取这些应用】



    我已经安装好了,这里是windows提供免费下载的,所以直接下载安装即可。

    (2)环境设置

    一般我们的windows是默认关闭支持Linux环境的,所以你要自己动手把它勾出来。

    打开控制面板


    如图,在这里打勾勾。

    如果成功,就OK啦!

    !!!确认后,请重启计算机。

    emmm...如果你进不去的话,就打开设置


    点进去,有个针对开发人员的选项



    选择开发人员模式,这样权限应该够改个Linux的啦。(一切OK后别忘了重启计算机哦)


    进入bash可以从【开始】菜单进入,也可以使用【Win+R】


    这样运行~

    安装完成后,会提示你设置用户名和密码。当一切都完成后,你就可以像Linux 一样玩耍了。<( ̄︶ ̄)↗[GO!]

    接下来,我们来看看怎样让两个系统的文件互相访问。Linux系统可以通过 /mnt/<盘号>/ 目录(挂载点)来访问你计算机上的文件系统。举个例子,你的 Windows 上的 C:\ 和 D:\ 根目录可以在 WSL 中相应地通过 /mnt/c 和 /mnt/d 访问。当你要把你的 Windows 下的项目文件、下载的内容和其它文件用到 Linux/Bash 之中时这很有用。这是逻辑挂载,所以当你在 shell 中使用类似 mount 这样的命令时它们不会显示。但是它们可以如你预期的那样工作。

    举个例子:你想访问F盘下的test文件



    据说大神们已经可以在wsl上运行图形化的Linux程序了,这点我没有测试过,有兴趣的小伙伴可以自行折腾。
    那如果我们把WSL里面的环境折腾乱掉怎么办?得益于Windows商店的好处,我们只要卸载并重新在商店下载即可。

    PS:贴几个wsl的相关资料链接,感兴趣的小伙伴自行阅读研究。
    release notes:
    https://msdn.microsoft.com/en-us/commandline/wsl/release_notes
    WSL团队的blog:
    https://blogs.msdn.microsoft.com/wsl/
    issue tracker:
    https://github.com/Microsoft/BashOnWindows/issues

    展开全文
  • windows 子系统 linux (WLS):启用Win10的Linux子系统 windows 子系统 linux (WLS): ifconfig ping等无法使用解决办法 windows 子系统 linux (WLS): 安装cscope   windows 子系统 linux (WLS): VIM ...

     

    windows 子系统 linux (WLS)系列文章目录:

     

    windows 子系统 linux (WLS):启用Win10的Linux子系统


    windows 子系统 linux (WLS): ifconfig ping等无法使用解决办法


    windows 子系统 linux (WLS): 安装cscope

     

    windows 子系统 linux (WLS): VIM cscope 快捷键无效

     

    windows 子系统 linux (WLS):jupyter notebook 安装

     

     

     

    Linux on Windows简介

        Win10一周年版推出了用于Windows的Linux子系统这一功能,最近体验了一下感觉极佳。不说别的,有一个完整的Linux环境就可以完爆一切bash环境了,痛快地卸载了Git for在Windows / Cygwin的/ MinGW的/ MSYS / babun吧!

        Linux的子系统和视窗的结合真是有一种神互补。子系统可以挂载窗口的文件系统,于是就可以在现有的文件系统下干一个完整的Linux的环境所能干的事情。软件丰富更适合日常使用的Windows与开源和适合开发的Linux结合使得开发更加简便,不用再考虑双系统虚拟机这种效率不高的结合方式了,Windows上的Linux用一种应用软件的方式实现了系统软件的功能,这一点可以说让人惊艳了。重要的是这样同时运行的两个系统并不是相互独立的,而是可以协作的,以后完全可以使用的Windows下的工具进行编码,然后在Linux的子系统进行Git的提交,当然,它所能够发挥的作用远远不仅于此。

    如何启用

    启用的Linux子系统

    启用开发者模式

        系统模式的设定位于所有设置 - >更新和安全 - >针对开发人员,更改后如下:

    更改系统功能

        使用win+X快捷键调出系统-管理菜单后点击程序与功能,选择启用或关闭的Windows功能,修改“适用于的Windows的Linux的子系统一项”,勾选之,确认并重启。

    安装系统

        使用cmd下载Linux系统。打开功能以后系统中其实还没有安装Linux,需要使用cmd完成安装,这一步可能比较漫长。如果PC中已经安装了bash工具如msys(git for Windows),打开管理员权限的CMD,输入bash,按照提示一步一步下载即可。下载的过程比较漫长,耐心等待。

    下载完成以后配置用户名密码即可愉快地使用Ubuntu的啦!

    启用根权限并建立用户

        接下来可以输入sudo passwd root建立root用户(最高权限)。如果需要的话可以再使用adduser username建立一个新用户(不建议使用useradd),用户的切换通过su username完成。

    切换到根输入侧用户su即可。

    完成升级

        启用了根用户,接下来操作就比较方便了,使用先su切到根用户,然后直接使用apt-get的完成软件包的升级。(apt-get updateapt-get upgrade)。

        如果升级过程中出现连接错误(__Assertion__,方法管芯),先把命令再输一次试试。如果CMD保持一个类似于死机的状态太久(比如20分钟),一次先按ctrl+C试试。

    基本配置

    修改源

        源的修改有两种方式:

    1. 通过修改源列表;
    2. 通过apt-add-repository命令。

        源列表文件位于/etc/apt/sources.list,可以使用VIM直接完成修改,建议先保存原文件cp /etc/apt/sources.list /etc/apt/sources.list.backup,然后再使用VIM编辑,将找到的源直接加在列表后面。使用CMD开VIM比较方便的在于可以直接将系统剪贴板的内容帖进去在插入模式下(按。i进入)将光标移到合适的位置,然后鼠标右键点击CMD标题栏,编辑- >粘贴即可修改完成以后按。Esc退出插入模式,输入侧:x并回车保存并退出。以后完成可以apt-get update状语从句:apt-get upgrade来一次。

    升级系统

        输入lsb_release -a可以看到当前的系统版本为:ubuntu 14.04.4 LTS,最新版本为16.04.1 LTS,可以更新一下。

    1. apt-get install update-manager安装更新管理器;
    2. do-release-upgrade -f DistUpgradeViewNonInteractive -d完成更新。

    如果上述步骤没有达到更新效果,可以再尝试以下步骤:

    1. dpkg --configure -a
    2. apt-get update,更新包列表,这一步可能会询问是否继续,YES即可。
    3. apt-get upgrade,升级软件包;
    4. apt-get dist-upgrade,完成升级;
    5. apt-get autoremove,自动删除不需要的包。

    如果遇到网络问题,参照完成升级  ,解决。以后完成再输入侧lsb_release -a就是金光闪闪的16.04啦〜

    优雅地使用

    使用的zsh

        Ubuntu的的默认外壳使用bash的,但是外观不太好看而且功能不够强大.zsh是一个相对好用一点的外壳,可以使用的zsh替换默认外壳。

    使用步骤

    安装的zsh

    1
    
    $ apt-get install zsh
    

    安装了wget和混帐

    1
    
    $ apt-get install wget git
    

    执行哦,我-zsh的配置脚本

    1
    
    $ wget --no-check-certificate https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh
    

    替换默认外壳

    1
    
    $ chsh -s /bin/zsh
    

        到这里的zsh的安装就完成啦,关闭可以命令行然后重新输入侧bash展示进入Linux中,输入侧然后su登录根账户查看效果。可以这时输入侧echo $SHELL查看当前的壳版本。

        注意:输入侧bash展示进入Linux的后其实是一种未登录的状态,输入侧需要su usernamee月刊到指定用户才能正常使用。

    zsh的配置

        尽管zsh的非常强大,但是默认设定还是不够完美,通过可以修改/root/.zshrc文件完成配置的更改,完成修改以后输入侧source /root/.zshrc即可查看效果。

        zsh的主题的可以在这里  找到,文件修改的中ZSH_THEME="robbyrussell"即可更改主题。不过由于CMD本身使用单个字体文件显示字符,所以一些很漂亮的主题可能不太好用,建议选择没有太多特殊符号的主题。由于zsh中的配置其实是一件非常有趣的事情,故其包含的内容也非常多,这里就不多说了。

    CMD设定

        尽管zsh的非常漂亮,但是在CMD中的显示依然要通过CMD的支持,所以建议对CMD也进行一些修改,右键标题栏 - >默认值可以设定默认属性,属性项里的设定可以设定本次会话的显示效果。加利福尼亚默认使用点阵字体,但是不太好看,推荐使用TrueTypeFont字体。下载好TrueTypeFont字体文件并安装后如果在CMD中无对应选项,可以修改注册表中关于检测控制台的设定。

        找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont\添加项即可。如添加000项,值为要添加的字体名。

    更好的选择

        推荐使用cmder代替cmd,外观极美的一个命令行工具,关键字高亮,配色和字体都很棒,可定制性很强。不过在cmder中使用Linux on Windows只有登陆后才能正常使用,登录前(输入侧bash而未e月刊到具体用户)甚至没有关键字高亮和命令重复的支持

        此外,cmder还提供了对mintty / poweshell等的支持。很优雅〜

        使用cmder时可以新建一个空的任务,在启动的框中填入bash.exe即可。这样可以避免历史命令文件的读取异常,保证正常使用上下键回看历史命令。不过由于cmder对VIM的支持不太好,可能会有方向键的问题解决方法如下:在框中填入%windir%\system32\bash.exe ~ -cur_console:p:n。即可界面如下:

        如果遇到vim的visual block模式无法进入的问题,在设置中关闭Ctrl + v的粘贴功能就好:settings->keys&macro->paste->paste mode #2->do nothing

    进阶

        w2qw  提供了一种通过bash的运行图形界面软件的方法主要步骤如下

    1. 在Linux的中安装图形界面的程序(如火狐)
    2. 安装 Xming X Server for Windows
    3. 在Linux的中输入DISPLAY=:0 firefox)。

        有兴趣可以体验一下〜

     

    展开全文
  • 今天为大家介绍如何才能启用Windows10下的Linux子系统,废话不多说,直接看步骤: 启用开发者模式 打开设置 点击更新和安全 点击开发者选项 启用开发人员模式 更改系统功能 使用win+X快捷键调出系统...

    今天为大家介绍如何才能启用Windows10下的Linux子系统,废话不多说,直接看步骤:

    ####启用开发者模式
    打开设置
    这里写图片描述

    点击更新和安全
    这里写图片描述

    点击开发者选项
    这里写图片描述

    启用开发人员模式
    这里写图片描述

    ####更改系统功能
    使用win+X快捷键调出系统管理菜单后点击应用和功能,然后拉到底下,选择程序和功能
    这里写图片描述

    选中应用或关闭Windows功能
    这里写图片描述

    勾选适用于Linux的Windows子系统,然后确认并重启就可以了
    这里写图片描述

    ####安装Linux系统
    打开功能以后系统中其实还没有安装Linux,需要使用cmd完成安装。
    首先按Win+R开启cmd命令输入框,然后输入lxrun /install /y来下载Linux系统(注意斜杠后面前要空一格,要不然无法识别命令)
    这里写图片描述

    好了,现在安装成功了,可以为所欲为了!

    首先输入bash指令进入Ubuntu系统

    这里写图片描述

    接着可以输入passwd重置密码,重置完密码就可以正常使用Ubuntu系统了。至此,基本的安装工作就完成了。

    =菜鸟分割线===

    ####Linux进阶
    在Ubuntu下我们可以通过 apt-get 命令 很方便的安装 / 卸载软件,由于默认的软件包仓库是位于国外的,安装软件的时候就可能遇到各种网络问题或者下载到的一些资源不完整,因此就需要切换数据源为国内的镜像站点来改善。

    编辑数据源配置文件 vi /etc/apt/sources.list
    这里写图片描述

    接着就进入vi编辑器
    这里写图片描述

    继续按enter键进入真正的vi编辑页面
    这里写图片描述

    vi编辑器一共有三种模式,分别是命令模式(command mode)插入模式(Insert mode)底行模式(last line mode)。命令模式下我们只能控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode等;插入模式下可以做文字输入,按「ESC」键可回到命令行模式;底行模式下,可以将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号等。

    当我们进入vi编辑器的时候默认是命令行模式,这是后如果想编辑内容,就输入 i 命令就可以了。现在我们要把镜像源改为阿里的,所以插入如下内容:

    deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
    

    接着按「ESC」退会命令行模式,输入命令行 wq! 保存退出就好了。

    接着输入命令apt-get update更新配置就可以了,这个过程可能比较长,祝好运!
    这里写图片描述

    好了本教程到此结束,如果本文帮助到了你,请客打个赏,不在意多少,只在乎情谊!
    在这里插入图片描述

    展开全文
  • Linux内核的5个子系统

    2018-01-21 00:44:43
    首先一张熟悉的图来说明GNU/...Linux 内核可以进一步划分成 3 层:最上面是系统调用接口,用户程序通过软件中断后,调用系统内核提供的功能,这个在用户空间和内核提供的服务之间的接口称为系统调用,它实现了一些基
    首先一张熟悉的图来说明GNU/linux的基本体系结构:



            体系的上部分是用户(或应用程序)空间,这是用户应用程序执行的地方。用户空间之下是内核空间,Linux 内核正是位于这里。Linux 内核可以进一步划分成 3 层:最上面是系统调用接口,用户程序通过软件中断后,调用系统内核提供的功能,这个在用户空间和内核提供的服务之间的接口称为系统调用,它实现了一些基本的功能,例如 read 和 write;系统调用接口之下是内核代码,可以更精确地定义为独立于体系结构的内核代码,这些代码是 Linux 所支持的所有处理器体系结构所通用的;内核代码之下是依赖于体系结构的代码,构成了通常称为 BSP(Board Support Package)的部分,这些代码用作给定体系结构的处理器和特定于平台的代码。

    然后介绍Linux内核的五个子系统:

    Linux内核主要由进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)和进程间通信(IPC)5个子系统组成,如图1所示。



    图1 Linux内核的组成部分与关系



    1.进程调度

       进程调度控制系统中的多个进程对CPU的访问,使得多个进程能在CPU中“微观串行,宏观并行”地执行。进程调度处于系统的中心位置,内核中其他的子系统都依赖它,因为每个子系统都需要挂起或恢复进程。


    图2 Linux进程状态转换

       如上图2所示,Linux的进程在几个状态间进行切换。在设备驱动编程中,当请求的资源不能得到满足时,驱动一般会调度其他进程执行,并使本进程进入睡眠状态,直到它请求的资源被释放,才会被唤醒而进入就绪态。睡眠分成可被打断的睡眠和不可被打断的睡眠,两者的区别在于可被打断的睡眠在收到信号的时候会醒。

       在设备驱动编程中,当请求的资源不能得到满足时,驱动一般会调度其他进程执行,其对应进程进入睡眠状态,直到它请求的资源被释放,才会被唤醒而进入就绪态。设备驱动中,如果需要几个并发执行的任务,可以启动内核线程,启动内核线程的函数为:

       pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);


        当用户使用系统提供的库函数进行进程编程,用户可以动态地创建进程,进程之间还有等待,互斥等操作,这些操作都是由linux内核来实现的。linux内核通过进程管理子系统实现了进程有关的操作,在linux系统上,所有的计算工作都是通过进程表现的,进程可以是短期的(执行一个命令),也可以是长期的(一种网络服务)。linux系统是一种动态系统,通过进程管理能够适应不断变化的计算需求。
       在用户空间,进程是由进程标示符(PID)表示的。从用户角度看,一个PID是一个数字值,可以唯一标识一个进程,一个PID值在进程的整个生命周期中不会更改,但是PID可以在进程销毁后被重新使用。创建进程可以使用几种方式,可以创建一个新的进程,也可以创建当前进程的子进程。
    在linux内核空间,每个进程都有一个独立的数据结构,用来保存该进程的ID、优先级、地址的空间等信息,这个结构也被称做进程控制块(Process Control Block)。所谓的进程管理就是对进程控制块的管理。
       linux的进程是通过fork()函数系统调用产生的。调用fork()的进程叫做父进程,生成的进程叫做子进程。子进程被创建的时候,除了进程ID外,其它数据结构与父进程完全一致。在fork()系统调用创建内存之后,子进程马上被加入内核的进程调试队列,然后使用exec()系统调用,把程序的代码加入到子进程的地址空间,之后子进程就开始执行自己的代码。
       在一个系统上可以有多个进程,但是一般情况下只有一个CPU,在同一个时刻只能有一个进程在工作,即使有多个CPU,也不可能和进程的数量一样多。如果让若干的进程都能在CPU上工作,这就是进程管理子系统的工作。linux内核设计了存放进程队列的结构,在一个系统上会有若干队列,分别存放不同状态的进程。一个进程可以有若干状态,具体是由操作系统来定义的,但是至少包含运行态、就绪态和等待3种状态,内核设计了对应的队列存放对应状态的进程控制块。
       当一个用户进程被加载后,会进入就绪态,被加入到就绪态队列,CPU时间被轮转到就绪态队列后,切换到进程的代码,进程被执行,当进程的时间片到了以后被换出。如果进程发生I/O操作也会被提前被换出,并且存放到等待队列,当I/O请求返回后,进程又被放入就绪队列。linux系统对进程队列的管理设计了若干不同的方法,主要的目的是提高进程调试的稳定性。



    2.内存管理

       内存管理的主要作用是控制多个进程安全地共享主内存区域。当CPU提供内存管理单元(MMU)时,Linux内存管理完成为每个进程进行虚拟内存到物理内存的转换。Linux 2.6引入了对无MMU CPU的支持。

       如下图3所示,一般而言,Linux的每个进程享有4GB的内存空间,0~3GB属于用户空间,3~4GB属于内核空间,内核空间对常规内存、I/O设备内存以及高端内存存在不同的处理方式。


    图3 Linux进程地址空间

        使用虚拟内存技术的计算机,内存管理的硬件按照分页方式管理内存。分页方式是把计算机系统的物理内存按照相同大小等分,每个内存分片称作内存页,通常内存页大小是4KB。Linux内核的内存管理子系统管理虚拟内存与物理内存之间的映射关系,以及系统可用内存空间。内存管理要管理的不仅是4KB缓冲区。Linux提供了对4KB缓冲区的抽象,例如slab分配器。这种内存管理模式使用4KB缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。
       在支持多用户的系统上,由于内存占用的增大,容易出现物理内存被消耗尽的情况。为了解决物理内存被耗尽的问题,内存管理子系统规定页面可以移出内存并放入磁盘中,这个过程称为交换。内存管理的源代码可以在./linux/mm中找到。



    3.虚拟文件系统

       如下图4所示,Linux虚拟文件系统(VFS)隐藏各种了硬件的具体细节,为所有的设备提供了统一的接口。而且,它独立于各个具体的文件系统,是对各种文件系统的一个抽象,使用超级块super block存放文件系统相关信息使用索引节点inode存放文件的物理信息使用目录项dentry存放文件的逻辑信息。


    图4 Linux文件系统


        在不同格式的文件分区上,程序都可以正确地读写文件,并且结果是一样的。有时在使用linux系统的时候发现,可以在不同类型的文件分区内直接复制文件,对应用程序来说,并不知道文件系统的类型,甚至不知道文件的类型,这就是虚拟文件系统在背后做的工作。虚拟文件系统屏蔽了不同文件系统间的差异,向用户提供了统一的接口。
        虚拟文件系统,即VFS(Virtual File System)是Linux内核中的一个软件抽象层。它通过一些数据结构及其方法向实际的文件系统如ext2,vfat等提供接口机制。通过使用同一套文件 I/O 系统调用即可对Linux中的任意文件进行操作而无需考虑其所在的具体文件系统格式;更进一步,文件操作可以在不同文件系统之间进行。在linux系统中,一切都可以被看做是文件。不仅普通的文本文件、目录可以当做文件进行处理,而且字符设备、块设备、套接字等都可以被当做文件进行处理。这些文件虽然类型不同,但是却使用同一种操作方法。这也是UNIX/Linux设计的基本哲学之一。
        虚拟文件系统(简称VFS)是实现“一切都是文件”特性的关键,是Linux内核的一个软件层,向用户空间的程序提供文件系统接口;同时提供了内核中的一个抽象功能,允许不同类型的文件系统存在。VFS可以被理解为一种抽象的接口标准,系统中所有的文件系统不仅依靠VFS共存,也依靠VFS协同工作。为了能够支持不同的文件系统,VFS定义了所有文件系统都支持的、最基本的一个概念上的接口和数据结构,在实现一个具体的文件系统的时候,需要向VFS提供符合VFS标准的接口和数据结构,不同的文件系统可能在实体概念上有差别,但是使用VFS接口时需要和VFS定义的概念保持一致,只有这样,才能实现对用户的文件系统无关性。VFS隐藏了具体文件系统的操作细节,所以,在VFS这一层以及内核其他部分看来,所有的文件系统都是相同的。对文件系统访问的系统调用通过VFS软件层处理,VFS根据访问的请求调用不同的文件系统驱动的函数处理用户的请求。文件系统的代码在访问物理设备的时候,需要使用物理设备驱动访问真正的硬件。


    4.网络接口

        网络接口提供了对各种网络标准的存取和各种网络硬件的支持。如下图5所示,在Linux中网络接口可分为网络协议和网络驱动程序,网络协议部分负责实现每一种可能的网络传输协议网络设备驱动程序负责与硬件设备通信,每一种可能的硬件设备都有相应的设备驱动程序。


    图5 Linux网络体系结构

        写网络应用程序,使用socket通过TCP/IP协议与其他机器通信,和前面介绍的内核子系统相似,socket相关的函数也是通过内核的子系统完成的,担当这部分任务的是内核的网络子系统,有时也把这部分代码称为“网络堆栈”。Linux内核提供了优秀的网络处理能力和功能,这与网络堆栈代码的设计思想是分不开的,Linux的网络堆栈部分沿袭了传统的层次结构,网络数据从用户进程到达实际的网络设备需要四个层次:用户进程,套接字,网络协议,网络设备。

        实际上,在每层里面还可以分为好多层次,数据传输的路径是按照层次来的,不能跨越某个层次。linux网络子系统对网络层次采用了类似面向对象的设计思路,把需要处理的层次抽象为不同的实体,并且定义了实体之间的关系和数据处理流程:

       (1)网络协议:网络协议可以理解为一种语言,用于网络中不同设备之间的通信,是一种通信的规范。
       (2)套接字:套接字是内核与用户程序的接口,一个套接字对应一个数据连接,并且向用户提供了文件I/O,用户可以像操作文件一样在数据连接上收发数据,具体的协议处理由网络协议部分处理。套接字是用户使用网络的接口。
       (3)设备接口:设备接口是网络子系统中软件和硬件的接口,用户的数据最终是需要通过网络硬件设备发送和接收的,网络设备千差万别,设备驱动也不尽相同,通过设备接口屏蔽了具体设备驱动的差异。
       (4)网络缓冲区:网络缓冲区也称为套接字缓冲区(sk_buff),是网络子系统中的一个重要结构。网络传输数据存在许多不定因素,除了物理设备对传输数据的限制(例如MMU),网络受到干扰、丢包、重传等,都会造成数据的不稳定,网络缓冲区通过对网络数据的重新整理,使业务处理的数据包是完整的。网络缓冲区是内存中的一块缓冲区,是网络系统与内存管理的接口。


    5.进程通信

       进程通信支持提供进程之间的通信,Linux支持进程间的多种通信机制,包含信号量、共享内存、管道等,这些机制可协助多个进程、多资源的互斥访问、进程间的同步和消息传递。



    子系统之间的依赖关系:

        Linux内核的5个组成部分之间的依赖关系如下:

    ·进程调度与内存管理之间的关系:这两个子系统互相依赖。在多道程序环境下,程序要运行必须为之创建进程,而创建进程的第一件事情,就是将程序和数据装入内存。

    ·进程间通信与内存管理的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有空间,还可以存取共同的内存区域。

    ·虚拟文件系统与网络接口之间的关系:虚拟文件系统利用网络接口支持网络文件系统(NFS),也利用内存管理支持RAMDISK设备。

    ·内存管理与虚拟文件系统之间的关系:内存管理利用虚拟文件系统支持交换,交换进程(swapd)定期由调度程序调度,这也是内存管理依赖于进程调度的惟一原因。当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前正在运行的进程。

        除了这些依赖关系外,内核中的所有子系统还要依赖于一些共同的资源。这些资源包括所有子系统都用到的例程,如分配和释放内存空间的函数、打印警告或错误信息的函数及系统提供的调试例程等。


    转载:

    http://infohacker.blog.51cto.com/6751239/1201601

    参考:

    https://www.ibm.com/developerworks/cn/linux/l-linux-kernel/

    http://infohacker.blog.51cto.com/6751239/1203700

    展开全文
  • 年前处理了一个涉及linux时钟子系统比较麻烦的问题,问题虽然解决了,但在过程中遇到很多不太清晰地的地方,今天一起整理一下 由于本人涉猎不广,不思进取,所总结东西大部分来源于网络,希望能早日迈过这个层次,多...

    年前处理了一个涉及linux时钟子系统比较麻烦的问题,问题虽然解决了,但在过程中遇到很多不太清晰地的地方,今天一起整理一下

    由于本人涉猎不广,不思进取,所总结东西大部分来源于网络,希望能早日迈过这个层次,多有些自己的东西,一些自己在技术方面的积极思考。

    +++++++++++++++++++++++++++++++++++++++++++++++++++++

    目录:

    1,时间在Linux的地位

    2,Linux如何管理时间

    3,时钟子系统的实现

    4,在Linux中如何计时

    5,Linux出了一个NO~HZ......

     

    一,时间在Linux的地位

    在一般操作系统中,很多活动都和时间有关,例如:进程调度,定时器任务,网络处理等等,内核中有大量的函数都是基于时间驱动的。记得在linux基础系列里面也提到了时钟相当于一个操作系统的“心跳”,操作系统没有了时钟也就想到于一个生物没有了心跳。所以说,了解Linux中的时钟处理机制有助于更好地了解Linux的运作方式。

     

    二,Linux如何管理时间

    一般说来,Linux内核主要需要两种类型的时间:
    1. 在内核运行期间持续记录当前的时间与日期,以便内核对某些对象和事件作时间标记(timestamp,也称为“时间戳”,“墙上时间”,“实际时间”)。
    2. 维持一个固定周期的定时器,以提醒内核或用户一段时间已经过去了。

    无论我们说软件时钟还是硬件时钟,他们都是建立在时钟硬件基础上的。内核必须在硬件的帮助下才能计算和管理时间。硬件为内核提供了一个系统定时器用以计算流逝的时间,系统定时器以某种频率自行触发时钟中断,该频率可以通过编程设定。

    在计算机系统中存在着许多硬件计时器(such as RTC, TSC, PIT. HPET etc...),而且根据架构的不同而支持的不同的硬件计时器(such as TSC on Intel, TBH/TBL on PPC, and COUNT on MIPS)。

    注:ARM架构目前没有专门的时间戳寄存器,所以也造成了在arm架构上没有标准的高精度接口export出来,能够使用的最大精度就是1/HZ秒。

     

    通常来说,硬件时钟就是指直接使用硬件计时器作为驱动的时钟,软件时钟即指timer,他是在硬件时钟之上构建的一套定时器方法。

     

    系统起来以后,系统被动的接受时钟中断,然后运行时钟中断处理程序,该ISR主要完成以下工作:

    1,更新系统运行时间

    2,更新墙上时间

    3,如在SMP系统上,均衡调度程序中个处理器上的运行队列,使其负载均衡

    4,检查当前进程是否用尽了自己的时间片。如果用尽,就重新调度

    5,运行超时的动态定时器

    6,更新资源消耗和处理器时间的统计值

    注:以上内容很多来自于Love的LD3,就象生活不能没有爱,搞linux就不能缺少“Love”。

     

     

    如果实在没有任务需要切换,执行完该ISR后,那么就执行idle,时钟中断会周期性的打破idle,然后查询有没有需要做的事情,如果没有继续idle,这基本上是linux中时钟管理的基本模式。 

     

    三,时钟子系统的实现

     

    我们知道,linux中各个子系统的实现都是一层层抽象的结果,时钟子系统也不例外。

     

    1,原理

    clocksource和clock_event_device两个结构被用来抽象linux的时钟管理:

     

    • struct clocksource :对硬件设备的抽象,描述时钟源信息
    • struct clock_event_device :时钟的事件信息,包括当硬件时钟中断发生时要执行那些操作,也可将该结构称作为“时钟事件设备”。

    需要特别注意的是结构 clock_event_device 的成员 event_handler ,它指定了当硬件时钟中断发生时,内核应该执行那些操作,也就是真正的时钟中断处理函数。

     

    Linux 内核维护了两个链表,分别存储了系统中所有时钟源的信息和时钟事件设备的信息。这两个链表的表头在内核中分别是 clocksource_list 和 clockevent_devices。

     

     

    2,初始化

     

    内核初始化部分( start_kernel 函数)和时钟相关的过程主要有以下几个(内核版本2.6.34):

     

    tick_init();

    init_timers();
    hrtimers_init();

    timekeeping_init();
    time_init();

     

     

    2.1 tick_init 函数

    函数 tick_init() 很简单,调用 clockevents_register_notifier 函数向 clockevents_chain 通知链注册元素: tick_notifier。这个元素的回调函数指明了当时钟事件设备信息发生变化(例如新加入一个时钟事件设备等等)时,应该执行的操作,该回调函数为 tick_notify。并不是我们从字面意思理解的这个就是直接注册tick中断服务函数。

     

    2.2 init_timers 函数

    初始化本 CPU 上的软件时钟相关的数据结构,向 cpu_chain 通知链注册元素 timers_nb ,该元素的回调函数用于初始化指定 CPU 上的软件时钟相关的数据结构,最后初始化时钟的软中断处理函数。

     

    2.3 hrtimers_init函数

    高精度时钟定时器相关处理

     

    2.4 timekeeping_init函数

    涉及到另外内核子系统timekeeping subsystem,这里略过

     

    2.5 time_init函数

    初始化硬件时钟源和时钟事件信息,这个函数和硬件体系相关,各个架构都有不同的实现,这里就体现了linux分层抽象的魅力,一个子系统的设计会抽象成好几层,会尽力将和体系相关的部分放到一层,这样在不同架构上,该子系统就能做到尽量少的改动。

     

    3,处理流程

    主要关注time_init函数中的处理流程,该部分是和架构有关系的,不同架构的实现都各不相同,要具体分析。

    以ARM架构为例,CPU为OMAP L138

    3.1 在arch/arm/mach-davinci/time.c中,将架构相关的代码在此实现,并将davinci_timer_init挂载到davinci_timer中,我们在davinci_timer_init中将完成:

    • timer硬件初始化
    • setup clocksource 和clock event

    3.2 在arch/arm/mach-davinci/board-da850-evm.c中设置MACHINE DES时,将davinci_timer挂到系统的timer上。

     

    3.3 在arch/arm/kernel/setup.c中的setup_arch()函数,将会取出MACHINE DES中挂载的内容,对于timer,将会赋值到一个全局变量system_timer:

    struct machine_desc *mdesc;

    mdesc = setup_machine(machine_arch_type);

    system_timer = mdesc->timer;

     

    3.4 这样初始化完成后,arch/arm/kernel的time_init会最终调用system->init()完成time的设置。

     

    四,linux中如何计时


    1,用户侧

    在用户空间中可以使用C语言函数gettimeofday 得到时间。


    2,shell

     

    在Linux的Shell下,我们经常也使用Shell内置的time命令和GNU版的time命令来测试程序运行的时间。

    内置的time提供的参数选项比较少,而GNU的time则提供了丰富的参数选项,包括指定输出文件等功能。

    [grandiose@Bygone grandiose]$ /usr/bin/time --output=foo.txt foo
    

    上句只有时间信息输出到了foo.txt文件中,如果想要包括foo执行的结果,就需要按下句这样使用:

     
    [grandiose@Bygone grandiose]$ /usr/bin/time --output=foo.txt --append foo >foo.txt
    

    如果想要控制输出时间的格式,可以使用-f开关进行格式化:

    [grandiose@Bygone grandiose]$ /usr/bin/time 
       --output=foo.txt -f "//t%E real,//t%U user,//t%S sys" foo
    

    如果仍需要使用Shell内置的time命令,可以用下面一句将结果输出至文件:

    [grandiose@Bygone grandiose]$ (time foo) 2>foo.txt
    

    这样写是因为内置命令time的输出是到标准错误的,文件描述符2表示标准错误stderr。如果还想要包括foo执行的结果,就要这样:

    [grandiose@Bygone grandiose]$ (time foo) >foo.txt 2>&1
    

    其中2>&1的含义是2与1 相同,一起送入foo.txt中。

    nohup命令可以保证进程在退出系统之后仍能运行,这是它的常规用法。我们也可以这样使用nohup:

    [grandiose@Bygone grandiose]$ nohup time foo
    

    结果全部输出至nohup.out,也包括程序运行的时间信息。可以使用下面的语句将时间信息输出至文件foo.txt中。

     

    [grandiose@Bygone grandiose]$ tail -2 nohup.out > foo.txt

    3,内核侧
    如果要定制自己的设备驱动程序,可能就会用到内核里的计时功能。Linux内核空间中的计时与用户空间
    的计时不太相同。在内核空间里,有一个全局变量Jiffies维护着当前的时间。与系统时钟有关的调用有
    #include <asm/param.h> 
    #include <linux/timer.h> 
    void add_timer(struct timer_list * timer); 
    int del_timer(struct timer_list * timer); 
    inline void init_timer(struct timer_list * timer); 
    五,linux来了一个NO~HZ

    NOHZ对于linux意味着什么呢,dog250兄表述的很到位(以下完全来自dog250兄的博文:

    http://blog.csdn.net/dog250/archive/2010/02/09/5303566.aspx):

     如果说nohz之前的linux内核是骨架的话,那么从 nohz之后,linux开始了精彩,之后几乎瞬时,cfs出现了,然后是cgroup, cgroup正式开始了虚拟容器,从此linux再也不用被 unix老大们看作是小孩子了,nohz标着linux开始成熟起来。

    nohz为何这么重要呢?因为它直接关系到了性能,直接联系着系统的心跳,在之前,系统总是被动的接受时钟中断,然后运行中断处理程序最终可能导致调度的发生,如果实在没有任务可以运行,那么就执行idle,这也许也算一种创意,可是时钟中断还是会周期性的打破idle,然后查询有没有需要做的事情,如果没有继续idle,这种方式没有什么问题,可是我们总是希望系统可以主动的做些事情,比如不是被动的接受中断而是主动的设置什么时候中断,因此必须将系统时钟发生中断这件事进行向上抽象,于是相应的clocksource和clock_event_device,这两个结构体就是时钟以及时钟行为的抽象,clocksource代表了一个时钟源,一般都会有一个计数器,其中的read回调函数就是负责读出其计数器的值,可是我们为何找不到write或者set之类的回调函数呢?这些回调函数其实不应该在 closksource中,而应该在clock_event_device中。实际上,clocksource只是一个钟,你可以类比我们用的钟表,clocksource就是一个钟表,我们需要一个钟表就是需要读出它的指针的值从而知道现在几点,就是这些,因此钟表都会有显示盘用于读数,至于钟表怎么运作,那就是钟表内部的机械原理了,记住,钟表就是用来读数的。另外我们为了害怕误事而需要闹铃,需要闹铃在一个时间段之后把我们唤醒,这就是个event,而这个event不一定非要有钟表,当然钟表的读数会为我们提供有用的参考值,这样的话钟表和闹铃就解耦合了,再重申一遍:

    不要因为有闹钟的存在就说钟表都会响铃或者说闹铃都有钟表,它们其实是两个东西,钟表为你展示某些事情,而闹铃需要你的设置,设想一个场景,你手边有一个没有闹铃的钟表,还有一个没有 钟表的闹铃,这个闹铃只能设置绝对时间,然后到期振铃,你现在不知道几点,可是你要睡觉并且得到通知必须在四个小时后去参加一个聚会,那么你现在要做什么?你肯定要看看你的钟表,然后设置你的闹钟。


    以上的例子中,钟表就是clocksource,而闹钟就是clock_event_device,前者提供了一个指示盘,后者封装
    了闹铃到期以后的行为以及设置闹铃的handler,就好像你的闹铃都有旋钮一样。既然操作系统的行为是时钟中断驱动的,那么它很符合我刚才例子中的那个逻辑,即使不用在内核中抽象出 clocksource和clock_event_device这些概念,只要能做到定时“振铃”,然后去执行时钟中断就可以了,2.6.18之前的内核中在没有抽象出“钟表”和“闹铃”的情况下实现了上述的逻辑,就是我们上面所说的硬件时钟中断模式。可是这种方式有一个默认的前提就是内核一直有事可做,软件是硬件的奴隶,不得不在硬件的默认前提下每隔一个时间段就被中断一次,而硬件只管定时中断而不管到底是否真正有事可做,理想的实现应该是将定时的任务交给内核自己,就好比我希望定一个闹铃到一定时间后叫醒我,我希望我自己定这个闹铃而不是希望到时间我正在熟睡而被不知情的叫醒。

     2.6.18以前的内核中,根本就没有简单的“定闹铃”的handler,因此不得不忍受硬件的有事无事的定时中断。clocksource和clock_event_device被抽象出来以 后,clock_event_device中有了定闹铃的handler,一切就醒目多了,实际上clocksource和clock_event_device被抽象出来并不是为了nohz,而是为了将时钟相关的代码从平台相关的代码中分离出来,以便于独立修改统一管理,否则需要维护很多平台的不同的时钟处理代码,而这些代码的逻辑大致相同,随后的2.6.22以后,nohz才出现,nohz其实就是托了抽象出来的clocksource和 clock_event_device的福,因为nohz直接需要设置下一次的中断时间而不是使用系统无条件的默认的HZ中断。 clock_event_device中的set_next_event就是定闹铃的把手,而event_handler则是可以让你自己定义闹铃到期后的事件,就好比手机定闹铃时可以选到期后播放的音乐一样可以自定义事件处理回调函数。

         cfs调度和HZ分离了clocksource和clock_event_device封装的时钟以及其操作,以往的进程在特定的固定时间片内运行,时钟的定时中断提供了时间片的监督工作,一切显得十分和谐,可是系统内核本身就是没有主权,一切都在硬件的安排下进行,clocksource和 clock_event_device被抽象出来以后,内核有了一定的主权,它可以在运行时设置硬件了,内核的运行和硬件的特性进一步解除耦合,内核不再是奴隶了,它终于可以作为主人设置硬件本身了,cfs调度器之后,关于进程以及整个系统的运行特性彻底从底层硬件的时钟中分离了,完全采用linux的逻辑进行,再也不用受制于底层的时钟以及时间片分配特性,linux可以按照自己的方式来进行调度,或者用自己的方式设置下一个中断的到来时间,这难道还是中断吗?中断的含义就是异步到来的事件,clock_event_device的set_next_event致使系统明确的知道下一个中断什么时候到来,这其实没有什么不对,就是因为它是时钟相关的,而时钟中断在老的版本的内核里面的中断间隔也是确定的。新的内核越来越多的将硬件把手抽象给内核,或者将内核把手抽象给用户,这样的内核显得越来越成熟了,内核可以通过硬件把手操控硬件从而影响运行时的策略,而用户可以通过内核把手操控内核从而影响内核的运行时策略。内核对下面的硬件可以控制了,对上面的用户空间也提供了很多不错的操作接口,三层的联系越来越紧密但是却没有增加耦合性,实在是妙!


         clocksource是一个钟表,clock_event_device是一个闹铃,它们可以合并为一个闹钟,也可以单独
    行动,既然clock_event_device是一个闹钟而且必然拥有定闹铃的把手(set_next_event),那么时钟中断就是由这个clock_event_device来设置的了,设置的中断到来以后,还是这个clock_event_device负责用event_handler 来唱一支歌,毕竟它是闹铃,闹铃要负责在到期后响铃的,而且除了响铃也可以做别的,而clocksource只是一个可以从中得到一个读数的一个源头罢 了,如果说谁要是有疑问,觉得如果一个clocksource没有中断功能却成功的成了一个全局的主要clocksource,那么怎么办?没有问题,设置中断和clocksource有没有中断功能没有关系,只要clock_event_device的set_next_event中有设置中断硬件的逻辑就可以了。比如tsc时钟源没有中断功能,它是一个高精度计数器,那么在系统的clock_event_device中的set_next_event中必须实现设置当前中断源的代码。用clocksource和clock_event_device实现的新的时钟逻辑更像是一个软件定时器。


    既然硬件时钟可以由运行中的内核软件驱动了,那么很多机制都随之变得灵活起来,比如hrtimer的实现,比如时钟中断的实现等等,在nohz模式中,在cpu进入idle之前要进入ick_nohz_stop_sched_tick,这个函数中可能就会停掉时钟中断,如果停掉的话,那么在每次其他硬件中断执行完之后会再次进入这个函数以检测timer队列是否被更新,或者定时器到期后,系统会重新开启间隔为tick_period的时钟中断,这个可以用 hrtimer实现,也可以用别的机制实现。为了维持系统内cpu的负载均衡,所有开启nohz停掉cpu的idle进程不能全部都停掉cpu进入halt,而是要有一个进行idle load balance,为何不能让别的cpu代劳呢?因为别的cpu忙着呢?只要处于idle状态的cpu比较闲,因此就由它来负责所有的停掉的cpu的负载均 衡工作,一旦有进程被拉到了这些cpu上,那么马上唤醒它们,这在load_balance函数代码中有描述:

    if (ld_moved && this_cpu != smp_processor_id()) 
        resched_cpu(this_cpu); 
    以上的片段就是说一旦有进程拉到了this_cpu上并且这个cpu不是当前的执行load_balance的cpu,那么就
    发送ipi唤醒处于nohz停止状态的cpu,因为由于系统不平衡,它已经不能再继续睡下去了。


    之前说过,由于2.6.23之前的内核的进程调度只要是基于时间片的,而时间片的计算又没有办法找到一种比较统一的方式,这个原因就是内核对硬件的控制力弱加上操作系统内核的抽象机制严重依赖底层的硬件配置,你可以将HZ设置到1000甚至更高(HZ不能随意高,必须依照cpu硬件来设置,HZ能设置多高不在于你的代码多高效,而是在于你的cpu有多快),可是你却要面对新的问题,比如时间片跨度太大的响应慢问题,时间片跨度太小导致的高优先级进程不怎么优先问题或者低优先级时间片和HZ相关并且有时过小导致的cache频繁失效问题,虽然双斜率机制解决了部分问题,可是又引入了新的问题,比如 nice 0两端不对称问题。在新的cfs中,调度行为不再依赖HZ的值,并且在时钟相关的操作抽象成clocksource和clock_event_device之后,底层的时钟硬件不再被在start_kernel中一次性的设置,而且被封装了,可以随时设置,新的设置方式 显得更加直观。

    展开全文
  • win10上linux子系统开启、升级及使用 在16年时看到网上有所win10上可以运行ubuntu子系统,就试着下载了试用了下,利用Linux子系统可以直接访问win10的各种文件,相比使用虚拟机很是方便,而且速度也是杠杠的。 ...
  • 启用Win10的Linux子系统

    2018-09-01 12:46:50
     Win10一周年版推出了用于Windows的Linux子系统这一功能,最近体验了一下感觉极佳。不说别的,有一个完整的Linux环境就可以完爆一切bash环境了,痛快地卸载了Git for Windows/Cygwin/minGW/msys/babun吧!  ...
  • 前段时间发现Windows可以安装Linux子系统了,恰逢电脑换了固态,还没装Linux,不如趁机体验一番!1、准备工作1.1、打开Windows的子系统功能1.2、打开Windows开发人员模式打开设置–&gt;更新和安全–&gt;针对...
  • 为什么需要激活自带Linux子系统 &nbsp;&nbsp;&nbsp;&nbsp;在公司日常开发工作中,绝大多数开发环境都是在Linux下,而公司配的电脑是 Windows10的系统,权限不够无法重装Linux系统,这时绝大多数人...
  • 首先你要升级到win10周年更新版,然后安装linux子系统。 win10的linux子系统给了我们一个将linux的强大的shell命令和windows的流畅界面结合的体验,让我们可以不用在windows上纠结虚拟机运行linux的卡顿,和在linux...
  • 使用window中的Linux子系统创建的文件究竟放在什么地方,既然作为子系统文件肯定是可以互相访问的 目录 ubuntu Linux子系统的目录是在这个目录下 C:\Users\用户名\AppData\Local\Packages\...
  • 先看看操作系统版本,之前看网上的安装说明很多都是比较早的系统beta版本和现在安装方法有些不一样,我当前的版本为 Windows10 1709 ,家庭版安装使用也是没有问题的下面开始安装,首先确认下你C盘的剩余空间哈 一、...
  • Win10一周年版推出了用于Windows的Linux子系统这一功能。Linux子系统和Windows的结合真是有一种神互补。子系统可以挂载windows的文件系统,于是就可以在现有的文件系统下干一个完整的Linux环境所能干的事情。软件...
  • Win10开启linux子系统报错“0x80070057”怎么解决? 在Win10系统中内置有Liux子系统,最近一位Win10用户在开启linux子系统时失败了,系统提示错误代码“0x80070057”,这是怎么回事呢?出现这种错误可能是该用户没有...
  • 卸载win10 linux子系统的方法
  • 新版win10可以开启linux子系统,但是在里面执行Python的画图程序时因为缺少图形化界面总是报错,这里提供一个解决方案。 (1) 下载并安装windows版本Xming 地址: ...
  • 不过之前听闻这个版本已经支持内置的linux子系统,于是就怀着好奇心试玩了一把。虽然期间遇到了很多问题,但总体来说这个子系统体验还不错,在这里就分享一些关键步骤和遇到的问题,剩下的大家自己折腾吧。。启用...
  • Windows10下安装Linux子系统 版本说明 版本 作者 日期 备注 0.1 ZY 2019.7.9 初稿 目录 文章目录Windows10下安装Linux子系统版本说明目录一、初衷二、资料收集三、官方安装说明1、准备2、安装所选的 ...
  • Linux 子系统
  • 1、首先将win10 系统更新至最新版 ...3、在控制面板中添加linux子系统 安装步骤为:控制面板–&gt;程序–&gt;启用或关闭windows功能,勾选”适用于windows的linux的子系统“,点击确定...
1 2 3 4 5 ... 20
收藏数 452,312
精华内容 180,924
关键字:

linux子系统