- 博客(272)
- 收藏
- 关注
原创 Linux 0.1x所有环境搭建(bochs运行0.12内核+和0.12传递文件+编译运行简单例程)
环境搭建电脑环境:OS: Deepin 15.11 stableKernel: x86_64 Linux 4.15.0-30deepin-generic在bochs运行0.12内核bochs:apt install bochs(自己编译麻烦)默认安装目录:主(工作)目录:/usr/local/bin,作用:配置文件,磁盘和bochs img工具默认配置(没啥用:/usr/local/share/doc/bochs用到的BIOS ROM和显卡ROM:/usr/local/share/bo
2020-05-22 22:52:23 1770
原创 Linux container_of() 宏定义
今天遇到了一段这样的代码,大致意思是 通过该struct结构体变量的成员的地址来反推该struct结构体变量的地址。功能:由结构体变量的某个成员变量的内存地址来得到该结构体变量的内存地址。并且用到了内核的宏,container_of()container_of()做了两步.该结构体成员变量的地址(指针)
2023-09-06 08:37:26 384
原创 使用UNIX域Socket传递文件描述符
[使用UNIX域Socket传递文件描述符]使用sendmsg(),recvmsg()fork后子进程继承父进程进程表象的描述符表(所有描述符项目),所以子进程和父进程相同的fd都共享了相同文件表象.不同进程打开相同路径文件的情况:操作文件的i节点是相同的,但是在内核文件表中维护了2个不同的文件表象(2个独立的进程),2个进程间传递fd的目的就是使2个进程的fd共享一个相同的文件表项 fork实现了父进程->子进程的fd传递,独立进程间通过sendmsg/recv
2020-11-18 23:33:03 1787
原创 I/O复用3个小实例+将signal转化为IO事件
I/O复用3个小实例:nonblock connect():利用error:EINPROGRESS非阻塞connect()man手册connect()The socket is nonblocking and the connection cannot be completed immediately. (UNIX domain sockets failed with EAGAIN instead.) It is possible to select(2) or poll(2) for
2020-11-08 21:59:42 982 1
原创 有限状态机实例:服务端实现简单的HTTP请求的读取和分析
有限状态机实例:服务端实现HTTP请求的读取和分析TCP/IP在包的头部给出头部的长度字段,但HTTP协议未提供头部长度字段,(头部长度变化大),头部结束时遇到空行,\r\n如果一次读操作没有读入HTTP请求的整个头部,即没有遇到空行,需要等待第二次读入,在每一次完成读操作,要分析新读入的数据是否有空行,(\r\n前面有请求头和头部字段),所以在寻找\r\n的过程中可以顺便解析http头部仅解析GET方法的http请求#include "me.h"#define BUFFER_SIZE
2020-10-30 22:45:23 772 1
原创 sql必知必会知识点总结(长
sql学习1.SELECT检索单个列SELECT prod_name FROM Products;返回未排序数据返回所有行,没有过滤检索多个列,列名之间加上,就行,SELECT prod_id,prod_name FROM Products;检索所有列,SELECT * FROM Products;,可以看到自己不知道名字的列2. 排序检索数据排序数据: SELECT prod_name,prod_price FROM Products ORDER BY prod_price;
2020-10-09 20:41:47 842
原创 Win下控制台简单贪吃蛇实现
贪吃蛇???算是对大一课设的交代>>>,代码抄过来的vs2020下编译,仅使用Sleep()和system(“cls”),_kbhit(),等几个win api结构: ------ main.c global.c global.h主要思路:2维数组每个点分别存墙(1),空地(0),蛇身体(2),食物点(3).然后遍历2维数组printf绘图蛇身体长度通过int* body[]指针数组指向对应地图点,main.c//#define _WINSOCK_DEPRECATED_
2020-10-01 20:08:48 201
原创 arp协议工作原理
测试网络:±-----------------------+ ±------------------------+| 主机A | |主机B || IP:192.168.247.141 | |IP:192.168.247.142 || MAC:00:0c:29:28:30:33 | |MAC:00:0c:29:ae:83:e0 |±---------±------
2020-09-29 16:46:45 783
原创 linux下在进程中加载执行纯2进制可执行文件bin
此博客来自他人,下面是自己的见解,因为正好用到相关内容objdump对纯2进制文件(hello.bin)反汇编objdump -m i386 -b binary -D hello.bin-m:指出反汇编目标架构-b:文件格式在进程中加载执行纯2进制可执行文件binmmap把2进制文件映射到进程用户内存空间,将程序控制权交给binlinux下用汇编通过中断调用api打印一个hello world (nasm版本),[section .data]output: db "Hello
2020-09-19 21:04:25 1441
原创 c语言提取tar包内容
tar文件:以一定方式将多个文件合并成tar文件,不对文件进行压缩,tar文件格式 很 简单,每个文件前面+512字节的header,并且将所有文件叠放在一起header1–file1–header2–file2–header3–file3解包就是读取文件头得到文件大小,然后读取出文件就行了提取tar文件并存储#include <stdio.h>// #include <.h>#include <stdlib.h>#include <unistd.h
2020-09-18 23:19:07 2183 2
原创 Orange‘s chapter10缺少的elf.h文件定义
Orange’s操作系统源码chapter 10,缺少的elf.h文件以及get_kernel_map()函数elf.h只用到elf_header和section_header,以及魔数 (写出部分定义就可以,剩下的没用)#ifndef _ORANGES_ELF_H_#define _ORANGES_ELF_H_typedef u32 Elf32_Word,Elf32_Addr,Elf32_Off;typedef u16 Elf32_Half;/* ELF header */typed
2020-09-15 20:28:41 439
原创 带有\n的printf被优化成puts
带有\n的printf被优化成putstest.c#include <stdio.h>int func(int a){ return 0;}int main(){ printf("Hello world\n"); return 0;}编译成可重定位文件.o gcc -c test.c查看elf section table readelf -S test.o找到.strtab序号,查看字符串表查看.strtab内容readelf -
2020-09-14 10:21:46 457
原创 多线程并发简单聊天室实现
多线程并发的简单聊天室实现server:每一个clnt对应一个线程,将从线程接收到的消息都转发个所有已经建立连接的clnt,clnt:一个线程用来发送msg给server,一个 线程用来接受msg并输出到stdoutserver.c使用了mutex建立临界区避免同时操作#include <me.h>#define BUF_SIZE 100#define MAX_CLNT 256void *handle_clnt(void*);//线程处理函数 void send_ms
2020-09-12 12:46:53 847 2
原创 线程同步:指定2个线程按顺序执行(信号量)
如何让2个线程按照先后顺序执行n次呢?如:线程A从用户输入得到值后存入全局变量num,此时线程B取走此值并且累加,总共执行n(5)次,完成后输出和<很有意思的问题,在基本忘掉了所以线程同步方法(只记得mutex,和基本信号量原理)的情况下,考虑为什么2个mutex不能实现?>我认为的原因:mutex不能决定进程A还是进程B谁先执行(而信号量初始化的时候可以控制状态),对于临界区2者功能一样2个信号量实现:#include <me.h>void* readin(
2020-09-11 21:20:20 827
原创 epoll入门
epoll对比select不需要 自己向OS传递监视对象信息,epoll由OS负责保存 监视对象文件fd,通过epoll_create()向OS申请资源int epoll_create(int size);在epoll实例中注册对象文件描述符int epoll_ctl(int epfd,int op,int fd,struct epoll_event *event);第二个参数option:EPOLL_CTL_ADD:向epoll实例中添加事件EPOLL_CTL_DEL:向epoll实
2020-09-09 20:14:27 193
原创 socket使用标准IO流分离
fd和标准IO相互转换fd->FILE*FILE * fdopen(int fd,const char *mode);#include <me.h>int main(void){ FILE *fp; int fd = open("news.txt",O_RDWR); if (fd == -1) { fputs("file open error",stdout); return -1; } fp = fdopen(fd,"w");
2020-09-08 15:45:40 309
原创 多播/广播
多播多播组地址:D类IP(具体的还没学)发送方设置TTL,接收方设置所在多组播组IPsetsockopt,IPPROTO_IP层选项:IP_MULTICAST_TTL:生存时间(time to live):组播传送距离IP_ADD_MEMBERSHIP:加入组播多播基于UDP协议完成,对面1000个用户,不需要像TCP建立1000个连接,不需要像UDP1000次数据传输,多播发送一次,由路由器完成包的复制发送方:./news_sender 224.2.2.2 9190#inc
2020-09-07 11:04:28 193
原创 recv函数MSG_PEEK|MSG_DONTWAIT|MSG_OOB选项
send recv函数ssize_t send(int sockfd,const void* buf,size_t nbytes,int flags);ssize_t recv(int sockfd,void* buf,size_t nbytes,int flags);之前一直在linux下使用read和write函数,MSG_OOB:TCP只有紧急模式,没有带外数据MSG_DONTWAIT:调用函数时不阻塞MSG_PEEK:只有recv能用,检测input缓冲区是否有数据,(缓冲区数据不变
2020-09-05 16:10:40 4143 1
原创 IO多路复用-select实现简单回声服务
I/O多路复用-select函数功能:将多个文件描述符统一监视,描述符是否能读写,以及是否发生异常?int select(int maxfd,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,timeval* timeout);fs_set注册使用由系列宏来完成,将fd_set看成bit mapFD_ZERO(fd_set* fdset); //所有位置位成0FD_SET(int fd,fd_set* fdset);//fd对应bit置位
2020-09-04 18:00:10 205
原创 多进程服务器端
多进程服务端利用信号回收子进程例子(利用子进程结束后向父进程发送SIGCHLD信号来回收子进程#include <me.h>//子进程结束信号void read_childproc(int signo){ int status; pid_t id = waitpid(-1,&status,WNOHANG); if (WIFEXITED(status)) { printf("Removed proc id: %d \n",id); print
2020-08-29 20:49:17 153
原创 Time_wait状态端口重利用
连接断开的过程:主机A发起请求断开连接,主机B回应ACK,FIN包,当主机A收到FIN包时,TIME_WAIT定时器开始启动,然后A向B发送ACK包,因为B没有收到ACK包,所以B不知道自己的FIN包是否发送成功B成功收到ACK包,连接断开B没有收到ACK包,认为自己发送的FIN包出现问题,则重新发送FIN包,为什么有Time_wait状态?如果没有Time_wait状态,A向B发送完ACK包后套接字完全终止,但是ACK包中途丢失,则B认为发送给A的FIN包丢失了,继续重传,但主机A已经处于
2020-08-24 16:44:27 1244
原创 编译当前目录所有.c
头文件都放在./include中CC = gccCFLAGS = -o2 -I include/ SRC = $(wildcard *.c) #代表所有的.c文件TAR = $(patsubst %.c,%, $(SRC)) #模式字符串替换all: clean $(TAR)$(TAR): %:%.c $(CC) $< $(CFLAGS) -o $@.PHONY: all clean clean: rm -f $(TAR)
2020-08-19 11:09:05 299
原创 Orange‘s:loader->kernel->中断(Minix)->进程(多)
从kernel.bin中根据elf文件格式执行内核加载kernel.bin步骤和加载loader.bin步骤一样,将kernel.bin加载到内存后,因为kernel的编译参数-Ttext 0x30400指定了程序入口(可以在/boot/include/load.inc中修改,并且修改kernel编译参数-Ttext就能加载到自己指定的内存地址处).因为**kernel被编译成elf格式,而非纯二进制,那么根据elf格式在把kernel程序段加载到内存中(program header中指定了,本书并未
2020-07-19 11:12:39 201 1
原创 Orange‘s:disp_str()字符串函数第二次调用乱码原因
书上.c编译参数加上-m32,LD链接参数-m elf_i386去掉此Bug后正好Makefile也完成了第2次调用disp_str()时乱码,Google后说是ebx没有进栈被保护的原因,果然没错,但是为什么呢?断点打到kernel起始执行地址:0x30400单步调试发现call cstart后如果第一次ebx被破坏后,第二次调用指向的参数地址错误,并且循环了多次调试信息:disp_str()第一次执行完毕后物理地址 0x304fdmemcpy()执行完毕物理地址: 0x3052.
2020-07-14 23:08:09 473
原创 Orange‘s:FAT12认识和Boot引导
前2章实验都是借助DOS提供保护模式环境来实验(因为在引导扇区512byte限制下提供不了保护模式),为了让OS进入保护模式而引导扇区又不能解决,通过boot把磁盘中的loader加载进内存,然后通过loader进入保护模式并且加载kernel这样就突破了512byte的限制boot->loader->kernel此书将软盘做成FAT12格式bximage制作1.44MB大小的fddd写入符合规则(BPB)的引导扇区则软盘被做成FAT12格式,(被dos或者linux识别后自动.
2020-07-12 11:02:52 331
原创 Orange‘s:保护模式小总结
Orange’s的中断方式我看了看和linux0.1x是一样的,时钟中断实验:回到实模式目前我认为没意义但是注意:a. 要求段寄存器高速缓冲器的属性(段长度)提前设置号b. cs通过在32bit代码段转跳到16bit代码段来设置(描述符)c. 直接修改jmp编译后指令的段地址d. 修改的8259A和IDTR需要恢复原样开启分页后人为使物理地址和线性地址对应,好操作通过宏填出描述符后,认为修改段基地址是很好的方法,宏定义各种描述符属性选择子起始就是偏移地址,因为 第几个*4
2020-07-10 18:21:42 358 1
原创 linux 0.12引导启动程序
引导启动程序91年16bit实模式的引导代码是Minix上的as86编译器编译的,现在改为as编译,进入32bit保护模式下后就是gas(现as)编译bootsect.S功能:将自己从0x7c00:0移动到0x9000:0处,并且读入setup.s(4*512=2kb)到自己后面将system模块读入到0x1000:0处,然后控制转移给setup.s在第一个扇区的倒数第6个字节开始分别是SWAP设备号和根文件系统设备号setup.S通过BIOS中断得到磁盘和内存的信息,以
2020-05-30 17:30:32 370
原创 第16章分页机制
386层次化分页结构页目录\页表\页页目录 页表 都占用4KB的页,1024个项,每个项4Byte大小页目录指向1024个页表,一个页表指向1024个页,一个页大小4KB,总的寻址大小是1024*1024*4KB=4GB在CR0中开启分页机制后,cpu段部件给出的地址不再是物理地址,称线性地址,需要经过页部件的转换为物理地址线性地址如何转换为物理地址CR3寄存器存页目录PDT的起始物理地址因为标准页是4KB,所以所有地址的低端12bit都是0,等会用作偏移量用将4KB的线性地址分
2020-05-18 10:54:30 300
原创 第15章任务切换
通过调用门尽管进入R0的例程,但是并没有进行任务切换,只是控制转换到了任务的全局区域任务切换的方法:中断:未屏蔽情况下,任务切换随时发生,如定时器中断(准确的时间间隔发生),强制任务实施任务切换(就我现在的理解就是进程能够执行的时间片是相同的,超过了在处理器层面上任务要切换),实模式在是内存最低端1KB的中断向量表,保护模式不再适用,取而代之的是中断描述符表类似GDT和LDT来保存描述符,不过保存的是门描述符: 中断门,陷阱门,任务门,中断和陷阱门本质是控制转移任务门本质是任务切换.
2020-05-13 16:26:10 237 1
原创 第14章特权级(控制转换)和任务
任务和特权级保护任务的隔离和特权级保护程序:记录在载体上的指令和数据,正在执行的一个副本叫做任务(task)为了有效在任务间实施隔离,每一个任务具有自己的描述符表,称为局部描述符表LDT(local):存放自己的段那么:类似GDTR,处理器中LDTR也是用来追踪LDT的LDT的数量依据任务的多少/段选择子中的TI(table indicator) 0=GDT 1=LDT任务状态段 TSS多任务环境下,任务切换保护现场:通用寄存器,段寄存器,ESP,EIP,EFLAGS 等,
2020-05-12 10:09:58 567
原创 第13章程序加载和动态执行
栈的描述符段界限大小的计算mov dword [ebx+0x18],0x7c00fffe ;粒度为4KB mov dword [ebx+0x1c],0x00cf9600高: 0x00cf9600低: 0x7c00fffe线性地址:0x00007c00c:1100 ->4kb,操作数32bit,limit:0xffffe 96:1001_0110_B:数据段读写向下扩展...
2020-05-07 17:50:48 276
原创 第11章:进入保护模式
描述符格式:高32位31 242322212019161514131211 87 0段基地址 24-31(8bit)GD/BLAVL段界限(19-16 = 4bit = 1个16位)pDPLSTYPE段基地址 23-16(8bit)低32位:...
2020-05-04 08:21:37 202
原创 IA-32架构 (Intel Architecture 32-bit)概览 和 8086小总结
IA-32架构 (Intel Architecture 32-bit)概览 和 8086小总结寄存器80868个通用寄存器AX BX CX DX SI DI BP SP32bit处理器在此通用寄存器扩展到32bitEAX EBX ECX EDX ESI EDI EBP ESP实模式下也可以使用,但是32bit寄存器的高16位不可独立使用32bit处理器拥有自己的工作模式:...
2020-05-01 17:13:51 757
转载 .vhd虚拟磁盘bochsdebug启动报错:ata0-0: could not open hard drive image file
.vhd虚拟硬盘用于bochs启动 软开实验修改硬盘类型为flat模式,不是VPC
2020-04-27 16:00:37 2818 8
原创 《X86汇编语言:从实模式到保护模式》检测点4.2报错:FATAL:Could not read from the boot medium!System halted
<x86汇编语言:从实模式到保护模式>检测点4.2报错:FATAL:Could not read from the boot medium!System halted已经有虚拟磁盘文件并且启动顺序是第一,错误原因:有效的主引导扇区的最后2个字节应当是0x55和0xaamov ax,0xb800mov ds,axmov byte [0x00],'h'mov byte ...
2020-04-27 09:45:05 952
原创 AIO小实例
使用同步IO和异步IO(熟悉AIO接口)的对比来自apue要求: 将文本的英文字符a-z和A-Zx向右偏移13个字母(不重要),命令行传入输入和输出文件路径完成相同的事情,同步IO和异步IO的对比同步IO#include "apue.h"#include <ctype.h>#include <fcntl.h>#define BSZ 4096un...
2020-03-24 20:51:45 242
原创 Debian下cpupower设置记录
Linux内核调频知识 链接查看当前cpu调度器cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor查看cpu支持调度cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors查看当前cpu频率cat /proc/cpuinfo | gre...
2020-03-17 10:36:03 2919 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人