自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(58)
  • 收藏
  • 关注

原创 OAI 5G-NR源码架构

在SA模式下,系统读取初始化配置文件,然后将其传送给RRC层,RRC层根据配置文件信息形成RRC message(如:SI系统消息),在5G NR NSA模式下,其接收的配置消息基本上就是MIB以及服务小区从X2接口传来的重配置消息。这里计算了空口帧的许多重要参数信息,包括每帧的时隙数、每子帧的时隙数、每个时隙的符号数、每帧的采样点数、每个时隙的点数、接收/发送天线数、频率范围、帧类型、子载波间隔等信息。对于半动态配置消息以及用户面数据信息的传送,MAC层与PHY层之间使用P7接口,对于上行数据,触发。

2024-07-17 15:38:09 738

原创 基于OAI平台的核心网+gNB+UE的搭建

主要是5G核心网、gNB、UE的一个搭建平台记录。

2024-07-17 15:22:22 772

原创 操作系统真象还原:实现文件写入

写入count字节前,先计算该文件已经占用的块数;5.将写文件所用到的块地址收集到all_blocks,共分为三种情况讨论;本节要实现的 sys_write 是系统调用 write 的内核实现,咱们之前的 write 是个简易版,它是为了临时完成输出打印的功能,不支持文件描述符。如今要让 write 支持文件描述符的话,还要修改下周边与此系统调用相关的内容。先将文件已有数据的最后一块数据读出来并与将要写入的数据在缓冲区中共同拼凑成一个完整的块,然后写入磁盘。,成功则返回写入的字节数,失败则返回-1。

2024-07-16 18:20:17 335

原创 操作系统真象还原:文件的打开与关闭代码实现

函数功能是打开编号为inode_no的inode对应的文件,若成功则返回文件描述符,否则返回-1。3.关于写文件,判断是否有其他进程正在写此文件,我们要保持互斥,读文件则不需要考虑;4.在创建文件进程或线程的。移除内存中的inode,并解除文件结构与inode的关系。:功能是将文件描述符转化为文件表的下标。先是获取一个空的fd描述符;函数就可以处理打开文件的命令了。:将文件正在写标志关闭,调用。,这样就可以顺利的摸到。

2024-07-16 18:18:48 210

原创 操作系统真象还原:创建文件

从查找是否存在,到最后创建之间,要排除以下情况:1、找到了,但是找到的是个目录;4.创建目录项,这里是会标记为普通文件的;加入打开的当前分区的根目录,初始化全局打开文件结构数组。3、在最后一个路径上没找到,但是没有传入表示创建文件的标志;此新增加的文件对应的目录项需要写入该目录的。中的某个扇区,原有扇区可能己满,所以有可能要申请新扇区来存储目录项。新增加的文件必然是存储在某一个目录中,所以该目录的。:函数功能是打开或创建文件成功后,返回文件描述符,即。,这些位于内存中已经被改变的数据要同步到硬盘。

2024-07-15 09:37:27 244

原创 操作系统真象还原:文件操作相关的基础函数

任何有关文件及目录的操作都了不开对inode的操作,因为我们需要通过inode知道文件的存储位置,所以操作文件,总是意味着要找到该文件的inode。涉及:找到一个inode在磁盘中的位置,初始化一个inode,加载该inode到内存中,修改内存中的inode之后同步到磁盘中,从内存中删除一个inode。接下来实现一堆与目录相关的函数,涉及目录打开、关闭,在一个目录文件中寻找指定目录项,初始化一个目录项,将目录项写入父目录中。同时一个目录中存储的是文件或者文件夹,在Linux下它又是一个文件,是文件就有。

2024-07-15 09:35:38 1223

原创 操作系统真象还原:文件描述符简介

inode 是操作系统为自己的文件系统准备的数据结构,它用于文件存储的管理,与用户关系不大,咱们要介绍的文件描述符才是与用户息息相关的。文件描述符即 file descriptor,但凡叫“描述符”的数据结构都用于描述一个对象,文件描述符所描述的对象是文件的操作。

2024-07-14 12:13:57 417

原创 操作系统真象还原:创建文件系统

