ARM uboot 的移植2-从三星官方 uboot 开始移植
一、inand 驱动问题的解决
1、先从现象出发定位问题
(1) 解决问题的第一步,是定位问题。所谓定位问题,就是找到源代码当中导致这个问题的那一句或者那几句代码。有时候解决这个问题需要修改的代码和直接导致这个问题的代码是不同的。我们这里说的定位问题指的是,定位到出问题的代码处,也就是运行了这一句代码时发生了这个错误。
(2) 定位了问题之后,实际修改程序解决问题不一定改的是这一句代码。但是肯定和这一句代码有关联,我们要通过自己分析来找到这种关联,从而从定位的错误点找到真正需要修改的点,然后去修改他。
(3) 实战方法:从打印出来的错误信息中挑选一个关键词,然后去源代码中搜索这个关键字,通过这种搜索的方法定位问题。通过搜索将问题定位在 drivers/mmc/mmc.c 的 818 行。
(4) 然后就是解决问题了。
2、网络搜索解决方案
(1) 初步的解决方案是自己先浏览一遍这个问题点周边代码的上下文。通过浏览代码上下文,发现这个函数是在读取 SD/iNand 的 ext_csd 寄存器的值。通过浏览代码,结合出错地方,可以判断出:从卡端读取 ext_csd 寄存器是成功的,并且从读取结果中拿到了卡的版本号信息。然后代码对版本号进行了判断,并且如果版本号大于 5 就会报错,并且函数错误退出。这就是问题所在。
(2) 问题就是:我们使用的 iNand 卡的版本号大于 5,而 uboot 代码本身不处理版本号大于 5 的卡,因此出错了。
(3) 怎么解决?第一可能,换卡;第二可能,软件修复。
(4)网络搜索错误关键字,然后逐个去查阅,看看哪个可以给我们提供解决问题的思路和方法。http://blog.csdn.net/wang_shuai_ww/article/details/22308853
3、尝试修改代码解决问题
(1) 解决方法就是修改 uboot 中的代码,把判断的 5 改成更大的数字。譬如 8,然后跳过这个错误。
现象:
4、推测和实验验证(SD卡和iNand的区别)
(1) 当前板子上有一个 iNand 接在 SD0 上,有一个外置 SD 卡接在 SD2 上。那 uboot 中初始化的这个是 iNand 而不是 SD 卡。也就是说,uboot 中实际用的是 SD0, 而不是SD2.
现象:
完整的现象截图:
(2) 大家可以尝试,使用外置 SD 卡时,这个版本号的问题不会出现。从这里可以推测出,SD 卡和 iNand 的区别,至少从一个角度可以看出:SD 卡版本低,iNand 的版本比较高。
二、一些小问题的修补
1、控制台串口更换为串口 0
(1) uboot 中默认使用串口 2 来做控制台输入输出的。
(2) SOC 中一共有 4 个串口(串口 0、1、2、3),开发板 X210 上用 DB9 接口引出了 2 个串口,分别是串口 2 和串口 0.(靠边的是串口 2,靠里那个是串口 0)。
(3) 三星公司推荐使用串口 2 来作为调试串口,所以在三星移植的 uboot 和内核版本中都是以串口 2 默认为控制台串口的。
(4) 有时候项目需要将调试串口修改为另外的串口(譬如串口 0),这时候需要修改 uboot 的代码,做移植让 uboot 工作在串口 0 的控制台下。
(5) uboot 中真正去硬件初始化串口控制器的代码在 lowlevel_init.S 中的 uart_asm_init 中,其中初始化串口的寄存器用 ELFIN_UART_CONSOLE_BASE 宏作为串口 n 的寄存器的基地址,结合偏移量对寄存器进行寻址初始化。所以 uart_asm_init 中到底初始化的是串口几(从 0 到 3)?取决于 ELFIN_UART_CONSOLE_BASE 宏。这个宏的值又由 CONFIG_SERIALn(n 是从 1 到 4)来决定。
(6) 同步代码、编译烧录运行,发现串口线插在串口 2 上,控制台上只打印:SD checksum error.(这个是内部 iROM 打印出来的,内部 iNand 校验失败的信息);然后将串口线改插到串口 0 上,启动,所有的信息出现。实验成功。
2、修改默认网络地址设置
(1) 修改配置头文件 smdkv210single.h 中的 CONFIG_IPADDR 等宏,则可以修改 uboot 的默认环境变量。
修改后:
(2) 更改完成后,如果环境变量还是原来的,正常。因为原来 uboot 执行过 saveenv,因此环境变量已经被保存到 iNand 中的 ENV 分区中去了。uboot 启动后校验时 iNand 的 ENV 分区中的环境变量是正确的,因此会优先加载。我们在 uboot 源代码中修改的只是默认的环境变量。
解决方案是擦除掉 iNand 中的那一份环境变量,然后迫使 uboot 启动时,使用 uboot 代码中自带的默认的这一份环境变量,就可以看到了。
(3) 可以使用 mmc write 0 30000000 11# 32(表示将 DDR 的 0x30000000 开头的一段内存中的内容,写入 iNand 中的第 17 个扇区开始的 32 个扇区内,写入长度是 32 个扇区长度(16KB))
3、修改行提示符
(1)
三、网卡驱动移植1
1、网卡芯片与开发板的连接方式
(1) SoC 的 SROM bank, 和网卡芯片的 CS 引脚( SROM 就是 SRAM/ROM)。
SoC 的 SROMController, 其实就是 SoC 提供的 对外总线式连接 SRAM/ROM 的接口。如果 SoC 要外部外接一些 SRAM/ROM 类的存储芯片(或者伪装成 SROM 接口的芯片,譬如网卡芯片),就要通过 SROM Controller 来连接。网卡接在 SROM 中的好处就是,网卡芯片好像一个存储芯片一样,被扩展在 SoC 的一个地址空间中,主机 SoC 可以直接用一个地址来访问网卡芯片的内部寄存器。
(2) 网卡芯片内部寄存器使用相对地址访问。网卡芯片内部很多寄存器有一个地址,这个地址是从 00 开始的,但是实际上,我们 SoC 不能用 0 地址去访问这个网卡的芯片内部寄存器。SoC 访问网卡芯片 00 寄存器时的地址,应该是:起始地址+ 00。 这里的起始地址就是网卡芯片对应接在 SROM bankn 中的 bankn 对应的基地址。
《DM9000AEP.pdf》
(3) 主机 SoC 上网,其实就是通过操控网卡芯片内部的寄存器、缓冲区等资源来上网的。也就是说,其实 SoC 是通过网卡芯片来间接上网的。
(4) 总结:网卡芯片实际上也是一种总线式连接方式。优势是 SoC 内部不需要内置网卡控制器,所有的 SFR 全都在外部网卡芯片中,而且还可以通过地址直接访问(IO与内存统一编址),不用像 Nand/SD 接口一样使用时序来访问。
2、原理图浏览
《x210bv3s.pdf》
(1) 210 的 SROM 控制器允许 8/16bit 的接口,我们实际使用的是 16 位接口。
(2) 网线有 8 根线,但是实际只有 4 根有效通信线,另外 4 根都是 GND,用来抗干扰的。4 根通信线中负责发送的有 2 根(Tx- 和 Tx+),负责接收的有 2 根(Rx+ 和 Rx-)。因为网线上传输的是差分信号。
(3) 网卡芯片有个 CS 引脚,(CS 就是 chip select,片选信号,主机向 CS 发送有效信号,则从机芯片工作;主机向 CS 发送无效信号,则从机芯片不工作。),这个引脚要接主机 SoC 的片选信号引脚,主机 S5PV210 的每一个 SROM bank 中有一个片选信号CSn (n=0-5),从原理图可以看出,我们 X210 上将 DM9000 的 CS 引脚接到了 CSn1上,对应 SROM bank1(推断出 DM9000 的总线地址基地址是 0x88000000)。
(4) DM9000 的 CMD 引脚,接到了 S5PV210 的 ADDR2 引脚上。DM9000 为了减少芯片引脚数,数据线和地址线是复用的(DATA0 到 DATA15,这 16 根线是有时候做数据线传输数据,有时候做地址线传输地址的。什么时候做什么用,就由 CMD 引脚决定。)通过查询数据手册知道:当 CMD 为高电平时,对应传输是DATA,当 CMD 为低电平时,对应传输为 INDEX(offset,寄存器地址)。
注明:这些引脚上的电平变化都是控制器自动的,不需要程序员手工干预。程序员所需要做的,就是在配置寄存器值时充分考虑到硬件电路的接法,然后给相应寄存器配置正确的数值即可。
四、网卡驱动移植2
1、网卡驱动文件介绍
(1) uboot 中本来就提供了很多网卡芯片的驱动程序,在 uboot/drivers/net/dm9000x.c 和dm9000x.h。
这个驱动来自于 linux kernel 源代码。所以我们 uboot 中是移植而不是编写。
(2) 要想彻底看懂这个驱动,必须对 linux 的驱动模型中网络设备驱动有一定的理解才可以。因为我们还没学驱动,因此这个源代码就不用看了。
(3) 这个驱动是 linux 内核中做好的,根本不用动,可以在 uboot 中直接使用的。而且因为 linux 驱动设计的很合理(数据和代码是分开的,这里驱动主要是代码,数据是由硬件开发板中的接法决定的,数据由一定的数据结构来提供。),所以驱动本身具有可移植性。这个就决定了我们移植 DM9000 驱动时,这个驱动文件 dm9000x.c 和 dm9000x.h 不用动,要动的是数据。
2、网卡移植的关键:初始化
(1) uboot 在第二阶段 init_sequences 中进行了一系列的初始化,其中就有网卡芯片的初始化。这个初始化就是关键,在这里的初始化中,只要将网卡芯片正确的初始化了,则网卡芯片就能工作(意思是网卡驱动 dm9000x.c 和 dm9000x.h 依赖于这里的初始化而工作)。
(2) 网卡初始化代码地方在:
start_armbootinit_sequenceboard_initdm9000_pre_init 这个函数就是移植的关键
(3) dm9000_pre_init 函数主要功能就是初始化 DM9000 网卡。这个初始化过程和我们开发板上 DM9000 网卡芯片的硬件连接方式有关。必须要结合开发板原理图来分析,然后决定这个函数怎么编程。
(4) 原来的代码是三星的工程师根据三星的开发板 SMDKV210 的硬件接法来写的程序,我们要根据自己的开发板的硬件接法去修改这个程序,让网卡在我们的开发板上能工作。
(5) #define DM9000_16BIT_DATA 这个宏用来表示 DM9000 工作在 16 位总线模式下。根据上节课的硬件原理图的分析,可以看到我们开发板上 DM9000 确实工作在 16 位模式下。
(6) 从三星版本的代码中可以看出,它操作的是 bit20-bit23 ,对照数据手册中寄存器定义,可以看出三星的开发板 DM9000 是接在 Bank5 上的。而我们接在 bank1 上的,因此我们需要操作的 bit 位是 bit4-bit7。
(7) 总结:三个寄存器的修改。主要是三星的开发板DM9000接在bank5,我们接在了bank1上,因此要做一些修改。
3、基地址的配置等
(1) 之前说过,驱动分为2部分:代码和数据。代码不用动,数据要修改。
(2) CONFIG_DM9000_BASE 是 DM9000 网卡通过 SROM bank 映射到 SoC 中地址空间中的地址。这个地址的值,取决于硬件接到了哪个 bank,这个 bank 的基地址是 SoC 自己定义好的。譬如我们这里接到了 bank1 上,bank1 的基地址是 0x88000000.
(3) DM9000_IO 表示访问芯片 IO 的基地址,直接就是 CONFIG_DM9000_BASE;DM9000_DATA 表示我们访问数据时的基地址,因为 DM9000 芯片的 CMD 引脚接到了 ADDR2,因此这里要 +4(0b100,对应 ADDR2)。
开发板实践,ping 命令成功:
实际上,只要我们的 CONFIG_DM9000_BASE 和 DM9000_DATA 在 SROMC Bank1 的地址范围内,而且区分好 CPU 地址总线的 ADDR2 (第二根地址线)的为 0 和为 1 的两种情况,都是能够正常使用网络通信的。
想了解更详细的 DM9000 的信息,可以浏览:链接地址
五、网卡驱动如何工作
1、网卡移植代码实践
(1) 经过实践,网卡驱动移植成功。
(2) 其实还可以做一些实验。譬如说,对网卡驱动初始化部分寄存器的设置,还有网卡 CONFIG_DM9000_BASE 也可以配成 0x88000000 再去试一试。
2、linux 系统中网卡驱动的典型工作方式简介
(1) 在 linux 系统中,网卡算是一个设备,这个设备驱动工作后,会生成一个设备名叫ethn(n 是0、1、2、····)(无线网卡名字一般叫 wlan0、wlan1····)。然后 linux 系统用一些专用命令来操作网卡,譬如 ifconfig 命令。
(2) linux 下的应用程序如何使用网卡驱动来进行网络通信?最通用的方法就是 socket 接口。linux 系统中有一系列的 API 和库函数,提供了一个 socket 编程接口,linux 下的应用程序都是通过 socket 来实现上网的,socket 内部就是间接调用的网卡驱动实现网络通信的。
(3) linux 设计是非常完备的,应用层和驱动层是严格分离的。也就是说,写网络编程应用层的人根本不用管驱动,只要会用 socket 接口即可;写底层驱动的人根本不用管应用层,只要面向 linux 的网络驱动框架模型即可。
3、uboot 中网卡驱动的工作方式简介
(1) 一定要记住:uboot 本身是一个裸机程序,是一个整体,没有分层。所以 uboot 中根本没有驱动和应用的概念。
(2) 按照逻辑来说,ping 这样的命令实现的代码,就是网络应用的应用程序,像dm9000x.c 和 dm9000x.h 这样的代码属于驱动程序。
所以在 uboot 中这些东西是揉在一起的,应用是直接调用驱动实现的。也就是说,ping 命令内部是直接调用了 dm9000 的网卡驱动中的函数来实现自己的。
4、以 ping 命令为例,查找代码验证分析
(1) ping 命令是 uboot 的众多命令之一,ping 命令实现的函数叫 do_ping。
(2) 函数的调用关系:
do_pingNetLoopPingStartPingSendArpRequesteth_send(dm9000x.c中)
(3) 验证了 《3、uboot 中网卡驱动的工作方式简介》 中说的,uboot 中应用程序(ping)调用驱动程序(dm9000x.c)的方式。这就是一种直接调用的方式。
六、使用自己移植的 uboot 启动内核
1、问题:当前我们移植的 uboot 不能启动内核
(1) 用同样的方法(使用 tftp 0x30008000 zImage-qt; 然后 bootm 0x30008000),分别使用我们自己移植的 uboot, 和使用九鼎移植版本的 uboot, 去启动内核,发现九鼎移植版本的可以启动,但是我们自己移植的不可以启动。到此我们就断定,我们的 uboot 有问题,不能启动内核。
(2) 做基本检查:首先怀疑是机器码不对。经过和九鼎移植版本的 uboot 对比发现,machid 都是 2456,说明机器码没错。
(3) 想到一个问题,我们之前做实验时,将串口改为了串口 0,而内核 zImage-qt 的串口输出在串口 2.怀疑可能的问题是,uboot 使用了串口 0, 而内核使用了串口 2,所以在 uboot 后看不到内核的启动信息。
2、解决第一步:将串口改回串口2
(1) 在 smdkv210single.h 中修改串口编号即可。
3、根据现象分析,定位问题并试图解决
(1) 如果已经启动了内核,那没什么好说的了。应该是可以直接启动了。
(2) 如何内核没有启动,是 smdkv210single.h 中没有定义 bootm 传参需要的那几个宏造成的。
源自朱友鹏老师.
相关文章:

