主线剧情0.0-Linux学习资源大综合

Linux 学习资源大综合

对收集到的比较丰富的 Linux 学习相关的资料进行整理。注,如果链接挂了请告诉我,如果链接里的内容被删了那么直接搜文章名字试试也许会搜出来很多转载的 “备份”。

注:在 Github 上的原版文章日后可能会更新,在其它位置发的不会跟进。文章的 Gitee 仓库地址,Gitee 访问更流畅


1 尝鲜

前置基础

计算机组成原理

路线的内容

总的来说(按顺序)

  1. 前置基础打牢(参考 前面的 “前置基础” 一节)。
  2. Linux 应用编程(文件IO、内存管理、多任务编程(进程和线程)、网络编程 和 图形界面QT 等)。细节内容见 “Linux 应用编程内容补充” 一节。
  3. Linux 驱动编程(字符设备、块设备、网络设备、总线设备 等)。细节内容见 “Linux 驱动编程内容补充” 一节。

深入层面

  • 内核研读。
  • 音频,视频子系统。
  • Linux 移植(uboot + kernel + rootfs 的 配置和编译 等)。比较深而且由于工作的细分工可能用的不多。
  • 等等。

2 网络资料收集整理

图片都有水印,侵删。

路线相关

0、

1、清华远见教程的路线图。

2、一张网图(侵删)。

3、一张超大图,非常丰富的内容罗列:嵌入式:我不是针对谁,我是说在座的Javaer都是弟弟,尤其程序羊 (qq.com),原图在 Github 仓库里 rd2coding/Road2Coding: 编程之路 (github.com)。 下面是概略截图,高清原图看上面的链接。

4、一些介绍 学习路线 的 杂网文。

!学习来源!

下面仅为个人见到的选择的推荐,欢迎补充!

最推荐的就是 “入手开发板,跟着教程学” 的方式即可~

就这些,我不会列成吨的资料骑脸。。

书籍推荐

注,书一般都是大书,要 入门学习 推荐参考上面 “!!!学习来源!!!” 一节里的,看书一般是 复习知识查漏补缺 和 用时现查 用的。

1、网络推荐 

 

2、引自 coding-style-and-more: C 编写规范和其他。CC-BY-NC-SA 4.0。 (gitee.com)。这些又都是典型的大厚书。

引自网络,侵删。

  • 算法和数据结构:数组、链表、二叉树、堆栈、排序算法、B+/B-树、DP(动态规划)等;
  • 操作系统:IO、存储器、多线程/多进程、同步机制、处理器调度及死锁、设备管理、通道等;
  • 计算机组成原理:冯诺依曼计算机组成、计算机层次结构、计算机性能指标等;
  • 网络底层:HTTP、HTTPS、DNS、ARP、TCP、IP、ICMP、UDP、FTP、SMTP、的实现底层;
  • 多进程/多线程编程:进程通信的方式(共享内存、pipe、Socket编程等)、同步、死锁及解决方案、线程池的实现、进程/线程的操作系统实现原理、进程的状态及切换和调度等。
  • 《嵌入式C语言的自我修养》 从沙子讲到CPU,从编辑器讲到编译器,从高阶C语言讲到内存管理,从GNU讲到多任务编程。
  • 《计算机体系结构》(经典),《计算机操作系统》/《现代操作系统》/《深入理解计算机系统》。
  • 《编码的奥秘》,相关介绍/推荐 想练习《编码的奥秘》里面的知识,有什么软件有帮助? - 知乎 (zhihu.com)。《编译原理》(经典),《深入分析GCC》。
  • 网络协议如《计算机网络》、《TCP-IP详解卷一/卷二/卷三》, 想深入了解 HTTP 协议,有哪些值得推荐的书籍? - 知乎 (zhihu.com)
  • 嵌入式应用相关:《GNU Make》,《Debugging with GDB》,《Linux 高级程序开发》,《POSIX 多线程程序设计》,《嵌入式Linux基础教程》,《嵌入式Linxu应用开发完全手册》,《嵌入式Linxu应用程序开发详解》。
  • 嵌入式底层相关:内核相关:《深入理解Linux内核》,《Linux内核源代码情景分析》,《Linux内核设计与实现》;驱动相关:《Linux设备驱动程序》,《Linux设备驱动开发详解》,《Linux驱动开发入门与实践》。