Linux 内核所在的分区是默认分区,自系统启动后就以该分区为默认分区,该分区的根目录是固定存在的,要想使用其他新分区的话,需要用 mount 命令手动把新的分区挂载到默认分区的某个目录下,这就是上面所说的“拿”出来。尽管其他分区都有自己的根目录,但是默认分区的根目录才是所有分区的父目录,因此挂载分区之后,整个路径树就像一串葡萄。只会存在于内存之中,因为它管理的是对一个目录文件的操作(比如打开一个目录文件,就会在内存中创建这样一个结构体)。遍历所有分区,如果该分区没有文件系统就调用。

2024-07-14 12:11:45 494

原创 操作系统真象还原:文件系统概述

这是一个网站有所有小节的代码实现,同时也包含了Bochs等文件硬盘是低速设备,其读写单位是扇区,为了避免频繁访问硬盘,操作系统不会有了一扇区数据就去读写一次磁盘,往往等数据积攒到“足够大小”时才一次性访问硬盘,这足够大小的数据就是块,硬盘读写单位是扇区,因此一个块是由多个扇区组成的,块大小是扇区大小的整数倍。块是文件系统的读写单位,因此文件至少要占据一个块,当文件体积大于1个块时,文件肯定被拆分成多个块来存储,那么问题来了,这多个块该如何组织到一起?

2024-07-13 14:20:57 1284

原创 动态规划中01背包问题

我们先来理解倒序遍历,从最后一个元素往前看,看到的都是“上一层的元素”然后每遍历到一个元素,就把当前元素赋值成“当前层”的。这样得到的背包,因为每个元素加上的都是上一层的对应的物品value,所以不会重复。倒序的时候左边元素再刷新前都是上一层的数据,但正序就不一样了,正序的时候,左边的元素刚刚刷新过,也就是左边的元素已经是本层的了,意味着什么 这样会导致一个物品反复加好几次。,所以这里可以从左到右来更新背包的容量,因为之前的值都已经好好的存储好了不会在改变。表容量为j的背包,所背的物品价值可以最大为。

2024-07-13 14:15:59 425

原创 isdigit和isalnum

函数可以用于判断一个字符是否为数字,但是要注意它只能检查单个字符,不能判断整个字符串是否为数字。它接受一个字符作为参数,如果这个字符是数字字符(0-9),则返回非零值(通常是1),否则返回0。函数是 C++ 标准库中的一个函数,用于检查字符是否为字母或数字。是 C++ 中的一个函数,用于检查一个字符是否为数字字符。函数对所有大写和小写字母以及数字返回。因为字符 ‘7’ 是数字字符。

2024-07-12 23:11:37 211

原创 reverse函数讲解

是一个非常有用的函数,可以在需要反转容器或数组中的元素顺序时使用。它简单、高效,并且与C++标准库中的其他算法函数一样易于使用。

2024-07-12 23:09:55 146

原创 cin和getline的区别

cin读取单个单词getline读取一整行。cin跳过空白字符getline保留空白字符。cin用于简单输入getline用于需要读取包含空格的字符串或整行输入的情况。通过理解这两者的区别,可以根据具体需求选择合适的输入方式。

2024-07-12 23:06:51 186

原创 getline函数讲解

这里的参数char* s是输入的字符串变量, n是输入字符串的字符个数(第n个补’\0’),这个类的一个函数,所在的命名空间是std,因此,输入的时候要写成。是string流的函数,只能用于string类型的输入操作。是std流的函数,用于char*类型的输入操作。则会在输入空格时自动结束输入。所代表的字符就终止输入。是用来存字符的变量名,是输入终止条件,即遇到。是结束标志,此处作用与。

2024-07-12 23:05:31 181

原创 C++的priority_queue讲解

优先队列(priority queue)是一种特殊的队列数据结构,其中每个元素都有一个与之相关的优先级。在优先队列中,总是优先处理优先级最高的元素,而不是按照元素插入队列的顺序进行处理。在C++标准库中,是一种容器适配器,提供常用的优先队列功能。通常使用堆数据结构实现,以确保插入和删除操作的高效性。基本定义默认是使用大顶堆的,即队首总是最大的元素//储存int型数据//储存double型数据//储存string型数据priority_queue q;//储存结构体或者类。

2024-07-12 23:03:50 382

原创 stringstream类讲解