ARM uboot 的移植2-从三星官方 uboot 开始移植
一、inand 驱动问题的解决 1、先从现象出发定位问题 (1) 解决问题的第一步,是定位问题。所谓定位问题,就是找到源代码当中导致这个问题的那一句或者那几句代码。有时候解决这个问题需要修改的代码和直接导致这个问题的代码是不同的。我们这里说的定位问…...

js作用域和作用域链
1、局部作用域分为函数作用域和块作用域 1.1、函数作用域: 在函数内部声明的变量只能在函数内部被访问,外部无法直接访问。 总结 1.函数内部声明的变量,在函数外部无法被访问 2.函数的参数也是函数内部的局部变量 3.不同函数内部声明的变量无法互相访…...
C语言字符串
目录 一、字符串的引入和注意事项 1.1 字符串定义的几种方式: 1.2 定义字符串的方法一和方法二的区别: 1.3 字符串输出的几种方式: 1.3.1 循环下标法遍历输出字符串: 1.3.2 转义字符%s输出字符串: 1.3.3 使用puts函…...

Eureka注册中心快速入门
一、提供者与消费者**服务提供者:**一次业务中,被其他微服务调用的服务。(提供接口给其他微服务)**服务消费者:**一次业务中,调用其他微服务的服务。(调用其它微服务提供的接口)比如…...
xmu 离散数学 卢杨班作业详解【1-3章】
文章目录第一章 命题逻辑常用latex数学公式1.4.5679101113171923242627第二章 一阶逻辑1.2.3.6.9.10.12.13.一阶逻辑推理理论12.13.15.第三章 集合2478101213.第一章 命题逻辑 常用latex数学公式 符号代码∨\vee∨$\vee$∧\wedge∧$\wedge$→\rightarrow→$\rightarrow$⇒\Ri…...

