2023秋招进展
graph LR
A(事项)-->LC(力扣)
LC-->easy(easy 60题)
LC-->medium(medium 10题)
LC-->hard(hard 2题)
A-->OS(操作系统内核)
OS-->inline(内联汇编)
inline-->trans(fa:fa-hand-o-right 翻译 )
OS-->boot(内核实现)
boot-->chapter8(fa:fa-hand-o-right 第八章 )
A-->DP(设计模式)
DP-->EF(简单工厂)
DP-->ST(单例)
DP-->OB(fa:fa-hand-o-right 观察者 )
A-->CSAPP(CSAPP)
CSAPP-->num3(fa:fa-hand-o-right 第3章 )
A-->CN(计算机网络)
CN-->HT(fa:fa-hand-o-right 图解HTTP)
A-->Rust(Rust)
A-->RHCE(红帽认证)
RHCE-->STUDY(fa:fa-hand-o-right 课程学习 )
...
红帽RHCE培训记录(四)
日志管理
systemd-journald 服务
记录的是本次启动之后的日志,是二进制文件,只能通过日志来看
rsyslog 服务
该服务对 syslog 消息进行排序,写入到 /var/log/ 文件夹下,重启后依然保存
系统日志文件
/etc/rsyslog.conf 专门管理日志的配置文件,配置了什么类型的日志记录在哪个文件中
在 /var/log/ 文件夹下
/var/log/messages 大多数系统日志消息记录在此,包括记录服务信息,系统报错信息等
/var/log/secure 与安全性和身份验证相关的日志
/var/log/cron 与定时任务和执行相关的日志
/var/log/maillog 与系统中邮件服务日志
/var/log/boot.log 与系统启动相关的日志,用 dmesg 命令查看
查看追加的日志中,err、warn、fail 的前后10行的内容。
tail -f /var/log/messages | grep -iE -C10 'err|warn|fail'
rsyslog 服务管理
rsyslog 服务使用日志消息的类型和 ...
站在巨人的肩上之操作系统篇(二)
终于从科研中抽出身来搞一搞自己的项目,MiniOS目前到了第8章了,越深入下去不懂的地方也就越多。
你能递归的去死磕一个问题多深,并且能安全的返回到原来你最初想要解决的问题,没有"爆栈",那么这个深度就代表你的学习能力。深度越深,学习能力越强。人不可能一直拥有一个足够舒适的环境去系统地把所有东西都搞定,不可能把所有的基础知识都搞定了再上项目,去解决实际问题。在实际问题中发现问题,解决问题,才是真真的学习能力!!!不是TM卷子上多少分!
目前最难懂部分还是汇编。之前看王爽的《汇编语言》,这本书虽然易懂,但是对应到目前操作系统的底层汇编代码,还是不够。再次踏上汇编的学习之路,目前在看《X86汇编语言:从实模式到保护模式》和《深度理解计算机系统》第三章。
本篇所有的描述都是AT&T格式的汇编
汇编的补充知识
基本指令
源操作数指定的值是一个立即数,存储在寄存器或者内存中。目的操作数指定一个位置,要么是一个寄存器,要么是一个内存地址。x86-64加了一条限制,传送指令的两个操作数不能都指向内存位置。 将一个值从一个内存位置复制到另一个内存位置需要两条指令——第一条指令将源值加 ...
GDB调试
C语言GDB调试
用 gcc 编译的时候,编译后的可执行文件不会包含源程序代码。如果想要编译后的文件用于调试,需要加 -g 参数,例如
1gcc -g -o book113 book113.c
编译完成后在终端输入
1gdb book113
即可进行调试
命令
缩写
说明
set args
设置主程序的参数,方法为 set args arg1 arg2 ...如果参数中包含特殊符号,用 “” 把参数包含进来,即 set args "arg1" "arg2" ...
break
b
设置断点,b 20表示在第20行设置断点。可以设置多个断点
run
r
开始运行程序,运行到断点位置停下来。如果没有遇到断点,程序一直运行下去
next
n
执行当前语句,如果该语句为函数调用,不会进入函数内部执行
step
s
执行当前语句,如果该语句为函数调用,则进入函数执行其中的第一条语句如果是库函数或第三方提供的函数,用 s 是进不去的,因为没有源代码。自己定义的函数可以进入
print
p
显示变量值,例如:p name 表 ...
win10与ubuntu双系统蓝牙配对问题
在 win10 与 ubuntu 双系统下,如果你使用的是蓝牙耳机、蓝牙键盘、蓝牙鼠标等蓝牙设备,那么一定会遇到过,在 win10 上面配对成功可以正常使用的蓝牙设备,在切换到 ubuntu 上再次重新配对,然而切换回 win10 系统之后却无法连接,只能再次重新配对的情况。即,在一个系统上配对成功的设备,若想在另一个系统上使用,每次都需要重新配对。
烦烦烦!!!
本文参照 win10 ubuntu16 双系统共用蓝牙鼠标 一文总结了解决方案,请务必每一步都按照下面的去做:
本文以一个蓝牙耳机为例
删除在 win10 上已成功配对的蓝牙设备
在 win10 上重新配对
删除在 ubuntu 上已成功配对的蓝牙设备
在 ubuntu 上重新配对,按照如下路径找到该 key,保存下来,等下要用
特别注意,3、4 两步顺序不能颠倒!
关闭蓝牙耳机,并重启电脑进入 win10
在 win10 上,下载这个工具 PsExec,解压后,以管理员身份运行 PowerShell,进入到该工具目录下
执行 PsExec.exe -s -i regedit 打开注册表, ...
左神算法基础班第一周
异或的性质及扩展
将异或看成“无进位相加”。那么,它的一些性质就好理解了。
0 ^ N = N,0 与任何数异或都是这个数本身。N ^ N = 0,任何数与自己异或都为 0。
异或运算满足交换律和结合律
不用额外变量即可交换两个数
123456int a = 7;int b = 103;a = a ^ b;b = a ^ b;a = a ^ b;
证明:把第4行代入第5行,b = (a ^ b) ^ b = a。把第4行和第5行的结果代入第6行,a = (a ^ b) ^ a = b
一个数组中,有1种数出现了奇数次,其他都出现了偶数次。怎么找到这种数。 :sparkles:
力扣 136,剑指offer 56
用一个初值为 0 的变量去异或数组中的每一个元素,最后的结果就是出现了奇数次的数。
原因:因为异或运算满足交换律,只要是出现了偶数次的数,那么其异或的结果必为0;出现了奇数次的数,异或的结果必为它本身。
力扣 136题
12345678int singleNumber(vector<int>& nums) { int ero ...
站在巨人的肩上之操作系统篇(一)
本系列博客承接自 https://lushuangning.github.io/posts/f0c07695/,在了解了一些汇编的基础知识和计算机的底层原理之后,现在开始尝试搭建一个操作系统的微内核。由于目前的进度已经到了第五章,我会在这篇博客上慢慢补充前五章里比较重要的部分。
汇编语言学习记录(七)
本篇主要介绍四级页表的代码实现
汇编语言学习记录(六)
本篇主要介绍内存分页
汇编语言学习记录(五)
本篇主要介绍 CPU 如何从实模式切换到保护模式
汇编语言学习记录(四)
本篇主要介绍 FAT32 文件系统
汇编语言学习记录(三)
从硬盘读取文件
伪指令 equ
1app_lba_start equ 100
常数是用伪指令 equ 声明的,他的意思是“等于”。本句的意思是,用标号 app_lba_start 来代表数值 100。
和其他伪指令 db、dw、dd 不同,用 equ 声明的数值不占用任何汇编地址,也不再运行时占用任何内存位置。
MBR 分区
MBR 分区存储在第0面第0道(柱面)1扇区,只占512字节。每台计算机都有一个 BIOS 程序,从硬盘的0面0道1扇区来寻找MBR。
操作系统就是就是被这440字节拉起来的。
运行启动扇区外的文件
我们之前写的几段汇编程序,都是写在了这个BootLoader中。但毕竟 BootLoader 只有512字节,太小了,所以还是得将指令和数据写到更广阔的的空间去,BootLoader 找到它并将它加载到内存就可以了。
BootLoader 代码
Program 代码
回车与换行
ASCII 码表里,有128个字符,其中96个是可显示的。包括大小写字母、数字等等。32个控制字符不可显示,比如回车、换行、制表符等。
处理回车和换行,就是处理 0x0a,0x0d。
光标的 ...
ptrdiff_t, size_t, difference_type
ptrdiff_t
ptrdiff_t 是 C/C++ 标准库中定义的一个与机器相关的数据类型。ptrdiff_t 类型变量通常用来保存两个指针减法操作的结果,在 cstddef 头文件中定义。用来保存两个指针减法操作的结果,通常被定义为 long int 类型。
ptrdiff_t 与 difference_type 区别,前面的是 C++ 定义的标准,后面则是 STL 定义的。
size_t
size_t是标准C库中定义的,它是一个基本的与机器相关的无符号整数的C/C+ +类型,它是sizeof操作符返回的结果类型。
常常会有人认为 在C/C++中 sizeof 是一个函数,而实际上 C/C++ 中的sizeof 是一个运算符。sizeof 运算符的结果是 size_t ,它是由 typedef 机制定义出来的”新”类型。
通常,size_t 和 ptrdiff_t 都是用typedef来实现的。
1typedef unsigned int size_t
size_t还经常出现在C++标准库中,此外C++库中经常会使用一个相似的类型size_type。
size_t 是全局定义的 ...
C++分配器
分配器 allocator 对容器的效率至关重要
operator new() 和 malloc()
所有的 C++ 平台上,operator new()函数里面都调用了 malloc()函数。
malloc 实际上向内存索要的空间,比它实际上返回的要多。
而 operator delete() 函数里调用 free() 函数。
allocate 和 deallocate
VC6 附带的标准库中,allocator 的实现如下
12345678910111213141516template<class _Ty>class allocator{public: typedef _SIZT size_type; typedef _PDFT difference_type; typedef _Ty _FARQ *pointer; typedef _Ty value_type; pointer allocate(size_type _N, const void *){ return (_Allocate((difference_type)_N, ...
汇编语言学习记录(二)
除了看王爽的汇编语言程序设计之外,最近还在 b 站上看到了 up 主谭玉刚讲的 Coding Master系列视频,从计算机底层讲起,清晰易懂,包括 x86 汇编,感觉比看书学习效率更快。不过该系列视频使用的是 NASM 汇编器,在语法上与王爽的代码有很多不同之处。
在这之前,补充点计算机启动时候的知识。
计算机是如何启动的?
内存分配
8086 CPU 是如何分配内存的?
计算机 BIOS 执行完 POST 后,会到硬盘等设备的 MBR 分区上找 BootLoader,找到就加载到内存 0x7c00 的位置。注意这个 0x7c00,刚好等于 32KB - 1024B。这个数字与 IBM PC Model 5150 有关。该计算机支持的最大内存时 32KB,也就是 0x0000~0x7FFF。操作系统起来后,BootLoader 的使命也就完成了,可以将其占用的内存释放。因此,最好的方法是将 BootLoader 放在内存的最后。那么 BootLoader 要占多少空间呢?MBR 扇区要占 512 个字节,栈/数据要占 512 个字节,总共 1KB。将其放在 32KB 的内存空间的 ...
红帽RHCE培训记录(三)
文件系统
块设备命名:
IDE设备:/dev/hda, /dev/hdb
SATA/SAS/USB设备:/dev/sda, /dev/sdb
virtio-blk 超虚拟化存储: /dev/vda, /dev/vdb
NVMe设备(SSD):/dev/nvme0, /dev/nvme1
逻辑卷:/dev/mapper/*
文件系统类型:
Windows 文件系统类型: fat32, NTFS
Linux 本地文件系统: ext2, ext3, ext4(rhel6), xfs(rhel7, rhel8)
网络文件系统: NFS, CIFS
集群文件系统: GFS, GFS2
分布式文件系统: CEPH
光盘: iso9660
文件数据块(block):存放文件的数据,文件的最小存储单元,默认大小是 4K。
inode 是文件的唯一标识号,存放文件的元数据,包括:
- 文件类型,权限,UID 和 GID
- 文件的链接数
- 文件大小和时间戳
- 文件数据块(block)在磁盘上的块指针
- 其他信息
使用 df -h 查看系统的文件组织结构
目录和文件的关系
系统识别文件是通过 i ...
命名空间里的友元函数
问题描述:
类声明:student.h
123456789101112131415...namespace Studenti { class Student : private std::string, private std::valarray<double> { private: typedef std::valarray<double> ArrayDb; std::ostream& arr_out(std::ostream& os) const; public: Student(); ... friend std::ostream& operator<<(std::ostream& os, const Student& stu);};}
类定义:student.cpp
1234567891011#include "student.h"...using namespace Studenti;ostream ...
TCP-IP网络编程(二)
(未完待续)
红帽RHCE培训记录(二)
最近在准备RHCE认证考试,这是培训时候的记录
TCP/IP网络编程(一)
基于Linux的套接字相关函数
在 linux 下,socket 也被认为是文件的一种。
文件的读写:
12345#include <sys/types.h>#include <sys/stat.h>#include <fcnt1.h>int open(const char* path, int flag);
12345#include <unistd.h>ssize_t write(int fd, const void* buf, size_t nbytes);int close(int fd);
12#include <unistd.h>ssize_t read(int fd, void* buf, size_t nbytes);
open 函数的返回值即文件描述符,也即 close 函数的参数。
ps: size_t 是通过 typedef 声明的 unsigned int 类型;ssize_t 是通过 typedef 声明的 signed int 类型。
服务端套接字创建过程
1234567891011121314 ...