和 stringstream,分别用来进行流的输入、输出和输入输出操作。本文以为主,介绍流的输入和输出操作。主要用来进行数据类型转换,由于 使用 string 对象来代替字符数组(snprintf方式),避免了缓冲区溢出的危险;而且,因为传入参数和目标对象的类型会被自动推导出来,所以不存在错误的格式化符号的问题。简单说,相比 C 编程语言库的数据类型转换, 更加安全、自动和直接。

2024-07-12 22:54:01 1840

原创 操作系统真象还原:编写硬盘驱动程序

这是一个网站有所有小节的代码实现,同时也包含了Bochs等文件要实现文件系统,必须先有个磁盘介质,虽然咱们己经有个虚拟磁盘 ,但它只充当了启动盘的作用,仅用来存储内核,是个没有文件系统的裸盘( raw disk)如同我们之前第一章创建主盘时一样,在bochs目录下:创建磁盘然后在输入框依次输入以下,输入一个,按一次回车接下来,我们在文件中,写入这样,bochs虚拟机启动时,就会识别这个磁盘并且自动挂载。:用来查看物理地址处的值,eg:查看0x475处一个字节的值。这个0x475处存储的是主机上安装的硬盘数

2024-07-02 15:26:36 318

原创 操作系统真象还原:进一步完善内核

系统调用就是让用户进程申请操作系统的帮助,让操作系统帮其完成某项工作,也就是相当于用户进程调用了操作系统的功能,因此“系统调用”准确地来说应该被称为“操作系统功能调用”。Linux 系统调用是用中断门来实现的,通过软中断指令 int 来主动发起中断信号Linux 只占用一个中断向量号,即 0x80 ,处理器执行指令 int 0x80 时便触发了系统调用。

2024-07-01 16:05:32 698

原创 操作系统真象还原:用户进程

** @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE。

2024-06-23 16:44:46 1103 1

原创 操作系统真象还原:输入输出系统

键盘是个独立的设备,在它内部有个叫作键盘编码器的芯片,通常是 Intel8048或兼容芯片,它的作用是:每当键盘上发生按键操作,它就向键盘控制器报告哪个键被按下,按键是否弹起。这个键盘控制器可并不在键盘内部,它在主机内部的主板上,通常是 Intel 8042 或兼容芯片,它的作用是接收来自键盘编码器的按键信息,将其解码后保存,然后向中断代理发中断,之后处理器执行相应的中断处理程序读入 8042 处理保存过的按键信息。一个键的状态要么是按下,要么是弹起,因此一个键便有两个编码,按键被按下时的编码叫通码。

2024-06-19 20:56:11 918

原创 操作系统真象还原:线程

我们软件中所做的任务切换,本质上就是改变了处理器中程序计数器的指向,即改变了处理器的“执行流”。

2024-06-19 14:50:38 973

原创 操作系统真象还原:内存管理系统

