文章目录

  • linux内核开发基础(linux内核源码、树莓派源码编译、SD卡挂载)
  • 树莓派等芯片带操作系统的启动过程
  • linux内核源码树
    • Linux内核源代码目录树结构:
  • 树莓派Linux源码配置
    • 配置Linux内核适合树莓派相关操作:
  • Linux内核编译
    • 1、安装必要的库:
    • 2、编译
    • 3、打包zImage文件
    • 4、挂数据拷贝

linux内核开发基础(linux内核源码、树莓派源码编译、SD卡挂载)

首先下载树莓派linux内核源码:

下载网址:https://github.com/raspberrypi/linux

在树莓派使用指令:uname -r查看当前树莓派的版本号,然后选择对应的linux内核版本号进行下载

将linux内核源码从共享文件夹拷贝到SYSTEM文件夹:cp linux-rpi-4.19.y.zip/home/fhn/SYSTEM/
然后使用指令对该压缩文件进行解压:unzip linux-rpi-4.19.y.zip

树莓派等芯片带操作系统的启动过程

之前学习的51和32(裸机)是直接使用C语言操控底层寄存器实现相关业务,这是业务流程型(就是设备有什么功能,要实现什么功能)裸机代码。
而linux的BootLoader是超级裸机(BootLoader的主要作用是引导操作系统启动)
BootLoader: 刚开始
一阶段学习就是让CPU和内存(FLASH)、串口(IIC、IIS)数据段打交道,就是驱动这些设备(主要用到汇编和C)
二阶段就是对于引导linux内核启动(纯C)

X86架构(比如:Intel),跑的是windows操作系统,上电启动的时候: 首先是启动BIOS然后是启动windows内核,然后就是加载C、D等盘,最后是启动应用程序。
对于其他的嵌入式产品(比如:树莓派、mini24440、mini6410、nanopi、海思、RK(瑞芯微)),这些产品上电后启动过程是:首先启动BootLoader(相当于windows的BIOS吧,但这里叫做BootLoader),然后引导linux内核,linux内核启动完成后就是加载文件系统(和C、D盘不太一样,在linux下是根据功能性来组织文件夹,带访问权限(这就是linux文件系统),就是根目录下的那些东西,可以使用指令:cd / 进入),文件系统起来以后才能跑应用程序(比如:KTV点歌机界面等)。

BootLoader、linux内核、文件系统构成操作系统,就像之前所说的在目的平台还没有建立的时候,需要通过交叉编译让这些东西可以使用

安卓的启动过程: 有很多嵌入式设备都开始运行安卓操作系统,首先硬件上电后,启动fastboot(也叫BootLoader,意思和BootLoader一样),然后引导linux内核,linux内核起来以后加载文件系统(因为底层还是linux),文件系统起来以后开始跑一个运行java代码的虚拟机,虚拟机起来以后开始运行home应用程序(就相当于手机的界面),点击home界面的某图标就可以打开相应的app。

  • 简单介绍,根目录下一些文件夹存放的东西,在嵌入式体统中,为了精简系统。/bin,/dev,/etc,/lib,/proc,/var,/usr
    对于根文件系统来说是必须具有的,其他目录都是可选的。首先使用指令:cd /进入到根目录,然后可以看到下面的一些文件夹。这篇博文更详细

  • dev
    该目录下存放的是设备文件,设备文件是Linux中特有的文件类型。在Linux系统下,以文件的方式访问各种设备,即通过读写某个设备文件操作某个具体硬件。譬如通过"dev/ttySAC0"文件可以操作串口0。(在linux下一切皆文件,就像之前树莓派的串口就是存放在dev下面)

  • lib: 该目录下存放共享库和可加载驱动程序模块。共享库用于启动系统、支持可执行程序的运行。

  • etc: 该目录下存放着各种配置文件,对于PC上的Linux系统,/etc目录下的文件和目录非常多,这些目录文件是可选的,它们依赖于系统中所拥有的应用程序是否需要配置文件。在嵌入式系统中,这些内容可以大为精减。

  • root: 根用户的目录,与此对应,普通用户的目录是/home下的某个子目录。

  • usr: 该目录存放的是共享、只读的程序和数据,/usr目录下的内容可以在多个主机间共享。

  • var: 与/usr目录相反,/var目录中存放可变的数据,比如spool目录(mail,news),log文件,临时文件。

  • proc:该是一个空目录,常作为proc文件系统的挂载点,proc文件系统是个虚拟的文件系统,它没有实际的存储设备,里面的文件都是由内核临时生成的,用来表示系统的运行状态,也可以操作其中的文件控制系统。

  • mnt: 用于临时挂载某个文件系统的挂接点,通常是空目录,也可以在里面创建子目录来临时挂载光盘、硬盘,譬如/mnt/cdram /mnt/hda1 。

  • home: 用户目录,它是可选的,对于每个普通用户,在/home目录下都有一个以用户名命名的子目录,里面存放用户相关的配置文件

  • opt: 存放的是和内核底层有些关系的东西

  • bin:该目录下存放所有用户都可以使用的、基本的命令,譬如cd,ls,cp等。这些命令在挂载其它文件系统之前就可以使用,所以/bin目录必须和根文件系统在同一个分区中,比如:which ls可以查找ls指令的路径

  • sbin:该目录下存放的是基本的系统命令,它们用于启动系统,修复系统等,与/bin目录相似,在挂接其他文件系统之前就可以使用/sbin,所以/sbin目录必须和根文件系统在同一个分区中

  • boot: 存放的是启动时候的一些数据,包括启动的时候加载的内容、一些命令和命令行的配置等等。

  • tmp: 用于存放临时文件,通常是空目录,一些需要生成临时文件的程序用到的/tmp目录下,所以/tmp目录必须存在并可以访问。

