Fedora 启动顺序

2023-11-17

http://hi.baidu.com/wwwkljoel/item/29620217882a585b2b3e2244

The start of the Fedora

fedora 系统加电或复位后,中央处理器将内存中的所有数据清零,并对内存进行校验。如果没有错误,则CS(Code Segment)寄存器中全部置1,而IP(Instruction Pointer)寄存器中全部置0。[CS]:[IP]地址单元中存储的指令是一条跳转指令,这条指令跳转到BIOS代码的首部。CPU就根据CS及IP 的值进入BIOS启动过程。

一、BIOS  ¶
  • 当微机接通电源后,系统将有一个对内部各个设备进行检查的过程,这是由一个通常称之为POST(Power On Self Test,上电自检)的程序来完成的。这也是BIOS的一个功能。BIOS系统设置程序 微机部件配置情况是放在一块可读写的CMOS RAM芯片中的,BIOS ROM将按照系统CMOS设置中的启动顺序搜寻软硬盘驱动器及CDROM、网络服务器等有效的启动驱动器,读入操作系统引导记录,然后将系统控制权交给引 导记录,由引导记录完成系统的启动。所以有时候启动机子起不来,声卡解压卡显示卡发生冲突;CD-ROM挂不上;不能正常运行一些在DOS、 Windows 3.x下运行得很好的程序,可能和BIOS有密切关系。

关于BIOS
注:Top

二、Boot Loader  ¶
  • BIOS 会记录可用來开机的裝置搜索顺序!所以,系統会开始去读取第一个开机裝置上面开机程序。首先第一个要读取的就是该硬盘的主要开机磁区 (Master Boot Record, MBR) 了,而系统可以由主要开机区所安裝的开机引导程序 (boot loader) 开始执行核心程序。 *简单地说,Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状 态,以便为最终调用操作系统内核准备好正确的环境。

通常,Boot Loader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 Boot Loader 几乎是不可能的。不过它们仍有一些共性。

  • 怎么会执行先执行Boot Loader呢?
  • 系统加电或复位后,所有的CPU 通常都从某个由 CPU 制造商预先安排的地址上取指令, 取它的第一条指令(BIOS)。而基于CPU 构建的嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM 或 FLASH 等)被映射到这个预先安排的地址上。BIOS会将MBR的Boot Loader调至内存0x07C00处,检查 0x0000:7DEF 是不是等于0xAA55,如果不等于则去尝试其他启动介质,如果没有其他启动介质就显示"No ROM BASIC",然后死机。 CPU会读取内存0x07C00处代码,执行。因此在系统加电后,CPU 将执行Boot Loader 程序。
  • 硬盘的0磁道的第一个扇区称为MBR(Master Boot Recorder),它的大小是512字节。Boot Loader通常是一段汇编代码,存放在MBR中,作用是将系统启动代码读到内存中,目前主流的Boot loader有grub, lilo, 还有spfdisk.

下面系统要做的工作就是顺着启动的代码一步步执行。对于Linux源代码来说启动的代码流程如图1所示:

  • Bootsect.S用于装载核心系统和setup.S。 setup.S是用汇编语言写的程序代码。Setup.S对已调入内存内核代码进行检查,如果没有错误的话,它会通过BIOS中断获取内存容量信息、设置 显示器基本模式、获取硬盘信息,这些操作,都是在X86的实模式下进行的,这时操作系统就准备让CPU进入保护模式。进入保护模式的启动阶段的同时把控制 权交给head.S,head.S是段保护模式的汇编程序。Head.S进行页表初始化、检查CPU类型后,调用/init/main.c中的 start_kernel()。Start_kernel()用于和处理器、内存等最基本硬件相关部分的初始化、与中断有关的初始化、对Linux文件系 统进行初始化。
  • 内核映像一般都是经过压缩的,压缩以后的内核映像就像是一大块数据,跟引导扇区和引导辅助程序的映像拼接在一起,成为内核的“引导映 像”。解除压缩以后的内核映像总是放在地址为0x100000(1MB)的地方。Linux核心加载后,由init进程初始化硬件和设备驱动,然后在后台 运行init进程。init进程是系统的第一个进程,init进程运行时将用到两个重要的系统引导配置文件/etc/inittab和 /etc/rc.d。

