学习资料推荐网站
https://www.code-nav.cn/
https://www.r2coding.com/
设备驱动在线书籍:
https://lwn.net/Kernel/LDD3/

1、 代码移植参考手册
https://support.huaweicloud.com/codeprtr-kunpenggrf/codeprtr-kunpenggrf.pdf

2、 内核相关参考链接
https://www.kernel.org/doc/Documentation/
https://mirrors.edge.kernel.org/pub/linux/
Linux kernel fundamentals:
https://ilinuxkernel.com/
3、arm开发文档
https://developer.arm.com/documentation/#sort=relevancy&f:@navigationhierarchiesproducts=[Architectures,CPU Architecture,A-Profile]

核心API文档
https://www.kernel.org/doc/html/latest/translations/zh_CN/core-api/unaligned-memory-access.html

4、linux源代码导航器
http://lxr.linux.no/source

https://elixir.bootlin.com/linux/latest/source
源码下载:
https://www.kernel.org/
说明文档:
https://www.kernel.org/doc/Documentation/

编译linux内核:
https://www.bilibili.com/read/cv11271232

内核开发人员代码合入记录:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/
u-boot源码下载:
https://ftp.denx.de/pub/u-boot/
busybox源码下载:
https://busybox.net/
gcc交叉编译器下载:
http://releases.linaro.org/components/toolchain/binaries/
芯片手册下载:
http://www.datasheetcatalog.com/
perf工具官网:
https://www.brendangregg.com/perf.html
perf视频教程:
https://www.bilibili.com/video/BV1hK4y1A7U4?spm_id_from=333.337.search-card.all.click&vd_source=9a8a120f260b2f6555d727c9d48cf27d
https://www.bilibili.com/video/BV1MK4y1m7Uj?spm_id_from=333.337.search-card.all.click&vd_source=9a8a120f260b2f6555d727c9d48cf27d
perf参考链接:http://walkerdu.com/2018/09/13/perf-event/

服务器链接工具:
xshell:https://www.xshell.com/zh/xshell/
winscp:https://winscp.net/eng/index.php
finalshell:http://www.hostbuf.com/t/988.html
5、 cpu相关:
查看CPU的个数
cpu_possible_map()// 机器上最多有多少个CPU
cpu_present_map()// 当前有多少个CPU
https://blog.csdn.net/guowenyan001/article/details/44224759

PCI设备ID(Device ID)查询:
https://devicehunt.com/
PCI设备清单:
https://pci-ids.ucw.cz/
6、 Linux中进程的七种状态
(1)R运行状态(runing):并不意味着进程一定在运行中,也可以在运行队列里;
(2)S睡眠状态(sleeping):进程在等待事件完成;(浅度睡眠,可以被唤醒)
(3)D磁盘睡眠状态(Disk sleep):不可中断睡眠(深度睡眠,不可以被唤醒,通常在磁盘写入时发生)
(4)T停止状态(stopped):可以通过发送SIGSTOP信号给进程来停止进程,可以发送SIGCONT信号让进程继续运行
(5)X死亡状态(dead):该状态是返回状态,在任务列表中看不到;
(6)Z僵尸状态(zombie):子进程退出,父进程还在运行,但是父进程没有读到子进程的退出状态,子进程进入僵尸状态;
(7)t追踪停止状态(trancing stop)
https://blog.csdn.net/weixin_39294633/article/details/80231033

7、 判断当前内核版本
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,4,90))//即表示内核版本大于5.4.9

8、
#ifdef __cplusplus
extern “C” {
#endif
//c语法的一段代码
#ifdef __cplusplus
}
#endif

参考链接:https://www.cnblogs.com/TurboLemon/p/6364241.html

9、CI使用指导
https://www.cnblogs.com/hhhyaaon/p/5854977.html