总结:

C51,STM32(裸机) 启动:c直接操控底层寄存器实现相关业务,属于业务流程型的裸机代码
遥控灯 :while(1)
垃圾桶:wemosD1 Loop
恩智浦智能车:stm32

x86 Inte1 windows 启动过程: 电源 —> BIOS —> windows内核 ——> C,D盘 ——> 程序启动(QQ)

嵌入式产品:树莓派,mini2440 ,mini6410 ,nanopi ,海思, 启动过程: 电源 ——> BootLoader(引导操作系统启动) ——> Linux内核 ——> 文件系统(根据功能性来组织文件夹,带访问权限)如:KTV点歌机,人脸识别打卡器,智能家居主控…

安卓启动过程: 电源 ——> fastBoot/Bootloader——> Linux内核 ——> 文件系统 ——> 虚拟机(java)——> HOME应用程序 ——> 点xx图标打开xxAPP

BootLoader:

一阶段 :让CPU,跟内存(FLASH),串口 (IIC 、IIS),数据段 打交道,驱动这些设备(汇编和c结合)

二阶段:引导linux内核启动(纯c)

linux内核源码树

linux内核源码树:其实就是目录的组织形式

找到之前下载的linux内核源码

使用tree指令,在以后做第三方工具安装的时候会去检查包里面的内容是否完整,或者是有一个文件夹目录下文件比较多的时候使用tree指令方便查看,然后如果出现识别不了表示没有下载,然后使用指令sudo apt install tree进行下载。


linux内核

linux内核大约有1.3w个c文件,1100w行代码,是因为linux是一个开源的,支持多架构多平台代码,可移植性非常高。但是linux内核编译出来一般就若干M,因为支持多平台,多架构,所以编译之前要配置,配置成适合目标平台来用。代码编译出来是给一个平台一个架构来用的,很多代码是不参与编译的。例如:ARM架构(海思、RK、树莓派、nanoPi)、X86架构、powerpc、mips等等架构

Linux内核源代码目录树结构:

  • arch: 包含和硬件体系结构相关的代码,每种平台占一个相应的目录。和32位PC相关的代码存放在i386目录下,其中比较重要的包括kernel(内核核心部分)、mm(内存管理)、math-emu(浮点单元仿真)、lib(硬件相关工具函数)、boot(引导程序)、pci(PCI总线)和power(CPU相关状态)。进入arm这个文件夹,这个里面存放的是arm架构相关的设备。mach表示架构相关的,mach-exynos:
    是三星公司的架构; mach-hisi : 是海思公司的架构,就单单arm架构下就有很多公司的架构。

block:部分块设备驱动程序。

crypto:常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法。

Documentation:关于内核各部分的通用解释和注释。

drivers:设备驱动程序,每个不同的驱动占用一个子目录。

fs:各种支持的文件系统,如ext、fat、ntfs等。

include:头文件。其中,和系统相关的头文件被放置在linux子目录下。

init:内核初始化代码(注意不是系统引导代码)。

ipc:进程间通信的代码。

kernel:内核的最核心部分,包括进程调度、定时器等,和平台相关的一部分代码放在arch/*/kernel目录下。

lib:库文件代码。

mm:内存管理代码,和平台相关的一部分代码放在arch/*/mm目录下。

