先给出官方链接地址
本质上说Linux内核开发和Linux驱动开发是不一样的,或者说驱动开发是内核开发的一部分,因为驱动属于内核。目前国内驱动开发和内核开发一般是一样的。
Linux设备驱动属于内核的一部分,Linux内核的一个模块可以以两种方式被编译和加载:
(1)直接编译进Linux内核,随同Linux启动时加载。
(2)编译成一个可加载和删除的模块。
/home/nvidia/kernel/kernel-5.10
TKOUT=/usr/src/linux-headers-$(uname -r)-ubuntu18.04_aarch64
nvidia@nvidia-desktop:~$ $TKOUT
-bash: /usr/src/linux-headers-5.10.104-tegra-ubuntu18.04_aarch64: No such file or directory
nvidia@nvidia-desktop:~$ cat TKOUT=/usr/src/linux-headers-$(uname -r)-ubuntu18.04_aarch64
cat: 'TKOUT=/usr/src/linux-headers-5.10.104-tegra-ubuntu18.04_aarch64': No such file or directory
nvidia@nvidia-desktop:~$ cat /usr/src/linux-headers-$(uname -r)-ubuntu18.04_aarch64
cat: /usr/src/linux-headers-5.10.104-tegra-ubuntu18.04_aarch64: No such file or directory
nvidia@nvidia-desktop:~$ cat /usr/src/linux-headers-$(uname -r)
cat: /usr/src/linux-headers-5.10.104-tegra: No such file or directory
nvidia@nvidia-desktop:~$ cat /usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/
kernel-5.10/ nvgpu/ nvidia/ nvlink/
nvidia@nvidia-desktop:~$ cat /usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/
kernel-5.10/ nvgpu/ nvidia/ nvlink/
nvidia@nvidia-desktop:~$ cat TKOUT=/usr/src/linux-headers-$(uname -r)-ubuntu20.04_aarch64
cat: 'TKOUT=/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64': No such file or directory
nvidia@nvidia-desktop:~$ TKOUT=/usr/src/linux-headers-$(uname -r)-ubuntu20.04_aarch64
nvidia@nvidia-desktop:~$ $TKOUT
-bash: /usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64: Is a directory
nvidia@nvidia-desktop:~$ sudo mkdir -p $TKOUT
[sudo] password for nvidia:
nvidia@nvidia-desktop:~$ $TKOUT
-bash: /usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64: Is a directory
nvidia@nvidia-desktop:~$ cd kernel/
kernel-5.10/ nvethernetrm/ nvgpu/ nvidia/
nvidia@nvidia-desktop:~$ cd kernel/
kernel-5.10/ nvethernetrm/ nvgpu/ nvidia/
nvidia@nvidia-desktop:~$ cd kernel/
kernel-5.10/ nvethernetrm/ nvgpu/ nvidia/
nvidia@nvidia-desktop:~$ cd kernel/kernel-5.10/
nvidia@nvidia-desktop:~/kernel/kernel-5.10$ ls
android-patches block COPYING crypto drivers include ipc Kconfig kernel-int-overlays.txt lib MAINTAINERS mm NVIDIA-REVIEWERS rt-patches scripts sound usr
arch certs CREDITS Documentation fs init Kbuild kernel kernel-overlays.txt LICENSES Makefile net README samples security tools virt
nvidia@nvidia-desktop:~/kernel/kernel-5.10$ ls
android-patches block COPYING crypto drivers include ipc Kconfig kernel-int-overlays.txt lib MAINTAINERS mm NVIDIA-REVIEWERS rt-patches scripts sound usr
arch certs CREDITS Documentation fs init Kbuild kernel kernel-overlays.txt LICENSES Makefile net README samples security tools virt
nvidia@nvidia-desktop:~/kernel/kernel-5.10$ sudo make ARCH=arm64 O=$TKOUT tegra_defconfig
make[1]: Entering directory '/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64'
GEN Makefile
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/confdata.o
HOSTCC scripts/kconfig/expr.o
LEX scripts/kconfig/lexer.lex.c
YACC scripts/kconfig/parser.tab.[ch]
HOSTCC scripts/kconfig/lexer.lex.o
HOSTCC scripts/kconfig/parser.tab.o
HOSTCC scripts/kconfig/preprocess.o
HOSTCC scripts/kconfig/symbol.o
HOSTCC scripts/kconfig/util.o
HOSTLD scripts/kconfig/conf
#
# configuration written to .config
#
make[1]: Leaving directory '/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64'
nvidia@nvidia-desktop:~/kernel/kernel-5.10$ sudo make ARCH=arm64 O=$TKOUT -j4 modules_prepare
make[1]: Entering directory '/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64'
GEN Makefile
WRAP arch/arm64/include/generated/uapi/asm/kvm_para.h
WRAP arch/arm64/include/generated/uapi/asm/errno.h
WRAP arch/arm64/include/generated/uapi/asm/ioctl.h
WRAP arch/arm64/include/generated/uapi/asm/ioctls.h
WRAP arch/arm64/include/generated/uapi/asm/ipcbuf.h
WRAP arch/arm64/include/generated/uapi/asm/msgbuf.h
WRAP arch/arm64/include/generated/uapi/asm/poll.h
WRAP arch/arm64/include/generated/uapi/asm/resource.h
WRAP arch/arm64/include/generated/uapi/asm/sembuf.h
WRAP arch/arm64/include/generated/uapi/asm/shmbuf.h
WRAP arch/arm64/include/generated/uapi/asm/siginfo.h
WRAP arch/arm64/include/generated/uapi/asm/socket.h
WRAP arch/arm64/include/generated/uapi/asm/sockios.h
WRAP arch/arm64/include/generated/uapi/asm/stat.h
WRAP arch/arm64/include/generated/uapi/asm/swab.h
WRAP arch/arm64/include/generated/uapi/asm/termbits.h
WRAP arch/arm64/include/generated/uapi/asm/termios.h
WRAP arch/arm64/include/generated/uapi/asm/types.h
UPD include/generated/uapi/linux/version.h
WRAP arch/arm64/include/generated/asm/early_ioremap.h
WRAP arch/arm64/include/generated/asm/mcs_spinlock.h
WRAP arch/arm64/include/generated/asm/qrwlock.h
WRAP arch/arm64/include/generated/asm/qspinlock.h
WRAP arch/arm64/include/generated/asm/set_memory.h
WRAP arch/arm64/include/generated/asm/user.h
WRAP arch/arm64/include/generated/asm/bugs.h
WRAP arch/arm64/include/generated/asm/delay.h
WRAP arch/arm64/include/generated/asm/div64.h
WRAP arch/arm64/include/generated/asm/dma-mapping.h
WRAP arch/arm64/include/generated/asm/dma.h
WRAP arch/arm64/include/generated/asm/emergency-restart.h
HOSTCC scripts/dtc/dtc.o
WRAP arch/arm64/include/generated/asm/hw_irq.h
HOSTCC scripts/dtc/flattree.o
WRAP arch/arm64/include/generated/asm/irq_regs.h
WRAP arch/arm64/include/generated/asm/kdebug.h
WRAP arch/arm64/include/generated/asm/kmap_types.h
WRAP arch/arm64/include/generated/asm/local.h
WRAP arch/arm64/include/generated/asm/local64.h
WRAP arch/arm64/include/generated/asm/mm-arch-hooks.h
WRAP arch/arm64/include/generated/asm/mmiowb.h
WRAP arch/arm64/include/generated/asm/msi.h
WRAP arch/arm64/include/generated/asm/rwonce.h
WRAP arch/arm64/include/generated/asm/serial.h
WRAP arch/arm64/include/generated/asm/switch_to.h
WRAP arch/arm64/include/generated/asm/unaligned.h
WRAP arch/arm64/include/generated/asm/vga.h
UPD include/config/kernel.release
HOSTCC scripts/dtc/fstree.o
HOSTCC scripts/dtc/data.o
UPD include/generated/utsrelease.h
HOSTCC scripts/dtc/livetree.o
HOSTCC scripts/dtc/treesource.o
HOSTCC scripts/dtc/srcpos.o
HOSTCC scripts/dtc/checks.o
HOSTCC scripts/dtc/util.o
LEX scripts/dtc/dtc-lexer.lex.c
YACC scripts/dtc/dtc-parser.tab.[ch]
HOSTCC scripts/dtc/dtc-lexer.lex.o
HOSTCC scripts/dtc/dtc-parser.tab.o
HOSTLD scripts/dtc/dtc
HOSTCC scripts/kallsyms
HOSTCC scripts/sorttable
HOSTCC scripts/genksyms/genksyms.o
HOSTCC scripts/selinux/genheaders/genheaders
HOSTCC scripts/selinux/mdp/mdp
YACC scripts/genksyms/parse.tab.[ch]
LEX scripts/genksyms/lex.lex.c
HOSTCC scripts/asn1_compiler
HOSTCC scripts/sign-file
HOSTCC scripts/extract-cert
HOSTCC scripts/genksyms/parse.tab.o
HOSTCC scripts/genksyms/lex.lex.o
HOSTLD scripts/genksyms/genksyms
CC scripts/mod/empty.o
HOSTCC scripts/mod/mk_elfconfig
CC scripts/mod/devicetable-offsets.s
UPD scripts/mod/devicetable-offsets.h
MKELF scripts/mod/elfconfig.h
HOSTCC scripts/mod/modpost.o
HOSTCC scripts/mod/file2alias.o
HOSTCC scripts/mod/sumversion.o
HOSTLD scripts/mod/modpost
CC kernel/bounds.s
CALL /home/nvidia/kernel/kernel-5.10/scripts/atomic/check-atomics.sh
UPD include/generated/timeconst.h
UPD include/generated/bounds.h
CC arch/arm64/kernel/asm-offsets.s
UPD include/generated/asm-offsets.h
CALL /home/nvidia/kernel/kernel-5.10/scripts/checksyscalls.sh
LDS arch/arm64/kernel/vdso/vdso.lds
CC arch/arm64/kernel/vdso/vgettimeofday.o
AS arch/arm64/kernel/vdso/note.o
AS arch/arm64/kernel/vdso/sigreturn.o
LD arch/arm64/kernel/vdso/vdso.so.dbg
VDSOSYM include/generated/vdso-offsets.h
LDS scripts/module.lds
make[1]: Leaving directory '/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64'
nvidia@nvidia-desktop:~/kernel/kernel-5.10$ ls
android-patches block COPYING crypto drivers include ipc Kconfig kernel-int-overlays.txt lib MAINTAINERS mm NVIDIA-REVIEWERS rt-patches scripts sound usr
arch certs CREDITS Documentation fs init Kbuild kernel kernel-overlays.txt LICENSES Makefile net README samples security tools virt
nvidia@nvidia-desktop:~/kernel/kernel-5.10$ cd /etc/
Display all 153 possibilities? (y or n)
nvidia@nvidia-desktop:~/kernel/kernel-5.10$ cd /usr/src/
cudnn_samples_v8/ linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/ tensorrt/
jetson_multimedia_api/ nvidia/
nvidia@nvidia-desktop:~/kernel/kernel-5.10$ cd /usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64$ ls
arch include kernel kernel-5.10 kernel-int-overlays.txt kernel-overlays.txt Makefile nvgpu nvidia nvlink scripts source
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64$ ls
arch include kernel kernel-5.10 kernel-int-overlays.txt kernel-overlays.txt Makefile nvgpu nvidia nvlink scripts source
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64$ cd kernel
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/kernel$ ls
bounds.s
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/kernel$ cd ..
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64$ cd kernel
kernel/ kernel-5.10/
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64$ cd kernel-5.10/
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/kernel-5.10$ ls
arch certs drivers include ipc Kconfig kernel-int-overlays.txt lib mm net scripts sound usr
block crypto fs init Kbuild kernel kernel-overlays.txt Makefile Module.symvers samples security tools virt
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/kernel-5.10$ vi Makefile
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/kernel-5.10$ cd ..
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64$ ls
arch include kernel kernel-5.10 kernel-int-overlays.txt kernel-overlays.txt Makefile nvgpu nvidia nvlink scripts source
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64$ mkdir chardev
mkdir: cannot create directory ‘chardev’: Permission denied
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64$ sudo mkdir chardev
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64$ cd chardev/
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev$ ls
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev$ vi Makefile
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev$ sudo vi Makefile
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev$ vi chardev.c
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev$ vi Makefile
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev$ sudo vi chardev.c
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev$ sudo make
make -C /lib/modules/5.10.104-tegra/build M=/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev modules
make[1]: Entering directory '/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/kernel-5.10'
make[2]: *** No rule to make target '/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev/chrdev.o', needed by '/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev/chrdev.mod'. Stop.
make[1]: *** [Makefile:1854: /usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/kernel-5.10'
make: *** [Makefile:10: kernel_modules] Error 2
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev$ ls
chardev.c Makefile
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev$ sudo mv chardev.c chrdev.c
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev$ sudo make
make -C /lib/modules/5.10.104-tegra/build M=/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev modules
make[1]: Entering directory '/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/kernel-5.10'
CC [M] /usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev/chrdev.o
MODPOST /usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev/Module.symvers
CC [M] /usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev/chrdev.mod.o
LD [M] /usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev/chrdev.ko
make[1]: Leaving directory '/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/kernel-5.10'
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev$ ;s
-bash: syntax error near unexpected token `;'
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev$ ls
chrdev.c chrdev.ko chrdev.mod chrdev.mod.c chrdev.mod.o chrdev.o Makefile modules.order Module.symvers
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev$ sudo insmod chrdev.ko
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev$
Message from syslogd@nvidia-desktop at Jan 29 15:22:45 ...
kernel:[24159.304339] hello.word
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev$ lsmod
Module Size Used by
chrdev 16384 0
bnep 28672 2
nvidia_modeset 1093632 4
fuse 118784 3
xt_conntrack 16384 1
xt_MASQUERADE 16384 1
nf_conntrack_netlink 45056 0
nfnetlink 20480 2 nf_conntrack_netlink
xt_addrtype 16384 2
iptable_filter 16384 1
iptable_nat 16384 1
nf_nat 45056 2 iptable_nat,xt_MASQUERADE
nf_conntrack 131072 4 xt_conntrack,nf_nat,nf_conntrack_netlink,xt_MASQUERADE
nf_defrag_ipv6 24576 1 nf_conntrack
nf_defrag_ipv4 16384 1 nf_conntrack
libcrc32c 16384 2 nf_conntrack,nf_nat
br_netfilter 32768 0
lzo_rle 16384 64
lzo_compress 16384 1 lzo_rle
zram 32768 8
overlay 114688 1
input_leds 16384 0
uvcvideo 102400 0
videobuf2_vmalloc 20480 1 uvcvideo
micrel 28672 1
snd_soc_tegra210_ope 32768 1
snd_soc_tegra186_asrc 36864 1
snd_soc_tegra186_dspk 20480 2
snd_soc_tegra186_arad 24576 2 snd_soc_tegra186_asrc
snd_soc_tegra210_iqc 16384 0
snd_soc_tegra210_mvc 20480 2
snd_soc_tegra210_afc 20480 6
snd_soc_tegra210_dmic 20480 4
snd_soc_tegra210_adx 28672 4
snd_soc_tegra210_amx 32768 4
snd_soc_tegra210_i2s 24576 6
snd_soc_tegra210_admaif 118784 1
snd_soc_tegra210_mixer 45056 1
snd_soc_tegra210_sfc 57344 4
snd_soc_tegra_pcm 16384 1 snd_soc_tegra210_admaif
aes_ce_blk 36864 0
crypto_simd 24576 1 aes_ce_blk
cryptd 28672 1 crypto_simd
aes_ce_cipher 20480 1 aes_ce_blk
ghash_ce 28672 0
sha2_ce 20480 0
sha256_arm64 28672 1 sha2_ce
sha1_ce 20480 0
snd_soc_spdif_tx 16384 0
snd_soc_tegra_machine_driver 16384 0
nct1008 24576 0
snd_soc_tegra210_adsp 753664 1
snd_soc_tegra210_ahub 1228800 3 snd_soc_tegra210_ope,snd_soc_tegra210_sfc
snd_soc_tegra_utils 28672 3 snd_soc_tegra210_admaif,snd_soc_tegra_machine_driver,snd_soc_tegra210_adsp
snd_soc_simple_card_utils 24576 1 snd_soc_tegra_utils
userspace_alert 16384 0
tegra210_adma 28672 2 snd_soc_tegra210_admaif,snd_soc_tegra210_adsp
binfmt_misc 24576 1
nvadsp 110592 1 snd_soc_tegra210_adsp
tegra_bpmp_thermal 16384 0
snd_hda_codec_hdmi 57344 1
ofpart 16384 0
cmdlinepart 16384 0
qspi_mtd 28672 0
snd_hda_tegra 20480 0
mtd 69632 4 cmdlinepart,qspi_mtd,ofpart
snd_hda_codec 118784 2 snd_hda_codec_hdmi,snd_hda_tegra
snd_hda_core 81920 3 snd_hda_codec_hdmi,snd_hda_codec,snd_hda_tegra
spi_tegra114 32768 0
nvidia 1339392 9 nvidia_modeset
loop 36864 23
ina3221 24576 0
pwm_fan 24576 0
nvgpu 2494464 32
nvmap 192512 188 nvgpu
ramoops 28672 0
reed_solomon 20480 1 ramoops
ip_tables 36864 2 iptable_filter,iptable_nat
x_tables 49152 5 xt_conntrack,iptable_filter,xt_addrtype,ip_tables,xt_MASQUERADE
nvidia@nvidia-desktop:/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64/chardev$