10、
unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base)
功能:将一个字符串转换成unsigend long long型数据。
返回:返回转换后数据。
参数:cp指向字符串的开始,endp指向分析的字符串末尾的位置,base为要用的基数(进制数),base为0表示通过cp来自动判断基数,函数自动可识别的基数:‘0x’表示16进制,‘0’表示8进制,其它都认定为10进制。函数可转换成数字的有效字符为:[0,f]。举例:cp = “0x12str”,base = 0,则返回unsigned long long为18,*endp = “str”。

来自 https://blog.csdn.net/caoyicheng1/article/details/22391319

11、 内存检测机制及工具参考
https://www.cnblogs.com/arnoldlu/p/8568090.html

12、tftp常用命令
root@hbg:/# tftp
BusyBox v1.22.1 (2015-12-18 15:33:52 CST) multi-call binary.

Usage: tftp [OPTIONS] HOST [PORT]

Transfer a file from/to tftp server

    -l FILE Local FILE           本地文件-r FILE Remote FILE      远程文件-g      Get file               获取文件-p      Put file               送出文件

根据tftp的用法,都是在设备上进行操作

从本地上传一个文件到设备的用法:

tftp -g -r filename IP

eg: tftp -g -r ath.ko 192.168.1.155

从设备上取出文件到本地的用法:

tftp -l -p filename IP

eg: tftp -l -p ath.ko 192.168.1.155

13、深入剖析Linux IO原理和几种零拷贝机制的实现
参考链接:https://www.cnblogs.com/lsgxeva/p/11619464.html

14、获取系统内存大小
struct sysinfo stSysInfo;
ulTotalRam = G(stSysInfo.totalram);
参考链接:https://blog.csdn.net/qq_33706673/article/details/78187559

15、 va_start、va_arg、va_end使用获取函数入参信息
https://www.runoob.com/cprogramming/c-macro-va_start.html

16、报文格式
http://www.023wg.com/message/message/cd_feature_link-layer.html

17、按log等级打印