关于Boot loader
注:Top

三、Initrd  ¶
  • 为什么要单独把initrd拿出来当成单独的一步呢?呵呵,因为initrd相当的重要,没有这个或者有点错误就无法启动文件系统 同时在上面的过程中会借助Boot loader来载入initrd ,用 initrd来制作虚拟硬盘(RAM Disk)并且利用linuxrc这支程序来进行模组的载入。 linuxrc 主要的特性是:
  • 必须是 linuxrc 这个档名;
  • 必须放置在 initrd 所建立的虚拟磁碟的最顶层目录;
  • 必须要可以被核心所执行。
  • initrd(boot loader initialized RAM disk)在 linux内核启动前, boot loader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的 initrd 文件系统。在 boot loader 配置了 initrd 的情况下,内核启动被分成了两个阶段,第一阶段先执行 initrd 文件系统中的"某个文件",完成加载驱动模块等任务,第二阶段才会执行真正的根文件系统中的 /sbin/init 进程。
    2.4版的initrd和2.6版的initrd是不一样的:
  • 为了使读者清晰的了解Linux2.6内核initrd机制的变化,在重点介绍Linux2.6内核initrd之前,先对 linux2.4内核的 initrd进行一个简单的介绍。Linux2.4内核的initrd的格式是文件系统镜像文件,本文将其称为image-initrd,以区别后面介绍 的linux2.6内核的cpio格式的initrd。 linux2.4内核对initrd的处理流程如下:
    • 1. boot loader把内核以及/dev/initrd的内容加载到内存,/dev/initrd是由boot loader初始化的设备,存储着initrd。
    • 2. 在内核初始化过程中,内核把 /dev/initrd 设备的内容解压缩并拷贝到 /dev/ram0 设备上。
    • 3. 内核以可读写的方式把 /dev/ram0 设备挂载为原始的根文件系统。
    • 4. 如果 /dev/ram0 被指定为真正的根文件系统,那么内核跳至最后一步正常启动。
    • 5. 执行 initrd 上的 /linuxrc 文件,linuxrc 通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动, 以及加载根文件系统。
    • 6. /linuxrc 执行完毕,真正的根文件系统被挂载。
    • 7. 如果真正的根文件系统存在 /initrd 目录,那么 /dev/ram0 将从 / 移动到 /initrd。否则如果 /initrd 目录不存在, /dev/ram0 将被卸载。
    • 8. 在真正的根文件系统上进行正常启动过程 ,执行 /sbin/init。 linux2.4 内核的 initrd 的执行是作为内核启动的一个中间阶段,也就是说 initrd 的 /linuxrc 执行以后,内核会继续执行初始化代码,我们后面会看到这是 linux2.4 内核同 2.6 内核的 initrd 处理流程的一个显著区别。
  • Linux2.6 内核对 Initrd 的处理流程
  • linux2.6 内核支持两种格式的 initrd,一种是前面第 3 部分介绍的 linux2.4 内核那种传统格式的文件系统镜像-image-initrd,它的制作方法同 Linux2.4 内核的 initrd 一样,其核心文件就是 /linuxrc。另外一种格式的 initrd 是 cpio 格式的,这种格式的 initrd 从 linux2.5 起开始引入,使用 cpio 工具生成,其核心文件不再是 /linuxrc,而是 /init,本文将这种 initrd 称为 cpio-initrd。尽管 linux2.6 内核对 cpio-initrd和 image-initrd 这两种格式的 initrd 均支持,但对其处理流程有着显著的区别,下面分别介绍 linux2.6 内核对这两种 initrd 的处理流程。 cpio-initrd 的处理流程
    • 1. boot loader 把内核以及 initrd 文件加载到内存的特定位置。
    • 2.内核判断initrd的文件格式,如果是cpio格式。
    • 3. 将initrd的内容释放到rootfs中。
    • 4. 执行initrd中的/init文件,执行到这一点,内核的工作全部结束,完全交给/init文件处理。
  • image-initrd的处理流程
    • 1. boot loader把内核以及initrd文件加载到内存的特定位置。
    • 2. 内核判断initrd的文件格式,如果不是cpio格式,将其作为image-initrd处理。
    • 3. 内核将initrd的内容保存在rootfs下的/initrd.image文件中。
    • 4. 内核将/initrd.image的内容读入/dev/ram0设备中,也就是读入了一个内存盘中。
    • 5. 接着内核以可读写的方式把/dev/ram0设备挂载为原始的根文件系统。
    • 6. .如果/dev/ram0被指定为真正的根文件系统,那么内核跳至最后一步正常启动。
    • 7. 执行initrd上的/linuxrc文件,linuxrc通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动, 以及加载根文件系统。
    • 8. /linuxrc执行完毕,常规根文件系统被挂载
    • 9. 如果常规根文件系统存在/initrd目录,那么/dev/ram0将从/移动到/initrd。否则如果/initrd目录不存在, /dev/ram0将被卸载。
    • 10. 在常规根文件系统上进行正常启动过程 ,执行/sbin/init。 通过上面的流程介绍可知,Linux2.6内核对image-initrd的处理流程同linux2.4内核相比并没有显著的变化, cpio-initrd的处理流程相比于image-initrd的处理流程却有很大的区别,流程非常简单,在后面的源代码分析中,读者更能体会到处理的 简捷。举个简单的例子

