《X86 汇编语言:从实模式到保护模式》
|
|
|
|
|
|
mov 指令没有指定操作数的大小,nasm 不知道怎么理解这三个 ASCII 码,可以是 8bit 的也可以是 16 或者 32bit
把显存的基地址移动到段寄存器里,然后字符 A 加上黑底白字下划线的特效移动到偏移 0x0 处,最后死循环
|
|
https://github.com/dibingfa/flash-linux0.11-talk
moutn hdc-0.11.img 会
|
|
编译 wsl 内核,加入 minix 文件系统
|
|
|
|
|
|
arch/x86/boot/bzImage 拷出来
%userprofile%\.wslconfig
|
|
|
|
p1 代表img 文件的 /分区号,从 1 开始
BIOS中断
BIOS 和 DOS 存在于实模式下,通过建立在中断向量表(Interrupt Vector Table,IVT)中的软中断指令 int 中断号来调用
中断向量表
中断服务程序入口地址的偏移量与段基址,一个中断向量占据4字节空间。中断向量表是8086系统内存中最低端1K字节空间,作用就是按照中断类型号从小到大的顺序存储对应的中断向量,总共存储256个中断向量
在中断响应过程中,CPU通过从接口电路获取的中断类型号(中断向量号)计算对应中断向量在表中的位置,并从中断向量表中获取中断向量,将程序流程转向中断服务程序的入口地址
由于中断向量表可以在操作系统层面灵活修改,不同系统的中断向量表可能不同
intel在CPU的保护模式下,占用了0x00 ~ 0x1F共32个中断号,Linux下从0x20开始用于系统自身的中断,包括8259芯片的中断重置
效果
汇编语言主要是 Intel 格式和 AT&T 格式。最常用的是 Intel 格式
Windows 平台 Intel 格式最常用的是两种汇编格式:MASM 和 NASM
《x86汇编语言-从实模式到保护模式》教你如何直接控制硬件,不借助于 BIOS、DOS、Windows、Linux 或者任何其他软件支持的情况下来显示字符、读取硬盘数据、控制其他硬件等
王爽的《汇编语言》基于 MASM,不少内容也过于陈旧,只能作为参考了
nasm 官网 nasm.us
寄存器
寄存器 | 宽度 | 类型 |
---|---|---|
rax | 64bit | long |
eax | 32bit | int |
ax | 16bit | short |
ah | 8bit | ax 寄存器的高八位 |
al | 8bit | al 寄存器的低八位 |
“X” 表示 Extern,表示从 8 位扩展到 16 位
“E”,还是 Extern 的意思
64 位 , “E” 换成 “R”,如RAX
在一个整型数组中,所有的数字都出现了两次,只有一个数是例外,找出这个数
还要求要在不使用额外空间的情况下找到解、要求的线性复杂度
使用二分查找倒是不会用到额外空间,可是时间复杂度为O(nlogn),又不符合线性复杂度
用异或运算的性质:
|
|
把数组中所有的数异或起来,得到的结果就是仅出现了一次的数
|
|
|
|
直接 ./configure 加参数后
|
|
|
|
|
|
创建两个 goroutines,在 channels a
和 b
上发送消息。发送完值后,关闭 channel
main routine无限循环来消耗channel中的值。不关心处理的顺序,使用 for..select处理来自channel的值
打印从通道获得的值后,无限循环继续运行。循环继续打印来自两个通道 b 和 a 的 0 值
一旦channel关闭,并且所有值都从其缓冲区中耗尽,通道将始终立即返回零值
|
|
应用程序通过 socket 和协议栈交互,socket 隔离了应用程序和协议栈,socket 是两者之间的接口,对于应用程序,它代表协议栈;而对于协议栈,它又代表应用程序,当数据包到达协议栈的时候,发生下面两个过程:
- 协议栈将数据包放入socket的接收缓冲区队列,并通知持有该socket的应用程序
- 持有该socket的应用程序响应通知事件,将数据包从socket的接收缓冲区队列中取出
多个进程阻塞在 accept 调用,协议栈将 client 请求 socket 放入 listen socket 的 accept 队列的时,唤醒一个还是全部进程来处理?
古早linux 内核通过睡眠队列组织所有等待某个事件的 task,wakeup 机制可以异步唤醒整个睡眠队列上的 task,wakeup 逻辑在唤醒睡眠队列时,会遍历该队列链表上的每一个节点,调用每一个节点的 callback,从而唤醒睡眠队列上的每个 task
一个 connect 到达这个 lisent socket 时,内核会唤醒所有睡眠在 accept 队列上的 task
N 个 task 进程 (线程) 同时从 accept 返回,但只有一个 task 返回这个 connect 的 fd,其他 task 都返回 — 1(EAGAIN)。即典型的 accept"惊群" 现象
惊群消耗什么
-
系统对用户进程/线程频繁地做无效的调度,上下文切换系统性能大打折扣
直接的消耗包括 cpu 寄存器要保存和加载(例如程序计数器)、系统调度器的代码需要执行。间接的消耗在于多核 cache 之间的共享数据
-
为了确保只有一个线程得到资源,用户必须对资源操作进行加锁保护,进一步加大了系统开销
锁机制也会造成 cpu 等资源的消耗和性能损耗
常见的服务器有通过锁机制解决,比如 nginx(可关);还有些认为惊群对系统性能影响不大,没有去处理,比如 lighttpd