#define safe_printf(level, fmt, args ...)\
{\if (SAFE_LOG_INFO == level)\{\printk("[lines%d @ %s] " fmt, __LINE__, __func__, ##args);\}\else if (SAFE_LOG_EMERG == level)\{\/*回板后调试直接串口打印功能*/\}\else\{/*do nothing*/}\
}
safe_printf(SAFE_LOG_INFO, "this is a tample\n");

参考链接:
printk结构浅析:
https://blog.csdn.net/tangkegagalikaiwu/article/details/8572365
18、 get_current()作用是获取当前进程的进程描述符:

struct task_struct *pstTask = get_current();

来自 https://blog.csdn.net/qq_34696349/article/details/118281098

19、
u32 cpu_to_le32 (u32);
u32 le32_to_cpu (u32);
这 2 个宏定义转换一个值, 从无论 CPU 使用的什么到一个无符号的, 小端, 32 位数, 并且转换回. 它们不管你的 CPU 是小端还是大端, 不管它是不是 32-位 处理器. 在没有事情要做的情况下它们原样返回它们的参数. 使用这些宏定义易于编写可移植的代码, 而不必使用大量的条件编译建造.
类似的还有be64_to_cpu 转换一个无符号的, 大端, 64-位 值到一个内部 CPU 表示。

来自 https://www.cnblogs.com/pengdonglin137/p/3423399.html

20、_asm 关键字
https://blog.csdn.net/wcccg/article/details/78496940

21、大小端宏定义(在大端序中这个低四位是存储在高地址的)
https://www.cnblogs.com/tlnshuju/p/6764129.html

22、
NR_CPUS是与多处理相关的宏定义,表示CPU的个数。

23、
①args…
GCC编译器中的CPP预编译器,是支持这种写法的,args… 比 args,… 的写法可读性较好。
含义:应该是DBG_OUTPUT的参数,第一个传给fmt, 第二个开始传给args…可为多个。
②##args
##args的意思,就是把args…中的多个参数,串连起来。

另外,如果写成 #fmt的话,就是把fmt传进来的内容以字符串形式输出。(下面例子中会说明)

来自 https://blog.csdn.net/u013187074/article/details/78874976

24、barrier()

带有C/C++表达式的内联汇编格式为:
asm volatile(“Instruction List” : Output : Input : Clobber/Modify);

如果一个内联汇编语句的Clobber/Modify域存在"memory",那么GCC会保证在此内联汇编之前,如果某个内存的内容被装入了寄存器,那么在这个内联汇编之后,如果需要使用这个内存处的内容,就会直接到这个内存处重新读取,而不是使用被存放在寄存器中的拷贝。因为这个 时候寄存器中的拷贝已经很可能和内存处的内容不一致了。

另外在linux内核中内存屏障也是基于它实现的include/asm/system.h中
#define barrier() asm__volatile(“”: : :“memory”)
主要是保证程序的执行遵循顺序一致性。呵呵,有的时候你写代码的顺序,不一定是最终执行的顺序,这个是处理器有关的。

1 int a=5,b=6;2 barrier();3 a=b;

在line3,GCC不会用存放b的寄存器给a赋值,而是invalidate b的Cacheline,重新读内存中的b值,赋值给a。

说明:

https://blog.csdn.net/caoshangpa/article/details/78853919
https://www.cnblogs.com/jhj117/p/5996744.html
http://blog.chinaunix.net/uid-130624-id-2907707.html

memory barrier是一种保证内存访问顺序的一种方法,让系统中的HW block(各个cpu、DMA controler、device等)对内存有一致性的视角。
http://www.wowotech.net/kernel_synchronization/memory-barrier.html

Volatile 当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据
https://blog.csdn.net/tigerjibo/article/details/7427366

25、GCC online documentation
https://gcc.gnu.org/onlinedocs/

26、 extern和头文件的理解
https://www.runoob.com/w3cnote/extern-head-h-different.html

27、
宏 virt_to_page 从一个内核虚地址得到该页的描述结构 struct page *。

来自 http://blog.chinaunix.net/uid-27714502-id-5753084.html

get_page获得page的使用,page的page_count计数加一,相应的,put_page释放page的使用,page的page_count计数减一。

28、 内存对齐设置
#undef ALIGN
#define ALIGN(x,a) (((x)+(a)-1)&~((a)-1))

aligned_addr = ALIGN((u64)qmem->iova, OTX2_ALIGN);
qmem->align = (aligned_addr - qmem->iova);

29、
__weak是一个宏,和__packed是同一种东西都是gcc的扩展属性:
#define __packed attribute((packed))
#define __weak attribute((weak))
如果这个关键字用在函数定义上面,一般情况下和一般函数没有两样。但是当有一个同名函数但是不带__weak被定义时,所有对这个函数的调用都是指向后者(不带__weak那个), 如果有两个一样的函数都用了__weak,那么真正调用那个,就要看连接器了。

来自 https://blog.csdn.net/u012839187/article/details/80743806

30、 flush_cache_all() 将cache中的数据刷到内存
#include <asm-generic/cacheflush.h>
flush_cache_all()
在驅動程式的設計中,我們可能會用到flush_cache_all將ARM cache的內容重新整理到RAM,這是因為ARM Linux中cache一般會被設定為write back的。而通常象DMA是訪問不了cache,所以如果我們需要啟動DMA將RAM中的內容寫到Flash中或LCD framebuffer,那麼我們就需要呼叫flush_cache_all將cache中最新的內容重新整理到RAM中。

https://www.itread01.com/content/1548848181.html

31、 memset_io 和memset

531 #ifndef __HAVE_ARCH_MEMSET
532 /**
533 * memset - Fill a region of memory with the given value
534 * @s: Pointer to the start of the area.
535 * @c: The byte to fill the area with
536 * @count: The size of the area.
537 *
538 * Do not use memset() to access IO space, use memset_io() instead.
539 */
540 void *memset(void *s, int c, size_t count)
541 {
542 char *xs = s;
543
544 while (count–)
545 *xs++ = c;
546 return s;
547 }
548 EXPORT_SYMBOL(memset);
549 #endif

memset函数用于将一段内存空间初始化成一个指定值,一般用于将内存空间初始化成零值。

32、EXPORT_SYMBOL
把内核函数的符号导出,也可以理解成将函数名作为符号导出;符号的意思就是函数的入口地址,或者说是把这些符号和对应的地址保存起来的,在内核运行的过程中,可以找到这些符号对应的地址的。比如项目中遇到一些文件如a.c没有像obj-y那种编译进内核而是lib-y这种编译成lib.a静态库,在其他文件如b.c想使用a.c中的函数如test()是会报未定义的,这时在a.c文件末尾加入,此时b.c就可以引用test()函数了。

EXPORT_SYMBOL (test);//括号中填函数名

33、RPM
RPM Package Manager (RPM) 是一个强大的命令行驱动的软件包管理工具,用来安装、卸载、校验、查询和更新 Linux 系统上的软件包。
命令行工具包下载链接:
http://rpmfind.net/linux/rpm2html/search.php?query=/sbin/lspci

34、busybox工具下载
https://busybox.net/downloads/

35、__extension__
gcc对标准C语言进行了扩展,但用到这些扩展功能时,编译器会提出警告,使用__extension__关键字会告诉gcc不要提出警告。
https://blog.csdn.net/mrwangwang/article/details/7986331

36、 链表处理接口实例
list_for_each(pstTmp, &g_stI2cGlobleInfo.stDevlist)
{
pstI2cDevInfo = list_entry(pstTmp, I2C_DEV_INFO_S , list);
if ( pstI2cDevInfo->unIdx.uiIndex == ulTmpIndex)
{
return pstI2cDevInfo;
}
}

list_add(&(pstI2cDevInfo->list),&g_stI2cGlobleInfo.stDevlist);

file: linux/include/linux/list.h
#define LIST_HEAD_INIT(name) { &(name), &(name) }
#define LIST_HEAD(name)
struct list_head name = LIST_HEAD_INIT(name)
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
list->prev = list;
}
LI

来自 https://blog.csdn.net/landishu/article/details/7952532

37、memset和memset_io
Do not use memset() to access IO space, use memset_io() instead.
https://blog.csdn.net/mcgrady_tracy/article/details/7373036

38、
ioremap_nocache
ioremap_cache
Ioremap
的区别
https://www.cnblogs.com/sinferwu/p/12917448.html

注意,实际过程中使用
ioremap_nocache映射后的地址,概率出现访问空指针问题

#include <asm/cacheflush.h>
__flush_icache_all();

39、
flush_cache_all 把CACHE的数据同步到内存当中
#include <asm-generic/cacheflush.h>

https://blog.csdn.net/guyongqiangx/article/details/52045849

https://www.likecs.com/show-205015909.html#cache_1

flush_dcache_range()使用
linux中可以使用flush_dcache_range()来对数据cache进行刷新
arch/nios2/include/asm/cacheflush.h:
extern void flush_dcache_range(unsigned long start, unsigned long end)
其中start为起始物理地址,end为结束物理地址

来自 http://blog.chinaunix.net/uid-24203478-id-3157908.html

40、 设备进入gdb的方法
Ps | grep vsysd
查看进程号

Gdb attach 进程号

gdb下 Bt 查看调用栈

41、申请地址cacheline对齐方法举例:

g_astPktRxFlag[i] = (atomic_t *)DRV_FPGA_Kmalloc(sizeof(atomic_t)+CACHE_LINE_SIZE, GFP_KERNEL, cpu_to_node(i));
g_astPktRxFlag[i] = (atomic_t *)(((ULONG)g_astPktRxFlag[i]+CACHE_LINE_SIZE)&(~(CACHE_LINE_SIZE-1)));

42、
-mno-unaligned-access
启用(或禁用)未对齐16位或32位地址的16位和32位值的读取和写入。默认情况下,对所有ARMv6之前的版本,所有ARMv6-M和ARMv8-M基准体系结构禁用未对齐访问,并对所有其他体系结构启用未对齐访问。如果未启用未对齐访问,则一次访问一个打包数据结构中的字一个字节。
GCC 编译时设置make EXTRA_CFLAGS=-mno-unaligned-access
https://www.likecs.com/show-204270271.html

43、buffer申请方式
该buffer地址要求4k字节对齐。申请buffer方式,驱动决定。
1:
addr = (uint64_t) kmalloc_tag(len, GFP_KERNEL, MID_XLPNAE);
// len=(alloc_size * num_blocks + align + rsvlen)
2:
pstFpa->vhpool_memvec[i].addr =
dma_zalloc_coherent(&pstFpa->pdev->dev,
pstFpa->vhpool_memvec[i].size,//len或max_block
&pstFpa->vhpool_memvec[i].iova,
GFP_KERNEL);
3:
struct page *p;
p = alloc_pages(GFP_KERNEL | __GFP_NOWARN, PERBUF_PAGE_ORDER);//p为buffer地址
(u8 *)page_address§;//物理地址转虚拟地址

https://blog.csdn.net/leoufung/article/details/121551933
4:
static struct kmem_cache *octeon3_eth_sso_pko_cache;
octeon3_eth_sso_pko_cache = kmem_cache_create(“sso_pko”, BLADE4_BLOCK_MAX_LEN, CVMX_CACHE_LINE_SIZE, 0, NULL);//用于创建slab高速缓存
void *mem = kmem_cache_alloc_tag(octeon3_eth_sso_pko_cache, GFP_KERNEL, MID_XLPNAE);//申请高速缓存中的内存供使用
https://blog.csdn.net/biaotai/article/details/109534282

44、网卡bd
https://www.bbsmax.com/A/ke5j2gpV5r/

45、内核页大小设置
查看系统当前页大小

# cat /proc/meminfo
MemTotal:       96878540 kB
MemFree:        83405160 kB
MemAvailable:   83129280 kB
PageSize:              4 kB
Buffers:             152 kB
Cached:           619324 kB
SwapCached:            0 kB
Active:           210356 kB
Inactive:         605104 kB
Active(anon):     210344 kB
Inactive(anon):   604964 kB
Active(file):         12 kB
Inactive(file):      140 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        198080 kB
Mapped:            49932 kB
Shmem:            619324 kB
Slab:            1234816 kB
SReclaimable:      17636 kB
SUnreclaim:      1217180 kB
KernelStack:       64640 kB
PageTables:         2736 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    48439268 kB
Committed_AS:    1436460 kB
VmallocTotal:   133142937536 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
AnonHugePages:    118784 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
#

内核配置:
页表级别:CONFIG_PGTABLE_LEVELS=4
页大小调整:
#CONFIG_ARM64_4K_PAGES=y
#CONFIG_ARM64_16K_PAGES is not set
CONFIG_ARM64_64K_PAGES=y

https://blog.csdn.net/m120674/article/details/119566226

页表大小与页大小的关系:
https://zhidao.baidu.com/question/335974047.html
目录表、页表、页表项
https://blog.csdn.net/Hehuyi_In/article/details/100867528

实用代码、链接、工具汇总相关推荐

  1. Unity 实用代码 小工具

    Unity 实用代码 小工具 Unity 屏幕截图 全屏截图方法 全屏截图方法 带委托事件 自定义截图方法 自定义截图方法 带委托 延迟工具 携程延迟方法 携程延迟带委托方法 场景加载 场景加载 方法 ...

  2. 静态代码分析工具汇总

    静态代码扫描,借用一段网上的原文解释一下(这里叫静态检查):"静态测试包括代码检查.静态结构分析.代码质量度量等.它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行.代码 ...

  3. 静态代码扫描工具汇总

    一.概述 在软件开发过程中,开发团队往往要花费大量的时间和精力发现并修改代码缺陷.传统的代码评审.同事复审,通过人工方式来检查缺陷仍然是一件耗时耗力的事情.而静态代码扫描工具能够在代码构建过程中帮助开 ...

  4. Android代码混淆工具汇总

    DexLabs ProGuard DexGuard Zelix KlassMaster SandMarks 下面附带Android常见的广告库列表 https://github.com/serval- ...

  5. 【PC工具】大神级代码注释,漂亮实用的代码注释工具代码logo工具

    github上看各路大牛大神的项目代码,经常会看到各种神注释 ...... 那么问题就来了:大神是如何在代码里搞的这些图片代码呢? 打死我也不信是大牛大神一个一个打上去,这不是大牛大神的风格 . 今天 ...

  6. Python 实用代码工具集目录

    Python 实用代码工具集目录 1.批量重命名文件 2.视频转图片 3.图片转视频 4.图像灰度处理.图像合并(hstack) 1.批量重命名文件 链接1: 批量重命名文件 2.视频转图片 链接2: ...

  7. vscode代码运行时间工具_10款实用的VSCode插件提升你的编辑体验 | 第98期

    代码编辑器或者文本编辑器相信大家都不会陌生,但是,常用Windows的朋友大概都知道其自带的"文本编辑器"那是一款多么难用的软件.后来又有一系列的编辑器,比如notepad++.s ...

  8. 代码静态检查工具汇总

    静态代码扫描,借用一段网上的原文解释一下(这里叫静态检查):"静态测试包括代码检查.静态结构分析.代码质量度量等.它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行.代码 ...

  9. 机器学习实用代码汇总(你想要的这里都有)

    机器学习实用代码汇总(你想要的这里都有) 文章目录 机器学习实用代码汇总(你想要的这里都有) 前言 一.数据导入 1.数据文件读取 2.提取特征和标签 3.数据分布及关系图(ProfileReport ...

  10. php调色板快捷键,Linux_制作简单实用的调色板工具,把如下代码加入body区域 - phpStudy...

    制作简单实用的调色板工具 把如下代码加入 区域中: 红 绿 蓝 灰 function hexit(which) hexit=hex(which) end function for(i=0;i<= ...

最新文章

  1. html 提交表单,图片和文字一起提交,图片存入服务器,图片地址和表单信息存入数据库,带后端php代码
  2. 应用Etherchannel扩展企业服务的高可用性
  3. fft 相位谱_信号处理之功率谱原理与python实现
  4. signavio-core-components ant build-all-in-one-war failed
  5. golang相关在线学习文档
  6. xp系统怎么弄清微软服务器名称,xp系统电脑怎么远程云服务器
  7. matlab概率论实验 分别掷硬币1,基于Matlab的概率论仿真实验
  8. enterFrame是什么意思?
  9. linux I/O 栈 预习(上)
  10. TensorFlow 教程 --教程--2.3MNIST机器学习入门
  11. pear php有什么用?,php – PEAR和PEAR2有什么区别?
  12. 2021年数学建模B组代码
  13. 计算机一级如何加脚注,用word添加脚注图文的方法是什么?这个计算机技能不会就晚了...
  14. 连接网络打印机报错0x000003e3
  15. 鸿蒙电视应用beta,华为鸿蒙 2.0 开发者公测版 Beta 3 更新:增加三个鸿蒙应用
  16. 关于取整符号(二叉树具有n个结点的m次树的最小高度⌈logₘ(n(m-1)+1)⌉)
  17. 一个纯技术程序员的求职心酸历程
  18. **PAT_甲级_1057 Stack (30分) (C++)【字符串处理/栈的模拟/树状数组】
  19. LeetCode52N皇后||
  20. 记录学习《流畅的python》的一些知识-----对象引用,可变性和垃圾回收

热门文章

  1. 分享!微信群二维码突破100人限制和7天不过期的方法
  2. nginx 解析二级域名
  3. php汉字utf8编码转换,PHP UTF8编码内的繁简转换类
  4. Go语言 常用日志记录方法
  5. css文字向右对齐_css怎么设置右对齐?
  6. 器件选型--电源电容滤波
  7. 用C# 设置excel单元格格式
  8. 随机样本,方便样本与资源回应样本
  9. arcgis坐标转换
  10. 单片机自学入门必看基础知识