linux-0.01 boot.s 改编成适合 NASM 语法

FAT12文件系统遍历实验:从磁盘布局到实模式内核实现 在操作系统开发中,文件系统常被视为从引导启动迈向实用内核的关键门槛。理解磁盘如何组织数据、目录项如何描述文件、文件分配表如何串联簇链,是构建可读文件内核的基础。FAT12作为最精简的文件系统之一,采用12位表项管理1.44MB软盘上的数据,其设计思想深刻影响着FAT16、FAT32等后续方案。通过实模式汇编与BIOS中断,开发者可以逐步解析引导扇区BPB、定位根目录区、匹配8.3文件名,并沿FAT链逐簇读取内容。这一过程不仅揭示了操作系统访问磁盘文件的底层原理,也为后续实现用户程序加载器、支持子目录遍历和迁 阅读详情
linux-0.01 boot.s 改编成适合 NASM 语法

linux-0.01中的boot.s是使用as86汇编器进行汇编,利用现行的Linux发行版本的as86汇编器进行汇编存在部分语法问题,

主要的语法修改:

0.0 编译成为16实模式为代码,编译起始地址为0

[BITS 16]        
[ORG 0x0000] 

1.注释 “|” 改为 ";"

2.常量起始标识”#“去掉

2.1 对内存地址addr的内容的引用改为[addr],

如:原格式add ax, sread

改为:add ax,[sread]

3.符号常量定义符号由 ”=“ 改为 EQU

4.为了直接生成binary文件,将如下段说明语句去掉(行首的数字为boot.s中的文件行号)

    40  .globl begtext, begdata, begbss, endtext, enddata, endbss
    41  .text
    42  begtext:
    43  .data
    44  begdata:
    45  .bss
    46  begbss:
    47  .text

   324  .text
   325  endtext:
   326  .data
   327  enddata:
   328  .bss
   329  endbss:

5. c语言格式的注释换成 NASM 语法的注释,行首加上;

   285  /*
   286   * This procedure turns off the floppy drive motor, so
   287   * that we enter the kernel in a known state, and
   288   * don't have to worry about it later.
   289   */


6. 294行的outb在NASM中应该改为out dx,al

   290  kill_motor:
   291          push dx
   292          mov dx,#0x3f2
   293          mov al,#0
   294          outb
   295          pop dx
   296          ret

7.加入SYSSIZE符号常量的定义

 SYSSIZE EQU 0x2000

8.文件为加入启动扇区signature 0x55aa,故将空闲的字节填充为0x00,凑足一个扇区的512个字节

    times 510-($-$$)  db 0        ;  all the rest filled with blank    
    db 0x55,0xaa   
主要的修改就是这些,些微的细节详见下面的代码。
编译命令:nasm boot_nasm.s -l boot_nasm.lst -f bin -o boot.bin

===================改写后的代码===============

;; rewrite the boot.s to fit the NASM syntax
;; snallie@tom.com
;; to make: nasm boot_nasm.s -l boot_nasm.lst -f bin
;; Time-stamp: <root Thursday 09/06/2012 15:15:46>

;    boot.s
;
; boot.s is loaded at 0x7c00 by the bios-startup routines, and moves itself
; out of the way to address 0x90000, and jumps there.
;
; It then loads the system at 0x10000, using BIOS interrupts. Thereafter
; it disables all interrupts, moves the system down to 0x0000, changes
; to protected mode, and calls the start of system. System then must
; RE-initialize the protected mode in its own tables, and enable
; interrupts as needed.
;
; NOTE! currently system is at most 8*65536 bytes long. This should be no
; problem, even in the future. I want to keep it simple. This 512 kB
; kernel size should be enough - in fact more would mean we'd have to move
; not just these start-up routines, but also do something about the cache-
; memory (block IO devices). The area left over in the lower 640 kB is meant
; for these. No other memory is assumed to be "physical", ie all memory
; over 1Mb is demand-paging. All addresses under 1Mb are guaranteed to match
; their physical addresses.
;
; NOTE1 abouve is no longer valid in it's entirety. cache-memory is allocated
; above the 1Mb mark as well as below. Otherwise it is mainly correct.
;
; NOTE 2! The boot disk type must be set at compile-time, by setting
; the following equ. Having the boot-up procedure hunt for the right
; disk type is severe brain-damage.
; The loader has been made as simple as possible (had to, to get it
; in 512 bytes with the code to move to protected mode), and continuos
; read errors will result in a unbreakable loop. Reboot by hand. It
; loads pretty fast by getting whole sectors at a time whenever possible.