mvn命令
在IDEA右侧Maven菜单中,有以下几种指令。 clean:清理,清除上一次构建生产的文件。执行该命令会删除项目地址下的target文件,但不会删除本地的maven已生成的文件。 validate:验证,验证项目是否正确且所有必…...
JS - 事件循环EventLoop
一、面试题:说一下事件循环(回答思路梳理) 首先 js 是单线程运行的( JS 可以修改 DOM,如果在 JS 执行的时候 UI 线程还在工作,就可能导致不能安全的渲染 UI),在代码执行的时候&…...

【Java基础】30分钟Git 从入门到精通
一、 版本控制工具1、什么是版本控制系统?版本控制系统(Version Control System):是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。版本控制系统不仅可以应用于软件源代码的文本文件,而且可以对…...
0100 MySQL03
1.distinct关键字 把查询结果去除重复记录,原表数据不会被修改,只能出现在字段的最前端 select distinct job from emp; select distinct job,deptno from emp;//表示两个字段联合起来 去重 2.连接查询 从一张表中单独查询,称为单表查询 两张表联合…...

32- PyTorch基础 (PyTorch系列) (深度学习)
知识要点 PyTorch可以说是现阶段主流的深度学习框架 . 1 PyTorch入门 1.1 PyTorch概述 Torch是什么?一个火炬!其实跟Tensorflow中Tensor是一个意思,可以当做是能在GPU中计算的矩阵.,也可以当做是ndarray的GPU版! PyT…...