net:网络相关代码,实现了各种常见的网络协议。

scripts:用于配置内核文件的脚本文件。

security:主要是一个SELinux的模块。

sound:常用音频设备的驱动程序等。

usr:实现了一个cpio。

在i386体系下,系统引导将从arch/i386/kernel/head.s开始执行,并进而转移到init/main.c中的main()函数初始化内核。

树莓派Linux源码配置

配置Linux内核适合树莓派相关操作:

以后可能涉及驱动代码的编写,驱动代码的编译需要一个提前编译好的内核,编译内核就需要对内核进行配置。
配置的最终目标是生成.config文件,该文件指导Makefile去把有用的东西组织成内核。
配置的方式有以下几种方式:

  • 第一种方式:厂家会配Linux内核源码,比如说:买了树莓派,厂家会提供Linux内核源码

    1. 然后这样就可以将厂家的.config文件里面的代码拷贝到要生成的.config文件即可。进入到Linux内核文件夹下,然后使用指令find . -name *_defconfig查找以defconfig结尾的文件。
    2. 比如树莓派的2和3就是使用的下图的bcm2709_defconfig,然后只需要将它拷贝到要生成的.config文件。
  • 第二种方式:使用make menuconfig(menuconfig、defconfig都是用来配置内核的)一项项配置,通常是基于厂家的config来配置。

  • 第三种方式:完全自己来。

树莓派内核编译:

  • 首先配置好ubuntu交叉编译的环境,环境的搭建在另一篇文章有配置过程。
    我们简单过一下交叉编译环境搭建:

手动配置环境变量
编译工具下载后,在64位ubuntu上编译我们需要的编译工具bin文件在:tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
目录下,将此目录添加到环境变量PATH中,添加方法:
先进入 vi /home/wxc/.bashrc 在最后面一行加入
export PATH=$PATH:/home/nicek/githubProjects/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

如果是在32位系统中编译则要选择32位的交叉编译工具。

配置完成之后可以用编译工具命令查看到版本号: arm-linux-gnueabihf-gcc -v

之后,所有的make命令都要指明一些环境变量: ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7

ARCH=arm : 指明当前要编译arm,虽然树莓派是64位的,这里仍然选择arm,而不是arm64。
CROSS_COMPILE : 指明交叉工具链名称。
KERNEL : 指明kernel类型,树莓派1设置为kernel,树莓派2、3设置为kernel7。

export环境变量后,在本终端里的后续命令都可以不用再指明这些环境变量,如:
配置之前的命令:ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig
配置之后的命令:make menuconfig

配置config

  • 然后开始配置config, linux源码中有很多工程:

  • 树莓派1的工程是bcmrpi_defconfig

  • 树莓派2、3的工程是bcm2709_defconfig
    配置过程如下

  • 使用源码里自带的configARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
    此命令功能是获取bcm2709_defconfig的配置到.config里。
    内核配置:

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
指定ARM架构   指定编译器                     树莓派         主要核心指令

这行命令的意思是:
指定arch(架构)是arm架构的-------ARCH=arm;指定编译器是系统里面arm-linux-gnueabihf-这个编译器,这就是之前配好的交叉编译器------CROSS_COMPILE=arm-linux-gnueabihf-;指定树莓派的kernel树莓派里面特别指定的---------KERNEL=kernel7;用的config是bcm2709_defconfig所以是-------make
bcm2709_defconfig,这就相当于直接拷贝厂家的config到.config。

  • 如果使用指令:ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig出现下图报错该错误原因是缺少某些需要的库,需要安装一下需要的库就行了,sudo apt-get install bisonsudo apt-get install flex,如果在安装上面库时提示找不到安装库,就需要更新一下source addr,sudo apt-get update #更新;sudo apt-get upgrade #升级,需要用update更新完才能upgrade;更详细的,请 $man apt-get,记录更新源的文件:/etc/apt/sources.list,默认sources.list中的更新源为官方的,下载速度慢,从而需要寻找符合自己需要的更新源。
    下载,或升级update出现问题 (点击这里)

  • 出现下图表示复制成功,configuration written to .config

  • 添加某些驱动
    如果想要添加某些驱动进来,就要:ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig,如果没什么改的就不用执行这一步。这时候它就会读取现有.config,给menuconfig做一些基本的项的填充。
    出现下图错误表示没有ncurses 库

    要进行安装ncurses 库sudo apt-get install libncurses5-dev libncursesw5-devsudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5,编译的时候还会用到一些其他的必要的库需要进行安装:sudo apt-get install bcsudo apt-get install zlib1g:i386

  • 执行完执行ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig会出现以下Ncurses界面,一般就是在Device Drivers进行设备驱动的配置,用方向键操作,用enter表示确定选择, Pressin < Y > includes表示要将前面带的编译进了内核,< M > modularizes features意思都是模块化特性,表示驱动以模块的方式生成驱动文件。< N>表示不需要的略过的就是下图的< >。
    驱动两种加载方式
    ① * 编译进内核 zImage包含了驱动
    ②M 驱动以模块方式生成驱动文件(xxx.ko)系统启动后,通过命令inmosd xxx.ko加载,下图的 < * >就是< Y>。在这个Ncurses界面可以使用 空格切换< >中的选项

  • 我们可以直接用工程里的配置,但这样的话可能会丢失原来使用的树莓派的配置,