; 1.44Mb disks:
sectors    EQU 18
; 1.2Mb disks:
; sectors = 15
; 720kB disks:
; sectors = 9
SYSSIZE EQU 0x2000
BOOTSEG EQU 0x07c0
INITSEG EQU 0x9000
SYSSEG  EQU 0x1000
; system loaded at 0x10000 (65536).

ENDSEG    EQU SYSSEG + SYSSIZE
        
[BITS 16]        
[ORG 0x0000]        ;  assembler init address 0000:    7c00

_start:
    mov    ax,BOOTSEG
    mov    ds,ax
    mov    ax,INITSEG
    mov    es,ax
    mov    cx,256
    sub    si,si
    sub    di,di
    rep     movsw
    jmp    INITSEG:go
go:    mov    ax,cs
    mov    ds,ax
    mov    es,ax
    mov    ss,ax
    mov    sp,0x400        ; arbitrary value >>512

    mov    ah,0x03    ; read cursor pos
    xor    bh,bh
    int    0x10
    
    mov    cx,24
    mov    bx,0x0007    ; page 0, attribute 7 (normal)
    mov    bp,msg1
    mov    ax,0x1301    ; write string, move cursor
    int    0x10

; ok, we've written the message, now
; we want to load the system (at 0x10000)

    mov    ax,SYSSEG
    mov    es,ax        ; segment of 0x010000
    call    read_it
    call    kill_motor

; if the read went well we get current cursor position ans save it for
; posterity.

    mov    ah,0x03    ; read cursor pos
    xor    bh,bh
    int    0x10        ; save it in known place, con_init fetches
    mov    [510],dx    ; it from 0x90510.
        
; now we want to move to protected mode ...

    cli            ; no interrupts allowed ;

; first we move the system to it's rightful place

    mov    ax,0x0000
    cld            ; 'direction'=0, movs moves forward
do_move:
    mov    es,ax        ; destination segment
    add    ax,0x1000
    cmp    ax,0x9000
    jz    end_move
    mov    ds,ax        ; source segment
    sub    di,di
    sub    si,si
    mov     cx,0x8000
    rep    movsw    ; 0x8000word=0x10000byte=64KB
    jmp    do_move

; then we load the segment descriptors

end_move:

    mov    ax,cs        ; right, forgot this at first. didn't work :-)
    mov    ds,ax
    lidt    [idt_48]        ; load idt with 0,0
    lgdt    [gdt_48]        ; load gdt with whatever appropriate

; that was painless, now we enable A20

    call    empty_8042
    mov    al,0xD1        ; command write
    out    0x64,al
    call    empty_8042
    mov    al,0xDF        ; A20 on
    out    0x60,al
    call    empty_8042

