Neohope's Blog http://www.neohope.com I'm here to learn and share. Fri, 27 Aug 2021 05:01:04 +0000 en-US hourly 1 https://wordpress.org/?v=5.8 Icarus Verilog环境搭建 http://www.neohope.com/2021/08/21/icarus-verilog%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba/ http://www.neohope.com/2021/08/21/icarus-verilog%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba/#respond Sat, 21 Aug 2021 04:58:25 +0000 http://www.neohope.com/?p=3994 1、下载Icarus Verilog Icarus Verilog: http://iverilog.icarus.com/home Icarus Verilog for Windows: http://bleyer.org/icarus/ vscode插件 Verilog-HDL/SystemVerilog/Bluespec SystemVerilog 2、下载示例源码 极客时间 操作系统实战45讲 Icarus Verilog示例源码 3、编译 4、在gtkwave中能查看波形咯

The post Icarus Verilog环境搭建 first appeared on Neohope's Blog.]]>
http://www.neohope.com/2021/08/21/icarus-verilog%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba/feed/ 0
Linux虚拟化管理 http://www.neohope.com/2021/08/21/linux%e8%99%9a%e6%8b%9f%e5%8c%96%e7%ae%a1%e7%90%86/ http://www.neohope.com/2021/08/21/linux%e8%99%9a%e6%8b%9f%e5%8c%96%e7%ae%a1%e7%90%86/#respond Sat, 21 Aug 2021 04:30:27 +0000 http://www.neohope.com/?p=3992 1、内核模块初始化 2、从数据结构角度,又可以看到了设备皆为文件的思想 3、通过上面的数据结构,我们就可以找到创建虚拟机的方法,并生成控制文件 kvm_dev.kvm_chardev_ops.kvm_dev_ioctl 或者,ioctl系统调用KVM_CREATE_VM,效果也是一样的: 4、生成虚拟CPU套路很相似,仍是文件操作 5、在调用ioctl时 6、启动虚拟机,还是文件操作 7、在调用ioctl时KVM_RUN 8、IO同样有虚拟化和半虚拟化两种 一个处理函数为kvm_fast_pio,另一个为kvm_emulate_instruction

The post Linux虚拟化管理 first appeared on Neohope's Blog.]]>
http://www.neohope.com/2021/08/21/linux%e8%99%9a%e6%8b%9f%e5%8c%96%e7%ae%a1%e7%90%86/feed/ 0
Linux系统调用03 http://www.neohope.com/2021/08/17/linux%e7%b3%bb%e7%bb%9f%e8%b0%83%e7%94%a803/ http://www.neohope.com/2021/08/17/linux%e7%b3%bb%e7%bb%9f%e8%b0%83%e7%94%a803/#respond Tue, 17 Aug 2021 12:18:42 +0000 http://www.neohope.com/?p=3981 Linux系统调用的整体流程为: 1、应用程序【用户态】通过syscall或glibc进行内核功能调用,这一部分在glibc源码中进行的 2、CPU收到syscall,Linux内核响应syscall调用【内核态】,这一部分在linux源码中进行的 3、返回结果到应用程序【用户态】 本节,给Linux系统,增加一个新系统调用功能,获取cpu数量。 1、新建一个源码编译目录 2、下载源码,解压 3、清理 4、修改文件 5、内核配置 6、修改.config,去掉一个证书 7、编译 8、安装 9、测试 9.1、新建文件cpus.c 9.2、编译 9.3、运行 极客时间 操作系统实战45讲 Linux系统调用源码

The post Linux系统调用03 first appeared on Neohope's Blog.]]>
http://www.neohope.com/2021/08/17/linux%e7%b3%bb%e7%bb%9f%e8%b0%83%e7%94%a803/feed/ 0
Linux系统调用02 http://www.neohope.com/2021/08/17/linux%e7%b3%bb%e7%bb%9f%e8%b0%83%e7%94%a802-2/ http://www.neohope.com/2021/08/17/linux%e7%b3%bb%e7%bb%9f%e8%b0%83%e7%94%a802-2/#respond Tue, 17 Aug 2021 12:16:32 +0000 http://www.neohope.com/?p=3987 Linux系统调用的整体流程为: 1、应用程序【用户态】通过syscall或glibc进行内核功能调用,这一部分在glibc源码中进行的 2、CPU收到syscall,Linux内核响应syscall调用【内核态】,这一部分在linux源码中进行的 3、返回结果到应用程序【用户态】 本节处理第二部分: 二、linux内核部分 1.1、以sys_openat为例,在syscall_64.tbl中为 1.2、make后,在生成的syscalls_64.h中为 1.3 在syscall_64.c中,展开__SYSCALL_COMMON 1.4、在syscall_64.c中,第一次展开__SYSCALL_64 1.5、在syscall_64.c中,第二次展开__SYSCALL_64 2、当产生系统调用时 2.1、应用直接syscall或通过glibc产生了syscall 2.2、cpu会产生类似于中断的效果,开始到entry_SYSCALL_64执行 2.3、调用do_syscall_64 2.4、根据sys_call_table调用对应的功能函数 2.5、但咱们实际写的函数sys_get_cpus,好像和实际调用函数__x64_sys_get_cpus,差了一个__x64,这需要一个wrapper 这样前后就对上了,glibc和linux内核就通了。