这里提供一个方法可以获取当前正在使用的树莓派的config
获取当前树莓派的config,已经开机的树莓派上会有这个节点:/proc/config.gz,从这个节点可以获取本树莓派的config。
如果没有这个节点的话则需要先加载模块:sudo modprobe configs
把 config.gz 内容复制到要编译的电脑上:
scp pi@[ip]:/proc/config.gz .解压,保存为.confg文件。
zcat config.gz >.config
:必须在linux环境下解压,在mac下会乱码。
把此config文件复制到linux源码的根目录,这种方法我没尝试过。

Linux内核编译

1、安装必要的库:

sudo apt-get install bc
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install zlib1g:i386
sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5

上面安装ncurses 库我们已经按装了,这里提到一句,没按过的,记得安装.

2、编译

执行menuconfig

c ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig

如果没什么改的就不用执行这一步。

已经生成.config文件了,然后就可以该文件指导Makefile去把有用的东西组织成内核:

编译
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs 2>&1 | tee build.log
以n进程编译。不指明几进程的话则默认以单进程编译。

使用指令:ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs 2>&1 | tee build.log,其中2>&1 | tee build.log是错误处理可以不关心(不要)。

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs j4是指定用多少电脑资源进行编译 zImage生成内核镜像   modules要生成驱动模块  dtbs生成配置文件

make -j4 zImage modules dtbs这段指令中的-j4是指定电脑(虚拟机)用多少的资源来编译,4表示4线程
zImage表示要生成zImage(内核镜像);
modules表示要生成驱动模块
dtbs表示要生成配置文件等等。

这里大概需要等待个20分中左右,如果10秒就出错了,说明之前配置没弄好,如交叉编译啊等。

  • 我编译的过程出现以下错误:
    原因是:都是没有安装libssl-dev~,libssl-dev包含libraries, header files and
    manpages
    ,他是openssl的一部分,而opensslssl进行了实现。
    解决方案:使用sudo apt-get install libssl-dev来安装libssl-dev即可,这个编译过程大概持续20分钟。

我们ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs 后没有报错,

其次在内核的源码树目录下生成vmlinux,vmlinux是没有压缩的linux

真正的内核生成的 在arch/arm/boot下,zImage才是我们想要的

编译成功后,看到源码树目录多了vmlinux,失败则无此文件
成功后,目标zImage镜像arch/arm/boot底下

3、打包zImage文件

打包zImage文件
直接用linux源码包里的工具:
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
在本目录生成一个kernel_new.img文件,这个文件就是要放到sd卡中的文件。

网上很多地方说的用 tools/mkimage/imagetool-uncompressd.py 的方法不行!!

  • 我们直接打包zImage文件 直接用linux源码包里的工具: ./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img

    scripts文件夹下面存放的是一些脚本文件,这里的mkknlimg会将zImage打包成kernel_new.img。在本目录生成一个kernel_new.img文件,这个文件就是要放到sd卡中的文件。

我们把树莓派的SD卡插入U盘,插到虚拟机里。

  • dmesg是查看底层的硬件信息。 当有设备接入的时候,内核会打印设备驱动的一些东西。可使用该指令查看U盘是否接入到ubuntu,
    并且可以看到SD的两个分区:

    sdb1(boot)
    sdb2(根目录相关文件)。