; well, that went ok, I hope. Now we have to reprogram the interrupts :-(
; we put them right after the intel-reserved hardware interrupts, at
; int 0x20-0x2F. There they won't mess up anything. Sadly IBM really
; messed this up with the original PC, and they haven't been able to
; rectify it afterwards. Thus the bios puts interrupts at 0x08-0x0f,
; which is used for the internal hardware interrupts as well. We just
; have to reprogram the 8259's, and it isn't fun.

    mov    al,0x11        ; initialization sequence
    out    0x20,al        ; send it to 8259A-1
    dw    0x00eb,0x00eb        ; jmp $+2, jmp $+2
    out    0xA0,al        ; and to 8259A-2
    dw    0x00eb,0x00eb
    mov    al,0x20        ; start of hardware int's (0x20)
    out    0x21,al
    dw    0x00eb,0x00eb
    mov    al,0x28        ; start of hardware int's 2 (0x28)
    out    0xA1,al
    dw    0x00eb,0x00eb
    mov    al,0x04        ; 8259-1 is master
    out    0x21,al
    dw    0x00eb,0x00eb
    mov    al,0x02        ; 8259-2 is slave
    out    0xA1,al
    dw    0x00eb,0x00eb
    mov    al,0x01        ; 8086 mode for both
    out    0x21,al
    dw    0x00eb,0x00eb
    out    0xA1,al
    dw    0x00eb,0x00eb
    mov    al,0xFF        ; mask off all interrupts for now
    out    0x21,al
    dw    0x00eb,0x00eb
    out    0xA1,al

; well, that certainly wasn't fun :-(. Hopefully it works, and we don't
; need no steenking BIOS anyway (except for the initial loading :-).
; The BIOS-routine wants lots of unnecessary data, and it's less
; "interesting" anyway. This is how REAL programmers do it.
;
; Well, now's the time to actually move into protected mode. To make
; things as simple as possible, we do no register set-up or anything,
; we let the gnu-compiled 32-bit programs do that. We just jump to
; absolute address 0x00000, in 32-bit protected mode.

    mov    ax,0x0001    ; protected mode (PE) bit
    lmsw    ax        ; This is it;
    jmp    8:0        ; jmp offset 0 of segment 8 (cs), ; jmp to 0:0 (head.s startup_32)

; This routine checks that the keyboard command queue is empty
; No timeout is used - if this hangs there is something wrong with
; the machine, and we probably couldn't proceed anyway.
empty_8042:
    dw    0x00eb,0x00eb
    in    al,0x64    ; 8042 status port
    test    al,2        ; is input buffer full?
    jnz    empty_8042    ; yes - loop
    ret

; This routine loads the system at address 0x10000, making sure
; no 64kB boundaries are crossed. We try to load it as fast as
; possible, loading whole tracks whenever we can.
;
; in:    es - starting address segment (normally 0x1000)
;
; This routine has to be recompiled to fit another drive type,
; just change the "sectors" variable at the start of the file
; (originally 18, for a 1.44Mb drive)
;
sread:    dw 1            ; sectors read of current track
head:    dw 0            ; current head
track:    dw 0            ; current track
read_it:
    mov ax,es
    test ax,0x0fff
die:    jne die            ; es must be at 64kB boundary
    xor bx,bx        ; bx is starting address within segment
rp_read:
    mov ax,es
    cmp ax,ENDSEG        ; have we loaded all yet?
    jb ok1_read
    ret
ok1_read:
    mov ax,sectors
    sub ax,[sread]
    mov cx,ax
    shl cx,9
    add cx,bx
    jnc ok2_read
    je ok2_read
    xor ax,ax
    sub ax,bx
    shr ax,9
ok2_read:
    call read_track
    mov cx,ax
    add ax,[sread]
    cmp ax,sectors
    jne ok3_read
    mov ax,1
    sub ax,[head]
    jne ok4_read
    inc word [track]
ok4_read:
    mov [head],ax
    xor ax,ax
ok3_read:
    mov [sread],ax
    shl cx,9
    add bx,cx
    jnc rp_read
    mov ax,es
    add ax,0x1000
    mov es,ax
    xor bx,bx
    jmp rp_read

read_track:
    push ax
    push bx
    push cx
    push dx
    mov dx,[track]
    mov cx,[sread]
    inc cx
    mov ch,dl
    mov dx,[head]
    mov dh,dl
    mov dl,0
    and dx,0x0100
    mov ah,2
    int 0x13
    jc bad_rt
    pop dx
    pop cx
    pop bx
    pop ax
    ret
bad_rt:    mov ax,0
    mov dx,0
    int 0x13
    pop dx
    pop cx
    pop bx
    pop ax
    jmp read_track

;/*
; * This procedure turns off the floppy drive motor, so
; * that we enter the kernel in a known state, and
; * don't have to worry about it later.
; */
kill_motor:
    push dx
    mov dx,0x3f2
    mov al,0
    ;;     outb
    out dx,al
    pop dx
    ret

gdt:
    dw    0,0,0,0        ; dummy

    dw    0x07FF        ; 8Mb - limit=2047 (2048*4096=8Mb)
    dw    0x0000        ; base address=0
    dw    0x9A00        ; code read/exec
    dw    0x00C0        ; granularity=4096, 386

    dw    0x07FF        ; 8Mb - limit=2047 (2048*4096=8Mb)
    dw    0x0000        ; base address=0
    dw    0x9200        ; data read/write
    dw    0x00C0        ; granularity=4096, 386

idt_48:
    dw    0            ; idt limit=0
    dw    0,0            ; idt base=0L

gdt_48:
    dw    0x800        ; gdt limit=2048, 256 GDT entries
    dw    gdt,0x9        ; gdt base = 0X9xxxx
    
msg1:
    db 13,10
    db "Loading system ..."
    db 13,10,13,10
    times 510-($-$$)  db 0        ;  all the rest filled with blank    
    db 0x55,0xaa   





飞牛NAS+Docker+FFmpeg构建本地音乐中枢实战 NAS(网络附加存储)不仅是大容量硬盘,更是可编程的私有媒体服务基础设施;Docker容器化技术让服务解耦、配置可溯、升级可控,而FFmpeg作为开源音视频处理核心,早已超越基础转码,成为采样率适配、元数据注入、HLS流式分片与响度标准化的关键引擎。在ARM64小主机(如N1/N2/树莓派)上,结合飞牛OS这一轻量Debian衍生系统,通过docker-compose.yml统一编排MinIO存储、MusicBrainz元数据索引、定制FFmpeg转码等微服务,可构建高稳定、低延迟、全链路自主的本地音乐中枢 阅读详情

相关推荐

飞腾D2000 UEFI编译与固件打包全流程实战解析

UEFI固件是现代服务器平台启动的核心,其编译与打包过程直接决定了系统的稳定性和可定制性。在ARM服务器领域,飞腾D2000平台因架构差异,其UEFI定制流程与x86截然不同。理解固件组成原理是第一步:D2000的BIOS并非单一文件,而是由UEFI主镜像、变量区、设备树等多个分区按特定Flash布局组合而成。UEFI编译仅生成FD镜像,而固件打包则需按偏移地址整合所有素材,二者混淆是导致烧录失败的主要原因。通过搭建交叉编译环境、配置EDK2工程、执行构建脚本,开发者可以产出定制化的UEFI固件,进而结合打

weixin_34111790的博客 408

Linux Kernel 0.01 的编译和运行

Linux Kernel 0.01 的编译和运行 本文操作环境均在 Linux 系统中实现。 ================================================================================== 一、准备工作 下面说明的内容要使用 bochs 模拟器和Linux 0.11作为开发平台。 1. 取得Linux 0.11开发平台文件,下载...

csshuke的专栏 4251

Qemu运行Linux0.01

1. windows模拟器运行Linux0.01三年前尝试过在windows上使用模拟器运行Linux0.01, 简单记录了一下操作过程,参考windows模拟器运行Linux0.01。2. Linux上使用Qemu运行Linux0.01在Linux机器上,使用Qemu运行Linux0.01,这部分工作国外很早就有人做过了,但是在国内,由于互联网管制,百度搜索里几乎没有相关的资料,为了学习者的方便

chengwenyang的专栏 3267

linux 0.01,编译linux0.01

编译 linux 0.011.下载linux-0.11-devel-060625(这个有gar,编译时要用),bochs 2.52.建新硬盘img用bochs自带的bximage建,按里的说明进行,也是256M.然后fdisk,mkfs,然后把mkdir root, 然后把/bin,/dev,/usr复制过来,这样硬盘的minix系统就OK了。2.按这个patch修改内核代码:只能手动改,那个pa...

weixin_35502173的博客 664

Linux的原版本0.01源代码

Linux老的版本,最简单的,很讨厌某些人在这优快云以此收取积分,我表示免费提供。这本就不应该收费,因为这就不是你原创的。

linux_0.01:linux_0.01源代码

linux_0.01 linux_0.01源代码

Linux内核编译(版本6.0以及版本v0.01)并用qemu驱动

x86 i386vmtools安装(实现win-linux软件互传)(build-essential”,它包含了 GNU 编辑器集合,GNU 调试器,和其他编译软件所必需的开发库和工具)(qemu-system-x86 安装qemu)

m0_73421035的博客 1399

Dify 从入门到熟悉100 天的学习大纲

理解 Dify 的核心概念,熟悉操作界面,并能创建简单的 AI 应用。祝你在这 100 天的旅程中学有所成,成为一名优秀的 AI 应用开发者!掌握生产环境部署、监控、调优,并关注 Dify 生态和前沿动态。探索多模态、Agent、API 集成、性能优化等高级主题。掌握工作流编排、高级提示词技巧、知识库优化等核心功能。

IT深耕十余载,大道之简 1735

NASM 2.16.01 + Bochs 2.7 环境配置:从实模式到保护模式调试实战 3 步走

本文详细介绍了如何使用NASM 2.16.01和Bochs 2.7搭建操作系统开发环境,从实模式到保护模式的调试实战指南。通过三步走策略,包括环境搭建、实模式引导扇区编写和Bochs调试技巧,帮助开发者快速掌握操作系统开发的核心技术。

weixin_34216196的博客 343

Zemax非序列模式新手入门:从零搭建一个抛物面反射镜系统(含灯丝光源与探测器设置)

本文详细介绍了如何在Zemax非序列模式下从零搭建抛物面反射镜系统,包括灯丝光源配置、反射镜建模和探测器设置等关键步骤。通过实战指南,帮助光学设计新手快速掌握非序列模式的应用技巧,特别适合处理复杂光线传播场景如反射镜系统和杂散光分析。

weixin_28717431的博客 436

基于FMCW技术的毫米波雷达测速原理与应用

调频连续波(FMCW)技术是毫米波雷达中实现高精度测速的核心方法之一。本文详细介绍了FMCW测速的基本原理、信号处理流程以及在实际应用中的关键技术。通过分析FMCW雷达的多普勒效应和频率差测量方法,本文展示了如何利用FMCW技术实现目标速度的高精度检测。此外,本文还探讨了FMCW测速在自动驾驶、智能交通和工业自动化等领域的应用案例,为毫米波雷达开发者提供了理论支持和实践指导。

不谈枯燥公式,只聊雷达趋势。用大白话解读毫米波里的黑科技。 1137

从零编写MBR:汇编语言实现计算机启动引导程序

计算机启动过程始于BIOS自检后加载并执行主引导记录(MBR),这是操作系统加载前的关键第一步。MBR位于硬盘第一个扇区,遵循特定结构,包含引导代码和分区表。在实模式下,CPU直接操作硬件,汇编语言成为编写MBR的唯一选择,因其能精确控制底层资源。通过NASM汇编器和虚拟机环境,开发者可以安全地实践MBR编写,理解计算机从加电到系统加载的完整链条。这一过程不仅涉及BIOS中断调用、内存地址操作等底层技术,还为后续引导加载程序和操作系统开发奠定基础。本文以动手实践为导向,详细展示了如何从打印字符开始,逐步实现

weixin_30555515的博客 352

Jetson Nano摄像头选型与配置全攻略:CSI与USB接口实战指南

在嵌入式视觉与边缘计算项目中,摄像头作为核心传感器,其选型与配置直接影响系统性能。CSI(Camera Serial Interface)和USB(Universal Serial Bus)是两种主流接口,前者通过MIPI CSI-2协议直接与SoC通信,具备低延迟、高带宽特性,适合实时性要求高的应用;后者基于通用串行总线标准,即插即用,通用性强。在NVIDIA Jetson Nano平台上,合理选择摄像头接口并优化驱动配置,能充分发挥其GPU加速优势,提升图像处理流水线效率。本文聚焦Jetson Nano

weixin_29190651的博客 323

实模式Kernel开发排错:系统镜像反汇编实战指南

操作系统底层开发中,启动阶段的黑屏或乱码往往并非逻辑复杂,而是地址假设错误。实模式x86 CPU以16位指令运行,逻辑地址由段基址和偏移组成,任何跳转目标、DS段寄存器或org指令的不一致,都会导致镜像无法按预期执行。反汇编工具能将机器码还原为可读指令,快速验证“源码预期”与“实际执行”的差异。在bootloader与Kernel的联合调试中,利用ndisasm和objdump对比跳转地址与入口点,再结合QEMU与GDB观察运行时寄存器状态,可以高效定位系统镜像中的地址错误。这一方法适用于学习操作系统启动流

weixin_34199405的博客 355

从选型到调试:MCU外部晶振电路设计的实战避坑指南

本文详细解析了MCU外部晶振电路设计的关键要点,从选型到调试提供全面指南。重点探讨了晶振频率选择、负载电容计算、PCB布局优化等核心问题,并分享常见故障排查技巧与EMC设计经验,帮助工程师规避设计陷阱,提升嵌入式系统时钟稳定性。

weixin_30872577的博客 276

基于STM32L4XX、HAL库的ESP32-S3-WROOM-1-N4 WIFI模块驱动程序设计

/ 检查是否收到完整的一行(以\r\n结尾)// 例如: 解析AT命令响应或MQTT消息等。// UART2初始化已在CubeMX中配置。// USART2初始化函数(由CubeMX生成)// 缓冲区溢出,重置。// 如果需要等待响应。// 处理接收到的数据。// 处理接收到的数据。// 等待ESP32模块启动。// 主循环其他任务。// 启用UART全局中断。// 发送HTTP GET请求。// 发送AT测试命令。// 连接Wi-Fi。// UART中断回调函数。

zhusl6688的博客 286

UEFI Shell启动盘:预编译双架构FAT32镜像一键可用

UEFI Shell是运行在固件层的轻量级交互环境,直接由UEFI规范定义,不依赖操作系统,具备硬件直访能力。其核心原理基于UEFI执行环境(DXE/PEI阶段)加载符合PI规范的.efi应用,通过EFI_SYSTEM_TABLE调用底层服务。技术价值在于提供比PE更早、比Live系统更底层的调试与修复能力,支撑ACPI验证、NVMe驱动加载、Secure Boot调试等关键场景。典型应用包括固件工程师的ACPI表修改验证、Linux运维的EFI分区手动挂载、Mac用户T2/M系列芯片的Legacy Boo

weixin_34356555的博客 357

38、四旋翼无人机的机械建模、控制与仿真及小型无人机高度的最优鲁棒无模型控制

本文探讨了四旋翼无人机的机械建模、控制与仿真方法,采用基于PID控制器的分层控制策略实现稳定飞行与路径跟踪,并开发了结合CAD模型与MATLAB环境的飞行模拟器。同时,针对小型无人机高度控制问题,提出了一种基于粒子群优化(PSO)的最优鲁棒无模型控制(PSO-MFC)方法,有效解决了参数整定难题,实现了零稳态误差跟踪和强抗干扰能力。两种方法在仿真中均表现出良好性能,为无人机控制系统的设计与优化提供了理论与实践基础。

l6m7n8的博客 99

RK3568嵌入式驱动开发:从内核模块、设备树到I2C/CAN实战路径

Linux设备驱动开发本质是内核空间与硬件资源的协同建模,其核心在于理解模块加载机制、设备树描述规范及总线协议(如I2C/CAN)的底层约束。设备树并非配置文件,而是硬件拓扑的声明式表达,决定驱动能否正确绑定;内核模块加载需通过vermagic校验、符号解析与内存重定位,任一环节失败即导致'Invalid module format'或'Unknown symbol'。技术价值体现在可控性与可追溯性——例如复位信号极性(reset-active-low)、时序参数(display-timings)、波特率寄

cuiji1279的博客 271

python+playwright 学习-10.pytest-playwright插件编写测试用例

pytest-playwright插件完美的继承了pytest 用例框架和playwright基础使用的封装,基本能满足工作中的常规需求了,不需要我们再做额外的插件开发。

qq_27371025的博客 2512

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

中断系统原理与实战:从CPU响应到ISR编写

中断是计算机实现多任务并发与实时响应的核心机制,本质是CPU在指令边界对异步事件的原子级上下文切换。其原理涵盖硬件信号触发(如INTR引脚)、CPU状态自动保存(FLAGS/CS:IP压栈)、中断向量寻址(IVT/IDT查表)及特权级校验等关键环节。技术价值在于保障操作系统响应性、设备I/O实时性与内核安全隔离,广泛应用于键盘驱动、实时控制、Linux内核调度及嵌入式系统开发。本文结合计算机408统考重点与王道计算机组成原理知识体系,深入解析中断响应12步流程、中断嵌套策略与手写键盘ISR实践,覆盖唐朔飞教

weixin_34055787的博客 402

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

渗透测试 ( 3 ) --- Metasploit Framework (MSF)

Metasploit专业版和精简版的主要差别在于专业版上面集成了全自动攻击模块,通过远程API集成网络分割测试模块、标准基线审计向导模块、闭环漏洞验证优先处理功能、动态载荷规避防病毒解决方案、钓鱼意识管理和鱼叉式网络钓鱼模块、对OWASP Top 10漏洞的Web应用程序测试模块、高级命令行和Web界面的选择模块。但是,专业版是必须要付费的,所以除非用到非个人的功能,否则没有必要去使用专业版,而且,专业版和精简版的渗透攻击模块是一样的。.........

freeking101的博客 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Linux 内核第一版 (v0.01) 开源代码解读

Linux 内核首个开源版本 (v0.01) 的体积非常小,仅包含 10,239 行代码。如果除去注释和空行,只剩下 8,670 行。正因它足够小,所以方便理解,是了解类 UNIX 操作系统内核内部结构的良好起点。然而,Linux的第一个版本v0.01非常小。它足够小,可以理解,并且是了解类unix操作系统内核内部的一个很好的起点。的内部结构,Linux内核经常被认为是一个庞大的开源软件。在撰写本文时,最新版本是v6.5-rc5,包含36M行代码。不用说,Linux是几十年来许多贡献者辛勤工作的成果。

ejinxian的专栏 2604

VirtualBox虚拟机安装RedHat7.3编译Linux0.01内核

引子 由于需要编译linux0.01内核,而目前的linux版本太高需要降低gcc版本等等,需要做不少调整非常不方便。 所以,直接安装RedHat7.3,这样就好编译linux0.01的内核了。 但是,安装RedHat7.3需要注意一些问题。 下载老版的RedHat RedHat7.3下载地址 http://ftp.heanet.ie/pub/redhat-archiv

编程的本质是数学问题 2505

linux0.01编译,制作启动软盘

花了几天时间,在网上找了很多教程,终于编译出linux0.01的Image文件,并成功制作了一个启动floppy。把主要步骤记下,方便像我一样刚开始学习linux的同学。编译环境:ubuntu8.04 desktop,gcc 4.2.3源码:linux.tar.gz1. tar -zxf linux.tar.gz2. cd linux3. make,在make时会出现不少错误,其中有fork,pa

tony的专栏 2355

编译运行linux0.01 kernel rootfs 详细教程(ubuntu18.04 直接编译运行)

1. 准备工作 下面说明的内容要使用 bochs 模拟器和Linux 0.11作为开发平台。 取得Linux 0.11开发平台文件,下载地址是:http://oldlinux.org/Linux.old/bochs/linux-0.11-devel-060625.zip 下载linux0.01源码 ,下载地址是:http://www.oldlinux.org/Linux.old/Linux-0....

qq_40169767的博客 1653
上一篇: IEEE754标准 单精度(32位)/双精度(64位)浮点数解码
下一篇: 一个简单有趣的C语言自打印程序print-me.c
jocks
博客等级 码龄18年 15粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值