3、Linux 驱动开发相关书籍

面经相关

部分引自 coding-style-and-more: C 编写规范和其他。CC-BY-NC-SA 4.0。 (gitee.com)

嵌入式相关

一些文章

算法相关

内核研读

一些基础概念

深入研读

网络杂文

网上东西非常杂,这里会推荐一些我个人见到的好的。

休闲阅读 Linux的功能有多强大? - 知乎 (zhihu.com)

Linux 应用编程内容补充

基本:

  • 韦东山、正点原子、野火 等 的 Linux 学习文档。

综合:

I/O编程:

misc:

下面引自 《主线剧情08-Linux应用编程-学习总结备查》:

这里就是日常用到的 API 的积累和整理,最详细、全面的 API 参考 见 上面 通过手册的 API 详细描述参考 一节。

日常用到的 标准 API 富集 单独放在了 【Linux 通用应用开发】 (仓库地址 GithubGitee)文件夹 里面,包括:

  • 文件 IO、字符流收发 和 字符串处理相关的 API 收集积累。

  • 一些 Shell 命令 API 收集积累。

  • 输入设备框架,读取驱动程序按照 input event 框架上传的信息。

  • 文件 IO 读写的基本四种机制(阻塞、非阻塞、poll/select 和 异步通知(通过信号机制))。

  • Socket TCP / UDP 编程。

  • 进程 和 线程 的设计和编程。包括 进程和线程的分配策略、进程和线程的 API 用法 等:

    • 进程 相关 API(fork()、exec、wait() 等等)。
    • 进程间通讯(管道、命名管道、信号、信号量、消息队列、共享内存、内存映射 和 套接字)。
    • pthread 线程编程库 相关 POSIX API(pthread_create()、(后面省略 “pthread_”)exit / cancel 和 join / tryjoin_np、self()、attr_setxxx() / attr_getxxx()、)。
    • 线程间通讯、同步的机制(锁机制(互斥锁、读写锁 和 自旋锁)、信号量机制、条件变量机制 和 信号(与 IPC 的信号使用上有区别))。
  • 串口收发编程、I2C编程。

    实质上就是对各种设备驱动文件 进行 open/read/write/ioctl/close 来配置和读写,有一些标准接口有标准的信息结构,因此有专门的 库,通过这些库来间接的 配置 和 读写设备驱动文件,比如 tslib、i2ctool 等等。

  • 等等其它,用时补充。比如 进程高级编程、内存管理、Linux 高并发编程 epoll 等等。

Linux 驱动编程内容补充

基本:

备查:

综合例子:

Linux各子系统:

Linux驱动具体是指什么?引自 Linux驱动具体是指什么? (qq.com)

驱动的具体分类?

1、驱动分类

(1)分3类:字符设备驱动、块设备驱动、网络设备驱动

(2)分类原则:设备本身读写操作的特征差异

时刻要注意一点,我们的驱动本质上是不分类的,因为我们的硬件是不同的,有不同的读写特性,所以的硬件是分类的,所以我们的驱动也就要跟着分类了。

2、三类驱动程序详细对比分析

(1)字符设备,准确的说应该叫“字节设备”,软件操作设备时是以字节为单位进行的。典型的如LCD、串口、LED、蜂鸣器、触摸屏······

(2)块设备,块设备是相对于字符设备定义的,块设备被软件操作时是以块(多个字节构成的一个单位)为单位的。设备的块大小是设备本身设计时定义好的,软件是不能去更