The post Linux系统调用02 first appeared on Neohope's Blog.]]>
http://www.neohope.com/2021/08/17/linux%e7%b3%bb%e7%bb%9f%e8%b0%83%e7%94%a802-2/feed/ 0
Linux系统调用01 http://www.neohope.com/2021/08/17/linux%e7%b3%bb%e7%bb%9f%e8%b0%83%e7%94%a801/ http://www.neohope.com/2021/08/17/linux%e7%b3%bb%e7%bb%9f%e8%b0%83%e7%94%a801/#respond Tue, 17 Aug 2021 12:12:05 +0000 http://www.neohope.com/?p=3985 Linux系统调用的整体流程为: 1、应用程序【用户态】通过syscall或glibc进行内核功能调用,这一部分在glibc源码中进行的 2、CPU收到syscall,Linux内核响应syscall调用【内核态】,这一部分在linux源码中进行的 3、返回结果到应用程序【用户态】 本节先处理第一部分: 一、glibc部分 1、应用程序调用open函数 2、展开后实际上调用了 3、而__open_nocancel 最终调用了INLINE_SYSCALL_CALL 4、宏展开【理解就好,不保证顺序】 4.1、初始为 4.4、第3次展开__INLINE_SYSCALL_NARGS 4.5、然后展开__SYSCALL_CONCAT,其实就是字符拼接 4.6、然后展开INTERNAL_SYSCALL4 4.7、展开INLINE_SYSCALL 4.8、展开INTERNAL_SYSCALL 4.9、最后internal_syscall4中,汇编调用了syscall 最终,syscall时,先传入调用号257,然后是四个真正的参数。

The post Linux系统调用01 first appeared on Neohope's Blog.]]>
http://www.neohope.com/2021/08/17/linux%e7%b3%bb%e7%bb%9f%e8%b0%83%e7%94%a801/feed/ 0
Mininet+ONOS网络模拟环境搭建 http://www.neohope.com/2021/08/16/mininetonos%e7%bd%91%e7%bb%9c%e6%a8%a1%e6%8b%9f%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba/ http://www.neohope.com/2021/08/16/mininetonos%e7%bd%91%e7%bb%9c%e6%a8%a1%e6%8b%9f%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba/#respond Mon, 16 Aug 2021 03:44:10 +0000 http://www.neohope.com/?p=3979 1、下载mininet虚拟机: 2、导入并运行虚拟机 3、安装docker 4、拉取onos镜像 5、运行ones容器 6、连接容器,启用服务 7、创建网络 8、网络访问 然后就可以看到拓扑图了

The post Mininet+ONOS网络模拟环境搭建 first appeared on Neohope's Blog.]]>
http://www.neohope.com/2021/08/16/mininetonos%e7%bd%91%e7%bb%9c%e6%a8%a1%e6%8b%9f%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba/feed/ 0
Linux内存管理 http://www.neohope.com/2021/08/15/linux%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86/ http://www.neohope.com/2021/08/15/linux%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86/#respond Sun, 15 Aug 2021 05:08:52 +0000 http://www.neohope.com/?p=3976 一、整理一下思路 NUMA体系下,每个CPU都有自己直接管理的一部分内存,叫做内存节点【node】,CPU访问自己的内存节点速度,快于访问其他CPU的内存节点; 每个内存节点,按内存的迁移类型,被划分为多个内存区域【zone】;迁移类型包括ZONE_DMA、ZONE_DMA32、ZONE_NORMAL 、ZONE_HIGHMEM、ZONE_MOVABLE、ZONE_DEVICE等; 每个内存区域中,是一段逻辑上的连续内存,包括多个可用页面;但在这个连续内存中,同样有不能使用的地方,叫做内存空洞;在处理内存操作时,要避免掉到洞里; 二、整理一下结构 每个内存节点由一个pg_data_t结构来描述其内存布局; 每个pg_data_t有一个zone数组,包括了内存节点下的全部内存区域zone; 每个zone里有一个free_area数组【0-10】,其序号n的元素下面,挂载了全部的连续2^n页面【page】,也就是free_area【0-10】分别挂载了【1个页面,2个页面,直到1024个页面】 每个free_area,都有一个链表数组,按不同迁移类型,对所属页面【page】再次进行了划分 三、分配内存【只能按2^n页面申请】 四、此外 1、在整个过程中,有一个水位_watermark的概念,其实就是用于控制内存区是否需要进行内存回收 2、申请内存时,会先按请求的 migratetype 从对应类型的page结构块中寻找,如果不成功,才会从其他 migratetype 的 page 结构块中分配, 降低内存碎片【rmqueue->__rmqueue->__rmqueue_fallback】 3、申请内存时,一般先在CPU所属内存节点申请;如果失败,再去其他内存节点申请;具体顺序,和NUMA memory policy有关;