更多关于initrd和linuxrc有参考文献
注:Top

四、Init  ¶
  • 1.init会根据设定档运行不同的run level,其设定档是/etc/inittab,根据不同的run level会在开机时启动不同的服务.
    在inittab里的格式是这样的:
    id:runlevels:action:process 如下表:
id is a unique sequence of 1-4 characters which identifies an entry in inittab (for versions of sysvinit compiled with libraries < 5.2.18 or a.out libraries the limit is 2 characters). Note: For gettys or other login processes, the id field should be the tty suffix of the corresponding tty, e.g. 1 for tty1. Otherwise, the login accounting might not work correctly. runlevels lists the runlevels for which the specified action should be taken. action "describes which action should be taken. Valid actions for the action field are:" respawn The process will be restarted whenever it terminates (e.g. getty). wait The process will be started once when the specified runlevel is entered and init will wait for its termination. once The process will be executed once when the specified runlevel is entered. boot The process will be executed during system boot. The runlevels field is ignored. bootwait The process will be executed during system boot, while init waits for its termination (e.g. /etc/rc). The runlevels field is ignored. off This does nothing. ondemand A process marked with an ondemand runlevel will be executed whenever the specified ondemand runlevel is called. However, no runlevel change will occur (ondemand runlevels are  a',  b', and `c'). initdefault An initdefault entry specifies the runlevel which should be entered after system boot. If none exists, init will ask for a runlevel on the console. The process field is ignored. sysinit The process will be executed during system boot. It will be executed before any boot or bootwait entries. The runlevels field is ignored. powerwait The process will be executed when init receives the SIGPWR signal, indicating that there is something wrong with the power. Init will wait for the process to finish before continuing. powerfail As for powerwait, except that init does not wait for the process's completion. powerokwait The process will be executed when init receives the SIGPWR signal, provided there is a file called /etc/powerstatus containing the word OK. This means that the power has come back again. ctrlaltdel The process will be executed when init receives the SIGINT signal. This means that someone on the system console has pressed the CTRL-ALT-DEL key combination. Typically one wants to execute some sort of shutdown either to get into single-user level or to reboot the machine. kbrequest The process will be executed when init receives a signal from the keyboard handler that a special key combination was pressed on the console keyboard. The documentation for this function is not complete yet; more documentation can be found in the kbdx.xx packages (most recent was kbd-0.94 at the time of this writing). Basically you want to map some keyboard combination to the " KeyboardSignal? " action. For example, to map Alt-Uparrow for this purpose use the following in your keymaps file:alt keycode 103= KeyboardSignal?  process specifies the process to be executed. If the process field starts with a `+' character, init will not do utmp and wtmp accounting for that process. This is needed for gettys that insist on doing their own utmp/wtmp housekeeping. This is also a historic bug.

有以下几种run level:

# 0 - 停机(千万不能把initdefault 设置为0 )

# 1 - 单用户模式

# 2 - 多用户,没有 NFS

# 3 - 完全多用户模式(标准的运行级)

# 4 - 预设保留

# 5- X11 (xwindow)

# 6 - 重新启动 (千万不要把initdefault 设置为6 )

常用的是3 和5 模式 其中3 是文字模式,含有网络功能,2 模式比3少了网络功能,5 是桌面模式,也是最常用的,跟windows的桌面模式很像,如果习惯了windows的用户,建议使用这种模式。

init启动时,它会在/etc/inittab内查找一个代码行,这一行指定了默认的运行级别:

id : 5 : initdefault : 这一行指出了默认情况下是启动5模式

根据inittab里的设定资料,会启动相应的服务,最先运行的服务是放在/etc/rc.d 目录下的文件。在大多数的Linux 发行版本中,启动脚本都是位于 /etc/rc.d/init.d中的。这些脚本被用ln 命令连接到 /etc/rc.d/rc*.d 目录。(这里的* 就是运行级0-6)

有关设定档inittab 内的具体内容可以查相关资料,这里不做解释

  • 2.接下来init 执行 /etc/rc.d/rc.sysinit 档案,这个档案主要是为我们设定好系统环境,例如环境变量,设置系统时间,设定终端字形,清楚开机过程中的暂存档,载入模组等,做的事情还是挺多的。

  • 3.服务,一般是放在/etc/init.d/下,也有的放在/etc/xinetd.d,放在这俩个目录下去的区别是,在 /etc/init.d/下的是一直存在于内存中,也就是说开机就启动的,在 /etc/xinet.d/下的是用的时候才启动的,其设定档为/etc/xinetd.conf。
    • 现在来了解一下在/etc/init.d/下的服务,这里面就保存了所有的开机启动服务,不管是在什么模式下,每个模式下开机所启动的 服务是不一样的,比如是5模式,我们就到/etc/rc.d/rc5.d/查看,里面的脚本的名字都有点怪,都是K(S)**name,不适以K开头就是 以S开头,以S开头的表示开机时要启动的服务,K开头的是表示开机时不启动的服务,后面接的两位数字表示,开机时服务执行的顺序,跟nice值有点像,都 是越小越先被执行。
    • 为什么以S开头就要被执行,以K开头的服务将不被启动呢?
    • 在inittab里有类似这样一句
    • l5:5:wait:/etc/rc.d/rc 5
    • 当然还有几句和它类似,上面这句表示在5模式执行:"/etc/rc.d/rc 5"这样一条命令,脚本rc里有两个for循环分别指出了要启动以S开头的服务,要关闭以K开头的服务,因为这时还没有启动登录界面,所以刚启动的服务就 变成了开机启动服务了。rc里的内容可以自己去参考一下。
    • 如果要想开机启动自定义程序,可以去修改/etc/rc.d/rc.local,因为这个是shell登录界面启动前的最后执行的脚本。这样即使你开始忘了在哪个脚本里关闭了某个程序,使它在开机时无法运行,你可以在这里面写,因为它是最后被执行的。
    • 如果你自己写了一个程序,要想在开机时也像/etc/rc.d/rc.d/下的服务一样,用那种方法启动它,你可以用chkconfig这个指令。也可以用man chkconfig参考一下用法
    • 最重要的一点,比如你写了一个脚本liuwenhan,那里面的格式要像下面的格式
      #!/bin/bash
      # chkconfig:35 80 70
      #接下来就是写你所需要的内容
    • 注意上面的第二行是很重要的,必须按上面的格式写一下, 在#和chkconfig之间是至少隔一个空格键,且要把写好的脚本放在/etc/init.d/下,这一行代表代表仅在3和5模式下启动该程序,且在 /etc/rc.d/rc3.d/和/etc/rc.d/rc5.d/下的名字为S80liuwenhan。在其他目录下为K70liuwenhan
    • 怎么用chkconfig添加,删除自定义程序,请参考man chkconfig或者info chkconfig
  • 4.启动登录界面,输入用户名和密码登录。

想了解具体的服务情况可以可以参考services

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fedora 启动顺序 的相关文章

  • ubuntu下ssh2安装

    iceant iceant desktop share ssh localhost ssh connect to host localhost port 22 Network is unreachable iceant iceant des
  • addr2line objdump命令使用方法

    如果是 的 CMakeList txt 编译的时候需要加上一下选项 才可以生产 版本 可以使用addr2line 定位问题 catkin make DCMAKE BUILD TYPE debug DCATKIN WHITELIST PACK
  • Linux系统管理:虚拟机Alpine Linux安装

    目录 一 理论 1 Alpine Linux 二 实验 1 Alpine Linux安装 三 问题 1 Alpine Linux 缺少VIM命令 2 Alpine Linux SSH连接不上 3 Alpine Linux IP配置 四 总结
  • PF_NETLINK应用实例NETLINK_KOBJECT_UEVENT具体实现--udev实现原理

    相对于linux来说 udev还是一个新事物 然而 尽管它03年才出现 尽管它很低调 J 但它无疑已经成为linux下不可或缺的组件了 udev是什么 它是如何实现的 最近研究Linux设备管理时 花了一些时间去研究udev的实现 udev
  • linux grep 使用

    1 grep 单独使用 搜素指定目录中包含指定字符的文件 例如 grep r words 搜素当前目录中包含 words 字符的文件 grep r words wc 搜素当前目录中包含 words 字符的文件 只显示 包含该字符的数量 2
  • Dell工作站8T硬盘安装ubuntu 16.04

    Dell工作站8T硬盘安装ubuntu 16 04 MBR文件系统仅支撑2T磁盘 因此在2T以上磁盘上安装ubuntu时 如果想利用全部磁盘空间 需要采用GPT分区 文件系统 模型 这需要重新分区 制作Ubuntu 16 04启动U盘 一
  • Linux系统之I/O进程

    Linux系统之I O进程 1 C库和C程序的编译过程 1 1 C库的分类 1 1 1 静态库的概念 1 1 2 制作静态库 1 1 3 动态库的概念 1 1 4 制作动态库 1 2 编译过程 共四步 2 标准I O 2 1 文件类型 2
  • Linux命令:lsof

    目录 一 理论 1 lsof 二 实验 1 无参数 2 p 参数 3 l 参数 4 u 参数 5 c 参数 6 d 参数 7 fileName 8 i 参数 一 理论 1 lsof 1 概念 命令 lsof list opened file
  • 07 - 日志服务器的搭建与攻击

    目录 1 项目环境 2 拓扑图 3 思路 4 配置GW CentOS 7 4 1 配置ens33 4 2 配置ens32 4 3 配置ens34 5 配置Server CentOS 7 1804 7 配置Syslog CentOS 7 18
  • ssh免密登录,各种权限设置都无效的解决办法!

    如果失败 有可能是以下原因 1 权限问题 这个还得试试 有可能你的权限真的不对 ssh目录 以及 home 当前用户 需要700权限 参考以下操作调整 sudo chmod 700 ssh sudo chmod 700 home 当前用户
  • 臻识车牌识别摄像头对接

    一 臻识车牌识别摄像头 1 非常有用的官方代码 内部有TCP HTTP等协议 2 官方常见问题 3 官方下载专区 二 http对接例子 1 自己使用java mock 模拟后台服务 你会用到的配置文件 java jar moco runne
  • Linux线程同步(二)---互斥锁实现线程同步

    一 why 先给自己打个广告 本人的微信公众号 嵌入式Linux江湖 主要关注嵌入式软件开发 股票基金定投 足球等等 希望大家多多关注 有问题可以直接留言给我 一定尽心尽力回答大家的问题 在博客 Linux线程同步 一 初识篇 中 介绍了为
  • Shell脚本中字符串截取功能

    在Shell脚本编写中 有几个地方都是要用到字符串截取的功能 那将这块的内容进行下记录 1 字符串变量的截取操作 对字符串变量的截取操作一般都是通过 操作符 的方式进行 1 从指定位置index截取固定长度 格式 string start
  • 在Fedora16中安装Qt

    首先 在http www trolltech com download上下载linux下的qt源文件 我下载时最新版是 qt everywhere opensource src 4 7 4 tar gz 将该文件放到某个目录下 进行解压缩
  • 防止内存泄露 Linux下用Valgrind做检查

    用C C 开发其中最令人头疼的一个问题就是内存管理 有时候为了查找一个内存泄漏或者一个内存访问越界 需要要花上好几天时间 如果有一款工具能够帮助我们做这件事情就好了 valgrind正好就是这样的一款工具 Valgrind是一款基于模拟li
  • Linux系统下搭建(更新)cuda环境

    本人之前ubuntu系统装的是cuda8 因为模型需要升级cuda 因此重新装cuda10 安装和更新cuda和cudnn以及安装和更新显卡驱动 下面操作都适合 一 安装 升级 显卡驱动 升级cuda之前 先要升级显卡驱动 登陆网页http
  • Linux的目录切换和用户管理

    切换目录 在使用linux系统的时候 会用cd来切换目录 cd 切换到根目录 cd 切换到主目录 cd 切换到之前工作目录 cd 虽然很方便但只能保存一次目录 pushd命令使用目录堆栈可以把多个目录存放起来 配套使用pushd popd
  • gdb 的使用总结

    1 设置动态库的路径 set solib search path PATH 如果需要设置多个路径 则在PATH直接用 冒号分隔 set solib search path PATH1 PATH2
  • Windows挂载Linux网络共享文件夹

    Windows挂载Linux网络共享文件夹 创建Linux网络共享文件夹 用共享工具samba Ubuntu安装samba sudo apt install samba 配置Windows访问共享文件夹的账户 smbpasswd a riv
  • Linux进程间通信--使用命名管道

    Linux进程间通信 使用命名管道 一 什么是命名管道 命名管道也被称为FIFO文件 它是一种特殊类型的文件 它在文件系统中以文件名的形式存在 但是它的行为却和之前所讲的没有名字的管道 匿名管道 类似 由于Linux中所有的事物都可被视为文

随机推荐

  • 柏睿java实习一面面经分享

    说一下list下面的类都有哪些 ArrayList和LinkedList的特点 jvm堆内存模型 jvm的垃圾回收算法都有哪些 简单描述一下它们事务的特性你对sql的优化了解多少 它有哪些方法 数据库的锁都有哪些 分别叙述下它们说一下lin
  • 在共享dll中使用mfc_实战经验:在DLL中支持多语言

    在主程序中支持多语言 在主程序中建立不同的语言资源字符串 并调用API函数SetProcessPreferredUILanguages设置当前语言就可以实现多语言特性 在DLL中支持多语言 1 因为DLL是主程序加载阶段载入到进程地址空间的
  • node调用ffmpeg转流

    ffmpeg始终是音视频领域绕不过去的一个坎 也是一个特别好的工具 虽然再node库里面有根据ffmpeg编译的库 比如 libav js和fluent ffmpeg之类 但是调用原生的ffmpeg应用也是一种方法 这边先上代码再详解 H2
  • 蚁群算法解决TSP(旅行商)问题

    文章目录 一 前言 蚁群算法的基本原理 其中的基本过程 二 状态问题 1 城市被选择的概率由距离和信息素浓度共同决定 2 信息素更新 三 整体实现 一 前言 蚁群算法 Ant Colony Optimization ACO 是一种模拟自然界
  • vmware workstation 提示程序包可能有错,错误代码 29141 & 提示不可恢复错误: (vcpu-0)...

    问题一 提示程序包可能有错 错误代码 29141 换了n个版本 vmware workstation 10 11 12 下载了n次 都提示该错误 29141 明明程序包没错啊 一开始还怀疑是我的操作系统是win 10导致的 但是看网上别人都
  • 深入理解synchronized底层原理,一篇文章就够了!

    文章目录 前言 一 synchronized的特性 1 1 原子性 1 2 可见性 1 3 有序性 1 4 可重入性 二 synchronized的用法 三 synchronized锁的实现 3 1 同步方法 3 2 同步代码块 四 syn
  • 程序员有多难?测试适不适合女孩子做?看完这篇文章你就懂了

    一 程序员压力很大 压力是相对的 这个主要是去看跟谁比 做销售压力大吗 做市场压力大吗 做运营压力大吗 做产品压力大吗 压力大吗 肯定大呀 你看那些 996 的程序员都在那泣不成声了 好不容易说出这句话 有什么压力呀 955公司的程序员在旁
  • QT多进程

    QT多进程 sf2gis 163 com 2014年11月6日 1 目的 启动可执行文件 2 原理 启动进程 并模拟命令行进行交互 3 方法 QProcess std system 3 1 QProcess 1 启动程序 可以使用start
  • 为你推荐10款开发常用的代码编辑器

    代码编辑器对于程序员来说十分重要 一个好的编辑器可以节省开发时间 提高工作效率 这篇文章会介绍10个优秀且免费的编辑器 它们都是非常方便易用的环境 你可以用它们来编写代码 查看源文件和文档等 简化你的工作 本文由PHP100中文网编译 转载
  • mysql监控指标_mysql主要性能监控指标

    1 系统mysql的进程数 ps ef grep mysql grep v grep wc l 2 Slave running mysql gt show status like Slave running 如果系统有一个从复制服务器 这个
  • QT找不到依赖库的解决办法

    QtCreator打开例程后 需要切换到 项目 页面 手动去掉勾选Shadow build 否则自动生成的构件目录里找不到依赖文件 编译出错
  • 230. Kth Smallest Element in a BST

    查找二叉搜索树的第K小节点 利用bst的中序遍历的性质 bst 中序遍历可以得到一个有序数组 每次从stack中弹出一个元素 看k 进行计数即可 Inorder Traversal We can inorder traverse the t
  • Spring系列文章:Spring中的设计模式

    一 简单 模式 BeanFactory的getBean 法 通过唯 标识来获取Bean对象 是典型的简单 模式 静态 模 式 二 法模式 FactoryBean是典型的 法模式 在配置 件中通过factory method属性来指定 法 该
  • Mac使用bootcamp安装win系统花屏解决方法

    15年11 乞丐版air装win屏幕花屏 很郁闷 先后找了网上很多方法 最终总结出了一个比较折中的方法 不玩游戏不使用大型3D的可以参考 1 花屏现象 2 解决方法 2 1 禁用驱动 2 2 使用Microsoft基本显示适配器 2 2 1
  • 记 asp.net core 开发过程中的错误

    mysql数据库 ef进行 update database 时 报 An error occurred using the connection to database on server localhost 3307 错误原因 serve
  • ctf.show web入门

    目录 信息收集 web1 where is flag web2 无法查看源代码 web3 where is flag web4 robots web5 phps文件泄露 web6 网站源码泄露 web7 git web8 svn泄露 web
  • 使用 OpenCV 和 Tesseract 对图像中的感兴趣区域 (ROI) 进行 OCR

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 在这篇文章中 我们将使用 OpenCV 在图像的选定区域上应用 OCR 在本篇文章结束时 我们将能够对输入图像应用自动方向校正 选择感兴趣的区域并将OCR 应用到所选区域
  • tensorrt和onnxruntime-gpu同时调用gpu时tensorrt推理出现错乱解决方式

    问题 当我在同一个进程同时调用tensorrt和onnxruntime gpu时 出现了tensorrt推理结果全为0的情况 解决方式 将onnxruntime gpu放到cpu上 但是cpu的推理速度明显会不如gpu 如果在python中
  • 深度剖析数据在内存中的存储(修炼内力)

    目录 一 数据类型的介绍 1 1数据大小 1 2类型的基本归类 二 整型在内存中的存储 2 1原码 反码 补码 2 2大小端介绍 2 2 1大小端的起源 2 2 2大小端的概念 2 2 3为什么会有大端和小端 2 2 4设计一个小程序来判断
  • Fedora 启动顺序

    http hi baidu com wwwkljoel item 29620217882a585b2b3e2244 The start of the Fedora fedora 系统加电或复位后 中央处理器将内存中的所有数据清零 并对内存进