@bit::Shadow
✧(≖ ◡ ≖✿
目录
[core dump 内存转储文件](#core dump 内存转储文件)
[ulimit -a指令查询](#ulimit -a指令查询)
[回顾冯 • 诺依曼体系结构](#回顾冯 • 诺依曼体系结构)
[在进程信号传递中断的作用: 承接上篇文章🔗🔗🔗](#在进程信号传递中断的作用: 承接上篇文章🔗🔗🔗)
信号表管理函数
管理基于下图
通过设定表内位值来达到"阻塞" / "未决"的目的。

block表
sigprocmask()
功能:++设定block区值++。
cpp
int sigprocmask(int how, const sigset_t* set, sigset_t* oldset);
how :
|-------------|----------------|
| SIGBLOCK | 希望添加的位 |
| SIG_UNBLOCK | 希望删除的位 |
| SIG_SETMASK | 按需直接设定(覆盖) |
set:设置值。
oldset 输出型参数:旧值拷贝。
返回值:-1表示失败。
pending表
sigpending()
功能:++获取pengding表++。
cpp
int sigpending(sigset_t* set);
简析信号频繁发送
当信号量过多 / 处理复杂情况,需要足够长时间时处理,仍然频繁发送的处理原则:
处理信号时接收到同种信号:
1.普通信号:直接丢失,(这是因为阻塞队列深度限制 为1)。
2.实时信号(34-64):++纳入阻塞队列,暂时挂起。++
内存转储文件的gdb使用
core dump 内存转储文件
core dump文件记录进程崩溃时的内存,寄存器,堆栈状态等。
| 单词 | 原意 | 在计算机中的含义 |
|---|---|---|
| Core | 磁芯(早期计算机内存) | 引申为"内存" |
| Dump | 倾倒、转储 | 将内存内容保存到文件 |
- 若进程使用了巨大内存(如100GB),core dump 同样接近100GB。 // 由于需要记录详细信息使用占用极大内存。
core终止的解释:在异常时终止,并产生core文件。供以debug(不过云服务器下常常禁止产生,因为频繁的重启消耗大------可通过指令开启)。
The default action of certain signals is to cause a process to terminate and produce a
core dump file, a file containing an image of the process's memory at the time of termi‐
nation. This image can be used in a debugger (e.g., gdb(1)) to inspect the state of the
program at the time that it terminated.
term终止:异常直接终止,不会产生core文件。
ulimit -a指令查询
功能:一个内置命令,表示当前Shell环境 下进程 及其启动拥有的各种资源限制。
bash
w@instance-qhw6x01g:~/e2026/June/6-13$ ulimit -a
real-time non-blocking time (microseconds, -R) unlimited
core file size (blocks, -c) 0 #可见此处的最大限制为0,那么就无法形成文件
data seg size (kbytes, -d) unlimited
core的临时修改与使用
cpp
# 修改 core dump 大小(单位:blocks,通常 1 block = 512 字节或 1024 字节)
ulimit -c 1024 # 限制为 1024 blocks(约 512KB/1MB)
ulimit -c unlimited # 不限制大小
除零错误演示:
设置大小

运行--出错产生文件


gdb调试(cgdb会出错),调试直接定位错误段

当core文件大小超出限制则不会生成。
信号执行
图解---系统调用下内核的执行逻辑

内核态与用户态
计算机组成原理---硬件中断
寄存器不仅存储在CPU中,在硬件(外设)中也有,像:磁盘。
☆☆中断控制器
外部设备(硬件)链接CPU是间接联系并非直接联系,其**间接链接设备称为"中断控制器"**一种常见的设备是"8259"电路板:


CPU的针脚
位于CPU背面,作为通信链接。


硬件中断的信息转换
外设与CPU的链接原理
中断控制器的线路链接外部设备和CPU的针脚等通信通道,中断控制器通过传递中断号在外设和CPU之间交互。

当外设作用(准备好、发送信号),通过(线路等)链接中断控制器,中++断控制器操纵寄存器被给予"中断号",后通过针脚通知CPU,CPU通过中断号 获知外设类型++,从而实现了从硬件到软件信息的转换。
回顾冯 • 诺依曼体系结构
存储器与CPU进行交互,信息交流。

CPU与OS的链路处理
外设与CPU通信完成后CPU无法处理数据只能获悉信息。
CPU维护中断例程信息再与**存储器(内存)**间沟通。
内存根据CPU提供的中断号索引操作系统注册的方法(像:函数指针方法处理键盘、网卡、处理显示器等),这些函数指针自然被统一封装,内核中称为IDT(Iterrupt Description Table 中断向量表 )。
硬件中断总图
从外设到操作系统的通信

时钟源
- 时钟源是一个计时器,它集成在CPU内。
- 时钟源内部使用高频信号和引用计数产生了进程时间片的概念。
- 时钟源控制进程轮转,其频率在100--1000Hz范围内与系统处理进程的终止及调度工作相关,所以称之为系统的脉搏。
在进程信号传递中断的作用: 承接上篇文章🔗🔗🔗
其集成于CPU内当中断信号发送到CPU内后,对时间片检查决定是否传递信号到中断向量表......。
正常情况下(大部分)操作系统是暂停的(pause()),当进程出现异常。OS首先进行重试,若多次重试无果(造成了)时间片耗尽,发送中断信号终止进程。

计时准则举例:
int count = 10;
CPU的多次请求(基于标准频率如:100Hz),请求前检查count是否大于0,每次请求后count--。
对应的count == 0 count > 0 都分别执行对应的进程调度。
*拓展:时钟源还与计算机的主频相关。
软中断
软中断指软件造成的中断导致执行流陷入内核。
虚拟内存表中,从低地址到高地址大约【0,3】GB为用户区【3,4】GB为内核区。

系统调用表
进程间所有的系统调用,调用同一张页表项(内核区页表) ,页表映射在物理内存中的操作系统区域。对于中断信号有物理内存相应区域维护的 **fs_ptr sys_call_table0**函数指针数组。
cpp
// 系统调用函数列举(以 x86_64 为例):
fs_ptr sys_call_table[0] = {
sys_setup, sys_exit, sys_fork, sys_read, sys_write,
sys_open, sys_close, sys_waitpid, sys_creat, sys_link,
sys_unlink, sys_execve, sys_chdir, sys_time, sys_mknod,
sys_chmod, sys_chown, sys_break, sys_stat, sys_lseek,
sys_getpid, sys_mount, sys_umount, sys_setuid, sys_getuid,
sys_stime, sys_ptrace, sys_alarm, sys_fstat, sys_pause,
sys_utime, sys_stty, sys_gtty, sys_access, sys_nice,
sys_ftime, sys_sync, sys_kill, sys_rename, sys_mkdir,
sys_rmdir, sys_dup, sys_pipe, sys_times, sys_prof,
sys_brk, sys_setgid, sys_getgid, sys_signal, sys_geteuid,
sys_getegid, sys_acct, sys_phys, sys_lock, sys_ioctl,
sys_fcntl, sys_mpx, sys_setpgid, sys_ulimit, sys_uname,
sys_umask, sys_chroot, sys_ustat, sys_dup2, sys_getppid,
sys_getpgrp, sys_setsid, sys_sigaction...
};
CPU怎么区分的内核态和用户态?
CPU怎么保证内核代码的安全?
CPU内拥有权限标志寄存器cs值为0表示内核态,值为3( 1 1 )表示用户态。在用户态与内核态切换的历程中会发生值的改变。
操作系统总结
总结:操作系统就是躺在中断向量表(IDT)和中断信号池中的软件集合
CPU内的软中断,如syscall等使得程序陷入(陷入前保存下一条指令的地址)内核的的调用
称为"陷阱"。
可重入函数与不可重入函数
可重入函数指:一个函数可以同时被多个执行流(如信号调用函数、多线程)同时安全地调用。
这样就涉及到了++数据同步++的问题。
使用场景:
你的主程序正在调用func()此时一个信号发过来,导致执行流立即陷入内核,而信号处理函数同样也调用了该函数func()。
多线程:多个线程同时调用该函数。
不可重入函数:通常具有外部属性的改变(如全局变量、内存申请、标准I/O函数像printf scanf"这些函数内部有缓冲区且可能调用malloc")。
感谢支持,持续更新
欢迎关注