4、挂数据拷贝

  • 挂载树莓派sd卡,并安装编译出的DIRECTLY 到sd卡:
    把树莓派的sd卡插入ubuntu系统电脑,树莓派的sd卡有两个分区:
    一个fat分区,是boot相关的内容,kernel的img文件就放在这个分区里
    一个是ext4分区,也就是系统的根目录分区
    我们生成的文件涉及到这两个分区的内容,一般插入ubuntu后会自动挂载,fat分区可以不用root权限操作,ext4分区需要root权限操作。两个分区具体挂载在什么地方可以自己决定,以下用[fat]表示boot挂载的路径,[ext4]表示ext4挂载的路径。
    自己创建两个文件夹,这里我在/home/wxc目录下mkdir data1 data2创建了两个文件夹data1 和 data2

1.挂载U盘

sudo mount /dev/sdb1 data1 一个fat分区,是boot相关的内容,kernel的img
sudo mount /dev/sdb2 data2 一个是ext4分区,也就是系统的根目录分区。

将内存卡中的sdb1挂载到data1(fat)文件夹夹,这样fat里面就有sdb1(boot相关)的内容了
将内存卡中的sdb2(根目录分区)挂载到data2(fat)文件夹夹,这样fat里面就有sdb1的内容了

  • 2. 安装modules
    挂载分区后,安装modules
    设备驱动文件: HDML 、USB、WIFI、IO 等…
    sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/wxc/data2 modules_install
    执行指令需要进入到源码下的那个文件夹
    操作ext4分区,需要root权限(因为是安装到根目录分区)。
    自己创建的文件夹名称不同,就将对应的[ext4]换成自己挂载根目录分区的文件夹路径即可,这里我换成了/home/wxc/data2。在这过程中会生成好多xxx.ko文件(HDMI、usb、wifi、io等的驱动),如果少了这步操作那些设备可能不会正常工作。下图表示安装成功:

  • 3.更新 kernel.img 文件

    在更新之前可以选择先备份镜像(注意镜像的名字是kernel7.img),使用指令:cp kernel7.img kernel7OLD.img 。不要直接删除,否则如果刷机没成功,原始kernel7.img被删除或者覆盖了,树莓派就开不开机了。
    下面对于更新有两种方式
    前面已经用mkknlimg 工具打包了kernel_new.img文件了,把它复制到boot分区并配置使用即可:cp kernel_new.img [fat]/,编辑 [fat]/config.txt 文件,在最后加入一行:kernel=kernel_new.img(在配置文件里面指定内核镜像是kernel_new.img)。
    因为前面已经备份了kernel7.img所以可以直接将 kernel_new.img的内容复制到kernel7.img将原有的东西覆盖掉:cp kernel_new.img /home/wxc/data1/kernel7.img
    拷贝完成后可以使用指令:du kernel7.img -h查看文件大小,
    然后可以使用指令:md5sum kernel_new.img查看原镜像的MD5值(每个文件都有它唯一的编码号就是md5的值),然后再查看拷贝后的镜像的MD5值进行比较,若拷贝过程中文件没有损坏,则md5的值相同,否则可能在拷贝过程中文件损坏。

  • 4.复制其他相关文件
    复制其他相关文件(配置文件,是为了加载驱动和其他配置文件
    cp arch/arm/boot/dts/.*dtb* [fat]/将[fat]换成自己内存卡boot分区挂载的对应的路径
    cp arch/arm/boot/dts/overlays/.*dtb* [fat]/overlays/
    cp arch/arm/boot/dts/overlays/README [fat]/overlays/
    这两个指令同上也需要将[fat]换成自己内存卡boot分区挂载的对应的路径。

以上内容配置完成后,然后修改config.txt和cmdline.txt文件里面的内容,通过串口观察系统的启动过程。

更新完成后插回树莓派即可开机,开机后可以用 uname -a 命令查看kernel信息已经改变。和从官网下载的内核版本相同

树莓派内核编译部分参考博文

ARM树莓派高级开发——linux内核源码、树莓派源码编译、SD卡挂载相关推荐

  1. Android9.0版本Vold服务源码分析之上层处理SD卡挂载

    本文接上一篇SD卡挂载之后,上层处理,主要是创建通知,提示用户.涉及 xref: /frameworks/base/services/core/java/com/android/server/Stor ...

  2. 详解5种红黑树的场景,从Linux内核谈到Nginx源码,听完醍醐灌顶丨Linux服务器开发丨Linux后端开发

    5种红黑树的场景,从Linux内核谈到Nginx源码,听完醍醐灌顶 1. 进程调度CFS的红黑树场景 2. 虚拟内存管理的红黑树场景 3. 共享内存slab的红黑树场景 视频讲解如下,点击观看: [干 ...

  3. 树莓派:关于linux内核

    1.树莓派等芯片带操作系统的启动过程 c51,STM32(裸机)>>>>>>>c直接操控底层寄存器实现相关业务.业务流程形的裸机代码 遥控灯:while(1) ...

  4. linux arm 虚拟机,ARM平台上实现Linux内核虚拟机技术研究

    摘要: 虚拟机技术可以简化计算机系统管理,提高系统的可移植性.可靠性和安全性,已经成为计算机技术研究和应用领域的一个重要方向.嵌入式系统向非专用计算平台方向的发展使它们要面对与普通计算机系统相同的需求 ...

  5. linux文件系统知识总结、SD卡挂载问题总结

    0.什么是linux文件系统? 在Linux系统中,每个装置都被当成一个档案来对待,即一切设备即文件 1.目录树结构: Linux内的所有数据都是以档案的形态来呈现的,所以啰,整个Linux系统最重要 ...

  6. linux4 sd卡驱动,在Linux上,如何格式化USB驱动器和SD卡

    在Linux中,你可以使用图形工具,如GParted或命令行工具,例如fdisk或parted,来格式化驱动器和分区. 在本教程中,向你展示如何使用Linux的parted工具格式化USB驱动器或SD ...

  7. linux内核开发基础(linux内核源码、树莓派源码编译、SD卡挂载)

    首先下载树莓派linux内核源码: 下载网址:https://github.com/raspberrypi/linux 在树莓派使用指令:uname -r查看当前树莓派的版本号,然后选择对应的linu ...

  8. 【Linux 内核 内存管理】Linux 内核堆内存管理 ③ ( CPU 计数器瓶颈 | per-CPU 计数器 | Linux 内核 percpu_counter 结构体源码 )

    文章目录 一.CPU 计数器瓶颈 二.per-CPU 计数器及 percpu_counter 结构体源码 一.CPU 计数器瓶颈 如果 操作系统 中有 多个 CPU , 假设只有一个 CPU 计数器工 ...

  9. Linux内核的红黑树源码实现以及调用

    红黑树可以说是程序员经常遇到的一种数据结构,不管是工作还是面试都会涉及,有时候还会让你写一段红黑树代码. 本文主要是讲Linux中的红黑树,关于红黑树定义参考wiki:https://en.wikip ...

最新文章

  1. oracle主从关系表查询,Oracle 主从表联合查询解决方法
  2. java- ASM 字节码操控框架
  3. 数据库常用sql语句
  4. billibilli html5播放,Thousands of people online are involved in ef...
  5. 【Qt】Qt中的快捷键汇总
  6. 数据分析词数统计和词的重要程度统计
  7. 将一个数字划分成树状
  8. Eclipse创建java webproject配置Tomacat和JDK
  9. mysql的每隔1分钟定时_深入研究MySQL(四)、备份与恢复
  10. u-boot新增命令后出现data abort
  11. shell基础之多功能nginx(安装、重启、停止等)
  12. 4.剑指Offer --- 解决面试题的思路
  13. Win系统 - 微星 GS65 笔记本电脑开机黑屏
  14. 网线接法只有两头线序一样就行了吗?
  15. 游戏史上80重要创新(原资料来自17173)
  16. tensorflow-serving源码阅读1
  17. 神武4虚拟机 进不去怎么办 无法登陆我们应如何解决?
  18. linux系统如何安装mtk驱动程序,模块编译问题 给MTK芯片的wifi网卡编译linux驱动 系统是mint...
  19. J0007. 华为手机怎么开启开发者选项
  20. python简单名片管理器,一个简单的Python名片管理系统

热门文章

  1. 基于qt的计算机论文,基于qt的科学计算器的设计与实现本科毕业论文.doc
  2. 分享 | 快递鸟电子面单API参数接口
  3. 库 家庭组 计算机 网络,Windows 8家庭组网络连接功能详解
  4. 有效的亚像素图像配准算法
  5. 两款简单的拒绝服务攻击工具
  6. 【论文学习】《Who is Real Bob? Adversarial Attacks on Speaker Recognition Systems》
  7. 互联网IT就业市场,你要说最有市场的一定是它,linux内核视频教程全套
  8. AutoLeaders控制组—51单片机学习笔记(LED控制、独立按键、数码管)
  9. XP系统经典故障FAQ
  10. php显示excel2007,PHP输出Excel PHPExcel的方法