make 给咱们提供了方法,可以在命令之前加个字符’@’,这样就不会输出命令本身信息了变量定义的格式:变量名=值(字符串),多个值之间用空格分开。make 程序在处理时会用空格将值打散,然后遍历每一个值。另外,值仅支持字符串类型,即使是数字也被当作字符串来处理。变量引用的格式:$(变量名)。这样,每次引用变量时,变量名就会被其值(宇符串)替换。/*

2024-06-10 19:16:53 963

原创 操作系统真象还原:中断

为了使所有设备之间的通信井然有序,各通信设备间必须有统一的节奏,不能各干各的,这个节奏就称为定时或时钟。时钟只是一种时间的度量,只是一种节奏。计算机中的时钟,大致上可分为两大类:内部时钟和外部时钟。内部时钟是指处理器中内部元件,如运算器、控制器的工作时序,主要用于控制、同步内部工作过程的步调。内部时钟是由晶体振荡器产生的,简称晶振,它位于主板上,其频率经过分频之后就是主板的外频,处理器和南北桥之间的通信就基于外频。Intel 处理器将此外频乘以某个倍数(也称为倍频)之后便称为主频。

2024-06-10 16:41:11 1059

原创 操作系统真象还原:完善内核

首先,每个进程都有自己的栈,这就是每个内存自己的专用内存空间。其次,保存参数的内存地址不用再花精力维护,己经有战机制来维护地址变化了,参数在战中的位置可以通过楼顶的偏移量来得到。调用者将所有参数从右向左入栈调用者清理参数所占的栈空间调用者将所有参数从右向左入栈被调用者清理参数所占的栈空间。

2024-06-05 15:13:05 706

原创 操作系统真象还原:保护模式进阶,向内核迈进

特权级转移分为两类, 一类是由中断门、调用门等手段实现低特权级转向高特权级,另一类则相反,是由调用返回指令从高特权级返回到低特权级,这是唯一种能让处理器降低特权级的情况。

2024-06-03 15:50:26 1016 1

原创 操作系统真象还原:保护模式入门

CPU 是按照程序中指令顺序来填充流水线的,也就是说按照程序计数器 PC(x86中是 CS: ip)中的值来装载流水线的,当前指令和下一条指令在空间上是挨着的。如果当前执行的指令是jmp,下一条指令已经被送上流水线译码了,第三条指令已经被送上流水线取指啦 仔细想想看,其实这个流水线没用了,因为 CPU 早已经跳到别处去执行了,第二、三条指令用不上了,所以 CPU 在遇到无条件转移指令 jmp 时,会清空流水线。

2024-06-02 19:15:09 923

原创 操作系统真象还原:完善MBR

关键字 section 并没有对程序中的地址产生任何影响,即在默认情况下,有没有 section 都一个样, section 中数据的地址依然是相对于整个文件的顺延,仅仅是在逻辑上让开发人员梳理程序之用。访问内存就要用“段:段内偏移”的形式,所以 cs 寄存器用来存代码段段基址, IP寄存器用来存储代码段段内偏移地址,同 cs 寄存器一样都是 16 位宽。数据段和代码段类似,只是这段区域中的内容不是指令,而是纯粹的数据,也就是说里面存储的是程序运行所需要的数据,属于指令的操作数。

2024-05-29 20:42:08 880

原创 操作系统真象还原:编写MBR主引导记录,让我们开始掌权

另外,因为 BIOS 进入 mbr 是通过 jmp 0: 7c00 来实现的,故此时 cs 己经变成 0,相当于“平坦模型”了,只不过此“平坦模型”大小只是 65536 字节,而不是 4GB。是编译器 NASM 预留的关键字,用来表示当前行和本 section 的地址,起到了标号的作用,它是 NASM 提供的,并不是 CPU 原生支持的。,它们的功能是告诉编译器:“嘿,老兄,你帮我把后面所有数据〈指令和变量 )的地址以 xxxx 为起始开始编吧”道 1 扇区的内容。,随后跳转到此地址,继续执行。

2024-05-29 20:36:24 392

原创 操作系统真象还原:部署工作环境

配置bochs的config文件(–prefix这后面填的是你想要安装bochs的目录),编译,安装。后面路径信息的前部分为自己的bochs安装路径)环境vmware + ubuntu 22.04。然后在输入框依次输入以下,输入一个,按一次回车。启动虚拟机查看效果(在bochs目录下)为即将要安装的bochs创建一个空目录。进入安装好bochs的目录。启动之后,输入c即可看见。

2024-05-29 20:34:59 194

原创 操作系统真象还原:一些你可能正感到迷惑的问题

平坦模型是相对于多段模型来说的,所以说平坦模型指的就是一个段。

2024-05-29 20:28:57 786

原创 剑指offer面试题34:在二叉树中和为某一值的路径

满足就加入最终的容器中,然后注意这里要对加入的值进行一个删除,达到回溯的目的。容器中,然后当到达了叶子结点就判断容器中的值是否满足。就是用深度优先遍历,直接将路径上的值存在一个。路径总和等于给定目标和的路径。是指没有子节点的节点。

2024-03-12 10:53:58 264

原创 剑指offer面试题32:从上到下打印二叉树

每一次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的末尾,接下来到队列的头部取出最早进入队列的节点,重复前面打印操作,直到队列中的元素全部打印完了。请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二次按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行一次类推。从上到下按照层打印二叉树,同一层的节点按照从左到右的顺序打印,每一层打印到一个容器里。从上到下打印出二叉树的每个节点,通一层的节点按照从左到右的顺序打印。如何广度优先遍历一幅有向图?

2024-03-11 15:57:48 405

原创 剑指offer面试题31:栈的压入、弹出序列

这个题目我们可以模拟整个入栈和出栈的操作,我们按照建立一个栈,按照pushed序列压入栈,并且判断是否与popped序列的首元素是否相同,如果相同就把这个元素从栈内弹出,并观察下一个popped元素判断与现在的栈元素首元素是否相同,如果是则循环操作,直到遇到与栈首元素不同或者栈为空时退出循环,继续在外边接着上面pushed序列压入剩余元素,等遍历完所有pushed元素后,如果两个序列相互匹配的话就栈内为空,否则就不为空。两个序列,每个序列中的。

2024-03-11 15:57:18 409

原创 剑指offer面试题28:对称的二叉树

1.中序遍历是左中右,所以初步想法是使用中序遍历把二叉树遍历一遍添加到容器中,这时候要把空着的节点以null的形式添加进容器,针对这种。2.书中的想法是使用迭代的思路,将比较左右两个节点,判断他们的情况一共有四种情况,都为空。树结构,然后把容器分为两段比较他们的值,从而得出是否是对称二叉树。,值一样则继续判断左节点的左子节点与右节点的右子节点情况。左节点的右子节点与右节点的左子节点情况。请设计一个函数判断一棵二叉树是否。,一个为空一个不为空。

2024-03-01 20:16:51 398

原创 剑指offer面试题22:链表中倒数第k个节点

2、我们还可以设置两个指针都同时指向头结点,第一个指针先走k-1步然后第二个指针开始跟第一个指针一起向后遍历,当第一个指针遍历到最后一个元素时,第二个指针就是指向的倒数第k个节点。1、求倒数第k个节点的值,我们归纳出当总共有n个节点时,倒数第k个节点就相当于从头开始的第n-k+1个节点。此方式要遍历两次链表第一次求出链表总数,第二次才能解出倒数第k个节点。实现一种算法,找出单向链表中倒数第 k 个节点。以下情况会导致代码崩溃,需要考虑。2.考察所写代码的鲁棒性。

2024-03-01 20:15:20 297

原创 剑指offer面试题16:数值的整数次方

同时这个代码可以优化,比如求一个数的16次方,上面的做法是从1到16依次来做,但是在这个过成中已经产生了8次方,我只要把这个8次方的数在两两相乘就可以得到16次方,这里需要考虑奇偶性。要权全面考虑输入的所有情况,输入的指数可能大于1,小于1或者是零和负数。不得使用库函数,同时不需要考虑大数问题。这里最容易出错的地方就是没有考虑到。

2024-01-10 20:07:19 336 1

原创 剑指offer面试题15:二进制中1的个数

针对这个问题,我们不右移输入的数字n。:这个方法思路是:先判断整数二进制中最右边一位是不是1;接着把输入的整数右移一位,此时原来处于从右边数起的第二位被转移到了最右边,在判断是不是1,这样每次移动一位,直到整数变为0为止。:在右移处理最左边的数字时:当位无符号数时,则用0填补最左边的n位;如果是有符号数时,则用数字的符号位填补最左边的n位,即填补n个1,请实现一个函数,输入一个整数,输出该数二进制表示中。所以上面的程序当输入的是一个负数例如。,则运算的最后结果为。

2024-01-09 17:17:30 369

原创 剑指offer面试题14:剪绳子

1.可以将这个问题看成为一个动态规划问题,我们现在求的是剪成为m段,得到的最大乘积。2.就是使用贪心算法,每一步裁剪的都是一个最优解,那么整体他就是一个最优,从局部最优推导出全局最优,当n>=5时,我们尽可能多地去剪长度为3的绳子;当剩下的绳子长度为4,就把绳子剪成两段长度为2的绳子,这样就可以得到最大乘积。例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。是顺序递增的,这意味着计算的顺序是自下而上的。的绳子,请把绳子剪成整数长的。),每段绳子的长度记为。

2024-01-08 19:50:35 368

原创 剑指offer面试题13:机器人的运动范围

这个题目类与之前的题目类似,就是起点是 [0, 0],判断当前点能够进入然后再遍历四周的点,每次移动到四周点时再将该点作为起点即可,也是一个回溯问题。的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于。例如,当k为18时,机器人能够进入方格。请问该机器人能够到达多少个格子?

2024-01-07 16:51:31 408

原创 剑指offer面试题12:矩阵中的路径

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。这是一个经典的回溯算法题目,可以使用回溯遍历出说有的结果,找到直到找到符合结果的路径。

2024-01-06 17:26:00 315

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除