![](https://img-blog.csdnimg.cn/858a8029106544f8b42ca80e99681d83.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Linux OS封神之路
文章平均质量分 65
虚拟机
妖怪喜欢风
现在的工作重点是操作系统(如Linux、QNX、Android)BSP层开发和虚拟化技术研究方向
展开
-
IA-32体系结构下的高端内存的理解
第一遍看。原创 2023-08-03 00:05:59 · 417 阅读 · 0 评论 -
Linux CFS调度器:原理和实现
集合,它的工作量应当由内核保持平衡,其组成类似于基数树,每个调度域被依次划分为一个或多个组,每个组待办调度域的一个。而某一调度实体由于某些原因导致进入阻塞或睡眠态,此时便会主动将时间片让出去,导致其。增加,此时便会形成不对等,这是不公平的,因此需要在下一进程切换时调度。是一样的,因此在这种情况下优先级较低的实际上是时钟有了更高的衰减率。子集,工作量的平衡总是在调度域的组之间来完成。当进程从一个CPU的运行队列中出来时,它的。为什么让优先级高的和优先级低的分配不同的。的周围,换句话来说就是,只比较相对大小。原创 2023-02-28 13:13:32 · 688 阅读 · 0 评论 -
Linux内核虚拟化技术KVM总结以及Docker容器技术的浅析(以x86架构为例)
虚拟中断芯片是在用户空间实现的,但是中断芯片密集地参与了整个计算机系统的运转过程,因此,为了减少内核空间与用户空间之间的上下文切换带来的开销,后来,中断芯片的虚拟是在了内核空间。)技术是一种更加轻量级的操作系统虚拟化技术,它将应用程序,依赖包,库文件等允许依赖环境打包到标准化的镜像中,通过容器引擎提供进程隔离,资源可限制的允许环境,实现应用与。,在这种方式下,虚拟机的非特权级治疗直接运行在处理器上,当运行特权级指令时,将触发处理器异常,陷入VMM中,由。虚拟化,内存虚拟化,中断虚拟化和设备虚拟化。原创 2022-11-07 19:57:47 · 2392 阅读 · 0 评论 -
虚拟文件系统(无持久存储的文件系统),以proc和sysfs为例
对于现代操作系统,虚拟文件系统是一个几乎无处不见的功能,因此,要探究现代操作系统的运行机制,对其进行讨论是必然的。本文使用的是`Linux 2.6.x.x`,这是一个变革性的版本,无论是内存管理,进程管理,文件管理还是设备管理都出现了开天辟地的变化,因此,以这个版本进行探究是很有必要的。原创 2022-10-16 17:12:20 · 1754 阅读 · 0 评论 -
现代操作系统的内存管理原理:以Linux2.6.x.x为例
不谈老掉牙的内存管理方式了。本文使用的内核是版本。内存管理?内存管理!不管是在老版本的操作系统各个子系统中,亦或是现代版本操作系统中,都是极其复杂和庞大的。当然,万变不离其宗,但是,看源码可以让你找不到方向。本文在上一篇的基础上来解释,当然要把源码完完全全的列出来不太现实,大家对照自己的前置理解即可,如果有时间和精力去完完全全看懂源码才是最好!。动态链接算是把Glibc、vir addr和用到了极致!对照之前的Linux 0.11和0.99版本,2.6.x.x。原创 2022-10-16 02:01:32 · 597 阅读 · 0 评论 -
什么是虚拟地址空间?从架构视角来解释
引言:小白,虚无,飘渺,渐实,真实,进阶,深化,投入,高阶,系统,架构……操作系统学习之路道阻且长。为何要从源码的角度来探究?抽象层实在太过抽象!操作系统五大功能,可能学完一学期的课程也难以把它们联系起来,因此从源码角度来解剖,很有必要。本文操作系统以Linux为例此篇也主要是解惑文章的,毕竟之前觉得操作系统很多东西实在存在的莫名其妙,时至今日,仍有许多疑点。但是对于现代操作系统,特别是Linux,越来越佩服了。原创 2022-10-12 22:32:48 · 1339 阅读 · 0 评论 -
Linux 2.6.4.30 Arm Architecture源码深度剖析---基于《ARM Linux内核源码剖析》
以下均是如此,内存管理和文件目录架构均没有太大的变化,而市面上唯一找到的便属这本《ARM Linux内核源码剖析》了,在它的基础上,我在本篇对该版本的。内存类型:根据内存使用目的的不同,内存类型对是否使用缓存、是否使用写缓冲、是否共享、域等信息的定义了不同设置,通过。由于嵌入式系统具有的资源十分有限,为了提高这种环境下内核内存的负载率和执行效率,使用压缩后的内核二进制文件。是 编译内核指定的,且都是虚拟地址,因此,只有将这些虚拟地址变更为物理地址,才能访问具有处理器信息的。架构代码进行词词解析,对!原创 2022-09-08 00:05:26 · 1331 阅读 · 0 评论 -
Linux 0.11源码的内存管理和进程创建&&Linux0.99改进方法简述
`Linux`内核源码剖析,在前面的一篇文章中有对其整体框架大致说清楚了,所以我也没有太在意其内在细节,在看完xv6源码之后,我对0.11版本还是有一些执念,感觉有一些不兼容。果然,让我发现了一些端倪,后来在网上查资料,才知道现在`Linux`操作系统的内存管理基本都是在0.99版本之后进行改进的,原始的0.11版本背负了太多历史包袱,导致其繁杂冗余,但是也没办法,当初能写出该系统也是在资源有限的前提下的。......原创 2022-08-18 04:29:53 · 504 阅读 · 0 评论 -
深度操作系统DeepinOS安装步骤和MySQL安装测试
深度操作系统是基于Linux内核,以桌面应用为主的开源GNU/Linux操作系统,支持笔记本、台式机和一体机。深度操作系统(deepin)包含深度桌面环境(DDE)和近30款深度原创应用,及数款来自开源社区的应用软件,支撑广大用户日常的学习和工作。另外,通过深度商店还能够获得近千款应用软件的支持,满足您对操作系统的扩展需求。深度操作系统由专业的操作系统研发团队和深度技术社区共同打造,其名称来自深度技术社区名称“deepin”一词,意思是对人生和未来深刻的追求和探索。---摘自百度百科...原创 2022-07-28 17:25:28 · 1035 阅读 · 0 评论 -
xv6多核系统进程调度流程及自旋锁的疑点
目录进程调度器在干吗?自旋锁的实现机制及其疑点xv6进程的睡眠和唤醒机制浅浅梳理一下进程切换的原理进程调度器在干吗?在main.c、proc.c和spinlock.c中初始化了进程描述符表和调度器// main.cint main(void) { // 初始化进程描述符表PCB pinit(); // 开始进程调度 mpmain();}static void mpmain(void) { scheduler(); // start running processes}原创 2022-05-07 18:42:35 · 735 阅读 · 0 评论 -
Linux内核源码的/arch和/sysdep目录下是什么&&Kconfig文件
目录/arch和/sysdep目录Kconfig作用/arch和/sysdep目录在Linux源码和glibc源码都看到一个类似的目录,在Linux源码中是/arch,在glibc中是/sysdep,这里面有很多汇编代码,仔细查看了才知道,这里面的是对相关处理器架构的各自的指令。如果大家对Linux深入感兴趣,推荐大家看一本书《计算机系统结构教程(张晨曦版)》,更好的了解处理器的架构和指令。下面是从网络上收集到的一些信息,权做参考,使用的源码是Linux5.17.5。Linux源码下载处原创 2022-05-05 17:36:34 · 1264 阅读 · 0 评论 -
GNU make文档个人解读(详略得当)
目录写Makefile规则分割长行翻看到最前面的一篇文章:比手写makefile好用一万倍CMake!,CMake无疑是一个很好的自动编译链接工具,但是从某种程度上来说,用了别人封装好的东西,就会失去很多主动性,被束缚住了,因此,对于原装的make的了解,是必要的,我一直坚信,懂底层方为上。如果在Windows环境下,如果你追求快速开发,可以跳过这篇文章,VS的内置编译环境和CMAKE和QMAKE诸如此类的应用封装的确实完整,我个人是不喜欢VS的,每次有问题看其源代码总是感觉怪怪的,可能它是P.J.Pl原创 2022-05-04 17:45:38 · 560 阅读 · 0 评论 -
KVM内核虚拟化技术以及Docker容器技术的原理浅谈?
KVM虚拟化技术随着云计算、大数据和分布式技术的发展和演进,我们需要在一台服务器上虚拟化出更多的虚拟机,还要让这些虚拟机能够弹性伸缩,实现跨主机的迁移。而虚拟化技术正是这些能力的基石。这一节课,就让我们一起探索一下,亚马逊、阿里、腾讯等知名公司用到的云虚拟主机,看看其中的核心技术——KVM 虚拟化技术。虚拟化技术是微内核的产物,在计算机层级中加上了一个中间层。微内核和宏内核区别和类似于集群和分布式,可自行了解,此处不作概述。虚拟机是运行在真实硬件上的产物,因此对于虚拟机的使用,无疑是要使用硬件原创 2022-03-30 17:52:02 · 1997 阅读 · 0 评论 -
关于《Linux内核完全注释》课后习题个人解答和相关数据结构整理
以下都是个人关于习题的个人解答(主要是没找到正确答案),如有错误,还望指出。第一章分别说明虚拟地址、线性地址和实际物理地址的定义,并说明他们之间的主要区别和相互关系。虚拟地址:假设了每个段的大小范围是0~4G,那么一个段的虚拟地址就是该段数据相对于本段的偏移值,是一个相对地址。线性地址:虚拟地址+偏移地址。即虚拟内存空间(VMA,virtual memory address),是一个进程的所有段相对于他的前一段的偏移地址,一般这个地址的最大限制受制于CPU的位数物理地址:线性地址通过段部件(虚拟原创 2022-03-23 19:09:30 · 2295 阅读 · 1 评论 -
一篇长文带你深析Linux动态链接的全过程
引言:最近受到了一位老师的启发(我不是CS专业的,我去找了信院里的操作系统的老师),又给我本狭隘的视野开拓了一些目光所及之处,交流了两个小时,倍感遗憾怎么没有早点认识这个老师,也倍感欣慰终于遇到了这种老师。这篇文章可能有点晦涩难懂,我希望你有以下的前置基础知识(基础即可,我会尽量说清):操作系统(最好看过CSAPP)AT&T语法的汇编语言(Intel汇编也可以,但是可能有些地方不同得去查询指令集开发手册了)对C和C++有一定的掌握对Linux操作熟练,对Linux内核和系统有一定的了解原创 2022-03-12 21:37:06 · 3430 阅读 · 0 评论 -
常用寄存器
常用有14个寄存器:通用寄存器:AX,BX,CX,DX变址寄存器:SI,DI指针寄存器:SP,BP指令指针寄存器:IP段寄存器:CS,SS,DS,ES标志寄存器:PSW8086CPU所有寄存器均为16bit,可存放2Byte,一个16bit寄存器存储一个16bit数据,最大值为2^16-1(decimal),FFFF(hexadecimal)汇编指令不区分大小当未对一个寄存器赋值的时候,其寄存器存储的值为0000H...原创 2021-06-17 16:43:24 · 4234 阅读 · 0 评论 -
ELF文件的架构和文件运行过程
文件架构来看一个文件的架构ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2’s complement, little endian Version: 1 (current) OS/ABI:原创 2021-06-18 19:21:28 · 1004 阅读 · 0 评论 -
nm命令和其内容详解
nm命令用于将二进制文件或可执行文件进行剖析常用参数// 可以直接man-A 或-o或 --print-file-name:打印出每个符号属于的文件-a或--debug-syms:打印出所有符号,包括debug符号-B:BSD码显示-C或--demangle[=style]:对低级符号名称进行解码,C++文件需要添加--no-demangle:不对低级符号名称进行解码,默认参数-D 或--dynamic:显示动态符号而不显示普通符号,一般用于动态库-f format或--format=fo原创 2021-06-18 16:22:44 · 5229 阅读 · 0 评论 -
ELF文件中段(section)的概念
段(Section)划分文件段(Section)一般可分为以下几个区域.text. :代码段.rodata:只读数据段.data: 已初始化全局数据段.bss:未初始化全局数据段。因为为初始化变量没有具体的值,所以无需在目标文件中分配用于保存值的空间,也就是在目标文件中不会占有实际的磁盘空间,仅仅是一个占位符。区分已初始化和为初始化全局变量是为了提高空间利用率。.symtab:符号表(symbol table)。在程序中被定义和引用的函数名和全局变量名都属于符号,与这些符号相关的信息都保存在符原创 2021-06-17 11:33:30 · 1255 阅读 · 0 评论 -
机器字长、存储字长和指令字长
机器字长:计算机能直接处理的二进制数据的位数,机器字长一般等于内部寄存器的大小,它决定了计算机的运算精度。指令字长:一个指令中包含二进制代码的位数。存储字长:一个存储单元存储二进制代码的长度,必须是字节的整数倍指令字长一般都取存储字长的整数倍,如果指令字长等于存储字长的2倍,就需要2次访存来取出一条指令,因此取指周期是机器周期的2倍,若指令周期等于存储字长,则取指周期等于机器周期。注意:64位操作系统是指特别为64为架构的计算机而设计的操作系统,能够利用64位处理器优势。但64位机器既可以使用64位原创 2021-06-17 10:26:11 · 4429 阅读 · 0 评论 -
Linux下的库操作工具-nm、ar、ldd、ldconfig和ld.so
1、nm [options] file 列出file中的所有符号[option] -c 将符号转化为用户级的名字 -s 当用于.a文件即静态库时,输出把符号名映射到定义该符号的模块或成员名的索引 -u 显示在file外定义的符号或没有定义的符号 -l 显示每个符号的行号,或为定义符号的重定义项2、ar {dmpqrtx} [member] archive file 用于操作高度结构化的存档文件(.a)[options]-c 创建存档文件-s原创 2021-06-23 01:46:16 · 389 阅读 · 0 评论 -
Linux软件安装之源码安装的--prefix选项
linux安装软件采用源码(一般是gz格式)安装灵活自由,适用于不同的平台,维护也十分方便。源码的安装一般由3个步骤组成:配置(configure)编译(make)安装(make install)# 检查环境,生成makefile文件,并将其放在/usr/local目录下生成一个独立文件夹./configure --prefix=/usr/local# 编译,生成sshspss可执行程序,连接第三方服务器make# 安装到用户目录sudo make install...原创 2021-06-30 01:34:51 · 377 阅读 · 0 评论 -
Linux下自己从0开始动手实现一个shell
源代码/************************************************************************* > File Name: kkbshell.c > Author: liuhao > Mail: 2226958871@qq.com > Created Time: Mon 13 Sep 2021 07:16:36 PM CST *********************************************原创 2021-09-13 20:51:45 · 229 阅读 · 0 评论 -
比手写makefile好用一万倍CMake!
当尝试过写了很多很多的makefile代码因为某些逻辑错误无法修改bug的时候,当因为无法理解文件引用的逻辑时(我深受其害)…makefile?代码引用逻辑就够喝一壶了。Linux下安装cmakesudo apt-get install cmake就用四个cmake基本命令吧# CMakeLists.txt# 指定cmake最小版本cmake_minimum_required(VERSION 3.0)# 生成项目名称project(MyLinuxServerTest)# 包含头文件路原创 2021-09-19 20:26:26 · 411 阅读 · 0 评论 -
shell编程(1):shell的定义
shell是一个程序,采用C语言编写,是用户和linux内核沟通的桥梁。它既是-种命令语言, 又是一种解释性的编程语言。通过-个图表来查看一下shel的作用。我们一般在shell上写命令(允许可执行文件),其实就是打开了和内核交互的过程。shell脚本,里面写的其实也是这些命令而已,比如# hw.shecho "Hello World"shell脚本提供了和内核交互的命令。仅此而已...原创 2021-06-29 20:08:22 · 154 阅读 · 0 评论 -
Linux下用rar压缩和解压文件
一.widonds下打包rar文件并上传yum install lrzsz rz test.rar二、下载并安装rar软件2.1 下载mkdir -p /home/oldboy/toolscd /home/oldboy/toolswget http://www.rarlab.com/rar/rarlinux-3.8.0.tar.gz2.2 安装tar zxvf rarlinux-3.8.0.tar.gzcd rarmakemake install 三、rar命令语法将/e原创 2021-09-15 17:12:47 · 283 阅读 · 0 评论 -
了解Linux(1):Linux下/etc相关目录解析
这里写目录标题adduser.confadjtimealternativesapparmor和apparmor.dbindrescport.blackcalendarchronyconsole-setupcroncrontabdeluser.confdhcpdpkgemascenvironmentethertypesfontsfstabgdbgroupgrub.dhdparm.confhosts刚考完试,不想写代码…考虑到经常用Linux,总是懵懵懂懂的用有点鸡肋,所以来写一写关于它的解析.先来看看第一原创 2021-05-15 01:32:23 · 1149 阅读 · 0 评论 -
Linux下配置自己的动态函数库路径
我们知道内存的读取数据速度是硬盘的好几倍,因此我们将常用的的动态链接库先载入内存当中(高速缓存,cache),如此一来,当使用动态函数库时,就不需要从头由硬盘中读出来啦配置想要读入高速缓存内存当中的动态函数库所在的目录sudo vim ./etc/ld.so.conf加入你想要读取的动态函数库的目录即可。ldconfig -v # 更新/etc/ld.so.conf可以验证一下ldconfig -p # 打印/etc/ld.so.conf的链接库内容同时将一份数据记录一份在/etc/ld原创 2021-06-24 15:01:02 · 200 阅读 · 0 评论 -
Linux权限详解(chmod、600、644、666、700、711、755、777、4755、6755、7755)
权限简介Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功。Linux下文件的权限类型一般包括读,写,执行。对应字母为 r、w、x。Linux下权限的粒度有 拥有者 、群组 、其它组 三种。每个文件都可以针对三个粒度,设置不同的rwx(读写执行)权限。通常情况下,一个文件只能归属于一个用户和组, 如果其它的用户想有这个文件的权限,则可以将该用户加入具备权限的群组,一个用户可以同时归属于多个组。Linux上通常使用chmod命令对文件的权限进行转载 2021-07-01 00:53:56 · 3579 阅读 · 0 评论 -
操作系统是怎么组织文件的?虚拟文件系统(Virtual File System)
ext2文件系统为例启动块(boot block):大小就是1KB,由pc标准确定。后面的都是块组构成,分为六部分,如图超级块(super block):整个分区的信息,在每个块组都有一份拷贝块组描述符表(gdt):本块的描述信息块位图(block bitmap):显示块是否占用inode位图:占一个块,表示每一个inode是否空闲可用inode表:文件类型,权限等等数据块(data block):常规文件数据,目录信息,符号链接,设备文件stat命令:读取文件的inode信息,然后把i原创 2021-09-13 20:20:51 · 268 阅读 · 0 评论 -
shell编程之<<重定向符号
<<重定向输出就是当执行文件的时候,有些参数 要我们输入,此时可用(与程序交互)举个栗子,我写个可执行文件// hello.cpp#include<iostream>using namespace std;int main() { int n; cin >> n; if (n == 1) cout << "Hello"; else if (n == 2) cout << "World"; else原创 2021-06-30 02:22:21 · 321 阅读 · 0 评论 -
Tmux使用教程
一、Tmux 是什么?1.1 会话与进程命令行的典型使用方式是,打开一个终端窗口(terminal window,以下简称"窗口"),在里面输入命令。用户与计算机的这种临时的交互,称为一次"会话"(session) 。会话的一个重要特点是,窗口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完。一个典型的例子就是,SSH 登录远程计算机,打开一个远程窗口执行命令。这时,网络突然断线,再次登录的时候,是找不回上一次执行的命令的。因为上一次原创 2021-09-26 23:07:59 · 121 阅读 · 0 评论 -
Linux:grep和管道符
作为和awk、sed齐名的grep文本操作,学好grep是很有必要的,当然,管道符也很重要grepgrep作用是在文件中提取和匹配符合条件的字符串行。grep [选项] “搜索内容” 文件名选项:-i 忽略大小写-n 输出行号-v 反向查找–color=auto 搜索出的关键字用颜色显示findfind:用于搜索符合条件的文件名,如果需要模糊查询,可以使用通配符,-regex选项也支持正则(equals)grep:用于在文件中搜索符合条件的字符串,如果需要模糊查询,可以使用正则(c原创 2021-06-17 01:26:25 · 2628 阅读 · 0 评论 -
Linux/UNIX免密登录
Linux/UNIX免密登录authorized_keys保存密钥在云主机上ssh-copy-id把公钥直接传送给云主机xshell注册密钥我的Linux版本是➜ ~ uname -aLinux iZwz9hl4wc7w8vb0fryco4Z 5.4.0-47-generic #51-Ubuntu SMP Fri Sep 4 19:50:52 UTC 2020 x86_64 x86_64 x86_64 GNU/Linuxauthorized_keys保存密钥在云主机上一般用的是ssh工具,我们原创 2021-06-19 12:55:43 · 280 阅读 · 0 评论 -
shell编程学习笔记
shell脚本就是将完成一个任务的所有 的命令按照执行的先后顺序,自上而下写入到一个文本文件中,然后给予执行权限。vim hello.sh# hello.sh#!/bin/bashecho "Hello World!"chmod 700 hello.sh./hello.shHello World!语法规范基本规范命名:命名要有意义(30个字解决)、以.sh结尾脚本格式:开头指针脚本运行环境,以#!组成(如#!/bin/bash)—解释环境注释:#,最好加入说明字段原创 2021-07-01 01:19:55 · 196 阅读 · 2 评论 -
Linux更改登陆shell
一般是命令chsh -s ./bin/shellname不过有时候不知道为啥有点出错,那便直接去文件里面修改吧其实chsh这个命令修改的就是这个文件中的内容su rootvim /etc/passwdyourname:x:1001:1001:,,,:/home/liuhao:/bin/zsh更改/bin下的可执行文件为你的shell即可,这个文件中的内容此前博客已做讲解,在此不做概述。...原创 2021-06-28 04:15:21 · 332 阅读 · 0 评论 -
XShell无法连接VMmare上的Ubuntu解决方法
主要原因在于没有开启ssh服务(端口为22)netstat -ant激活Internet连接 (服务器和已建立连接的)Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631原创 2021-07-11 16:24:36 · 116 阅读 · 0 评论 -
lib32、libx32、lib、lib64
lib:lib文件夹包含目标文件(object files)与库。lib32和lib64:lib32, lib64分别表示32位,64位的目标文件和库libx32:libx32是面向x32 ABI的目标文件和库。x32 ABI使用着32位地址空间,但是可以使用一些x86-64的特性(更多寄存器,更优良的浮点运算等)。32位是x86架构,64位是x64架构,x32代表的是地址总线、libexec:包含不由用户和shell script直接执行的二进制文件...原创 2021-06-19 13:12:14 · 1351 阅读 · 0 评论 -
编译原理(2):正则表达式和有穷自动机
正则表达式正则表达式基本概念正则定义有穷自动机(FA)FA的表示最长子串匹配原则有穷自动机分类确定的FA非确定的FADFA和NFA的等价性从正则表达式到有穷自动机从正则表达式到NFA从NFA变成DFA识别单词的DFA功能词法分析的错误处理正则表达式基本概念正则表达式(RE),是一种描述正则语言的更紧凑的方法正则表达式可以由较小的正则表达式按照特定规则递归地构建。每个正则表达式r定义(表示)一个语言,记为L(r )。这个语言也是根据r 的子表达式所表示的语言递归定义的epsilon是一个RE,L(ε原创 2021-06-24 20:30:43 · 2037 阅读 · 1 评论 -
编译原理(1):语言及其文法
语言及其文法语言及其文法基本概念字母表串文法定义语言的定义推导归约句子和句型CFG分析树构造树分析短语二义性语言及其文法基本概念字母表字母表(alphabet):字母表习是一个有穷符号集合。符号:字母、数字、标点符号、…如二进制字母表:{0, 1}ASCII字母表Unicode字母表字母表的运算字母表∑ 1和∑ 2的乘积(product)字母表∑ 的n次幂(power)(长度为n的符号串构成的集合)字母表∑ 的正闭包(positive closure)∑ + = ∑ ∪∑ 2原创 2021-06-24 19:33:39 · 1207 阅读 · 1 评论