The post Linux内存管理 first appeared on Neohope's Blog.]]>
http://www.neohope.com/2021/08/15/linux%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86/feed/ 0
Linux进程管理 http://www.neohope.com/2021/08/15/linux%e8%bf%9b%e7%a8%8b%e7%ae%a1%e7%90%86/ http://www.neohope.com/2021/08/15/linux%e8%bf%9b%e7%a8%8b%e7%ae%a1%e7%90%86/#respond Sun, 15 Aug 2021 05:06:48 +0000 http://www.neohope.com/?p=3974 一、进程数据结构 每个CPU有一个rq结构,描述进程运行队列,其中: A、cfs_rq、rt_rq、dl_rq,分别包含了公平调度、实时调度、最早截至时间调度算法相关的队列 B、记录了当前CPU的,正在运行的进程、空转进程、停止进程等; C、每个进程用一个task_struct结构描述; task_struct结构包括: sched_entity结构,描述调度实体; files_struct 结构,描述进程打开的文件; mm_struct结构,描述一个进程的地址空间的数据结构;其中包括,vm_area_struct 结构,描述一段虚拟地址空间 二、fork创建一个进程 三、调度器数据结构 sched_class结构,通过一组函数指针描述了调度器; __end_sched_classes,优先级最高 stop_sched_class,停止调度类 dl_sched_class,最早截至时间调度类 rt_sched_class,实时调度类 fair_sched_class,公平调度调度类 idle_sched_class,空转调度类 __begin_sched_classes,优先级最低 调度器的优先级,是编译时指定的,通过__begin_sched_classes和__end_sched_classes进行定位; 四、CFS调度 cfs调度算法,调度队列为cfs_rq,其整体是一个红黑树,树根记录在tasks_timeline中; cfs调度器,根据一个进程权重占总体权重的比例,确定每个进程的CPU时间分配比例;而这个权重,开放给程序员的是一个nice值,数值越小,权重越大; 同时,即不能让进程切换过于频繁,也不能让进程长期饥饿,需要保证调度时间: 当进程数小于8个时,进程调度延迟为6ms,也就是每6ms保证每个进程至少运行一次; 当进程数大于8个时,进程延迟无法保证,需要确保程序至少运行一段时间才被调度,这个时间称为最小调度粒度时间,默认为0.75ms; cfs中,由于每个进程的权重不同,所以无法单纯的通过进程运行时间来对进程优先级进行排序。所以将进程运行时间,通过权重换算,得到了一个进程运行的虚拟时间,然后通过虚拟时间,来对进程优先级进行排序。此时,红黑树的排序特性就充分发挥了,哪个进程的虚拟时间最小,就会来到红黑树的最左子节点,进行调度时,从左到右进行判断就好了。 这个时间又是如何刷新呢:

The post Linux进程管理 first appeared on Neohope's Blog.]]>
http://www.neohope.com/2021/08/15/linux%e8%bf%9b%e7%a8%8b%e7%ae%a1%e7%90%86/feed/ 0
Linux设备管理 http://www.neohope.com/2021/08/15/linux%e8%ae%be%e5%a4%87%e7%ae%a1%e7%90%86/ http://www.neohope.com/2021/08/15/linux%e8%ae%be%e5%a4%87%e7%ae%a1%e7%90%86/#respond Sun, 15 Aug 2021 05:04:54 +0000 http://www.neohope.com/?p=3972 关于数据结构 一、目录组织相关结构 kobject结构表示sysfs一个目录或者文件节点,同时提供了引用计数或生命周期管理相关功能; kset结构,可以看作一类特殊的kobject,可以作为kobject的集合;同时承担了发送用户消息的功能; Linux通过kobject和 kset来组织sysfs下的目录结构。但两者之间关系,却并非简单的文件和目录的关系。每个kobject的父节点,需要通过parent和kset两个属性来决定: A、无parent、无kset,则将在sysfs的根目录(即/sys/)下创建目录; B、无parent、有kset,则将在kset下创建目录;并将kobj加入kset.list; C、有parent、无kset,则将在parent下创建目录; D、有parent、有kset,则将在parent下创建目录,并将kobj加入kset.list; kobject和kset并不会单独被使用,而是嵌入到其他结构中发挥作用。 二、总线与设备结构 bus_type结构,表示一个总线,其中 subsys_private中包括了kset; device结构,表示一个设备,包括驱动指针、总线指针和kobject; device_driver结构,表示一个驱动,其中 driver_private包括了kobject; 上面说的kset和kobject的目录组织关系,起始就是存在于这些数据结构中的; 通过kset和kobject就可以实现总线查找、设备查找等功能; 三、初始化 全局kset指针devices_kset管理所有设备 全局kset指针bus_kset管理所有总线 初始化调用链路: 四、设备功能函数调用 miscdevice结构,表示一个杂项设备; 其中 file_operations包含了全部功能函数指针; 以打开一个设备文件为例,其调用链路为: 关于驱动程序Demo 极客时间 操作系统实战45讲 miscdrv源码 一、miscdrv是一个内核模块 1、四个操作函数,封装在file_operations结构中,包括: misc_open在打开设备文件时执行 misc_release在关闭设备文件时执行 misc_read在读取设备时执行 misc_write在写入设备时执行 file_operations又被封装在miscdevice中,在注册设备时传入 2、devicesinfo_bus_match函数用于总线设备的过滤,被封装在bus_type结构中 Continue reading Linux设备管理

The post Linux设备管理 first appeared on Neohope's Blog.]]>
http://www.neohope.com/2021/08/15/linux%e8%ae%be%e5%a4%87%e7%ae%a1%e7%90%86/feed/ 0
Linux文件管理 http://www.neohope.com/2021/08/15/linux%e6%96%87%e4%bb%b6%e7%ae%a1%e7%90%86/ http://www.neohope.com/2021/08/15/linux%e6%96%87%e4%bb%b6%e7%ae%a1%e7%90%86/#respond Sun, 15 Aug 2021 05:01:17 +0000 http://www.neohope.com/?p=3970 一、数据结构 1、四大基本结构 A、超级块管理为super_block,用于描述存储设备上的文件系统,可以从super_block出发把存储设备上的内容读取出来 B、目录结构管理为dentry,通过其来组织整个目录结构 C、文件索引节点管理为inode,可以先把它看作是存储设备上的具体对象,一个inode可以对应多个dentry【比如link】 D、文件管理为file,描述进程中的某个文件对象 2、Linux在挂载文件系统时,会读取文件系统超级块super_block,然后从超级块出发读取并构造全部dentry目录结构;dentry目录结构指向存储设备文件时,是一个个的inode结构。 3、应用程序在打开文件时,在进程结构task_struct->fs_struct中,记录进程相关的文件系统信息,这样就可以对文件系统,进行新增、删除、打开、关闭等相关操作。 4、同时,在进程结构task_struct->files_struct->fdtable->file,保存全部打开的文件指针,文件指针file结构中,会保存inode指针,从而可以获取文件权限、文件访问记录、文件数据块号的信息,进一步可以从文件读取文件信息。 二、trfs demo 极客时间 操作系统实战45讲 trfs源码 1、除上面的结构外,内部使用了两个结构:文件描述fileinfo,目录描述dir_entry A、fileinfo记录在了inode的私有数据中,这样通过inode就可以方便的找到fileinfo B、如果是文件,fileinfo.data中记录的就是文件内容 C、如果是文件夹,fileinfo.data记录的就是一个个dir_entry 2、trfs基于非连续内存 A、由MAX_FILES+1个fileinfo组成,记录在全局变量finfo_arr中,但第0和第MAX_FILES个好像没有使用 B、每个fileinfo中包含一个文件块,大小为MAX_BLOCKSIZE C、并没有使用单独的位图,而是通过每个fileinfo来记录其使用情况的 3、初始化 4、使用 A、每次新建文件或文件夹,就占用一个空闲的fileinfo B、删除文件或文件夹,就将一个fileinfo设置为可用 C、读写文件就是通过file找到fileinfo.data D、查找和枚举就是通过file找到fileinfo.data,然后访问其中的每个dir_entry

The post Linux文件管理 first appeared on Neohope's Blog.]]>
http://www.neohope.com/2021/08/15/linux%e6%96%87%e4%bb%b6%e7%ae%a1%e7%90%86/feed/ 0