用gdb.attach()在gdb下断点但没停下的情况及解决办法
在python中,如果导入了pwntools,就可以使用里面的gdb.attach(io)的命令来下断点。 但是这一次鼠鼠遇到了一个情况就是下了断点,但是仍然无法在断点处开始运行,奇奇怪怪。 这是我的攻击脚本 我们运行一下。 可以看到其实已经运行起…...
Linux入门篇-作业(jobs)调度(本质仍然是进程)
简介 之所以叫做作业调度,作业是以shell为单位的,一个shell建立的作业,不会被另外一个shell看到(包 括root),但是仍然可以看到作业对应的进程。①前台进程(front process) 运行在用户…...
vue 监听 取消监听
vue 的 watch 除了可以使用声明式的配置项以外,还可以通过命令式 this.$watch 方法。 如下是我们比较少用的命令式(想要初始只监听一次,必须命令式写法): 监听只运行一次 声明式 export default{data: {showType: fa…...

0103深度优先搜索和单点连通-无向图-数据结构和算法(Java)
文章目录1.1 走迷宫1.2 图的深度优先搜索实现1.3 算法分析及性能1. 4 单点连通性后记1.1 走迷宫 简单的迷宫,如下图1.1-1所示: 探索迷宫而不迷路,我们需要: 选择一条没有标记过的通道,在你走过的路上铺一条绳子&…...

进销存管理系统
技术:Java等摘要:进销存管理系统是为了实现企业仓库商品管理的系统化、规范化和自动化,从而提高企业管理效率而设计开发的管理信息系统。它完全取代了过去一直用人工管理的工作方式,避免了由于管理人员手工操作上的疏忽以及管理质…...

Sonar:VSCode配置SonarLint/SonarLint连接SonarQube
需求描述 公司为项目代码配置了Sonar检测,希望在VSCode中开发项目时能够同步检测结果。 注意事项 SonarQube版本必须为7.9,否则SonarLint无法连接(GitHub-SonarLint-Wiki第一行就有说明)!!!S…...

陀螺仪小车(Forerake-Car)
项目简介:搭建一辆有arduino UNO 与rnf24l01组成的小车;手部安装由arduino nano开发板、nrf24l01、imu构成的手势控制器,利用手势控制器检测手部状态、发送信号对小车进行前进,实现基于卡尔曼滤波的MPU6050姿态结算。 准备工作&am…...
Leetcode Day5 含有重复元素集合的组合+
1、含有重复元素集合的组合 给定一个可能有重复数字的整数数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次,解集不能包含重复的组合。 【题目传送门】 思…...

Mac Book pro(M1)使用总结
1、拿到电脑激活的时候,一定要记住账号密码及安全问题的答案。 2、显示隐藏文件夹: 3、显示.git或者gitignore等隐藏后缀的文件: 打开终端 defaults write com.apple.finder AppleShowAllFiles TRUE重启Finder在终端输入 killall Finder …...

QML集成JavaScript
在QML中可以使用现有的QML元素来创建页面,但QML紧密的集成了必要的JavaScript。 但QML中使用JavaScript比较严格,在QML中不可以添加或修改JavaScript全局对象成员,这样可能会使用一个未经声明的变量。 内联JavaScript 一些小型的JavaScript函…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...