改的,不同设备的块大小可以不一样。常见的块设备都是存储类设备,如:硬盘、NandFlash、iNand、SD····操作块设备时,我们必须以块单位进行操作,将一块的

数据读取到内存中去,然后在内存中找到相应的那个字节数据修改之后再以一块的数据写入到我们的块设备中去。

(3)网络设备,网络设备是专为网卡设计的驱动模型,linux中网络设备驱动主要目的是为了支持API中socket相关的那些函数工作。

驱动的设计思想?

1: 分离、分层思想

2: 驱动的上面是系统调用API

3: 驱动的下面是硬件

4: 驱动本身的实现也是基于分离、分层的思想

 

驱动和内核的关系?

驱动已经成为内核中最庞大的组成部分

内核会直接以函数调用的方式调用驱动代码

驱动的动态安装和卸载都会“更改”内核

驱动程序崩溃甚至会导致内核崩溃

驱动的效率会影响内核的整体效率

驱动的漏洞会造成内核安全漏洞

下面摘自网络,侵删。

  1. 学会写简单的makefile    2. 编一应用程序,可以用makefile跑起来    3. 学会写驱动的makefile    4. 写一简单char驱动,makefile编译通过,可以insmod, lsmod, rmmod. 在驱动的init函数里打印hello world, insmod后应该能够通过dmesg看到输出。    5. 写一完整驱动, 加上read, write, ioctl, polling等各种函数的驱动实现。 在ioctl里完成从用户空间向内核空间传递结构体的实现。    6. 写一block驱动, 加上read,write,ioctl,poll等各种函数实现。    7. 简单学习下内存管理, 这个是最难的,明白各种memory alloc的函数实现细节。这是linux开发的基本功。    8. 学习锁机制的应用,这个不是最难的但是最容易犯错的,涉及到很多同步和并发的问题。    9. 看内核中实际应用的驱动代码。 你会发现最基本的你已经知道了, 大的框架都是一样的, 无非是read, write, ioctl等函数的实现, 但里面包含了很多很多细小的实现细节是之前不知道的。 这时候就要考虑到很多别的问题而不仅仅是基本功能的实现。    推荐您看2.6.20中integrated的一个驱动 kvm, 记得是在driver/lguest下,很好玩的, 就是linux下的虚拟机驱动, 代码不长,但功能强大。有能力的可以自己写一操作系统按照要求做成磁盘镜像加载到虚拟机中, 然后客户机可以有自己的4G虚拟地址空间。    10. 看完驱动欢迎您进入Linux kernel学习中来。    最简单的方法,跟着ldd(linux devive driver)做一遍。

全栈之路

p.s 只是总结着玩的

  • 自动控制原理&信号与系统&英语。
  • 电路、数模电基础。
  • 各类电路拓扑,各类电源、各类电机、各类接口、各类保护。
  • 原理图&PCB绘制&绘制规范和技巧。
  • 高速信号&信号完整性&电源完整性&EMC&射频天线。
  • C/C++语言基础&编程规范&开发模式。
  • MCU编程(各类外设,通讯接口,总线,USB)。
  • RTOS编程&LWIP网络编程。
  • 数据结构与算法(堆、栈、链、树、图;串匹配、排序、搜索、动态规划.etc)。
  • 计算机体系结构,计算机操作系统,计算机网络,编译原理。
  • Vim、GCC、Make、Git、APT。
  • uboot、kernel、rootfs 的 编辑配置、移植、编译 和 源码研读。
  • Linux驱动(字符设备、块设备、网络设备、总线设备 等)。
  • Linux应用(文件IO、内存管理、多任务编程、网络编程 和 图形界面QT 等)。
  • 音频应用,视频应用,摄像头,总线开发(每一块都是专家)。
  • 机器学习,深度学习。
  • 上位机。
  • 前端/后端。
  • 安全。

p.s 术业有专攻

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值